Files
ihaleist/server/offer-audit-parts.mjs

37 lines
2.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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, {signal} = {}) {
signal?.throwIfAborted();
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) { signal?.throwIfAborted(); 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)});}
})); }
signal?.throwIfAborted();
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.'};
}