Audit all supplied requirements across complete long drafts

This commit is contained in:
2026-09-06 10:20:37 +03:00
parent c3ec8c8ba8
commit 673d6c1bc8
7 changed files with 89 additions and 9 deletions
+34
View File
@@ -0,0 +1,34 @@
import {splitAnalysisText} from './analysis-parts.mjs';
import {qualifyOfferAudit} from './offer-audit.mjs';
/** Audit every supplied requirement against every draft part, without generic AI-schema merging. */
export async function auditOfferInParts(requirements, draft, run) {
const groups=[];let current=[],size=0;
for(const requirement of requirements) {
if(requirement.length>8000) throw new Error('Tek bir denetim gerekliliği çok uzun. Kaynak maddeyi ayrı gerekliliklere ayırın.');
if(current.length && size+requirement.length>8000){groups.push(current);current=[];size=0;}
current.push(requirement);size+=requirement.length+10;
}
if(current.length)groups.push(current);
const parts=splitAnalysisText(draft,10000),jobs=groups.flatMap((group,g)=>parts.map(part=>({group,g,part}))),results=[];
for(let i=0;i<jobs.length;i+=2) await Promise.all(jobs.slice(i,i+2).map(async job=>{
try {
const output=await run(job.group,job.part.text);
results.push({...job,review:qualifyOfferAudit(output,job.group,job.part.text)});
} catch(error){results.push({...job,error:String(error.message || error)});}
}));
if(!results.some(result=>result.review))throw new Error('Taslağın hiçbir bölümü denetlenemedi. Yeniden deneyin.');
const merged=[];
for(const [g,group] of groups.entries()) for(const requirement of group) {
const matching=results.filter(result=>result.g===g);
const rows=matching.flatMap(result=>result.review?.maddeler.filter(row=>row.gereklilik===requirement) || []);
const verified=rows.find(row=>row.durum==='karsilaniyor');
const failed=matching.some(result=>result.error);
merged.push(failed ? {gereklilik:requirement,durum:'belirsiz',oneri:'Taslağın bazı bölümleri denetlenemedi. Yeniden deneyin.'}
: verified || (rows.length===parts.length && rows.every(row=>row.durum==='eksik')
? {gereklilik:requirement,durum:'eksik'} : {gereklilik:requirement,durum:'belirsiz'}));
}
const review=qualifyOfferAudit({maddeler:merged},requirements,draft);
return {...review,auditReview:{draftParts:parts.length,requirementGroups:groups.length,failedCalls:results.filter(row=>row.error).length},
kapsam:review.kapsam+' Uzun taslak bölümler halinde kontrol edilir; bölümler arasına yayılan bir kanıt elle kontrol gerektirebilir.'};
}