NODEDC_1C/llm_normalizer/backend/src/services/assistantDeepTurnPackagingR...

220 lines
11 KiB
TypeScript

import { nanoid } from "nanoid";
import type {
AssistantAddressRuntimeMetaForDeep,
AssistantConversationItem,
AssistantDebugPayload,
AssistantDebugRouteRecord,
AssistantExecutionStateRecord,
AssistantRequirement,
AnswerGroundingCheck,
FaLiveRouteAuditDebug,
RbpLiveRouteAuditDebug,
RequirementCoverageReport,
UnifiedRetrievalResult
} from "../types/assistant";
import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer";
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
import type { AssistantDeepTurnInputBuilderArgs } from "./assistantDeepTurnInputBuilder";
import { buildAssistantDeepTurnPackagingInput } from "./assistantDeepTurnInputBuilder";
import { assembleAssistantDeepTurnPackaging } from "./assistantDeepTurnPackaging";
import type { AssistantFollowupUsage } from "./assistantFollowupUsage";
import type { ClaimBoundAnchorAudit, TargetedEvidenceAcquisitionAudit } from "./assistantClaimBoundEvidence";
import type { CompanyAnchorSet } from "./companyAnchorResolver";
import type {
DomainPolarityGuardAudit,
EvidenceAdmissibilityAudit,
GroundedAnswerEligibilityAudit,
TemporalGuardAudit
} from "./assistantRuntimeGuards";
import type {
AssistantRetrievalCallRecord,
AssistantRetrievalRawResultRecord
} from "./assistantDeepTurnRetrievalRuntimeAdapter";
import type {
AssistantAnalysisContextForContract,
AssistantRuntimeAnalysisContextForPrePackaging
} from "./assistantDeepTurnPrePackagingContext";
import { buildAssistantDeepTurnPrePackagingContext } from "./assistantDeepTurnPrePackagingContext";
import {
buildAssistantInvestigationStateSnapshot,
persistAssistantInvestigationStateSnapshot
} from "./assistantInvestigationStateRuntimeAdapter";
import type { DeepAnalysisLogDetails } from "./assistantMessageLogAssembler";
type AssistantDeepTurnCompositionForPackaging = AssistantDeepTurnInputBuilderArgs["composition"] & {
assistant_reply: string;
};
export interface AssistantDeepTurnPackagingRuntimeInput {
featureInvestigationStateV1: boolean;
sessionId: string;
questionId: string;
userMessage: string;
normalized: {
trace_id: string;
prompt_version: string;
schema_version: string;
normalized: NormalizeResponsePayload["normalized"];
};
normalizedQuestion: string;
routeSummary: RouteHintSummary | null;
executionPlan: AssistantDeepTurnInputBuilderArgs["executionPlan"];
requirementExtractionRequirements: AssistantRequirement[];
coverageEvaluationRequirements: AssistantRequirement[];
coverageReport: RequirementCoverageReport;
groundingCheck: AnswerGroundingCheck;
retrievalCalls: AssistantRetrievalCallRecord[];
retrievalResultsRaw: AssistantRetrievalRawResultRecord[];
retrievalResults: UnifiedRetrievalResult[];
questionTypeClass: string;
companyAnchors: CompanyAnchorSet | null;
runtimeAnalysisContext: AssistantDeepTurnInputBuilderArgs["runtimeAnalysisContext"];
businessScopeResolution: AssistantDeepTurnInputBuilderArgs["businessScopeResolution"];
temporalGuard: TemporalGuardAudit;
polarityAudit: DomainPolarityGuardAudit;
claimAnchorAudit: ClaimBoundAnchorAudit;
targetedEvidenceAudit: TargetedEvidenceAcquisitionAudit;
evidenceAdmissibilityGateAudit: EvidenceAdmissibilityAudit;
rbpLiveRouteAudit: RbpLiveRouteAuditDebug | null;
faLiveRouteAudit: FaLiveRouteAuditDebug | null;
groundedAnswerEligibilityGuard: GroundedAnswerEligibilityAudit;
followupStateUsage?: AssistantFollowupUsage | null;
followupApplied: boolean;
composition: AssistantDeepTurnCompositionForPackaging;
featureContractsV11: boolean;
featureAnswerPolicyV11: boolean;
previousInvestigationState: InvestigationStateWithProblemUnits | null | undefined;
addressRuntimeMetaForDeep: AssistantAddressRuntimeMetaForDeep | null | undefined;
extractDroppedIntentSegments: (normalizedPayload: NormalizeResponsePayload["normalized"]) => string[];
buildDebugRoutes: (routeSummary: RouteHintSummary | null) => AssistantDebugRouteRecord[];
extractExecutionState: (normalizedPayload: NormalizeResponsePayload["normalized"]) => AssistantExecutionStateRecord[];
sanitizeReply: (value: string, fallback?: string) => string;
persistInvestigationState: (sessionId: string, snapshot: InvestigationStateWithProblemUnits) => void;
nowIso?: () => string;
messageIdFactory?: () => string;
buildPrePackagingContextFn?: typeof buildAssistantDeepTurnPrePackagingContext;
buildInvestigationStateSnapshotFn?: typeof buildAssistantInvestigationStateSnapshot;
persistInvestigationStateSnapshotFn?: typeof persistAssistantInvestigationStateSnapshot;
buildDeepTurnPackagingInputFn?: typeof buildAssistantDeepTurnPackagingInput;
assembleDeepTurnPackagingFn?: typeof assembleAssistantDeepTurnPackaging;
}
export interface AssistantDeepTurnPackagingRuntimeOutput {
messageId: string;
investigationStateSnapshot: InvestigationStateWithProblemUnits | null;
droppedIntentSegments: string[];
analysisContextForContract: AssistantAnalysisContextForContract | null;
routesForDebug: AssistantDebugRouteRecord[];
resolvedExecutionState: AssistantExecutionStateRecord[];
safeAssistantReplyBase: string;
safeAssistantReply: string;
debug: AssistantDebugPayload;
assistantItem: AssistantConversationItem;
deepAnalysisLogDetails: DeepAnalysisLogDetails;
}
export function runAssistantDeepTurnPackagingRuntime(
input: AssistantDeepTurnPackagingRuntimeInput
): AssistantDeepTurnPackagingRuntimeOutput {
const buildPrePackagingContextSafe = input.buildPrePackagingContextFn ?? buildAssistantDeepTurnPrePackagingContext;
const buildInvestigationStateSnapshotSafe =
input.buildInvestigationStateSnapshotFn ?? buildAssistantInvestigationStateSnapshot;
const persistInvestigationStateSnapshotSafe =
input.persistInvestigationStateSnapshotFn ?? persistAssistantInvestigationStateSnapshot;
const buildDeepTurnPackagingInputSafe = input.buildDeepTurnPackagingInputFn ?? buildAssistantDeepTurnPackagingInput;
const assembleDeepTurnPackagingSafe = input.assembleDeepTurnPackagingFn ?? assembleAssistantDeepTurnPackaging;
const deepTurnPrePackagingContext = buildPrePackagingContextSafe({
normalizedPayload: input.normalized.normalized,
routeSummary: input.routeSummary,
runtimeAnalysisContext: input.runtimeAnalysisContext as AssistantRuntimeAnalysisContextForPrePackaging,
assistantReply: input.composition.assistant_reply,
extractDroppedIntentSegments: input.extractDroppedIntentSegments,
buildDebugRoutes: input.buildDebugRoutes,
extractExecutionState: input.extractExecutionState,
sanitizeReply: input.sanitizeReply
});
const investigationStateSnapshot = buildInvestigationStateSnapshotSafe({
featureEnabled: input.featureInvestigationStateV1,
previousState: input.previousInvestigationState,
timestamp: input.nowIso ? input.nowIso() : new Date().toISOString(),
questionId: input.questionId,
userMessage: input.userMessage,
routeSummary: input.routeSummary,
requirements: input.coverageEvaluationRequirements,
coverageReport: input.coverageReport,
retrievalResults: input.retrievalResults,
replyType: input.composition.reply_type,
followupApplied: input.followupApplied
});
persistInvestigationStateSnapshotSafe({
featureEnabled: input.featureInvestigationStateV1,
sessionId: input.sessionId,
snapshot: investigationStateSnapshot,
persist: input.persistInvestigationState
});
const messageId = input.messageIdFactory ? input.messageIdFactory() : `msg-${nanoid(10)}`;
const deepTurnPackagingInput = buildDeepTurnPackagingInputSafe({
sessionId: input.sessionId,
messageId,
userMessage: input.userMessage,
normalized: input.normalized,
normalizedQuestion: input.normalizedQuestion,
routeSummary: input.routeSummary,
droppedIntentSegments: deepTurnPrePackagingContext.droppedIntentSegments,
analysisContextForContract: deepTurnPrePackagingContext.analysisContextForContract,
executionPlan: input.executionPlan,
requirementExtractionRequirements: input.requirementExtractionRequirements,
coverageEvaluationRequirements: input.coverageEvaluationRequirements,
coverageReport: input.coverageReport,
groundingCheck: input.groundingCheck,
retrievalCalls: input.retrievalCalls,
retrievalResultsRaw: input.retrievalResultsRaw,
retrievalResults: input.retrievalResults,
routesForDebug: deepTurnPrePackagingContext.routesForDebug,
resolvedExecutionState: deepTurnPrePackagingContext.resolvedExecutionState,
questionTypeClass: input.questionTypeClass,
companyAnchors: input.companyAnchors,
runtimeAnalysisContext: input.runtimeAnalysisContext,
businessScopeResolution: input.businessScopeResolution,
temporalGuard: input.temporalGuard,
polarityAudit: input.polarityAudit,
claimAnchorAudit: input.claimAnchorAudit,
targetedEvidenceAudit: input.targetedEvidenceAudit,
evidenceAdmissibilityGateAudit: input.evidenceAdmissibilityGateAudit,
rbpLiveRouteAudit: input.rbpLiveRouteAudit,
faLiveRouteAudit: input.faLiveRouteAudit,
groundedAnswerEligibilityGuard: input.groundedAnswerEligibilityGuard,
followupStateUsage: input.followupStateUsage,
composition: {
reply_type: input.composition.reply_type,
fallback_type: input.composition.fallback_type,
answer_structure_v11: input.composition.answer_structure_v11,
problem_centric_answer_applied: input.composition.problem_centric_answer_applied,
problem_units_used_count: input.composition.problem_units_used_count,
problem_answer_mode: input.composition.problem_answer_mode,
problem_unit_ids_used: input.composition.problem_unit_ids_used
},
safeAssistantReplyBase: deepTurnPrePackagingContext.safeAssistantReplyBase,
featureContractsV11: input.featureContractsV11,
featureAnswerPolicyV11: input.featureAnswerPolicyV11,
investigationStateSnapshot,
addressRuntimeMetaForDeep: input.addressRuntimeMetaForDeep
});
const deepTurnPackaging = assembleDeepTurnPackagingSafe(deepTurnPackagingInput);
return {
messageId,
investigationStateSnapshot,
droppedIntentSegments: deepTurnPrePackagingContext.droppedIntentSegments,
analysisContextForContract: deepTurnPrePackagingContext.analysisContextForContract,
routesForDebug: deepTurnPrePackagingContext.routesForDebug,
resolvedExecutionState: deepTurnPrePackagingContext.resolvedExecutionState,
safeAssistantReplyBase: deepTurnPrePackagingContext.safeAssistantReplyBase,
safeAssistantReply: deepTurnPackaging.deepAnswerArtifacts.safeAssistantReply,
debug: deepTurnPackaging.debug,
assistantItem: deepTurnPackaging.assistantItem,
deepAnalysisLogDetails: deepTurnPackaging.deepAnalysisLogDetails
};
}