fix: degrade elder analysis when knowledge retrieval fails

This commit is contained in:
2026-07-05 02:33:26 -07:00
parent b586756226
commit 6ed7508983

View File

@@ -208,20 +208,23 @@ export async function generateElderAiAnalysis(
: { success: true as const, data: { results: [] } }; : { success: true as const, data: { results: [] } };
if (!knowledgeResults.success) { if (!knowledgeResults.success) {
await saveFailedAnalysis({ await recordAuditLog({
context, actor: context.account,
organizationId: residentContext.context.organizationId, organizationId: residentContext.context.organizationId,
elderId, action: "ai.knowledge.retrieve",
dataScopes: residentContext.context.dataScopes, targetType: "elder",
category: "retrieval_failed", targetId: elderId,
result: "failure",
reason: getBriefErrorReason("retrieval_failed"),
}); });
return { success: false, reason: knowledgeResults.reason, status: knowledgeResults.status };
} }
const dataScopes = knowledgeResults.data.results.length > 0 const knowledgeItems = knowledgeResults.success ? knowledgeResults.data.results : [];
const knowledgeUnavailableReason = knowledgeResults.success ? "" : getBriefErrorReason("retrieval_failed");
const dataScopes = knowledgeItems.length > 0
? [...residentContext.context.dataScopes, "knowledge" as const] ? [...residentContext.context.dataScopes, "knowledge" as const]
: residentContext.context.dataScopes; : residentContext.context.dataScopes;
const knowledgeCitations: AiCitation[] = knowledgeResults.data.results.map((item, index) => ({ const knowledgeCitations: AiCitation[] = knowledgeItems.map((item, index) => ({
id: `kb-${index + 1}`, id: `kb-${index + 1}`,
sourceType: "knowledge", sourceType: "knowledge",
sourceId: item.chunkId, sourceId: item.chunkId,
@@ -238,10 +241,11 @@ export async function generateElderAiAnalysis(
"输出 JSON 字段overallRiskLevel(low|medium|high|critical|unknown), summary, keyFindings, recommendations, dataGaps, citations, confidence, modelSummary。", "输出 JSON 字段overallRiskLevel(low|medium|high|critical|unknown), summary, keyFindings, recommendations, dataGaps, citations, confidence, modelSummary。",
"keyFindings[] 字段category, severity(info|warning|critical), evidence, citationIds。", "keyFindings[] 字段category, severity(info|warning|critical), evidence, citationIds。",
"recommendations[] 字段title, priority(low|normal|high|urgent), rationale, suggestedNextStep, citationIds。", "recommendations[] 字段title, priority(low|normal|high|urgent), rationale, suggestedNextStep, citationIds。",
knowledgeUnavailableReason ? `知识库检索不可用:${knowledgeUnavailableReason}。请在 dataGaps 中包含“知识库检索不可用,分析未使用内部知识库”。` : "",
`modelSummary 固定为 {"provider":"openai-compatible","chatModel":"${runtimeConfig.config.chatModel}","embeddingModel":"${runtimeConfig.config.embeddingModel}"}。`, `modelSummary 固定为 {"provider":"openai-compatible","chatModel":"${runtimeConfig.config.chatModel}","embeddingModel":"${runtimeConfig.config.embeddingModel}"}。`,
`可用 citations${JSON.stringify(citations)}`, `可用 citations${JSON.stringify(citations)}`,
`住民上下文:\n${residentContext.context.promptContext}`, `住民上下文:\n${residentContext.context.promptContext}`,
`知识库片段:\n${knowledgeResults.data.results.map((item, index) => `[kb-${index + 1}] ${item.title}\n${item.content}`).join("\n\n") || "无"}`, `知识库片段:\n${knowledgeItems.map((item, index) => `[kb-${index + 1}] ${item.title}\n${item.content}`).join("\n\n") || "无"}`,
].join("\n\n"); ].join("\n\n");
let rawOutput: unknown; let rawOutput: unknown;
@@ -275,7 +279,15 @@ export async function generateElderAiAnalysis(
return { success: false, reason: getBriefErrorReason("schema_validation_failed"), status: 502 }; return { success: false, reason: getBriefErrorReason("schema_validation_failed"), status: 502 };
} }
const normalizedOutput = normalizeCitations(output, citations); const normalizedOutput = normalizeCitations(
knowledgeUnavailableReason
? {
...output,
dataGaps: [...output.dataGaps, "知识库检索不可用,分析未使用内部知识库"],
}
: output,
citations,
);
const database = getDatabase(); const database = getDatabase();
const rows = await database const rows = await database
.insert(elderAiAnalyses) .insert(elderAiAnalyses)