Stage 2 завершён: problem-first ответы и follow-up continuity - ассистент переведён от entity-heavy логики к problem-first ответам с problem-unit слоем, удержанием контекста в follow-up и очисткой пользовательского ответа от сырых технических ссылок.

This commit is contained in:
2026-03-26 14:53:52 +03:00
parent ece1abed76
commit 96353cfd48
2474 changed files with 21678 additions and 3292445 deletions
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.normalizeRetrievalResult = normalizeRetrievalResult;
const config_1 = require("../config");
const stage1Contracts_1 = require("../types/stage1Contracts");
const problemUnitAssembler_1 = require("./problemUnitAssembler");
function toObject(value) {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return null;
@@ -59,6 +60,18 @@ function normalizeStringArray(value) {
}
return value.map((item) => String(item));
}
function mergeSummaryWithProblemUnitMeta(summary, input) {
return {
...summary,
problem_units_enabled: true,
candidate_evidence_count: input.candidateEvidenceCount,
problem_units_count: input.problemUnitsCount,
problem_unit_types: input.unitTypes,
problem_unit_duplicate_collapses: input.duplicateCollapses,
problem_unit_severity_distribution: input.severityDistribution,
problem_unit_confidence_distribution: input.confidenceDistribution
};
}
function normalizeConfidence(value) {
if (value === "high" || value === "medium" || value === "low") {
return value;
@@ -359,15 +372,18 @@ function normalizeEvidenceItems(fragmentId, requirementIds, route, value) {
});
}
function normalizeRetrievalResult(fragmentId, requirementIds, route, raw) {
return {
const items = normalizeObjectArray(raw.items);
const summary = normalizeSummary(raw.summary);
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, raw.evidence);
const baseResult = {
fragment_id: fragmentId,
requirement_ids: requirementIds,
route,
status: normalizeStatus(raw.status),
result_type: normalizeResultType(raw.result_type),
items: normalizeObjectArray(raw.items),
summary: normalizeSummary(raw.summary),
evidence: normalizeEvidenceItems(fragmentId, requirementIds, route, raw.evidence),
items,
summary,
evidence,
why_included: normalizeStringArray(raw.why_included),
selection_reason: normalizeStringArray(raw.selection_reason),
risk_factors: normalizeStringArray(raw.risk_factors),
@@ -376,4 +392,33 @@ function normalizeRetrievalResult(fragmentId, requirementIds, route, raw) {
limitations: normalizeStringArray(raw.limitations),
errors: normalizeErrors(raw.errors)
};
if (!config_1.FEATURE_ASSISTANT_PROBLEM_UNITS_V1) {
return baseResult;
}
const assembled = (0, problemUnitAssembler_1.assembleProblemUnits)({
route,
result_type: baseResult.result_type,
evidence,
raw_entities: items,
summary,
risk_factors: baseResult.risk_factors,
selection_reason: baseResult.selection_reason,
business_interpretation: baseResult.business_interpretation
});
const enrichedSummary = mergeSummaryWithProblemUnitMeta(summary, {
candidateEvidenceCount: assembled.candidate_evidence.length,
problemUnitsCount: assembled.problem_units.length,
unitTypes: assembled.problem_unit_summary.unit_types,
duplicateCollapses: assembled.problem_unit_summary.duplicate_collapses,
severityDistribution: assembled.problem_unit_summary.severity_distribution,
confidenceDistribution: assembled.problem_unit_summary.confidence_distribution
});
return {
...baseResult,
summary: enrichedSummary,
raw_entities: items,
candidate_evidence: assembled.candidate_evidence,
problem_units: assembled.problem_units,
problem_unit_summary: assembled.problem_unit_summary
};
}