Архитектура: ввести answer-inspection follow-up contract и закрыть phase15 replay

This commit is contained in:
2026-04-18 23:04:37 +03:00
parent c605fae3a3
commit 1d48f01841
16 changed files with 575 additions and 13 deletions
@@ -38,6 +38,7 @@ export interface AssistantLivingModePolicy {
hasDataRetrievalRequestSignal: (text: unknown) => boolean;
hasOrganizationFactLookupSignal: (text: unknown) => boolean;
hasMetaAnswerFollowupSignal: (text: unknown) => boolean;
hasAnswerInspectionFollowupSignal: (text: unknown) => boolean;
hasConversationMemoryRecallFollowupSignal: (text: unknown) => boolean;
hasHistoricalCapabilityFollowupSignal: (text: unknown) => boolean;
hasOrganizationFactFollowupSignal: (userMessage: unknown, items: unknown[]) => boolean;
@@ -160,6 +161,30 @@ export function createAssistantLivingModePolicy(deps: AssistantLivingModePolicyD
hasStrongDataIntentSignal(sample));
}
function hasAnswerInspectionFollowupSignal(userMessage) {
const rawText = compactWhitespace(String(userMessage ?? "").toLowerCase());
const repairedText = compactWhitespace(repairAddressMojibake(String(userMessage ?? "")).toLowerCase());
const samples = [rawText, repairedText]
.filter((item) => item.length > 0)
.map((item) => item.replace(/ё/g, "е"));
if (samples.length === 0) {
return false;
}
const hasInspectionCue = samples.some((sample) => /(?:ошибк|неверн|не так|перепутал|у тебя написано|ты написал|это ошибка|правильно ли|корректн)/iu.test(sample));
if (!hasInspectionCue) {
return false;
}
const hasAnswerObjectCue = samples.some((sample) => /(?:контрагент|покупател|поставщик|поле|ответ|позици|номенклат|документ)/iu.test(sample));
if (!hasAnswerObjectCue) {
return false;
}
const hasFreshRetrievalAction = samples.some((sample) => /(?:покажи|выведи|найди|список|проверь по базе|подними документы|достань|рассчитай|посчитай|сколько|кто\s+нам|кто\s+у\s+нас)/iu.test(sample));
if (hasFreshRetrievalAction) {
return false;
}
return true;
}
function hasConversationMemoryRecallFollowupSignal(userMessage) {
const rawText = compactWhitespace(String(userMessage ?? "").toLowerCase());
const repairedText = compactWhitespace(repairAddressMojibake(String(userMessage ?? "")).toLowerCase());
@@ -421,6 +446,7 @@ export function createAssistantLivingModePolicy(deps: AssistantLivingModePolicyD
hasDataRetrievalRequestSignal,
hasOrganizationFactLookupSignal,
hasMetaAnswerFollowupSignal,
hasAnswerInspectionFollowupSignal,
hasConversationMemoryRecallFollowupSignal,
hasHistoricalCapabilityFollowupSignal,
hasOrganizationFactFollowupSignal,