ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.2 - Усилена оркестрацию в deep/address гейте и follow-up binding в assistantService.ts. Починен кейс UTF-8 follow-up refinement (теперь followup_state_usage.applied=true в нужном сценарии). Убраны регрессии по assistantLivingRouter и stage3 lifecycle probe. Корректное поведение для llm canonical candidate (чтобы не уезжало в clarification_required там, где должен быть address factual).

This commit is contained in:
2026-04-11 14:56:14 +03:00
parent 19f5f19d8e
commit b5bd4fd737
46 changed files with 2471 additions and 370 deletions
@@ -1,5 +1,6 @@
import type { AssistantMessageRequestPayload } from "../types/assistant";
import type { NormalizeRequestPayload, NormalizeResponsePayload } from "../types/normalizer";
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
import type { AssistantFollowupUsage } from "./assistantFollowupUsage";
export interface AssistantDeepTurnFollowupBinding {
@@ -13,11 +14,11 @@ export interface BuildAssistantDeepTurnNormalizationRuntimeInput {
payload: AssistantMessageRequestPayload;
featureInvestigationStateV1: boolean;
featureStateFollowupBindingV1: boolean;
sessionInvestigationState: unknown | null | undefined;
sessionInvestigationState: InvestigationStateWithProblemUnits | null | undefined;
buildFollowupStateBinding: (input: {
userMessage: string;
payloadContext: NormalizeRequestPayload["context"] | undefined;
investigationState: unknown;
investigationState: InvestigationStateWithProblemUnits;
}) => AssistantDeepTurnFollowupBinding;
normalize: (payload: NormalizeRequestPayload) => Promise<NormalizeResponsePayload>;
}
@@ -31,14 +32,18 @@ export interface BuildAssistantDeepTurnNormalizationRuntimeOutput {
export async function buildAssistantDeepTurnNormalizationRuntime(
input: BuildAssistantDeepTurnNormalizationRuntimeInput
): Promise<BuildAssistantDeepTurnNormalizationRuntimeOutput> {
const followupBinding =
const investigationState = input.sessionInvestigationState;
const canUseFollowupBinding =
input.featureInvestigationStateV1 &&
input.featureStateFollowupBindingV1 &&
Boolean(input.sessionInvestigationState)
investigationState !== null &&
investigationState !== undefined;
const followupBinding =
canUseFollowupBinding
? input.buildFollowupStateBinding({
userMessage: input.userMessage,
payloadContext: input.payload.context,
investigationState: input.sessionInvestigationState as unknown
investigationState
})
: {
normalizedQuestion: input.userMessage,