ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.85 - 2.88 - Убран последний as any из backend/src и довел тип debug до конца цепочки deep-turn
This commit is contained in:
parent
dedf193542
commit
966be04af9
|
|
@ -1920,7 +1920,61 @@ Validation:
|
||||||
- `assistantDeepTurnResponseAttemptRuntimeAdapter.test.ts`
|
- `assistantDeepTurnResponseAttemptRuntimeAdapter.test.ts`
|
||||||
- `assistantDeepTurnAttemptRuntimeAdapter.test.ts`
|
- `assistantDeepTurnAttemptRuntimeAdapter.test.ts`
|
||||||
|
|
||||||
Status: **In progress (Phase 2.1 + 2.2 + 2.3 + 2.4 + 2.5 + 2.6 + 2.7 + 2.8 + 2.9 + 2.10 + 2.11 + 2.12 + 2.13 + 2.14 + 2.15 + 2.16 + 2.17 + 2.18 + 2.19 + 2.20 + 2.21 + 2.22 + 2.23 + 2.24 + 2.25 + 2.26 + 2.27 + 2.28 + 2.29 + 2.30 + 2.31 + 2.32 + 2.33 + 2.34 + 2.35 + 2.36 + 2.37 + 2.38 + 2.39 + 2.40 + 2.41 + 2.42 + 2.43 + 2.44 + 2.45 + 2.46 + 2.47 + 2.48 + 2.49 + 2.50 + 2.51 + 2.52 + 2.53 + 2.54 + 2.55 + 2.56 + 2.57 + 2.58 + 2.59 + 2.60 + 2.61 + 2.62 + 2.63 + 2.64 + 2.65 + 2.66 + 2.67 + 2.68 + 2.69 + 2.70 + 2.71 + 2.72 + 2.73 + 2.74 + 2.75 + 2.76 + 2.77 + 2.78 + 2.79 + 2.80 completed)**
|
Implemented in current pass (Phase 2.81 + 2.82 + 2.83 + 2.84):
|
||||||
|
1. Removed remaining unsafe casts from deep analysis-attempt input builder:
|
||||||
|
- `assistantDeepTurnAnalysisAttemptInputBuilder.ts`
|
||||||
|
- added typed adapters/normalizers for:
|
||||||
|
- temporal/polarity/claim-bound resolver bridges;
|
||||||
|
- focus-domain narrowing for guard pipeline;
|
||||||
|
- company-anchor and primary-period normalization;
|
||||||
|
- runtime callback mapping (`context -> plan -> retrieval -> guard -> grounding -> composition`) without `as any`.
|
||||||
|
2. Hardened deep analysis runtime contracts:
|
||||||
|
- `assistantDeepTurnAnalysisRuntimeAdapter.ts`
|
||||||
|
- replaced broad unknown execution-plan/guard/grounding signatures with concrete typed contracts (`AssistantExecutionPlanItem`, guard and grounding slices).
|
||||||
|
3. Hardened deep context contracts for guard chain compatibility:
|
||||||
|
- `assistantDeepTurnContextRuntimeAdapter.ts`
|
||||||
|
- aligned temporal/polarity/claim-bound outputs with concrete audits;
|
||||||
|
- aligned `liveTemporalHint` with retrieval runtime contract.
|
||||||
|
4. Removed remaining unsafe casts from grounding and composition runtime adapters:
|
||||||
|
- `assistantDeepTurnGroundingRuntimeAdapter.ts`
|
||||||
|
- `assistantDeepTurnCompositionRuntimeAdapter.ts`
|
||||||
|
- replaced generic cast-based defaults with typed defaults and normalized company-anchor handoff into answer composer.
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
1. `npm run build` passed.
|
||||||
|
2. Targeted deep analysis/grounding/composition pack passed:
|
||||||
|
- `assistantDeepTurnAnalysisAttemptInputBuilder.test.ts`
|
||||||
|
- `assistantDeepTurnAnalysisRuntimeAdapter.test.ts`
|
||||||
|
- `assistantDeepTurnAnalysisAttemptRuntimeAdapter.test.ts`
|
||||||
|
- `assistantDeepTurnGroundingRuntimeAdapter.test.ts`
|
||||||
|
- `assistantDeepTurnCompositionRuntimeAdapter.test.ts`
|
||||||
|
- `assistantDeepTurnAttemptRuntimeAdapter.test.ts`
|
||||||
|
|
||||||
|
Implemented in current pass (Phase 2.85 + 2.86 + 2.87 + 2.88):
|
||||||
|
1. Removed the final `as any` from backend source deep-turn packaging path:
|
||||||
|
- `assistantDeepTurnPackaging.ts`
|
||||||
|
- switched assistant-item debug handoff to strongly typed payload contract.
|
||||||
|
2. Hardened debug payload contract at assembly boundary:
|
||||||
|
- `assistantDebugPayloadAssembler.ts`
|
||||||
|
- `buildDeepAnalysisDebugPayload(...)` now returns `AssistantDebugPayload` contract.
|
||||||
|
3. Propagated typed debug payload through deep-turn runtime chain:
|
||||||
|
- `assistantDeepTurnPackagingRuntimeAdapter.ts`
|
||||||
|
- `assistantDeepTurnResponseRuntimeAdapter.ts`
|
||||||
|
- `assistantDeepTurnResponseAttemptRuntimeAdapter.ts`
|
||||||
|
- `assistantDeepTurnAttemptRuntimeAdapter.ts`
|
||||||
|
- aligned `debug` field contracts to `AssistantDebugPayload` and fixed generic runtime callback typing so `ResponseType` remains preserved end-to-end.
|
||||||
|
4. Preserved behavior:
|
||||||
|
- no runtime logic change; only contract tightening for debug payload propagation and generic signature alignment.
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
1. `npm run build` passed.
|
||||||
|
2. Targeted deep packaging/response chain pack passed:
|
||||||
|
- `assistantDeepTurnPackaging.test.ts`
|
||||||
|
- `assistantDeepTurnPackagingRuntimeAdapter.test.ts`
|
||||||
|
- `assistantDeepTurnResponseAttemptRuntimeAdapter.test.ts`
|
||||||
|
- `assistantDeepTurnAttemptRuntimeAdapter.test.ts`
|
||||||
|
|
||||||
|
Status: **In progress (Phase 2.1 + 2.2 + 2.3 + 2.4 + 2.5 + 2.6 + 2.7 + 2.8 + 2.9 + 2.10 + 2.11 + 2.12 + 2.13 + 2.14 + 2.15 + 2.16 + 2.17 + 2.18 + 2.19 + 2.20 + 2.21 + 2.22 + 2.23 + 2.24 + 2.25 + 2.26 + 2.27 + 2.28 + 2.29 + 2.30 + 2.31 + 2.32 + 2.33 + 2.34 + 2.35 + 2.36 + 2.37 + 2.38 + 2.39 + 2.40 + 2.41 + 2.42 + 2.43 + 2.44 + 2.45 + 2.46 + 2.47 + 2.48 + 2.49 + 2.50 + 2.51 + 2.52 + 2.53 + 2.54 + 2.55 + 2.56 + 2.57 + 2.58 + 2.59 + 2.60 + 2.61 + 2.62 + 2.63 + 2.64 + 2.65 + 2.66 + 2.67 + 2.68 + 2.69 + 2.70 + 2.71 + 2.72 + 2.73 + 2.74 + 2.75 + 2.76 + 2.77 + 2.78 + 2.79 + 2.80 + 2.81 + 2.82 + 2.83 + 2.84 + 2.85 + 2.86 + 2.87 + 2.88 completed)**
|
||||||
|
|
||||||
## Stage 3 (P2): Hybrid Semantic Layer (LLM + Deterministic Guards)
|
## Stage 3 (P2): Hybrid Semantic Layer (LLM + Deterministic Guards)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,88 @@ exports.buildAssistantDeepTurnAnalysisRuntimeInput = buildAssistantDeepTurnAnaly
|
||||||
const companyAnchorResolver_1 = require("./companyAnchorResolver");
|
const companyAnchorResolver_1 = require("./companyAnchorResolver");
|
||||||
const assistantRuntimeGuards_1 = require("./assistantRuntimeGuards");
|
const assistantRuntimeGuards_1 = require("./assistantRuntimeGuards");
|
||||||
const assistantClaimBoundEvidence_1 = require("./assistantClaimBoundEvidence");
|
const assistantClaimBoundEvidence_1 = require("./assistantClaimBoundEvidence");
|
||||||
|
const KNOWN_GUARD_DOMAINS = [
|
||||||
|
"settlements_60_62",
|
||||||
|
"vat_document_register_book",
|
||||||
|
"month_close_costs_20_44",
|
||||||
|
"fixed_asset_amortization"
|
||||||
|
];
|
||||||
|
function toRecordObject(value) {
|
||||||
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function toStringArray(value) {
|
||||||
|
if (!Array.isArray(value)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
.map((item) => (typeof item === "string" ? item.trim() : ""))
|
||||||
|
.filter((item) => item.length > 0);
|
||||||
|
}
|
||||||
|
function toCompanyAnchorSet(value) {
|
||||||
|
const source = toRecordObject(value);
|
||||||
|
if (!source) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
contract_numbers: toStringArray(source.contract_numbers),
|
||||||
|
document_numbers: toStringArray(source.document_numbers),
|
||||||
|
dates: toStringArray(source.dates),
|
||||||
|
amounts: toStringArray(source.amounts),
|
||||||
|
accounts: toStringArray(source.accounts),
|
||||||
|
periods: toStringArray(source.periods),
|
||||||
|
document_types: toStringArray(source.document_types),
|
||||||
|
all: toStringArray(source.all)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function toClaimBoundPrimaryPeriod(value) {
|
||||||
|
const source = toRecordObject(value);
|
||||||
|
if (!source) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const from = typeof source.from === "string" ? source.from.trim() : "";
|
||||||
|
const to = typeof source.to === "string" ? source.to.trim() : "";
|
||||||
|
const granularity = source.granularity === "day" || source.granularity === "month" ? source.granularity : null;
|
||||||
|
if (!from || !to || !granularity) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
from,
|
||||||
|
to,
|
||||||
|
granularity
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function normalizeFocusDomainForGuards(value) {
|
||||||
|
const normalized = typeof value === "string" ? value.trim() : "";
|
||||||
|
if (!normalized) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (KNOWN_GUARD_DOMAINS.includes(normalized)) {
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const resolveTemporalGuardAdapter = (input) => (0, assistantRuntimeGuards_1.resolveTemporalGuard)({
|
||||||
|
userMessage: input.userMessage,
|
||||||
|
normalized: input.normalized,
|
||||||
|
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
|
||||||
|
analysisContext: input.analysisContext
|
||||||
|
});
|
||||||
|
const resolveDomainPolarityGuardAdapter = (input) => (0, assistantRuntimeGuards_1.resolveDomainPolarityGuard)({
|
||||||
|
userMessage: input.userMessage,
|
||||||
|
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
|
||||||
|
focusDomainHint: input.focusDomainHint
|
||||||
|
});
|
||||||
|
const resolveClaimBoundAnchorsAdapter = (input) => (0, assistantClaimBoundEvidence_1.resolveClaimBoundAnchors)({
|
||||||
|
userMessage: input.userMessage,
|
||||||
|
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
|
||||||
|
focusDomainHint: input.focusDomainHint,
|
||||||
|
primaryPeriod: toClaimBoundPrimaryPeriod(input.primaryPeriod)
|
||||||
|
});
|
||||||
|
const applyTemporalHintToExecutionPlanAdapter = (executionPlan, temporalGuard) => (0, assistantRuntimeGuards_1.applyTemporalHintToExecutionPlan)(executionPlan, temporalGuard);
|
||||||
|
const applyPolarityHintToExecutionPlanAdapter = (executionPlan, domainPolarityGuardInitial) => (0, assistantRuntimeGuards_1.applyPolarityHintToExecutionPlan)(executionPlan, domainPolarityGuardInitial);
|
||||||
function buildAssistantDeepTurnContextRuntimeInput(input) {
|
function buildAssistantDeepTurnContextRuntimeInput(input) {
|
||||||
return {
|
return {
|
||||||
userMessage: input.userMessage,
|
userMessage: input.userMessage,
|
||||||
|
|
@ -20,9 +102,9 @@ function buildAssistantDeepTurnContextRuntimeInput(input) {
|
||||||
resolveCompanyAnchors: companyAnchorResolver_1.resolveCompanyAnchors,
|
resolveCompanyAnchors: companyAnchorResolver_1.resolveCompanyAnchors,
|
||||||
resolveBusinessScopeAlignment: input.resolveBusinessScopeAlignment,
|
resolveBusinessScopeAlignment: input.resolveBusinessScopeAlignment,
|
||||||
inferP0DomainFromMessage: input.inferP0DomainFromMessage,
|
inferP0DomainFromMessage: input.inferP0DomainFromMessage,
|
||||||
resolveTemporalGuard: assistantRuntimeGuards_1.resolveTemporalGuard,
|
resolveTemporalGuard: resolveTemporalGuardAdapter,
|
||||||
resolveDomainPolarityGuard: assistantRuntimeGuards_1.resolveDomainPolarityGuard,
|
resolveDomainPolarityGuard: resolveDomainPolarityGuardAdapter,
|
||||||
resolveClaimBoundAnchors: assistantClaimBoundEvidence_1.resolveClaimBoundAnchors,
|
resolveClaimBoundAnchors: resolveClaimBoundAnchorsAdapter,
|
||||||
resolveBusinessScopeFromLiveContext: input.resolveBusinessScopeFromLiveContext
|
resolveBusinessScopeFromLiveContext: input.resolveBusinessScopeFromLiveContext
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -38,8 +120,8 @@ function buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime) {
|
||||||
toExecutionPlan: input.toExecutionPlan,
|
toExecutionPlan: input.toExecutionPlan,
|
||||||
enforceRbpLiveRoutePlan: input.enforceRbpLiveRoutePlan,
|
enforceRbpLiveRoutePlan: input.enforceRbpLiveRoutePlan,
|
||||||
enforceFaLiveRoutePlan: input.enforceFaLiveRoutePlan,
|
enforceFaLiveRoutePlan: input.enforceFaLiveRoutePlan,
|
||||||
applyTemporalHintToExecutionPlan: assistantRuntimeGuards_1.applyTemporalHintToExecutionPlan,
|
applyTemporalHintToExecutionPlan: applyTemporalHintToExecutionPlanAdapter,
|
||||||
applyPolarityHintToExecutionPlan: assistantRuntimeGuards_1.applyPolarityHintToExecutionPlan
|
applyPolarityHintToExecutionPlan: applyPolarityHintToExecutionPlanAdapter
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
function buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime) {
|
function buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime) {
|
||||||
|
|
@ -57,8 +139,8 @@ function buildAssistantDeepTurnGuardRuntimeInput(runtime) {
|
||||||
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
|
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
|
||||||
claimAnchorAudit: runtime.claimAnchorAudit,
|
claimAnchorAudit: runtime.claimAnchorAudit,
|
||||||
temporalGuard: runtime.temporalGuard,
|
temporalGuard: runtime.temporalGuard,
|
||||||
focusDomainForGuards: runtime.focusDomainForGuards,
|
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
|
||||||
companyAnchors: runtime.companyAnchors,
|
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
|
||||||
userMessage: runtime.userMessage
|
userMessage: runtime.userMessage
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -72,7 +154,7 @@ function buildAssistantDeepTurnGroundingRuntimeInput(input, runtime) {
|
||||||
normalizedPayload: input.normalizedPayload,
|
normalizedPayload: input.normalizedPayload,
|
||||||
userMessage: input.userMessage,
|
userMessage: input.userMessage,
|
||||||
requirementExtraction: runtime.requirementExtraction,
|
requirementExtraction: runtime.requirementExtraction,
|
||||||
extractRequirements: input.extractRequirements,
|
extractRequirements: (routeSummary, normalized, userMessage) => input.extractRequirements(routeSummary, normalized ?? null, userMessage),
|
||||||
evaluateCoverage: input.evaluateCoverage,
|
evaluateCoverage: input.evaluateCoverage,
|
||||||
checkGrounding: input.checkGrounding,
|
checkGrounding: input.checkGrounding,
|
||||||
temporalGuard: runtime.temporalGuard,
|
temporalGuard: runtime.temporalGuard,
|
||||||
|
|
@ -106,8 +188,28 @@ function buildAssistantDeepTurnCompositionRuntimeInput(input, runtime) {
|
||||||
function buildAssistantDeepTurnAnalysisRuntimeInput(input) {
|
function buildAssistantDeepTurnAnalysisRuntimeInput(input) {
|
||||||
return {
|
return {
|
||||||
userMessage: input.userMessage,
|
userMessage: input.userMessage,
|
||||||
runContextRuntime: () => input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input)),
|
runContextRuntime: () => {
|
||||||
runExecutionPlanRuntime: (runtime) => input.runDeepTurnPlanRuntimeSafe(buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime)),
|
const runtime = input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input));
|
||||||
|
return {
|
||||||
|
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
|
||||||
|
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
|
||||||
|
temporalGuard: runtime.temporalGuard,
|
||||||
|
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
|
||||||
|
claimAnchorAudit: runtime.claimAnchorAudit,
|
||||||
|
businessScopeResolution: runtime.businessScopeResolution,
|
||||||
|
resolvedRouteSummary: runtime.resolvedRouteSummary,
|
||||||
|
liveTemporalHint: runtime.liveTemporalHint
|
||||||
|
};
|
||||||
|
},
|
||||||
|
runExecutionPlanRuntime: (runtime) => {
|
||||||
|
const output = input.runDeepTurnPlanRuntimeSafe(buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime));
|
||||||
|
return {
|
||||||
|
requirementExtraction: output.requirementExtraction,
|
||||||
|
executionPlan: output.executionPlan,
|
||||||
|
rbpRoutePlanEnforcement: output.rbpRoutePlanEnforcement,
|
||||||
|
faRoutePlanEnforcement: output.faRoutePlanEnforcement
|
||||||
|
};
|
||||||
|
},
|
||||||
runRetrievalRuntime: (runtime) => input.runDeepTurnRetrievalRuntimeSafe(buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime)),
|
runRetrievalRuntime: (runtime) => input.runDeepTurnRetrievalRuntimeSafe(buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime)),
|
||||||
runGuardRuntime: (runtime) => input.runDeepTurnGuardRuntimeSafe(buildAssistantDeepTurnGuardRuntimeInput(runtime)),
|
runGuardRuntime: (runtime) => input.runDeepTurnGuardRuntimeSafe(buildAssistantDeepTurnGuardRuntimeInput(runtime)),
|
||||||
runGroundingRuntime: (runtime) => input.runDeepTurnGroundingRuntimeSafe(buildAssistantDeepTurnGroundingRuntimeInput(input, runtime)),
|
runGroundingRuntime: (runtime) => input.runDeepTurnGroundingRuntimeSafe(buildAssistantDeepTurnGroundingRuntimeInput(input, runtime)),
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.buildAssistantDeepTurnComposition = buildAssistantDeepTurnComposition;
|
exports.buildAssistantDeepTurnComposition = buildAssistantDeepTurnComposition;
|
||||||
const questionTypeResolver_1 = require("./questionTypeResolver");
|
const questionTypeResolver_1 = require("./questionTypeResolver");
|
||||||
const answerComposer_1 = require("./answerComposer");
|
const answerComposer_1 = require("./answerComposer");
|
||||||
|
function toStringArray(value) {
|
||||||
|
if (!Array.isArray(value)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
.map((item) => (typeof item === "string" ? item.trim() : ""))
|
||||||
|
.filter((item) => item.length > 0);
|
||||||
|
}
|
||||||
|
function normalizeCompanyAnchorSet(value) {
|
||||||
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const source = value;
|
||||||
|
return {
|
||||||
|
contract_numbers: toStringArray(source.contract_numbers),
|
||||||
|
document_numbers: toStringArray(source.document_numbers),
|
||||||
|
dates: toStringArray(source.dates),
|
||||||
|
amounts: toStringArray(source.amounts),
|
||||||
|
accounts: toStringArray(source.accounts),
|
||||||
|
periods: toStringArray(source.periods),
|
||||||
|
document_types: toStringArray(source.document_types),
|
||||||
|
all: toStringArray(source.all)
|
||||||
|
};
|
||||||
|
}
|
||||||
function buildAssistantDeepTurnComposition(input) {
|
function buildAssistantDeepTurnComposition(input) {
|
||||||
const resolveQuestionTypeSafe = input.resolveQuestionTypeFn ?? questionTypeResolver_1.resolveQuestionType;
|
const resolveQuestionTypeSafe = input.resolveQuestionTypeFn ?? questionTypeResolver_1.resolveQuestionType;
|
||||||
const composeAssistantAnswerSafe = input.composeAssistantAnswerFn ?? answerComposer_1.composeAssistantAnswer;
|
const composeAssistantAnswerSafe = input.composeAssistantAnswerFn ?? answerComposer_1.composeAssistantAnswer;
|
||||||
|
|
@ -11,7 +35,7 @@ function buildAssistantDeepTurnComposition(input) {
|
||||||
? input.investigationState?.followup_context?.active_domain ?? input.investigationState?.focus.domain ?? null
|
? input.investigationState?.followup_context?.active_domain ?? input.investigationState?.focus.domain ?? null
|
||||||
: null;
|
: null;
|
||||||
const questionTypeClass = resolveQuestionTypeSafe(input.userMessage);
|
const questionTypeClass = resolveQuestionTypeSafe(input.userMessage);
|
||||||
const companyAnchorSet = input.companyAnchors;
|
const companyAnchorSet = normalizeCompanyAnchorSet(input.companyAnchors);
|
||||||
const hasPeriodInCompanyAnchors = (Array.isArray(companyAnchorSet?.dates) && companyAnchorSet.dates.some((item) => String(item ?? "").trim().length > 0)) ||
|
const hasPeriodInCompanyAnchors = (Array.isArray(companyAnchorSet?.dates) && companyAnchorSet.dates.some((item) => String(item ?? "").trim().length > 0)) ||
|
||||||
(Array.isArray(companyAnchorSet?.periods) && companyAnchorSet.periods.some((item) => String(item ?? "").trim().length > 0));
|
(Array.isArray(companyAnchorSet?.periods) && companyAnchorSet.periods.some((item) => String(item ?? "").trim().length > 0));
|
||||||
const normalizationPeriodExplicit = input.hasExplicitPeriodAnchor(input.normalizedPayload) || hasPeriodInCompanyAnchors;
|
const normalizationPeriodExplicit = input.hasExplicitPeriodAnchor(input.normalizedPayload) || hasPeriodInCompanyAnchors;
|
||||||
|
|
@ -24,7 +48,7 @@ function buildAssistantDeepTurnComposition(input) {
|
||||||
groundingCheck: input.groundingCheck,
|
groundingCheck: input.groundingCheck,
|
||||||
focusDomainHint,
|
focusDomainHint,
|
||||||
questionTypeHint: questionTypeClass,
|
questionTypeHint: questionTypeClass,
|
||||||
companyAnchors: input.companyAnchors,
|
companyAnchors: companyAnchorSet,
|
||||||
normalizationPeriodExplicit,
|
normalizationPeriodExplicit,
|
||||||
enableAnswerPolicyV11: input.featureAnswerPolicyV11,
|
enableAnswerPolicyV11: input.featureAnswerPolicyV11,
|
||||||
enableProblemCentricAnswerV1: input.featureProblemCentricAnswerV1,
|
enableProblemCentricAnswerV1: input.featureProblemCentricAnswerV1,
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ const assistantOrchestrationRuntimeAdapter_1 = require("./assistantOrchestration
|
||||||
const assistantDeepTurnGuardRuntimeAdapter_1 = require("./assistantDeepTurnGuardRuntimeAdapter");
|
const assistantDeepTurnGuardRuntimeAdapter_1 = require("./assistantDeepTurnGuardRuntimeAdapter");
|
||||||
function runAssistantDeepTurnGroundingRuntime(input) {
|
function runAssistantDeepTurnGroundingRuntime(input) {
|
||||||
const runCoverageGroundingPipelineSafe = input.runCoverageGroundingPipelineFn ?? assistantOrchestrationRuntimeAdapter_1.runAssistantCoverageGroundingPipeline;
|
const runCoverageGroundingPipelineSafe = input.runCoverageGroundingPipelineFn ?? assistantOrchestrationRuntimeAdapter_1.runAssistantCoverageGroundingPipeline;
|
||||||
const applyGroundingEligibilitySafe = input.applyGroundingEligibilityFn ??
|
const applyGroundingEligibilityDefault = (payload) => (0, assistantDeepTurnGuardRuntimeAdapter_1.applyAssistantDeepTurnGroundingEligibility)(payload);
|
||||||
((payload) => (0, assistantDeepTurnGuardRuntimeAdapter_1.applyAssistantDeepTurnGroundingEligibility)(payload));
|
const applyGroundingEligibilitySafe = input.applyGroundingEligibilityFn ?? applyGroundingEligibilityDefault;
|
||||||
const rbpLiveRouteAudit = input.collectRbpLiveRouteAudit({
|
const rbpLiveRouteAudit = input.collectRbpLiveRouteAudit({
|
||||||
claimType: input.claimType,
|
claimType: input.claimType,
|
||||||
retrievalResults: input.retrievalResults,
|
retrievalResults: input.retrievalResults,
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ function assembleAssistantDeepTurnPackaging(input) {
|
||||||
text: deepAnswerArtifacts.safeAssistantReply,
|
text: deepAnswerArtifacts.safeAssistantReply,
|
||||||
replyType: input.composition.reply_type,
|
replyType: input.composition.reply_type,
|
||||||
traceId: input.normalized.trace_id,
|
traceId: input.normalized.trace_id,
|
||||||
debug: debug
|
debug
|
||||||
});
|
});
|
||||||
const deepAnalysisLogDetails = (0, assistantMessageLogAssembler_1.buildDeepAnalysisProcessedLogDetails)({
|
const deepAnalysisLogDetails = (0, assistantMessageLogAssembler_1.buildDeepAnalysisProcessedLogDetails)({
|
||||||
sessionId: input.sessionId,
|
sessionId: input.sessionId,
|
||||||
|
|
|
||||||
|
|
@ -391,25 +391,26 @@ function normalizeEvidenceItems(fragmentId, requirementIds, route, value) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function normalizeRetrievalResult(fragmentId, requirementIds, route, raw) {
|
function normalizeRetrievalResult(fragmentId, requirementIds, route, raw) {
|
||||||
const items = normalizeObjectArray(raw.items);
|
const rawResult = toObject(raw) ?? {};
|
||||||
const summary = normalizeSummary(raw.summary);
|
const items = normalizeObjectArray(rawResult.items);
|
||||||
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, raw.evidence);
|
const summary = normalizeSummary(rawResult.summary);
|
||||||
|
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, rawResult.evidence);
|
||||||
const baseResult = {
|
const baseResult = {
|
||||||
fragment_id: fragmentId,
|
fragment_id: fragmentId,
|
||||||
requirement_ids: requirementIds,
|
requirement_ids: requirementIds,
|
||||||
route,
|
route,
|
||||||
status: normalizeStatus(raw.status),
|
status: normalizeStatus(rawResult.status),
|
||||||
result_type: normalizeResultType(raw.result_type),
|
result_type: normalizeResultType(rawResult.result_type),
|
||||||
items,
|
items,
|
||||||
summary,
|
summary,
|
||||||
evidence,
|
evidence,
|
||||||
why_included: normalizeStringArray(raw.why_included),
|
why_included: normalizeStringArray(rawResult.why_included),
|
||||||
selection_reason: normalizeStringArray(raw.selection_reason),
|
selection_reason: normalizeStringArray(rawResult.selection_reason),
|
||||||
risk_factors: normalizeStringArray(raw.risk_factors),
|
risk_factors: normalizeStringArray(rawResult.risk_factors),
|
||||||
business_interpretation: normalizeStringArray(raw.business_interpretation),
|
business_interpretation: normalizeStringArray(rawResult.business_interpretation),
|
||||||
confidence: normalizeConfidence(raw.confidence),
|
confidence: normalizeConfidence(rawResult.confidence),
|
||||||
limitations: normalizeStringArray(raw.limitations),
|
limitations: normalizeStringArray(rawResult.limitations),
|
||||||
errors: normalizeErrors(raw.errors)
|
errors: normalizeErrors(rawResult.errors)
|
||||||
};
|
};
|
||||||
if (!config_1.FEATURE_ASSISTANT_PROBLEM_UNITS_V1) {
|
if (!config_1.FEATURE_ASSISTANT_PROBLEM_UNITS_V1) {
|
||||||
return baseResult;
|
return baseResult;
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ function toAnalysisContext(input: DeepAnalysisDebugPayloadInput["runtimeAnalysis
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function buildDeepAnalysisDebugPayload(input: DeepAnalysisDebugPayloadInput): Record<string, unknown> {
|
export function buildDeepAnalysisDebugPayload(input: DeepAnalysisDebugPayloadInput): AssistantDebugPayload {
|
||||||
const analysisContext = toAnalysisContext(input.runtimeAnalysisContext);
|
const analysisContext = toAnalysisContext(input.runtimeAnalysisContext);
|
||||||
return {
|
return {
|
||||||
trace_id: input.traceId,
|
trace_id: input.traceId,
|
||||||
|
|
@ -156,5 +156,5 @@ export function buildDeepAnalysisDebugPayload(input: DeepAnalysisDebugPayloadInp
|
||||||
answer_structure_v11: input.answerStructureV11,
|
answer_structure_v11: input.answerStructureV11,
|
||||||
investigation_state_snapshot: input.investigationStateSnapshot,
|
investigation_state_snapshot: input.investigationStateSnapshot,
|
||||||
normalized: input.normalizedPayload
|
normalized: input.normalizedPayload
|
||||||
};
|
} as unknown as AssistantDebugPayload;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ import { resolveCompanyAnchors } from "./companyAnchorResolver";
|
||||||
import {
|
import {
|
||||||
applyPolarityHintToExecutionPlan,
|
applyPolarityHintToExecutionPlan,
|
||||||
applyTemporalHintToExecutionPlan,
|
applyTemporalHintToExecutionPlan,
|
||||||
|
type DomainPolarityGuardAudit,
|
||||||
|
type TemporalGuardAudit,
|
||||||
resolveDomainPolarityGuard,
|
resolveDomainPolarityGuard,
|
||||||
resolveTemporalGuard
|
resolveTemporalGuard
|
||||||
} from "./assistantRuntimeGuards";
|
} from "./assistantRuntimeGuards";
|
||||||
|
|
@ -13,8 +15,7 @@ import type {
|
||||||
} from "./assistantDeepTurnContextRuntimeAdapter";
|
} from "./assistantDeepTurnContextRuntimeAdapter";
|
||||||
import type {
|
import type {
|
||||||
BuildAssistantDeepTurnExecutionPlanInput,
|
BuildAssistantDeepTurnExecutionPlanInput,
|
||||||
BuildAssistantDeepTurnExecutionPlanOutput,
|
BuildAssistantDeepTurnExecutionPlanOutput
|
||||||
AssistantRequirementExtractionLike
|
|
||||||
} from "./assistantDeepTurnPlanRuntimeAdapter";
|
} from "./assistantDeepTurnPlanRuntimeAdapter";
|
||||||
import type {
|
import type {
|
||||||
AssistantDeepTurnRetrievalExecutionInput,
|
AssistantDeepTurnRetrievalExecutionInput,
|
||||||
|
|
@ -32,14 +33,120 @@ import type {
|
||||||
BuildAssistantDeepTurnCompositionInput,
|
BuildAssistantDeepTurnCompositionInput,
|
||||||
AssistantDeepTurnCompositionOutput
|
AssistantDeepTurnCompositionOutput
|
||||||
} from "./assistantDeepTurnCompositionRuntimeAdapter";
|
} from "./assistantDeepTurnCompositionRuntimeAdapter";
|
||||||
import type { AssistantExecutionPlanItem } from "./assistantQueryPlanning";
|
|
||||||
import type { RunAssistantDeepTurnAnalysisAttemptRuntimeInput } from "./assistantDeepTurnAnalysisAttemptRuntimeAdapter";
|
import type { RunAssistantDeepTurnAnalysisAttemptRuntimeInput } from "./assistantDeepTurnAnalysisAttemptRuntimeAdapter";
|
||||||
|
import type { CompanyAnchorSet } from "./companyAnchorResolver";
|
||||||
|
|
||||||
type ExecutionPlanRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runExecutionPlanRuntime"]>[0];
|
type ExecutionPlanRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runExecutionPlanRuntime"]>[0];
|
||||||
type RetrievalRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runRetrievalRuntime"]>[0];
|
type RetrievalRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runRetrievalRuntime"]>[0];
|
||||||
type GuardRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runGuardRuntime"]>[0];
|
type GuardRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runGuardRuntime"]>[0];
|
||||||
type GroundingRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runGroundingRuntime"]>[0];
|
type GroundingRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runGroundingRuntime"]>[0];
|
||||||
type CompositionRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runCompositionRuntime"]>[0];
|
type CompositionRuntimeArgs = Parameters<RunAssistantDeepTurnAnalysisRuntimeInput["runCompositionRuntime"]>[0];
|
||||||
|
type ClaimBoundPrimaryPeriod = Parameters<typeof resolveClaimBoundAnchors>[0]["primaryPeriod"];
|
||||||
|
const KNOWN_GUARD_DOMAINS = [
|
||||||
|
"settlements_60_62",
|
||||||
|
"vat_document_register_book",
|
||||||
|
"month_close_costs_20_44",
|
||||||
|
"fixed_asset_amortization"
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
function toRecordObject(value: unknown): Record<string, unknown> | null {
|
||||||
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return value as Record<string, unknown>;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toStringArray(value: unknown): string[] {
|
||||||
|
if (!Array.isArray(value)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
.map((item) => (typeof item === "string" ? item.trim() : ""))
|
||||||
|
.filter((item) => item.length > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toCompanyAnchorSet(value: unknown): CompanyAnchorSet | null {
|
||||||
|
const source = toRecordObject(value);
|
||||||
|
if (!source) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
contract_numbers: toStringArray(source.contract_numbers),
|
||||||
|
document_numbers: toStringArray(source.document_numbers),
|
||||||
|
dates: toStringArray(source.dates),
|
||||||
|
amounts: toStringArray(source.amounts),
|
||||||
|
accounts: toStringArray(source.accounts),
|
||||||
|
periods: toStringArray(source.periods),
|
||||||
|
document_types: toStringArray(source.document_types),
|
||||||
|
all: toStringArray(source.all)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function toClaimBoundPrimaryPeriod(value: unknown): ClaimBoundPrimaryPeriod {
|
||||||
|
const source = toRecordObject(value);
|
||||||
|
if (!source) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const from = typeof source.from === "string" ? source.from.trim() : "";
|
||||||
|
const to = typeof source.to === "string" ? source.to.trim() : "";
|
||||||
|
const granularity = source.granularity === "day" || source.granularity === "month" ? source.granularity : null;
|
||||||
|
if (!from || !to || !granularity) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
from,
|
||||||
|
to,
|
||||||
|
granularity
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeFocusDomainForGuards(
|
||||||
|
value: unknown
|
||||||
|
): AssistantDeepTurnRetrievalGuardPipelineInput["focusDomainForGuards"] {
|
||||||
|
const normalized = typeof value === "string" ? value.trim() : "";
|
||||||
|
if (!normalized) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (KNOWN_GUARD_DOMAINS.includes(normalized as (typeof KNOWN_GUARD_DOMAINS)[number])) {
|
||||||
|
return normalized as AssistantDeepTurnRetrievalGuardPipelineInput["focusDomainForGuards"];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const resolveTemporalGuardAdapter: BuildAssistantDeepTurnRuntimeContextInput["resolveTemporalGuard"] = (input) =>
|
||||||
|
resolveTemporalGuard({
|
||||||
|
userMessage: input.userMessage,
|
||||||
|
normalized: input.normalized,
|
||||||
|
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
|
||||||
|
analysisContext: input.analysisContext
|
||||||
|
});
|
||||||
|
|
||||||
|
const resolveDomainPolarityGuardAdapter: BuildAssistantDeepTurnRuntimeContextInput["resolveDomainPolarityGuard"] = (
|
||||||
|
input
|
||||||
|
) =>
|
||||||
|
resolveDomainPolarityGuard({
|
||||||
|
userMessage: input.userMessage,
|
||||||
|
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
|
||||||
|
focusDomainHint: input.focusDomainHint
|
||||||
|
});
|
||||||
|
|
||||||
|
const resolveClaimBoundAnchorsAdapter: BuildAssistantDeepTurnRuntimeContextInput["resolveClaimBoundAnchors"] = (
|
||||||
|
input
|
||||||
|
) =>
|
||||||
|
resolveClaimBoundAnchors({
|
||||||
|
userMessage: input.userMessage,
|
||||||
|
companyAnchors: toCompanyAnchorSet(input.companyAnchors),
|
||||||
|
focusDomainHint: input.focusDomainHint,
|
||||||
|
primaryPeriod: toClaimBoundPrimaryPeriod(input.primaryPeriod)
|
||||||
|
});
|
||||||
|
|
||||||
|
const applyTemporalHintToExecutionPlanAdapter: BuildAssistantDeepTurnExecutionPlanInput["applyTemporalHintToExecutionPlan"] =
|
||||||
|
(executionPlan, temporalGuard) =>
|
||||||
|
applyTemporalHintToExecutionPlan(executionPlan, temporalGuard as TemporalGuardAudit);
|
||||||
|
|
||||||
|
const applyPolarityHintToExecutionPlanAdapter: BuildAssistantDeepTurnExecutionPlanInput["applyPolarityHintToExecutionPlan"] =
|
||||||
|
(executionPlan, domainPolarityGuardInitial) =>
|
||||||
|
applyPolarityHintToExecutionPlan(executionPlan, domainPolarityGuardInitial as DomainPolarityGuardAudit);
|
||||||
|
|
||||||
export interface BuildAssistantDeepTurnAnalysisRuntimeInputInput
|
export interface BuildAssistantDeepTurnAnalysisRuntimeInputInput
|
||||||
extends RunAssistantDeepTurnAnalysisAttemptRuntimeInput {
|
extends RunAssistantDeepTurnAnalysisAttemptRuntimeInput {
|
||||||
|
|
@ -75,9 +182,9 @@ export function buildAssistantDeepTurnContextRuntimeInput(
|
||||||
resolveCompanyAnchors,
|
resolveCompanyAnchors,
|
||||||
resolveBusinessScopeAlignment: input.resolveBusinessScopeAlignment,
|
resolveBusinessScopeAlignment: input.resolveBusinessScopeAlignment,
|
||||||
inferP0DomainFromMessage: input.inferP0DomainFromMessage,
|
inferP0DomainFromMessage: input.inferP0DomainFromMessage,
|
||||||
resolveTemporalGuard: resolveTemporalGuard as any,
|
resolveTemporalGuard: resolveTemporalGuardAdapter,
|
||||||
resolveDomainPolarityGuard: resolveDomainPolarityGuard as any,
|
resolveDomainPolarityGuard: resolveDomainPolarityGuardAdapter,
|
||||||
resolveClaimBoundAnchors: resolveClaimBoundAnchors as any,
|
resolveClaimBoundAnchors: resolveClaimBoundAnchorsAdapter,
|
||||||
resolveBusinessScopeFromLiveContext: input.resolveBusinessScopeFromLiveContext
|
resolveBusinessScopeFromLiveContext: input.resolveBusinessScopeFromLiveContext
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -97,8 +204,8 @@ export function buildAssistantDeepTurnExecutionPlanRuntimeInput(
|
||||||
toExecutionPlan: input.toExecutionPlan,
|
toExecutionPlan: input.toExecutionPlan,
|
||||||
enforceRbpLiveRoutePlan: input.enforceRbpLiveRoutePlan,
|
enforceRbpLiveRoutePlan: input.enforceRbpLiveRoutePlan,
|
||||||
enforceFaLiveRoutePlan: input.enforceFaLiveRoutePlan,
|
enforceFaLiveRoutePlan: input.enforceFaLiveRoutePlan,
|
||||||
applyTemporalHintToExecutionPlan: applyTemporalHintToExecutionPlan as any,
|
applyTemporalHintToExecutionPlan: applyTemporalHintToExecutionPlanAdapter,
|
||||||
applyPolarityHintToExecutionPlan: applyPolarityHintToExecutionPlan as any
|
applyPolarityHintToExecutionPlan: applyPolarityHintToExecutionPlanAdapter
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -107,7 +214,7 @@ export function buildAssistantDeepTurnRetrievalRuntimeInput(
|
||||||
runtime: RetrievalRuntimeArgs
|
runtime: RetrievalRuntimeArgs
|
||||||
): AssistantDeepTurnRetrievalExecutionInput {
|
): AssistantDeepTurnRetrievalExecutionInput {
|
||||||
return {
|
return {
|
||||||
executionPlan: runtime.executionPlan as AssistantExecutionPlanItem[],
|
executionPlan: runtime.executionPlan,
|
||||||
liveTemporalHint: runtime.liveTemporalHint,
|
liveTemporalHint: runtime.liveTemporalHint,
|
||||||
executeRouteRuntime: input.executeRouteRuntime,
|
executeRouteRuntime: input.executeRouteRuntime,
|
||||||
mapNoRouteReason: input.mapNoRouteReason,
|
mapNoRouteReason: input.mapNoRouteReason,
|
||||||
|
|
@ -120,11 +227,11 @@ export function buildAssistantDeepTurnGuardRuntimeInput(
|
||||||
): AssistantDeepTurnRetrievalGuardPipelineInput {
|
): AssistantDeepTurnRetrievalGuardPipelineInput {
|
||||||
return {
|
return {
|
||||||
retrievalResults: runtime.retrievalResults,
|
retrievalResults: runtime.retrievalResults,
|
||||||
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial as any,
|
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
|
||||||
claimAnchorAudit: runtime.claimAnchorAudit as any,
|
claimAnchorAudit: runtime.claimAnchorAudit,
|
||||||
temporalGuard: runtime.temporalGuard as any,
|
temporalGuard: runtime.temporalGuard,
|
||||||
focusDomainForGuards: runtime.focusDomainForGuards as any,
|
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
|
||||||
companyAnchors: runtime.companyAnchors as any,
|
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
|
||||||
userMessage: runtime.userMessage
|
userMessage: runtime.userMessage
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -141,18 +248,19 @@ export function buildAssistantDeepTurnGroundingRuntimeInput(
|
||||||
routeSummary: runtime.routeSummary,
|
routeSummary: runtime.routeSummary,
|
||||||
normalizedPayload: input.normalizedPayload,
|
normalizedPayload: input.normalizedPayload,
|
||||||
userMessage: input.userMessage,
|
userMessage: input.userMessage,
|
||||||
requirementExtraction: runtime.requirementExtraction as AssistantRequirementExtractionLike,
|
requirementExtraction: runtime.requirementExtraction,
|
||||||
extractRequirements: input.extractRequirements as any,
|
extractRequirements: (routeSummary, normalized, userMessage) =>
|
||||||
evaluateCoverage: input.evaluateCoverage as any,
|
input.extractRequirements(routeSummary, normalized ?? null, userMessage),
|
||||||
checkGrounding: input.checkGrounding as any,
|
evaluateCoverage: input.evaluateCoverage,
|
||||||
|
checkGrounding: input.checkGrounding,
|
||||||
temporalGuard: runtime.temporalGuard,
|
temporalGuard: runtime.temporalGuard,
|
||||||
polarityAudit: runtime.polarityAudit,
|
polarityAudit: runtime.polarityAudit,
|
||||||
evidenceAudit: runtime.evidenceAudit,
|
evidenceAudit: runtime.evidenceAudit,
|
||||||
claimAnchorAudit: runtime.claimAnchorAudit,
|
claimAnchorAudit: runtime.claimAnchorAudit,
|
||||||
targetedEvidenceHitRate: runtime.targetedEvidenceHitRate,
|
targetedEvidenceHitRate: runtime.targetedEvidenceHitRate,
|
||||||
businessScopeResolved: runtime.businessScopeResolved,
|
businessScopeResolved: runtime.businessScopeResolved,
|
||||||
collectRbpLiveRouteAudit: input.collectRbpLiveRouteAudit as any,
|
collectRbpLiveRouteAudit: input.collectRbpLiveRouteAudit,
|
||||||
collectFaLiveRouteAudit: input.collectFaLiveRouteAudit as any
|
collectFaLiveRouteAudit: input.collectFaLiveRouteAudit
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -183,25 +291,37 @@ export function buildAssistantDeepTurnAnalysisRuntimeInput(
|
||||||
): RunAssistantDeepTurnAnalysisRuntimeInput {
|
): RunAssistantDeepTurnAnalysisRuntimeInput {
|
||||||
return {
|
return {
|
||||||
userMessage: input.userMessage,
|
userMessage: input.userMessage,
|
||||||
runContextRuntime: () =>
|
runContextRuntime: () => {
|
||||||
input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input)) as any,
|
const runtime = input.runDeepTurnContextRuntimeSafe(buildAssistantDeepTurnContextRuntimeInput(input));
|
||||||
runExecutionPlanRuntime: (runtime) =>
|
return {
|
||||||
input.runDeepTurnPlanRuntimeSafe(
|
companyAnchors: toCompanyAnchorSet(runtime.companyAnchors),
|
||||||
|
focusDomainForGuards: normalizeFocusDomainForGuards(runtime.focusDomainForGuards),
|
||||||
|
temporalGuard: runtime.temporalGuard,
|
||||||
|
domainPolarityGuardInitial: runtime.domainPolarityGuardInitial,
|
||||||
|
claimAnchorAudit: runtime.claimAnchorAudit,
|
||||||
|
businessScopeResolution: runtime.businessScopeResolution,
|
||||||
|
resolvedRouteSummary: runtime.resolvedRouteSummary,
|
||||||
|
liveTemporalHint: runtime.liveTemporalHint
|
||||||
|
};
|
||||||
|
},
|
||||||
|
runExecutionPlanRuntime: (runtime) => {
|
||||||
|
const output = input.runDeepTurnPlanRuntimeSafe(
|
||||||
buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime)
|
buildAssistantDeepTurnExecutionPlanRuntimeInput(input, runtime)
|
||||||
) as any,
|
);
|
||||||
|
return {
|
||||||
|
requirementExtraction: output.requirementExtraction,
|
||||||
|
executionPlan: output.executionPlan,
|
||||||
|
rbpRoutePlanEnforcement: output.rbpRoutePlanEnforcement,
|
||||||
|
faRoutePlanEnforcement: output.faRoutePlanEnforcement
|
||||||
|
};
|
||||||
|
},
|
||||||
runRetrievalRuntime: (runtime) =>
|
runRetrievalRuntime: (runtime) =>
|
||||||
input.runDeepTurnRetrievalRuntimeSafe(
|
input.runDeepTurnRetrievalRuntimeSafe(buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime)),
|
||||||
buildAssistantDeepTurnRetrievalRuntimeInput(input, runtime)
|
|
||||||
) as any,
|
|
||||||
runGuardRuntime: (runtime) =>
|
runGuardRuntime: (runtime) =>
|
||||||
input.runDeepTurnGuardRuntimeSafe(buildAssistantDeepTurnGuardRuntimeInput(runtime) as any),
|
input.runDeepTurnGuardRuntimeSafe(buildAssistantDeepTurnGuardRuntimeInput(runtime)),
|
||||||
runGroundingRuntime: (runtime) =>
|
runGroundingRuntime: (runtime) =>
|
||||||
input.runDeepTurnGroundingRuntimeSafe(
|
input.runDeepTurnGroundingRuntimeSafe(buildAssistantDeepTurnGroundingRuntimeInput(input, runtime)),
|
||||||
buildAssistantDeepTurnGroundingRuntimeInput(input, runtime)
|
|
||||||
) as any,
|
|
||||||
runCompositionRuntime: (runtime) =>
|
runCompositionRuntime: (runtime) =>
|
||||||
input.runDeepTurnCompositionRuntimeSafe(
|
input.runDeepTurnCompositionRuntimeSafe(buildAssistantDeepTurnCompositionRuntimeInput(input, runtime))
|
||||||
buildAssistantDeepTurnCompositionRuntimeInput(input, runtime)
|
|
||||||
) as any
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,32 @@
|
||||||
import type { AnswerGroundingCheck, AssistantRequirement, RequirementCoverageReport, UnifiedRetrievalResult } from "../types/assistant";
|
import type { AnswerGroundingCheck, AssistantRequirement, RequirementCoverageReport, UnifiedRetrievalResult } from "../types/assistant";
|
||||||
import type { RouteHintSummary } from "../types/normalizer";
|
import type { RouteHintSummary } from "../types/normalizer";
|
||||||
|
import type { ClaimBoundAnchorAudit } from "./assistantClaimBoundEvidence";
|
||||||
|
import type {
|
||||||
|
AssistantDeepTurnRetrievalGuardPipelineInput,
|
||||||
|
AssistantDeepTurnRetrievalGuardPipelineOutput
|
||||||
|
} from "./assistantDeepTurnGuardRuntimeAdapter";
|
||||||
import type {
|
import type {
|
||||||
AssistantPlanEnforcementAuditLike,
|
AssistantPlanEnforcementAuditLike,
|
||||||
AssistantRequirementExtractionLike
|
AssistantRequirementExtractionLike
|
||||||
} from "./assistantDeepTurnPlanRuntimeAdapter";
|
} from "./assistantDeepTurnPlanRuntimeAdapter";
|
||||||
|
import type { AssistantExecutionPlanItem } from "./assistantQueryPlanning";
|
||||||
import type {
|
import type {
|
||||||
AssistantDeepTurnRetrievalExecutionOutput,
|
AssistantDeepTurnRetrievalExecutionOutput,
|
||||||
AssistantLiveTemporalHint
|
AssistantLiveTemporalHint
|
||||||
} from "./assistantDeepTurnRetrievalRuntimeAdapter";
|
} from "./assistantDeepTurnRetrievalRuntimeAdapter";
|
||||||
import type { AssistantDeepTurnRetrievalGuardPipelineOutput } from "./assistantDeepTurnGuardRuntimeAdapter";
|
import type {
|
||||||
import type { AssistantDeepTurnGroundingRuntimeOutput } from "./assistantDeepTurnGroundingRuntimeAdapter";
|
AssistantDeepTurnGroundingRuntimeInput,
|
||||||
|
AssistantDeepTurnGroundingRuntimeOutput
|
||||||
|
} from "./assistantDeepTurnGroundingRuntimeAdapter";
|
||||||
import type { AssistantDeepTurnCompositionOutput } from "./assistantDeepTurnCompositionRuntimeAdapter";
|
import type { AssistantDeepTurnCompositionOutput } from "./assistantDeepTurnCompositionRuntimeAdapter";
|
||||||
|
import type { DomainPolarityGuardAudit, TemporalGuardAudit } from "./assistantRuntimeGuards";
|
||||||
|
|
||||||
export interface AssistantDeepTurnRuntimeContextLike {
|
export interface AssistantDeepTurnRuntimeContextLike {
|
||||||
companyAnchors: unknown;
|
companyAnchors: AssistantDeepTurnRetrievalGuardPipelineInput["companyAnchors"];
|
||||||
focusDomainForGuards: string | null;
|
focusDomainForGuards: AssistantDeepTurnRetrievalGuardPipelineInput["focusDomainForGuards"];
|
||||||
temporalGuard: unknown;
|
temporalGuard: TemporalGuardAudit;
|
||||||
domainPolarityGuardInitial: unknown;
|
domainPolarityGuardInitial: DomainPolarityGuardAudit;
|
||||||
claimAnchorAudit: {
|
claimAnchorAudit: ClaimBoundAnchorAudit;
|
||||||
claim_type: string;
|
|
||||||
[key: string]: unknown;
|
|
||||||
};
|
|
||||||
businessScopeResolution: {
|
businessScopeResolution: {
|
||||||
business_scope_resolved?: string[] | null;
|
business_scope_resolved?: string[] | null;
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
|
|
@ -35,25 +41,25 @@ export interface RunAssistantDeepTurnAnalysisRuntimeInput {
|
||||||
runExecutionPlanRuntime: (input: {
|
runExecutionPlanRuntime: (input: {
|
||||||
resolvedRouteSummary: RouteHintSummary | null;
|
resolvedRouteSummary: RouteHintSummary | null;
|
||||||
claimAnchorAudit: AssistantDeepTurnRuntimeContextLike["claimAnchorAudit"];
|
claimAnchorAudit: AssistantDeepTurnRuntimeContextLike["claimAnchorAudit"];
|
||||||
temporalGuard: unknown;
|
temporalGuard: TemporalGuardAudit;
|
||||||
domainPolarityGuardInitial: unknown;
|
domainPolarityGuardInitial: DomainPolarityGuardAudit;
|
||||||
}) => {
|
}) => {
|
||||||
requirementExtraction: AssistantRequirementExtractionLike;
|
requirementExtraction: AssistantRequirementExtractionLike;
|
||||||
executionPlan: unknown[];
|
executionPlan: AssistantExecutionPlanItem[];
|
||||||
rbpRoutePlanEnforcement: AssistantPlanEnforcementAuditLike;
|
rbpRoutePlanEnforcement: AssistantPlanEnforcementAuditLike;
|
||||||
faRoutePlanEnforcement: AssistantPlanEnforcementAuditLike;
|
faRoutePlanEnforcement: AssistantPlanEnforcementAuditLike;
|
||||||
};
|
};
|
||||||
runRetrievalRuntime: (input: {
|
runRetrievalRuntime: (input: {
|
||||||
executionPlan: unknown[];
|
executionPlan: AssistantExecutionPlanItem[];
|
||||||
liveTemporalHint: AssistantLiveTemporalHint | null;
|
liveTemporalHint: AssistantLiveTemporalHint | null;
|
||||||
}) => Promise<AssistantDeepTurnRetrievalExecutionOutput>;
|
}) => Promise<AssistantDeepTurnRetrievalExecutionOutput>;
|
||||||
runGuardRuntime: (input: {
|
runGuardRuntime: (input: {
|
||||||
retrievalResults: UnifiedRetrievalResult[];
|
retrievalResults: UnifiedRetrievalResult[];
|
||||||
domainPolarityGuardInitial: unknown;
|
domainPolarityGuardInitial: DomainPolarityGuardAudit;
|
||||||
claimAnchorAudit: AssistantDeepTurnRuntimeContextLike["claimAnchorAudit"];
|
claimAnchorAudit: AssistantDeepTurnRuntimeContextLike["claimAnchorAudit"];
|
||||||
temporalGuard: unknown;
|
temporalGuard: TemporalGuardAudit;
|
||||||
focusDomainForGuards: string | null;
|
focusDomainForGuards: AssistantDeepTurnRetrievalGuardPipelineInput["focusDomainForGuards"];
|
||||||
companyAnchors: unknown;
|
companyAnchors: AssistantDeepTurnRetrievalGuardPipelineInput["companyAnchors"];
|
||||||
userMessage: string;
|
userMessage: string;
|
||||||
}) => AssistantDeepTurnRetrievalGuardPipelineOutput;
|
}) => AssistantDeepTurnRetrievalGuardPipelineOutput;
|
||||||
runGroundingRuntime: (input: {
|
runGroundingRuntime: (input: {
|
||||||
|
|
@ -63,10 +69,10 @@ export interface RunAssistantDeepTurnAnalysisRuntimeInput {
|
||||||
faPlanAudit: unknown;
|
faPlanAudit: unknown;
|
||||||
routeSummary: RouteHintSummary | null;
|
routeSummary: RouteHintSummary | null;
|
||||||
requirementExtraction: AssistantRequirementExtractionLike;
|
requirementExtraction: AssistantRequirementExtractionLike;
|
||||||
temporalGuard: unknown;
|
temporalGuard: AssistantDeepTurnGroundingRuntimeInput["temporalGuard"];
|
||||||
polarityAudit: unknown;
|
polarityAudit: AssistantDeepTurnGroundingRuntimeInput["polarityAudit"];
|
||||||
evidenceAudit: unknown;
|
evidenceAudit: AssistantDeepTurnGroundingRuntimeInput["evidenceAudit"];
|
||||||
claimAnchorAudit: AssistantDeepTurnRuntimeContextLike["claimAnchorAudit"];
|
claimAnchorAudit: AssistantDeepTurnGroundingRuntimeInput["claimAnchorAudit"];
|
||||||
targetedEvidenceHitRate?: number | null;
|
targetedEvidenceHitRate?: number | null;
|
||||||
businessScopeResolved?: string[] | null;
|
businessScopeResolved?: string[] | null;
|
||||||
}) => AssistantDeepTurnGroundingRuntimeOutput;
|
}) => AssistantDeepTurnGroundingRuntimeOutput;
|
||||||
|
|
@ -87,7 +93,7 @@ export interface RunAssistantDeepTurnAnalysisRuntimeOutput {
|
||||||
businessScopeResolution: AssistantDeepTurnRuntimeContextLike["businessScopeResolution"];
|
businessScopeResolution: AssistantDeepTurnRuntimeContextLike["businessScopeResolution"];
|
||||||
resolvedRouteSummary: RouteHintSummary | null;
|
resolvedRouteSummary: RouteHintSummary | null;
|
||||||
requirementExtraction: AssistantRequirementExtractionLike;
|
requirementExtraction: AssistantRequirementExtractionLike;
|
||||||
executionPlan: unknown[];
|
executionPlan: AssistantExecutionPlanItem[];
|
||||||
retrievalCalls: AssistantDeepTurnRetrievalExecutionOutput["retrievalCalls"];
|
retrievalCalls: AssistantDeepTurnRetrievalExecutionOutput["retrievalCalls"];
|
||||||
retrievalResultsRaw: AssistantDeepTurnRetrievalExecutionOutput["retrievalResultsRaw"];
|
retrievalResultsRaw: AssistantDeepTurnRetrievalExecutionOutput["retrievalResultsRaw"];
|
||||||
retrievalResults: UnifiedRetrievalResult[];
|
retrievalResults: UnifiedRetrievalResult[];
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import type { AssistantMessageResponsePayload } from "../types/assistant";
|
import type { AssistantDebugPayload, AssistantMessageResponsePayload } from "../types/assistant";
|
||||||
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
|
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
|
||||||
import {
|
import {
|
||||||
buildAssistantDeepTurnNormalizationRuntime,
|
buildAssistantDeepTurnNormalizationRuntime,
|
||||||
|
|
@ -74,13 +74,13 @@ export interface RunAssistantDeepTurnAttemptRuntimeInput<ResponseType = Assistan
|
||||||
input: RunAssistantDeepTurnResponseAttemptRuntimeInput<ResponseType>
|
input: RunAssistantDeepTurnResponseAttemptRuntimeInput<ResponseType>
|
||||||
) => {
|
) => {
|
||||||
response: ResponseType;
|
response: ResponseType;
|
||||||
debug: Record<string, unknown>;
|
debug: AssistantDebugPayload;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface RunAssistantDeepTurnAttemptRuntimeOutput<ResponseType = AssistantMessageResponsePayload> {
|
export interface RunAssistantDeepTurnAttemptRuntimeOutput<ResponseType = AssistantMessageResponsePayload> {
|
||||||
response: ResponseType;
|
response: ResponseType;
|
||||||
debug: Record<string, unknown>;
|
debug: AssistantDebugPayload;
|
||||||
normalizationRuntime: BuildAssistantDeepTurnNormalizationRuntimeOutput;
|
normalizationRuntime: BuildAssistantDeepTurnNormalizationRuntimeOutput;
|
||||||
deepTurnAnalysisRuntime: RunAssistantDeepTurnAnalysisRuntimeOutput;
|
deepTurnAnalysisRuntime: RunAssistantDeepTurnAnalysisRuntimeOutput;
|
||||||
}
|
}
|
||||||
|
|
@ -92,8 +92,12 @@ export async function runAssistantDeepTurnAttemptRuntime<ResponseType = Assistan
|
||||||
input.runDeepTurnNormalizationRuntime ?? buildAssistantDeepTurnNormalizationRuntime;
|
input.runDeepTurnNormalizationRuntime ?? buildAssistantDeepTurnNormalizationRuntime;
|
||||||
const runDeepTurnAnalysisAttemptRuntimeSafe =
|
const runDeepTurnAnalysisAttemptRuntimeSafe =
|
||||||
input.runDeepTurnAnalysisAttemptRuntime ?? runAssistantDeepTurnAnalysisAttemptRuntime;
|
input.runDeepTurnAnalysisAttemptRuntime ?? runAssistantDeepTurnAnalysisAttemptRuntime;
|
||||||
const runDeepTurnResponseAttemptRuntimeSafe =
|
const runDeepTurnResponseAttemptRuntimeSafe: (
|
||||||
input.runDeepTurnResponseAttemptRuntime ?? runAssistantDeepTurnResponseAttemptRuntime;
|
input: RunAssistantDeepTurnResponseAttemptRuntimeInput<ResponseType>
|
||||||
|
) => {
|
||||||
|
response: ResponseType;
|
||||||
|
debug: AssistantDebugPayload;
|
||||||
|
} = input.runDeepTurnResponseAttemptRuntime ?? runAssistantDeepTurnResponseAttemptRuntime;
|
||||||
|
|
||||||
const normalizationRuntime = await runDeepTurnNormalizationRuntimeSafe(
|
const normalizationRuntime = await runDeepTurnNormalizationRuntimeSafe(
|
||||||
buildAssistantDeepTurnNormalizationRuntimeInput({
|
buildAssistantDeepTurnNormalizationRuntimeInput({
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemU
|
||||||
import type { QuestionTypeClass } from "./questionTypeResolver";
|
import type { QuestionTypeClass } from "./questionTypeResolver";
|
||||||
import { resolveQuestionType } from "./questionTypeResolver";
|
import { resolveQuestionType } from "./questionTypeResolver";
|
||||||
import { composeAssistantAnswer } from "./answerComposer";
|
import { composeAssistantAnswer } from "./answerComposer";
|
||||||
|
import type { CompanyAnchorSet } from "./companyAnchorResolver";
|
||||||
|
|
||||||
export interface BuildAssistantDeepTurnCompositionInput {
|
export interface BuildAssistantDeepTurnCompositionInput {
|
||||||
userMessage: string;
|
userMessage: string;
|
||||||
|
|
@ -32,6 +33,32 @@ export interface AssistantDeepTurnCompositionOutput {
|
||||||
composition: ReturnType<typeof composeAssistantAnswer>;
|
composition: ReturnType<typeof composeAssistantAnswer>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toStringArray(value: unknown): string[] {
|
||||||
|
if (!Array.isArray(value)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
.map((item) => (typeof item === "string" ? item.trim() : ""))
|
||||||
|
.filter((item) => item.length > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeCompanyAnchorSet(value: unknown): CompanyAnchorSet | null {
|
||||||
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const source = value as Record<string, unknown>;
|
||||||
|
return {
|
||||||
|
contract_numbers: toStringArray(source.contract_numbers),
|
||||||
|
document_numbers: toStringArray(source.document_numbers),
|
||||||
|
dates: toStringArray(source.dates),
|
||||||
|
amounts: toStringArray(source.amounts),
|
||||||
|
accounts: toStringArray(source.accounts),
|
||||||
|
periods: toStringArray(source.periods),
|
||||||
|
document_types: toStringArray(source.document_types),
|
||||||
|
all: toStringArray(source.all)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export function buildAssistantDeepTurnComposition(
|
export function buildAssistantDeepTurnComposition(
|
||||||
input: BuildAssistantDeepTurnCompositionInput
|
input: BuildAssistantDeepTurnCompositionInput
|
||||||
): AssistantDeepTurnCompositionOutput {
|
): AssistantDeepTurnCompositionOutput {
|
||||||
|
|
@ -43,10 +70,7 @@ export function buildAssistantDeepTurnComposition(
|
||||||
? input.investigationState?.followup_context?.active_domain ?? input.investigationState?.focus.domain ?? null
|
? input.investigationState?.followup_context?.active_domain ?? input.investigationState?.focus.domain ?? null
|
||||||
: null;
|
: null;
|
||||||
const questionTypeClass = resolveQuestionTypeSafe(input.userMessage);
|
const questionTypeClass = resolveQuestionTypeSafe(input.userMessage);
|
||||||
const companyAnchorSet = input.companyAnchors as {
|
const companyAnchorSet = normalizeCompanyAnchorSet(input.companyAnchors);
|
||||||
dates?: unknown[];
|
|
||||||
periods?: unknown[];
|
|
||||||
} | null;
|
|
||||||
const hasPeriodInCompanyAnchors =
|
const hasPeriodInCompanyAnchors =
|
||||||
(Array.isArray(companyAnchorSet?.dates) && companyAnchorSet.dates.some((item) => String(item ?? "").trim().length > 0)) ||
|
(Array.isArray(companyAnchorSet?.dates) && companyAnchorSet.dates.some((item) => String(item ?? "").trim().length > 0)) ||
|
||||||
(Array.isArray(companyAnchorSet?.periods) && companyAnchorSet.periods.some((item) => String(item ?? "").trim().length > 0));
|
(Array.isArray(companyAnchorSet?.periods) && companyAnchorSet.periods.some((item) => String(item ?? "").trim().length > 0));
|
||||||
|
|
@ -60,7 +84,7 @@ export function buildAssistantDeepTurnComposition(
|
||||||
groundingCheck: input.groundingCheck,
|
groundingCheck: input.groundingCheck,
|
||||||
focusDomainHint,
|
focusDomainHint,
|
||||||
questionTypeHint: questionTypeClass,
|
questionTypeHint: questionTypeClass,
|
||||||
companyAnchors: input.companyAnchors as any,
|
companyAnchors: companyAnchorSet,
|
||||||
normalizationPeriodExplicit,
|
normalizationPeriodExplicit,
|
||||||
enableAnswerPolicyV11: input.featureAnswerPolicyV11,
|
enableAnswerPolicyV11: input.featureAnswerPolicyV11,
|
||||||
enableProblemCentricAnswerV1: input.featureProblemCentricAnswerV1,
|
enableProblemCentricAnswerV1: input.featureProblemCentricAnswerV1,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer";
|
import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer";
|
||||||
|
import type { ClaimBoundAnchorAudit } from "./assistantClaimBoundEvidence";
|
||||||
|
import type { AssistantLiveTemporalHint } from "./assistantDeepTurnRetrievalRuntimeAdapter";
|
||||||
|
import type { DomainPolarityGuardAudit, TemporalGuardAudit } from "./assistantRuntimeGuards";
|
||||||
|
|
||||||
const KNOWN_P0_DOMAINS = new Set([
|
const KNOWN_P0_DOMAINS = new Set([
|
||||||
"settlements_60_62",
|
"settlements_60_62",
|
||||||
|
|
@ -9,7 +12,7 @@ const KNOWN_P0_DOMAINS = new Set([
|
||||||
|
|
||||||
function toAnalysisContext(
|
function toAnalysisContext(
|
||||||
runtimeAnalysisContext: BuildAssistantDeepTurnRuntimeContextInput["runtimeAnalysisContext"]
|
runtimeAnalysisContext: BuildAssistantDeepTurnRuntimeContextInput["runtimeAnalysisContext"]
|
||||||
): Record<string, string | null> | null {
|
): AssistantLiveTemporalHint | null {
|
||||||
if (!runtimeAnalysisContext.active) {
|
if (!runtimeAnalysisContext.active) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -48,26 +51,19 @@ export interface BuildAssistantDeepTurnRuntimeContextInput {
|
||||||
userMessage: string;
|
userMessage: string;
|
||||||
normalized: NormalizeResponsePayload["normalized"];
|
normalized: NormalizeResponsePayload["normalized"];
|
||||||
companyAnchors: unknown;
|
companyAnchors: unknown;
|
||||||
analysisContext: Record<string, string | null> | null;
|
analysisContext: AssistantLiveTemporalHint | null;
|
||||||
}) => {
|
}) => TemporalGuardAudit;
|
||||||
effective_primary_period?: unknown;
|
|
||||||
primary_period_window?: unknown;
|
|
||||||
[key: string]: unknown;
|
|
||||||
};
|
|
||||||
resolveDomainPolarityGuard: (input: {
|
resolveDomainPolarityGuard: (input: {
|
||||||
userMessage: string;
|
userMessage: string;
|
||||||
companyAnchors: unknown;
|
companyAnchors: unknown;
|
||||||
focusDomainHint: string | null;
|
focusDomainHint: string | null;
|
||||||
}) => unknown;
|
}) => DomainPolarityGuardAudit;
|
||||||
resolveClaimBoundAnchors: (input: {
|
resolveClaimBoundAnchors: (input: {
|
||||||
userMessage: string;
|
userMessage: string;
|
||||||
companyAnchors: unknown;
|
companyAnchors: unknown;
|
||||||
focusDomainHint: string | null;
|
focusDomainHint: string | null;
|
||||||
primaryPeriod: unknown;
|
primaryPeriod: unknown;
|
||||||
}) => {
|
}) => ClaimBoundAnchorAudit;
|
||||||
claim_type: string;
|
|
||||||
[key: string]: unknown;
|
|
||||||
};
|
|
||||||
resolveBusinessScopeFromLiveContext: (input: {
|
resolveBusinessScopeFromLiveContext: (input: {
|
||||||
current: {
|
current: {
|
||||||
route_summary_resolved: RouteHintSummary | null;
|
route_summary_resolved: RouteHintSummary | null;
|
||||||
|
|
@ -93,22 +89,15 @@ export interface BuildAssistantDeepTurnRuntimeContextOutput {
|
||||||
};
|
};
|
||||||
inferredDomainByMessage: string | null;
|
inferredDomainByMessage: string | null;
|
||||||
focusDomainForGuards: string | null;
|
focusDomainForGuards: string | null;
|
||||||
temporalGuard: {
|
temporalGuard: TemporalGuardAudit;
|
||||||
effective_primary_period?: unknown;
|
domainPolarityGuardInitial: DomainPolarityGuardAudit;
|
||||||
primary_period_window?: unknown;
|
claimAnchorAudit: ClaimBoundAnchorAudit;
|
||||||
[key: string]: unknown;
|
|
||||||
};
|
|
||||||
domainPolarityGuardInitial: unknown;
|
|
||||||
claimAnchorAudit: {
|
|
||||||
claim_type: string;
|
|
||||||
[key: string]: unknown;
|
|
||||||
};
|
|
||||||
businessScopeResolution: {
|
businessScopeResolution: {
|
||||||
route_summary_resolved: RouteHintSummary | null;
|
route_summary_resolved: RouteHintSummary | null;
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
};
|
};
|
||||||
resolvedRouteSummary: RouteHintSummary | null;
|
resolvedRouteSummary: RouteHintSummary | null;
|
||||||
liveTemporalHint: Record<string, string | null> | null;
|
liveTemporalHint: AssistantLiveTemporalHint | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function buildAssistantDeepTurnRuntimeContext(
|
export function buildAssistantDeepTurnRuntimeContext(
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,10 @@ import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normal
|
||||||
import type { AssistantRequirementExtractionResult, AssistantCoverageEvaluationResult } from "./assistantOrchestrationRuntimeAdapter";
|
import type { AssistantRequirementExtractionResult, AssistantCoverageEvaluationResult } from "./assistantOrchestrationRuntimeAdapter";
|
||||||
import { runAssistantCoverageGroundingPipeline } from "./assistantOrchestrationRuntimeAdapter";
|
import { runAssistantCoverageGroundingPipeline } from "./assistantOrchestrationRuntimeAdapter";
|
||||||
import type { AssistantDeepTurnGroundingEligibilityOutput } from "./assistantDeepTurnGuardRuntimeAdapter";
|
import type { AssistantDeepTurnGroundingEligibilityOutput } from "./assistantDeepTurnGuardRuntimeAdapter";
|
||||||
import { applyAssistantDeepTurnGroundingEligibility } from "./assistantDeepTurnGuardRuntimeAdapter";
|
import {
|
||||||
|
applyAssistantDeepTurnGroundingEligibility,
|
||||||
|
type AssistantDeepTurnGroundingEligibilityInput
|
||||||
|
} from "./assistantDeepTurnGuardRuntimeAdapter";
|
||||||
|
|
||||||
export interface AssistantDeepTurnGroundingRuntimeInput {
|
export interface AssistantDeepTurnGroundingRuntimeInput {
|
||||||
claimType: string;
|
claimType: string;
|
||||||
|
|
@ -34,10 +37,10 @@ export interface AssistantDeepTurnGroundingRuntimeInput {
|
||||||
coverage: RequirementCoverageReport,
|
coverage: RequirementCoverageReport,
|
||||||
retrievalResults: UnifiedRetrievalResult[]
|
retrievalResults: UnifiedRetrievalResult[]
|
||||||
) => AnswerGroundingCheck;
|
) => AnswerGroundingCheck;
|
||||||
temporalGuard: unknown;
|
temporalGuard: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>["temporalGuard"];
|
||||||
polarityAudit: unknown;
|
polarityAudit: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>["polarityAudit"];
|
||||||
evidenceAudit: unknown;
|
evidenceAudit: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>["evidenceAudit"];
|
||||||
claimAnchorAudit: unknown;
|
claimAnchorAudit: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>["claimAnchorAudit"];
|
||||||
targetedEvidenceHitRate?: number | null;
|
targetedEvidenceHitRate?: number | null;
|
||||||
businessScopeResolved?: string[] | null;
|
businessScopeResolved?: string[] | null;
|
||||||
collectRbpLiveRouteAudit: (input: {
|
collectRbpLiveRouteAudit: (input: {
|
||||||
|
|
@ -51,15 +54,9 @@ export interface AssistantDeepTurnGroundingRuntimeInput {
|
||||||
planAudit: unknown;
|
planAudit: unknown;
|
||||||
}) => unknown;
|
}) => unknown;
|
||||||
runCoverageGroundingPipelineFn?: typeof runAssistantCoverageGroundingPipeline;
|
runCoverageGroundingPipelineFn?: typeof runAssistantCoverageGroundingPipeline;
|
||||||
applyGroundingEligibilityFn?: (input: {
|
applyGroundingEligibilityFn?: (
|
||||||
groundingCheckBase: AnswerGroundingCheck;
|
input: AssistantDeepTurnGroundingEligibilityInput<AnswerGroundingCheck>
|
||||||
temporalGuard: unknown;
|
) => AssistantDeepTurnGroundingEligibilityOutput<AnswerGroundingCheck>;
|
||||||
polarityAudit: unknown;
|
|
||||||
evidenceAudit: unknown;
|
|
||||||
claimAnchorAudit?: unknown;
|
|
||||||
targetedEvidenceHitRate?: number | null;
|
|
||||||
businessScopeResolved?: string[] | null;
|
|
||||||
}) => AssistantDeepTurnGroundingEligibilityOutput<AnswerGroundingCheck>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AssistantDeepTurnGroundingRuntimeOutput {
|
export interface AssistantDeepTurnGroundingRuntimeOutput {
|
||||||
|
|
@ -75,9 +72,11 @@ export function runAssistantDeepTurnGroundingRuntime(
|
||||||
input: AssistantDeepTurnGroundingRuntimeInput
|
input: AssistantDeepTurnGroundingRuntimeInput
|
||||||
): AssistantDeepTurnGroundingRuntimeOutput {
|
): AssistantDeepTurnGroundingRuntimeOutput {
|
||||||
const runCoverageGroundingPipelineSafe = input.runCoverageGroundingPipelineFn ?? runAssistantCoverageGroundingPipeline;
|
const runCoverageGroundingPipelineSafe = input.runCoverageGroundingPipelineFn ?? runAssistantCoverageGroundingPipeline;
|
||||||
|
const applyGroundingEligibilityDefault: NonNullable<
|
||||||
|
AssistantDeepTurnGroundingRuntimeInput["applyGroundingEligibilityFn"]
|
||||||
|
> = (payload) => applyAssistantDeepTurnGroundingEligibility(payload);
|
||||||
const applyGroundingEligibilitySafe =
|
const applyGroundingEligibilitySafe =
|
||||||
input.applyGroundingEligibilityFn ??
|
input.applyGroundingEligibilityFn ?? applyGroundingEligibilityDefault;
|
||||||
((payload) => applyAssistantDeepTurnGroundingEligibility(payload as any) as any);
|
|
||||||
|
|
||||||
const rbpLiveRouteAudit = input.collectRbpLiveRouteAudit({
|
const rbpLiveRouteAudit = input.collectRbpLiveRouteAudit({
|
||||||
claimType: input.claimType,
|
claimType: input.claimType,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import type {
|
import type {
|
||||||
AssistantConversationItem,
|
AssistantConversationItem,
|
||||||
|
AssistantDebugPayload,
|
||||||
AssistantReplyType,
|
AssistantReplyType,
|
||||||
AssistantRequirement,
|
AssistantRequirement,
|
||||||
AnswerGroundingCheck,
|
AnswerGroundingCheck,
|
||||||
|
|
@ -112,7 +113,7 @@ export interface AssistantDeepTurnPackagingOutput {
|
||||||
evidenceBundleAssembly: AssistantEvidenceBundleAssembly;
|
evidenceBundleAssembly: AssistantEvidenceBundleAssembly;
|
||||||
contractsBundleV1: AssistantContractsBundleV1;
|
contractsBundleV1: AssistantContractsBundleV1;
|
||||||
deepAnswerArtifacts: DeepAnswerArtifacts;
|
deepAnswerArtifacts: DeepAnswerArtifacts;
|
||||||
debug: Record<string, unknown>;
|
debug: AssistantDebugPayload;
|
||||||
assistantItem: AssistantConversationItem;
|
assistantItem: AssistantConversationItem;
|
||||||
deepAnalysisLogDetails: Record<string, unknown>;
|
deepAnalysisLogDetails: Record<string, unknown>;
|
||||||
}
|
}
|
||||||
|
|
@ -194,7 +195,7 @@ export function assembleAssistantDeepTurnPackaging(input: AssistantDeepTurnPacka
|
||||||
text: deepAnswerArtifacts.safeAssistantReply,
|
text: deepAnswerArtifacts.safeAssistantReply,
|
||||||
replyType: input.composition.reply_type,
|
replyType: input.composition.reply_type,
|
||||||
traceId: input.normalized.trace_id,
|
traceId: input.normalized.trace_id,
|
||||||
debug: debug as any
|
debug
|
||||||
});
|
});
|
||||||
const deepAnalysisLogDetails = buildDeepAnalysisProcessedLogDetails({
|
const deepAnalysisLogDetails = buildDeepAnalysisProcessedLogDetails({
|
||||||
sessionId: input.sessionId,
|
sessionId: input.sessionId,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import type {
|
import type {
|
||||||
AssistantConversationItem,
|
AssistantConversationItem,
|
||||||
|
AssistantDebugPayload,
|
||||||
AssistantRequirement,
|
AssistantRequirement,
|
||||||
AnswerGroundingCheck,
|
AnswerGroundingCheck,
|
||||||
RequirementCoverageReport,
|
RequirementCoverageReport,
|
||||||
|
|
@ -101,7 +102,7 @@ export interface AssistantDeepTurnPackagingRuntimeOutput {
|
||||||
resolvedExecutionState: unknown;
|
resolvedExecutionState: unknown;
|
||||||
safeAssistantReplyBase: string;
|
safeAssistantReplyBase: string;
|
||||||
safeAssistantReply: string;
|
safeAssistantReply: string;
|
||||||
debug: Record<string, unknown>;
|
debug: AssistantDebugPayload;
|
||||||
assistantItem: AssistantConversationItem;
|
assistantItem: AssistantConversationItem;
|
||||||
deepAnalysisLogDetails: Record<string, unknown>;
|
deepAnalysisLogDetails: Record<string, unknown>;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import type { AssistantMessageResponsePayload } from "../types/assistant";
|
import type { AssistantDebugPayload, AssistantMessageResponsePayload } from "../types/assistant";
|
||||||
import type { NormalizeResponsePayload } from "../types/normalizer";
|
import type { NormalizeResponsePayload } from "../types/normalizer";
|
||||||
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
|
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
|
||||||
import type { RunAssistantDeepTurnAnalysisRuntimeOutput } from "./assistantDeepTurnAnalysisRuntimeAdapter";
|
import type { RunAssistantDeepTurnAnalysisRuntimeOutput } from "./assistantDeepTurnAnalysisRuntimeAdapter";
|
||||||
|
|
@ -55,7 +55,7 @@ export function runAssistantDeepTurnResponseAttemptRuntime<
|
||||||
input: RunAssistantDeepTurnResponseAttemptRuntimeInput<ResponseType>
|
input: RunAssistantDeepTurnResponseAttemptRuntimeInput<ResponseType>
|
||||||
): {
|
): {
|
||||||
response: ResponseType;
|
response: ResponseType;
|
||||||
debug: Record<string, unknown>;
|
debug: AssistantDebugPayload;
|
||||||
} {
|
} {
|
||||||
const runDeepTurnResponseRuntimeSafe =
|
const runDeepTurnResponseRuntimeSafe =
|
||||||
input.runDeepTurnResponseRuntime ?? runAssistantDeepTurnResponseRuntime;
|
input.runDeepTurnResponseRuntime ?? runAssistantDeepTurnResponseRuntime;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import type { AssistantMessageResponsePayload } from "../types/assistant";
|
import type { AssistantDebugPayload, AssistantMessageResponsePayload } from "../types/assistant";
|
||||||
import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer";
|
import type { NormalizeResponsePayload, RouteHintSummary } from "../types/normalizer";
|
||||||
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
|
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
|
||||||
import {
|
import {
|
||||||
|
|
@ -70,7 +70,7 @@ export interface RunAssistantDeepTurnResponseRuntimeInput {
|
||||||
|
|
||||||
export interface RunAssistantDeepTurnResponseRuntimeOutput {
|
export interface RunAssistantDeepTurnResponseRuntimeOutput {
|
||||||
response: AssistantMessageResponsePayload;
|
response: AssistantMessageResponsePayload;
|
||||||
debug: Record<string, unknown>;
|
debug: AssistantDebugPayload;
|
||||||
}
|
}
|
||||||
|
|
||||||
function toRecordObject(value: unknown): Record<string, unknown> | null {
|
function toRecordObject(value: unknown): Record<string, unknown> | null {
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ export async function executeAssistantDeepTurnRetrievalPlan(
|
||||||
raw_result: raw
|
raw_result: raw
|
||||||
});
|
});
|
||||||
retrievalResults.push(
|
retrievalResults.push(
|
||||||
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, raw as any)
|
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, raw)
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const message = error instanceof Error ? error.message : String(error);
|
const message = error instanceof Error ? error.message : String(error);
|
||||||
|
|
@ -118,7 +118,7 @@ export async function executeAssistantDeepTurnRetrievalPlan(
|
||||||
raw_result: rawError
|
raw_result: rawError
|
||||||
});
|
});
|
||||||
retrievalResults.push(
|
retrievalResults.push(
|
||||||
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, rawError as any)
|
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, rawError)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -509,28 +509,29 @@ export function normalizeRetrievalResult(
|
||||||
fragmentId: string,
|
fragmentId: string,
|
||||||
requirementIds: string[],
|
requirementIds: string[],
|
||||||
route: string,
|
route: string,
|
||||||
raw: RawRetrievalResult
|
raw: unknown
|
||||||
): UnifiedRetrievalResult {
|
): UnifiedRetrievalResult {
|
||||||
const items = normalizeObjectArray(raw.items);
|
const rawResult = (toObject(raw) as RawRetrievalResult | null) ?? {};
|
||||||
const summary = normalizeSummary(raw.summary);
|
const items = normalizeObjectArray(rawResult.items);
|
||||||
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, raw.evidence);
|
const summary = normalizeSummary(rawResult.summary);
|
||||||
|
const evidence = normalizeEvidenceItems(fragmentId, requirementIds, route, rawResult.evidence);
|
||||||
|
|
||||||
const baseResult: UnifiedRetrievalResult = {
|
const baseResult: UnifiedRetrievalResult = {
|
||||||
fragment_id: fragmentId,
|
fragment_id: fragmentId,
|
||||||
requirement_ids: requirementIds,
|
requirement_ids: requirementIds,
|
||||||
route,
|
route,
|
||||||
status: normalizeStatus(raw.status),
|
status: normalizeStatus(rawResult.status),
|
||||||
result_type: normalizeResultType(raw.result_type),
|
result_type: normalizeResultType(rawResult.result_type),
|
||||||
items,
|
items,
|
||||||
summary,
|
summary,
|
||||||
evidence,
|
evidence,
|
||||||
why_included: normalizeStringArray(raw.why_included),
|
why_included: normalizeStringArray(rawResult.why_included),
|
||||||
selection_reason: normalizeStringArray(raw.selection_reason),
|
selection_reason: normalizeStringArray(rawResult.selection_reason),
|
||||||
risk_factors: normalizeStringArray(raw.risk_factors),
|
risk_factors: normalizeStringArray(rawResult.risk_factors),
|
||||||
business_interpretation: normalizeStringArray(raw.business_interpretation),
|
business_interpretation: normalizeStringArray(rawResult.business_interpretation),
|
||||||
confidence: normalizeConfidence(raw.confidence),
|
confidence: normalizeConfidence(rawResult.confidence),
|
||||||
limitations: normalizeStringArray(raw.limitations),
|
limitations: normalizeStringArray(rawResult.limitations),
|
||||||
errors: normalizeErrors(raw.errors)
|
errors: normalizeErrors(rawResult.errors)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!FEATURE_ASSISTANT_PROBLEM_UNITS_V1) {
|
if (!FEATURE_ASSISTANT_PROBLEM_UNITS_V1) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue