ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.30: вынос ветки tool_gate_skip + chat fallback из assistantService в отдельный runtime-адаптер, чтобы в сервисе остался только orchestration flow.

This commit is contained in:
2026-04-10 20:52:04 +03:00
parent 3531f7ddfe
commit 353cbc1763
16 changed files with 1706 additions and 405 deletions
@@ -0,0 +1,72 @@
import type { AssistantMessageRequestPayload } from "../types/assistant";
import type { NormalizeRequestPayload, NormalizeResponsePayload } from "../types/normalizer";
export interface AssistantDeepTurnFollowupBinding {
normalizedQuestion: string;
mergedContext: NormalizeRequestPayload["context"] | undefined;
usage: unknown | null;
}
export interface BuildAssistantDeepTurnNormalizationRuntimeInput {
userMessage: string;
payload: AssistantMessageRequestPayload;
featureInvestigationStateV1: boolean;
featureStateFollowupBindingV1: boolean;
sessionInvestigationState: unknown | null | undefined;
buildFollowupStateBinding: (input: {
userMessage: string;
payloadContext: NormalizeRequestPayload["context"] | undefined;
investigationState: unknown;
}) => AssistantDeepTurnFollowupBinding;
normalize: (payload: NormalizeRequestPayload) => Promise<NormalizeResponsePayload>;
}
export interface BuildAssistantDeepTurnNormalizationRuntimeOutput {
followupBinding: AssistantDeepTurnFollowupBinding;
normalizePayload: NormalizeRequestPayload;
normalized: NormalizeResponsePayload;
}
export async function buildAssistantDeepTurnNormalizationRuntime(
input: BuildAssistantDeepTurnNormalizationRuntimeInput
): Promise<BuildAssistantDeepTurnNormalizationRuntimeOutput> {
const followupBinding =
input.featureInvestigationStateV1 &&
input.featureStateFollowupBindingV1 &&
Boolean(input.sessionInvestigationState)
? input.buildFollowupStateBinding({
userMessage: input.userMessage,
payloadContext: input.payload.context,
investigationState: input.sessionInvestigationState as unknown
})
: {
normalizedQuestion: input.userMessage,
mergedContext: input.payload.context,
usage: null
};
const normalizePayload: NormalizeRequestPayload = {
llmProvider: input.payload.llmProvider,
apiKey: input.payload.apiKey,
model: input.payload.model,
baseUrl: input.payload.baseUrl,
temperature: input.payload.temperature,
maxOutputTokens: input.payload.maxOutputTokens,
promptVersion: input.payload.promptVersion ?? "address_query_runtime_v1",
systemPrompt: input.payload.systemPrompt,
developerPrompt: input.payload.developerPrompt,
domainPrompt: input.payload.domainPrompt,
fewShotExamples: input.payload.fewShotExamples,
userQuestion: followupBinding.normalizedQuestion,
context: followupBinding.mergedContext,
useMock: Boolean(input.payload.useMock)
};
const normalized = await input.normalize(normalizePayload);
return {
followupBinding,
normalizePayload,
normalized
};
}