NODEDC_1C/llm_normalizer/backend/src/services/assistantTurnRuntimeInputBu...

252 lines
16 KiB
TypeScript

import type { RunAssistantAddressAttemptRuntimeInput } from "./assistantAddressAttemptRuntimeAdapter";
import type { RunAssistantDeepTurnAttemptRuntimeInput } from "./assistantDeepTurnAttemptRuntimeAdapter";
import type {
RunAssistantTurnAttemptRuntimeAddressInput,
RunAssistantTurnAttemptRuntimeDeepInput
} from "./assistantTurnAttemptRuntimeAdapter";
import type {
AssistantUserTurnBootstrapPayloadLike,
RunAssistantUserTurnBootstrapRuntimeInput
} from "./assistantUserTurnBootstrapRuntimeAdapter";
type AddressAttemptRuntimeInput<ResponseType = unknown> = RunAssistantAddressAttemptRuntimeInput<ResponseType>;
type DeepTurnAttemptRuntimeInput<ResponseType = unknown> = RunAssistantDeepTurnAttemptRuntimeInput<ResponseType>;
export interface AssistantTurnRuntimeBuilderDeps<ResponseType = unknown> {
ensureSession: RunAssistantUserTurnBootstrapRuntimeInput["ensureSession"];
appendItem: RunAssistantUserTurnBootstrapRuntimeInput["appendItem"];
getSession: RunAssistantUserTurnBootstrapRuntimeInput["getSession"];
persistSession: RunAssistantUserTurnBootstrapRuntimeInput["persistSession"];
compactWhitespace: RunAssistantUserTurnBootstrapRuntimeInput["compactWhitespace"];
repairAddressMojibake: RunAssistantUserTurnBootstrapRuntimeInput["repairAddressMojibake"];
resolveRuntimeAnalysisContext: RunAssistantUserTurnBootstrapRuntimeInput["resolveRuntimeAnalysisContext"];
runAddressLlmPreDecompose: (
payload: AddressAttemptRuntimeInput<ResponseType>["payload"],
userMessage: string
) => Promise<Record<string, unknown>>;
tryAddressQueryHandle: AddressAttemptRuntimeInput<ResponseType>["runAddressQueryTryHandle"];
setInvestigationState: DeepTurnAttemptRuntimeInput<ResponseType>["persistInvestigationState"];
normalize: DeepTurnAttemptRuntimeInput<ResponseType>["normalize"];
executeRouteRuntime: DeepTurnAttemptRuntimeInput<ResponseType>["executeRouteRuntime"];
chatClient: AddressAttemptRuntimeInput<ResponseType>["chatClient"];
messageIdFactory: AddressAttemptRuntimeInput<ResponseType>["messageIdFactory"];
nowIso: AddressAttemptRuntimeInput<ResponseType>["nowIso"];
defaultApiKey: NonNullable<AddressAttemptRuntimeInput<ResponseType>["defaultApiKey"]>;
logEvent: AddressAttemptRuntimeInput<ResponseType>["logEvent"];
featureAssistantAddressQueryV1: AddressAttemptRuntimeInput<ResponseType>["featureAssistantAddressQueryV1"];
featureAddressLlmPredecomposeV1: AddressAttemptRuntimeInput<ResponseType>["featureAddressLlmPredecomposeV1"];
featureInvestigationStateV1: DeepTurnAttemptRuntimeInput<ResponseType>["featureInvestigationStateV1"];
featureStateFollowupBindingV1: DeepTurnAttemptRuntimeInput<ResponseType>["featureStateFollowupBindingV1"];
featureContractsV11: DeepTurnAttemptRuntimeInput<ResponseType>["featureContractsV11"];
featureAnswerPolicyV11: DeepTurnAttemptRuntimeInput<ResponseType>["featureAnswerPolicyV11"];
featureProblemCentricAnswerV1: DeepTurnAttemptRuntimeInput<ResponseType>["featureProblemCentricAnswerV1"];
featureLifecycleAnswerV1: DeepTurnAttemptRuntimeInput<ResponseType>["featureLifecycleAnswerV1"];
defaultModel: AddressAttemptRuntimeInput<ResponseType>["defaultModel"];
defaultBaseUrl: AddressAttemptRuntimeInput<ResponseType>["defaultBaseUrl"];
buildAddressLlmPredecomposeContractV1:
AddressAttemptRuntimeInput<ResponseType>["buildAddressLlmPredecomposeContractV1"];
sanitizeAddressMessageForFallback: AddressAttemptRuntimeInput<ResponseType>["sanitizeAddressMessageForFallback"];
toNonEmptyString: AddressAttemptRuntimeInput<ResponseType>["toNonEmptyString"];
resolveAddressFollowupCarryoverContext:
AddressAttemptRuntimeInput<ResponseType>["resolveAddressFollowupCarryoverContext"];
resolveAssistantOrchestrationDecision:
AddressAttemptRuntimeInput<ResponseType>["resolveAssistantOrchestrationDecision"];
buildAddressDialogContinuationContractV2:
AddressAttemptRuntimeInput<ResponseType>["buildAddressDialogContinuationContractV2"];
mergeFollowupContextWithOrganizationScope:
AddressAttemptRuntimeInput<ResponseType>["mergeFollowupContextWithOrganizationScope"];
isRetryableAddressLimitedResult: AddressAttemptRuntimeInput<ResponseType>["isRetryableAddressLimitedResult"];
mergeKnownOrganizations: AddressAttemptRuntimeInput<ResponseType>["mergeKnownOrganizations"];
hasAssistantDataScopeMetaQuestionSignal:
AddressAttemptRuntimeInput<ResponseType>["hasAssistantDataScopeMetaQuestionSignal"];
shouldHandleAsAssistantCapabilityMetaQuery:
AddressAttemptRuntimeInput<ResponseType>["shouldHandleAsAssistantCapabilityMetaQuery"];
hasDestructiveDataActionSignal: AddressAttemptRuntimeInput<ResponseType>["hasDestructiveDataActionSignal"];
hasDangerOrCoercionSignal: AddressAttemptRuntimeInput<ResponseType>["hasDangerOrCoercionSignal"];
hasOperationalAdminActionRequestSignal:
AddressAttemptRuntimeInput<ResponseType>["hasOperationalAdminActionRequestSignal"];
hasOrganizationFactLookupSignal: AddressAttemptRuntimeInput<ResponseType>["hasOrganizationFactLookupSignal"];
hasOrganizationFactFollowupSignal: AddressAttemptRuntimeInput<ResponseType>["hasOrganizationFactFollowupSignal"];
hasLivingChatSignal: AddressAttemptRuntimeInput<ResponseType>["hasLivingChatSignal"];
shouldEmitOrganizationSelectionReply:
AddressAttemptRuntimeInput<ResponseType>["shouldEmitOrganizationSelectionReply"];
hasAssistantCapabilityQuestionSignal:
AddressAttemptRuntimeInput<ResponseType>["hasAssistantCapabilityQuestionSignal"];
resolveDataScopeProbe: AddressAttemptRuntimeInput<ResponseType>["resolveDataScopeProbe"];
applyScriptGuard: AddressAttemptRuntimeInput<ResponseType>["applyScriptGuard"];
applyGroundingGuard: AddressAttemptRuntimeInput<ResponseType>["applyGroundingGuard"];
buildAssistantSafetyRefusalReply: AddressAttemptRuntimeInput<ResponseType>["buildAssistantSafetyRefusalReply"];
buildAssistantDataScopeContractReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantDataScopeContractReply"];
buildAssistantProactiveOrganizationOfferReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantProactiveOrganizationOfferReply"];
buildAssistantOrganizationFactBoundaryReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantOrganizationFactBoundaryReply"];
buildAssistantDataScopeSelectionReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantDataScopeSelectionReply"];
buildAssistantOperationalBoundaryReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantOperationalBoundaryReply"];
buildAssistantCapabilityContractReply:
AddressAttemptRuntimeInput<ResponseType>["buildAssistantCapabilityContractReply"];
loadAssistantCanonExcerpt: AddressAttemptRuntimeInput<ResponseType>["loadAssistantCanonExcerpt"];
sanitizeOutgoingAssistantText: AddressAttemptRuntimeInput<ResponseType>["sanitizeOutgoingAssistantText"];
buildAddressDebugPayload: AddressAttemptRuntimeInput<ResponseType>["buildAddressDebugPayload"];
buildAddressFollowupOffer: AddressAttemptRuntimeInput<ResponseType>["buildAddressFollowupOffer"];
buildFollowupStateBinding: DeepTurnAttemptRuntimeInput<ResponseType>["buildFollowupStateBinding"];
resolveBusinessScopeAlignment: DeepTurnAttemptRuntimeInput<ResponseType>["resolveBusinessScopeAlignment"];
inferP0DomainFromMessage: DeepTurnAttemptRuntimeInput<ResponseType>["inferP0DomainFromMessage"];
resolveBusinessScopeFromLiveContext: DeepTurnAttemptRuntimeInput<ResponseType>["resolveBusinessScopeFromLiveContext"];
extractRequirements: DeepTurnAttemptRuntimeInput<ResponseType>["extractRequirements"];
toExecutionPlan: DeepTurnAttemptRuntimeInput<ResponseType>["toExecutionPlan"];
enforceRbpLiveRoutePlan: DeepTurnAttemptRuntimeInput<ResponseType>["enforceRbpLiveRoutePlan"];
enforceFaLiveRoutePlan: DeepTurnAttemptRuntimeInput<ResponseType>["enforceFaLiveRoutePlan"];
mapNoRouteReason: DeepTurnAttemptRuntimeInput<ResponseType>["mapNoRouteReason"];
buildSkippedResult: DeepTurnAttemptRuntimeInput<ResponseType>["buildSkippedResult"];
evaluateCoverage: DeepTurnAttemptRuntimeInput<ResponseType>["evaluateCoverage"];
checkGrounding: DeepTurnAttemptRuntimeInput<ResponseType>["checkGrounding"];
collectRbpLiveRouteAudit: DeepTurnAttemptRuntimeInput<ResponseType>["collectRbpLiveRouteAudit"];
collectFaLiveRouteAudit: DeepTurnAttemptRuntimeInput<ResponseType>["collectFaLiveRouteAudit"];
hasExplicitPeriodAnchorFromNormalized: DeepTurnAttemptRuntimeInput<ResponseType>["hasExplicitPeriodAnchor"];
extractDroppedIntentSegments: DeepTurnAttemptRuntimeInput<ResponseType>["extractDroppedIntentSegments"];
toDebugRoutes: DeepTurnAttemptRuntimeInput<ResponseType>["buildDebugRoutes"];
extractExecutionState: DeepTurnAttemptRuntimeInput<ResponseType>["extractExecutionState"];
}
export function buildAssistantUserTurnBootstrapRuntimeInput(
payload: AssistantUserTurnBootstrapPayloadLike,
deps: AssistantTurnRuntimeBuilderDeps
): RunAssistantUserTurnBootstrapRuntimeInput {
return {
payload,
ensureSession: deps.ensureSession,
appendItem: deps.appendItem,
getSession: deps.getSession,
persistSession: deps.persistSession,
compactWhitespace: deps.compactWhitespace,
repairAddressMojibake: deps.repairAddressMojibake,
resolveRuntimeAnalysisContext: deps.resolveRuntimeAnalysisContext,
messageIdFactory: deps.messageIdFactory,
nowIso: deps.nowIso
};
}
export function buildAssistantAddressAttemptRuntimeInput<ResponseType = unknown>(
runtimeInput: RunAssistantTurnAttemptRuntimeAddressInput<AddressAttemptRuntimeInput<ResponseType>["payload"]>,
deps: AssistantTurnRuntimeBuilderDeps<ResponseType>
): RunAssistantAddressAttemptRuntimeInput<ResponseType> {
return {
featureAssistantAddressQueryV1: deps.featureAssistantAddressQueryV1,
sessionId: runtimeInput.sessionId,
userMessage: runtimeInput.userMessage,
sessionItems: runtimeInput.sessionItems,
sessionAddressNavigationState: runtimeInput.sessionAddressNavigationState,
payload: runtimeInput.payload,
sessionScope: {
knownOrganizations: runtimeInput.sessionOrganizationScope.knownOrganizations,
selectedOrganization: runtimeInput.sessionOrganizationScope.selectedOrganization,
activeOrganization: runtimeInput.sessionOrganizationScope.activeOrganization
},
featureAddressLlmPredecomposeV1: deps.featureAddressLlmPredecomposeV1,
runAddressLlmPreDecompose: async () => deps.runAddressLlmPreDecompose(runtimeInput.payload, runtimeInput.userMessage),
buildAddressLlmPredecomposeContractV1: deps.buildAddressLlmPredecomposeContractV1,
sanitizeAddressMessageForFallback: deps.sanitizeAddressMessageForFallback,
toNonEmptyString: deps.toNonEmptyString,
resolveAddressFollowupCarryoverContext: deps.resolveAddressFollowupCarryoverContext,
resolveAssistantOrchestrationDecision: deps.resolveAssistantOrchestrationDecision,
buildAddressDialogContinuationContractV2: deps.buildAddressDialogContinuationContractV2,
runtimeAnalysisContextAsOfDate: runtimeInput.runtimeAnalysisContext.as_of_date,
compactWhitespace: deps.compactWhitespace,
mergeFollowupContextWithOrganizationScope: deps.mergeFollowupContextWithOrganizationScope,
runAddressQueryTryHandle: deps.tryAddressQueryHandle,
isRetryableAddressLimitedResult: deps.isRetryableAddressLimitedResult,
mergeKnownOrganizations: deps.mergeKnownOrganizations,
hasAssistantDataScopeMetaQuestionSignal: deps.hasAssistantDataScopeMetaQuestionSignal,
shouldHandleAsAssistantCapabilityMetaQuery: deps.shouldHandleAsAssistantCapabilityMetaQuery,
hasDestructiveDataActionSignal: deps.hasDestructiveDataActionSignal,
hasDangerOrCoercionSignal: deps.hasDangerOrCoercionSignal,
hasOperationalAdminActionRequestSignal: deps.hasOperationalAdminActionRequestSignal,
hasOrganizationFactLookupSignal: deps.hasOrganizationFactLookupSignal,
hasOrganizationFactFollowupSignal: deps.hasOrganizationFactFollowupSignal,
hasLivingChatSignal: deps.hasLivingChatSignal,
shouldEmitOrganizationSelectionReply: deps.shouldEmitOrganizationSelectionReply,
hasAssistantCapabilityQuestionSignal: deps.hasAssistantCapabilityQuestionSignal,
resolveDataScopeProbe: deps.resolveDataScopeProbe,
applyScriptGuard: deps.applyScriptGuard,
applyGroundingGuard: deps.applyGroundingGuard,
buildAssistantSafetyRefusalReply: deps.buildAssistantSafetyRefusalReply,
buildAssistantDataScopeContractReply: deps.buildAssistantDataScopeContractReply,
buildAssistantProactiveOrganizationOfferReply: deps.buildAssistantProactiveOrganizationOfferReply,
buildAssistantOrganizationFactBoundaryReply: deps.buildAssistantOrganizationFactBoundaryReply,
buildAssistantDataScopeSelectionReply: deps.buildAssistantDataScopeSelectionReply,
buildAssistantOperationalBoundaryReply: deps.buildAssistantOperationalBoundaryReply,
buildAssistantCapabilityContractReply: deps.buildAssistantCapabilityContractReply,
chatClient: deps.chatClient,
loadAssistantCanonExcerpt: deps.loadAssistantCanonExcerpt,
sanitizeOutgoingAssistantText: deps.sanitizeOutgoingAssistantText,
defaultModel: deps.defaultModel,
defaultBaseUrl: deps.defaultBaseUrl,
defaultApiKey: deps.defaultApiKey,
buildAddressDebugPayload: deps.buildAddressDebugPayload,
buildAddressFollowupOffer: deps.buildAddressFollowupOffer,
appendItem: deps.appendItem,
getSession: deps.getSession,
persistSession: deps.persistSession,
cloneConversation: (items) => items.map((item) => ({ ...item })),
logEvent: deps.logEvent,
messageIdFactory: deps.messageIdFactory,
nowIso: deps.nowIso
};
}
export function buildAssistantDeepTurnAttemptRuntimeInput<ResponseType = unknown>(
runtimeInput: RunAssistantTurnAttemptRuntimeDeepInput<DeepTurnAttemptRuntimeInput<ResponseType>["payload"]> & {
runtimeAnalysisContext: DeepTurnAttemptRuntimeInput<ResponseType>["runtimeAnalysisContext"];
sessionInvestigationState: DeepTurnAttemptRuntimeInput<ResponseType>["sessionInvestigationState"];
},
deps: AssistantTurnRuntimeBuilderDeps<ResponseType>
): RunAssistantDeepTurnAttemptRuntimeInput<ResponseType> {
return {
sessionId: runtimeInput.sessionId,
questionId: runtimeInput.questionId,
userMessage: runtimeInput.userMessage,
payload: runtimeInput.payload,
runtimeAnalysisContext: runtimeInput.runtimeAnalysisContext,
sessionInvestigationState: runtimeInput.sessionInvestigationState,
addressRuntimeMetaForDeep: runtimeInput.addressRuntimeMetaForDeep,
featureInvestigationStateV1: deps.featureInvestigationStateV1,
featureStateFollowupBindingV1: deps.featureStateFollowupBindingV1,
featureContractsV11: deps.featureContractsV11,
featureAnswerPolicyV11: deps.featureAnswerPolicyV11,
featureProblemCentricAnswerV1: deps.featureProblemCentricAnswerV1,
featureLifecycleAnswerV1: deps.featureLifecycleAnswerV1,
buildFollowupStateBinding: deps.buildFollowupStateBinding,
normalize: deps.normalize,
resolveBusinessScopeAlignment: deps.resolveBusinessScopeAlignment,
inferP0DomainFromMessage: deps.inferP0DomainFromMessage,
resolveBusinessScopeFromLiveContext: deps.resolveBusinessScopeFromLiveContext,
extractRequirements: deps.extractRequirements,
toExecutionPlan: deps.toExecutionPlan,
enforceRbpLiveRoutePlan: deps.enforceRbpLiveRoutePlan,
enforceFaLiveRoutePlan: deps.enforceFaLiveRoutePlan,
executeRouteRuntime: deps.executeRouteRuntime,
mapNoRouteReason: deps.mapNoRouteReason,
buildSkippedResult: deps.buildSkippedResult,
evaluateCoverage: deps.evaluateCoverage,
checkGrounding: deps.checkGrounding,
collectRbpLiveRouteAudit: deps.collectRbpLiveRouteAudit,
collectFaLiveRouteAudit: deps.collectFaLiveRouteAudit,
hasExplicitPeriodAnchor: deps.hasExplicitPeriodAnchorFromNormalized,
extractDroppedIntentSegments: deps.extractDroppedIntentSegments,
buildDebugRoutes: deps.toDebugRoutes,
extractExecutionState: deps.extractExecutionState,
sanitizeReply: deps.sanitizeOutgoingAssistantText,
persistInvestigationState: deps.setInvestigationState,
messageIdFactory: deps.messageIdFactory,
appendItem: deps.appendItem,
getSession: deps.getSession,
persistSession: deps.persistSession,
cloneConversation: (items) => items.map((item) => ({ ...item })),
logEvent: deps.logEvent
};
}