35 lines
2.3 KiB
JavaScript
35 lines
2.3 KiB
JavaScript
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.'};
|
||
}
|