ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.612.64 - вынос mapper для assistantAddressLaneResponseAttemptRuntimeAdapter и для assistantLivingChatAttemptRuntimeAdapter / сборка входов для living chat attempt в отдельный builder (LLM + handler)

This commit is contained in:
2026-04-11 09:52:59 +03:00
parent 6c9b94ef34
commit 79b636bfe6
11 changed files with 489 additions and 78 deletions
@@ -4,6 +4,7 @@ import {
type RunAssistantAddressLaneResponseRuntimeInput,
type RunAssistantAddressLaneResponseRuntimeOutput
} from "./assistantAddressLaneResponseRuntimeAdapter";
import { buildAssistantAddressLaneResponseRuntimeInput } from "./assistantAddressLaneResponseRuntimeInputBuilder";
export interface RunAssistantAddressLaneResponseAttemptRuntimeInput<
ResponseType = AssistantMessageResponsePayload
@@ -20,26 +21,28 @@ export function runAssistantAddressLaneResponseAttemptRuntime<
): ResponseType {
const runAddressLaneResponseRuntimeSafe =
input.runAddressLaneResponseRuntime ?? runAssistantAddressLaneResponseRuntime;
const runtime = runAddressLaneResponseRuntimeSafe({
sessionId: input.sessionId,
userMessage: input.userMessage,
effectiveAddressUserMessage: input.effectiveAddressUserMessage,
addressLane: input.addressLane,
carryoverMeta: input.carryoverMeta,
llmPreDecomposeMeta: input.llmPreDecomposeMeta,
knownOrganizations: input.knownOrganizations,
activeOrganization: input.activeOrganization,
sanitizeOutgoingAssistantText: input.sanitizeOutgoingAssistantText,
buildAddressDebugPayload: input.buildAddressDebugPayload,
buildAddressFollowupOffer: input.buildAddressFollowupOffer,
mergeKnownOrganizations: input.mergeKnownOrganizations,
toNonEmptyString: input.toNonEmptyString,
appendItem: input.appendItem,
getSession: input.getSession,
persistSession: input.persistSession,
cloneConversation: input.cloneConversation,
logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory
});
const runtime = runAddressLaneResponseRuntimeSafe(
buildAssistantAddressLaneResponseRuntimeInput({
sessionId: input.sessionId,
userMessage: input.userMessage,
effectiveAddressUserMessage: input.effectiveAddressUserMessage,
addressLane: input.addressLane,
carryoverMeta: input.carryoverMeta,
llmPreDecomposeMeta: input.llmPreDecomposeMeta,
knownOrganizations: input.knownOrganizations,
activeOrganization: input.activeOrganization,
sanitizeOutgoingAssistantText: input.sanitizeOutgoingAssistantText,
buildAddressDebugPayload: input.buildAddressDebugPayload,
buildAddressFollowupOffer: input.buildAddressFollowupOffer,
mergeKnownOrganizations: input.mergeKnownOrganizations,
toNonEmptyString: input.toNonEmptyString,
appendItem: input.appendItem,
getSession: input.getSession,
persistSession: input.persistSession,
cloneConversation: input.cloneConversation,
logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory
})
);
return runtime.response;
}
@@ -0,0 +1,54 @@
import type { RunAssistantAddressLaneResponseRuntimeInput } from "./assistantAddressLaneResponseRuntimeAdapter";
export interface BuildAssistantAddressLaneResponseRuntimeInputInput<ResponseType = unknown> {
sessionId: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["sessionId"];
userMessage: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["userMessage"];
effectiveAddressUserMessage:
RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["effectiveAddressUserMessage"];
addressLane: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["addressLane"];
carryoverMeta?: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["carryoverMeta"];
llmPreDecomposeMeta?: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["llmPreDecomposeMeta"];
knownOrganizations: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["knownOrganizations"];
activeOrganization: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["activeOrganization"];
sanitizeOutgoingAssistantText:
RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["sanitizeOutgoingAssistantText"];
buildAddressDebugPayload:
RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["buildAddressDebugPayload"];
buildAddressFollowupOffer:
RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["buildAddressFollowupOffer"];
mergeKnownOrganizations:
RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["mergeKnownOrganizations"];
toNonEmptyString: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["toNonEmptyString"];
appendItem: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["appendItem"];
getSession: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["getSession"];
persistSession: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["persistSession"];
cloneConversation: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["cloneConversation"];
logEvent: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["logEvent"];
messageIdFactory: RunAssistantAddressLaneResponseRuntimeInput<ResponseType>["messageIdFactory"];
}
export function buildAssistantAddressLaneResponseRuntimeInput<ResponseType = unknown>(
input: BuildAssistantAddressLaneResponseRuntimeInputInput<ResponseType>
): RunAssistantAddressLaneResponseRuntimeInput<ResponseType> {
return {
sessionId: input.sessionId,
userMessage: input.userMessage,
effectiveAddressUserMessage: input.effectiveAddressUserMessage,
addressLane: input.addressLane,
carryoverMeta: input.carryoverMeta,
llmPreDecomposeMeta: input.llmPreDecomposeMeta,
knownOrganizations: input.knownOrganizations,
activeOrganization: input.activeOrganization,
sanitizeOutgoingAssistantText: input.sanitizeOutgoingAssistantText,
buildAddressDebugPayload: input.buildAddressDebugPayload,
buildAddressFollowupOffer: input.buildAddressFollowupOffer,
mergeKnownOrganizations: input.mergeKnownOrganizations,
toNonEmptyString: input.toNonEmptyString,
appendItem: input.appendItem,
getSession: input.getSession,
persistSession: input.persistSession,
cloneConversation: input.cloneConversation,
logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory
};
}
@@ -6,6 +6,10 @@ import {
runAssistantLivingChatLlmRuntime,
type RunAssistantLivingChatLlmRuntimeInput
} from "./assistantLivingChatLlmRuntimeAdapter";
import {
buildAssistantLivingChatHandlerRuntimeInput,
buildAssistantLivingChatLlmRuntimeInput
} from "./assistantLivingChatAttemptRuntimeInputBuilder";
type AssistantLivingChatHandlerInput<ResponseType> = TryHandleAssistantLivingChatRuntimeInput<ResponseType>;
type AssistantLivingChatLlmInput = RunAssistantLivingChatLlmRuntimeInput;
@@ -32,17 +36,19 @@ function buildExecuteLlmChat<ResponseType>(
runLivingChatLlmSafe: (input: AssistantLivingChatLlmInput) => Promise<string>
): AssistantLivingChatHandlerInput<ResponseType>["executeLlmChat"] {
return async () =>
runLivingChatLlmSafe({
userMessage: input.userMessage,
sessionItems: input.sessionItems,
payload: input.payload,
chatClient: input.chatClient,
loadAssistantCanonExcerpt: input.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText: input.sanitizeOutgoingAssistantText,
defaultModel: input.defaultModel,
defaultBaseUrl: input.defaultBaseUrl,
defaultApiKey: input.defaultApiKey
});
runLivingChatLlmSafe(
buildAssistantLivingChatLlmRuntimeInput({
userMessage: input.userMessage,
sessionItems: input.sessionItems,
payload: input.payload,
chatClient: input.chatClient,
loadAssistantCanonExcerpt: input.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText: input.sanitizeOutgoingAssistantText,
defaultModel: input.defaultModel,
defaultBaseUrl: input.defaultBaseUrl,
defaultApiKey: input.defaultApiKey
})
);
}
export async function runAssistantLivingChatAttemptRuntime<ResponseType = unknown>(
@@ -51,43 +57,45 @@ export async function runAssistantLivingChatAttemptRuntime<ResponseType = unknow
const runLivingChatHandlerSafe = input.runLivingChatHandler ?? tryHandleAssistantLivingChatRuntime;
const runLivingChatLlmSafe = input.runLivingChatLlm ?? runAssistantLivingChatLlmRuntime;
const executeLlmChat = buildExecuteLlmChat(input, runLivingChatLlmSafe);
return runLivingChatHandlerSafe({
sessionId: input.sessionId,
userMessage: input.userMessage,
sessionItems: input.sessionItems,
modeDecision: input.modeDecision,
sessionScope: input.sessionScope,
addressRuntimeMeta: input.addressRuntimeMeta,
traceIdFactory: input.traceIdFactory,
toNonEmptyString: input.toNonEmptyString,
mergeKnownOrganizations: input.mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal: input.hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery: input.shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal: input.hasDestructiveDataActionSignal,
hasDangerOrCoercionSignal: input.hasDangerOrCoercionSignal,
hasOperationalAdminActionRequestSignal: input.hasOperationalAdminActionRequestSignal,
hasOrganizationFactLookupSignal: input.hasOrganizationFactLookupSignal,
hasOrganizationFactFollowupSignal: input.hasOrganizationFactFollowupSignal,
shouldEmitOrganizationSelectionReply: input.shouldEmitOrganizationSelectionReply,
hasAssistantCapabilityQuestionSignal: input.hasAssistantCapabilityQuestionSignal,
resolveDataScopeProbe: input.resolveDataScopeProbe,
executeLlmChat,
applyScriptGuard: input.applyScriptGuard,
applyGroundingGuard: input.applyGroundingGuard,
buildAssistantSafetyRefusalReply: input.buildAssistantSafetyRefusalReply,
buildAssistantDataScopeContractReply: input.buildAssistantDataScopeContractReply,
buildAssistantOrganizationFactBoundaryReply: input.buildAssistantOrganizationFactBoundaryReply,
buildAssistantDataScopeSelectionReply: input.buildAssistantDataScopeSelectionReply,
buildAssistantOperationalBoundaryReply: input.buildAssistantOperationalBoundaryReply,
buildAssistantCapabilityContractReply: input.buildAssistantCapabilityContractReply,
appendItem: input.appendItem,
getSession: input.getSession,
persistSession: input.persistSession,
cloneConversation: input.cloneConversation,
logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory,
nowIso: input.nowIso,
runLivingChatRuntime: input.runLivingChatRuntime,
finalizeLivingChatTurn: input.finalizeLivingChatTurn
});
return runLivingChatHandlerSafe(
buildAssistantLivingChatHandlerRuntimeInput({
sessionId: input.sessionId,
userMessage: input.userMessage,
sessionItems: input.sessionItems,
modeDecision: input.modeDecision,
sessionScope: input.sessionScope,
addressRuntimeMeta: input.addressRuntimeMeta,
traceIdFactory: input.traceIdFactory,
toNonEmptyString: input.toNonEmptyString,
mergeKnownOrganizations: input.mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal: input.hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery: input.shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal: input.hasDestructiveDataActionSignal,
hasDangerOrCoercionSignal: input.hasDangerOrCoercionSignal,
hasOperationalAdminActionRequestSignal: input.hasOperationalAdminActionRequestSignal,
hasOrganizationFactLookupSignal: input.hasOrganizationFactLookupSignal,
hasOrganizationFactFollowupSignal: input.hasOrganizationFactFollowupSignal,
shouldEmitOrganizationSelectionReply: input.shouldEmitOrganizationSelectionReply,
hasAssistantCapabilityQuestionSignal: input.hasAssistantCapabilityQuestionSignal,
resolveDataScopeProbe: input.resolveDataScopeProbe,
executeLlmChat,
applyScriptGuard: input.applyScriptGuard,
applyGroundingGuard: input.applyGroundingGuard,
buildAssistantSafetyRefusalReply: input.buildAssistantSafetyRefusalReply,
buildAssistantDataScopeContractReply: input.buildAssistantDataScopeContractReply,
buildAssistantOrganizationFactBoundaryReply: input.buildAssistantOrganizationFactBoundaryReply,
buildAssistantDataScopeSelectionReply: input.buildAssistantDataScopeSelectionReply,
buildAssistantOperationalBoundaryReply: input.buildAssistantOperationalBoundaryReply,
buildAssistantCapabilityContractReply: input.buildAssistantCapabilityContractReply,
appendItem: input.appendItem,
getSession: input.getSession,
persistSession: input.persistSession,
cloneConversation: input.cloneConversation,
logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory,
nowIso: input.nowIso,
runLivingChatRuntime: input.runLivingChatRuntime,
finalizeLivingChatTurn: input.finalizeLivingChatTurn
})
);
}
@@ -0,0 +1,81 @@
import type {
TryHandleAssistantLivingChatRuntimeInput
} from "./assistantLivingChatHandlerRuntimeAdapter";
import type { RunAssistantLivingChatLlmRuntimeInput } from "./assistantLivingChatLlmRuntimeAdapter";
export interface BuildAssistantLivingChatLlmRuntimeInputInput {
userMessage: RunAssistantLivingChatLlmRuntimeInput["userMessage"];
sessionItems: RunAssistantLivingChatLlmRuntimeInput["sessionItems"];
payload: RunAssistantLivingChatLlmRuntimeInput["payload"];
chatClient: RunAssistantLivingChatLlmRuntimeInput["chatClient"];
loadAssistantCanonExcerpt: RunAssistantLivingChatLlmRuntimeInput["loadAssistantCanonExcerpt"];
sanitizeOutgoingAssistantText: RunAssistantLivingChatLlmRuntimeInput["sanitizeOutgoingAssistantText"];
defaultModel: RunAssistantLivingChatLlmRuntimeInput["defaultModel"];
defaultBaseUrl: RunAssistantLivingChatLlmRuntimeInput["defaultBaseUrl"];
defaultApiKey?: RunAssistantLivingChatLlmRuntimeInput["defaultApiKey"];
}
export function buildAssistantLivingChatLlmRuntimeInput(
input: BuildAssistantLivingChatLlmRuntimeInputInput
): RunAssistantLivingChatLlmRuntimeInput {
return {
userMessage: input.userMessage,
sessionItems: input.sessionItems,
payload: input.payload,
chatClient: input.chatClient,
loadAssistantCanonExcerpt: input.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText: input.sanitizeOutgoingAssistantText,
defaultModel: input.defaultModel,
defaultBaseUrl: input.defaultBaseUrl,
defaultApiKey: input.defaultApiKey
};
}
export interface BuildAssistantLivingChatHandlerRuntimeInputInput<ResponseType = unknown>
extends Omit<TryHandleAssistantLivingChatRuntimeInput<ResponseType>, "executeLlmChat"> {
executeLlmChat: TryHandleAssistantLivingChatRuntimeInput<ResponseType>["executeLlmChat"];
}
export function buildAssistantLivingChatHandlerRuntimeInput<ResponseType = unknown>(
input: BuildAssistantLivingChatHandlerRuntimeInputInput<ResponseType>
): TryHandleAssistantLivingChatRuntimeInput<ResponseType> {
return {
sessionId: input.sessionId,
userMessage: input.userMessage,
sessionItems: input.sessionItems,
modeDecision: input.modeDecision,
sessionScope: input.sessionScope,
addressRuntimeMeta: input.addressRuntimeMeta,
traceIdFactory: input.traceIdFactory,
toNonEmptyString: input.toNonEmptyString,
mergeKnownOrganizations: input.mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal: input.hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery: input.shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal: input.hasDestructiveDataActionSignal,
hasDangerOrCoercionSignal: input.hasDangerOrCoercionSignal,
hasOperationalAdminActionRequestSignal: input.hasOperationalAdminActionRequestSignal,
hasOrganizationFactLookupSignal: input.hasOrganizationFactLookupSignal,
hasOrganizationFactFollowupSignal: input.hasOrganizationFactFollowupSignal,
shouldEmitOrganizationSelectionReply: input.shouldEmitOrganizationSelectionReply,
hasAssistantCapabilityQuestionSignal: input.hasAssistantCapabilityQuestionSignal,
resolveDataScopeProbe: input.resolveDataScopeProbe,
executeLlmChat: input.executeLlmChat,
applyScriptGuard: input.applyScriptGuard,
applyGroundingGuard: input.applyGroundingGuard,
buildAssistantSafetyRefusalReply: input.buildAssistantSafetyRefusalReply,
buildAssistantDataScopeContractReply: input.buildAssistantDataScopeContractReply,
buildAssistantOrganizationFactBoundaryReply: input.buildAssistantOrganizationFactBoundaryReply,
buildAssistantDataScopeSelectionReply: input.buildAssistantDataScopeSelectionReply,
buildAssistantOperationalBoundaryReply: input.buildAssistantOperationalBoundaryReply,
buildAssistantCapabilityContractReply: input.buildAssistantCapabilityContractReply,
appendItem: input.appendItem,
getSession: input.getSession,
persistSession: input.persistSession,
cloneConversation: input.cloneConversation,
logEvent: input.logEvent,
messageIdFactory: input.messageIdFactory,
nowIso: input.nowIso,
runLivingChatRuntime: input.runLivingChatRuntime,
finalizeLivingChatTurn: input.finalizeLivingChatTurn
};
}