165 lines
6.1 KiB
TypeScript
165 lines
6.1 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import { runAssistantDeepTurnAnalysisRuntime } from "../src/services/assistantDeepTurnAnalysisRuntimeAdapter";
|
|
|
|
describe("assistant deep turn analysis runtime adapter", () => {
|
|
it("orchestrates deep pipeline steps in deterministic order", async () => {
|
|
const callOrder: string[] = [];
|
|
|
|
const runContextRuntime = vi.fn(() => {
|
|
callOrder.push("context");
|
|
return {
|
|
companyAnchors: { accounts: ["60.01"] },
|
|
focusDomainForGuards: "settlements_60_62",
|
|
temporalGuard: { primary_period_window: { from: "2020-07-01", to: "2020-07-31" } },
|
|
domainPolarityGuardInitial: { polarity: "supplier_payable" },
|
|
claimAnchorAudit: { claim_type: "prove_settlement_closure_state" },
|
|
businessScopeResolution: { business_scope_resolved: ["company_specific_accounting"] },
|
|
resolvedRouteSummary: { mode: "deterministic_v2", decisions: [] as any[] } as any,
|
|
liveTemporalHint: {
|
|
as_of_date: "2020-07-31",
|
|
period_from: null,
|
|
period_to: null,
|
|
source: "analysis_context"
|
|
}
|
|
};
|
|
});
|
|
const runExecutionPlanRuntime = vi.fn((input) => {
|
|
callOrder.push("plan");
|
|
expect(input.claimAnchorAudit.claim_type).toBe("prove_settlement_closure_state");
|
|
return {
|
|
requirementExtraction: {
|
|
requirements: [{ id: "R1" }],
|
|
byFragment: new Map<string, string[]>([["F1", ["R1"]]])
|
|
},
|
|
executionPlan: [{ fragment_id: "F1" }],
|
|
rbpRoutePlanEnforcement: { executionPlan: [{ fragment_id: "F1" }], audit: { rbp: true } },
|
|
faRoutePlanEnforcement: { executionPlan: [{ fragment_id: "F1" }], audit: { fa: true } }
|
|
} as any;
|
|
});
|
|
const runRetrievalRuntime = vi.fn(async (input) => {
|
|
callOrder.push("retrieval");
|
|
expect(input.liveTemporalHint?.as_of_date).toBe("2020-07-31");
|
|
return {
|
|
retrievalCalls: [{ fragment_id: "F1", route: "store_canonical" }],
|
|
retrievalResultsRaw: [{ fragment_id: "F1", route: "store_canonical", raw_result: {} }],
|
|
retrievalResults: [{ fragment_id: "F1", requirement_ids: ["R1"] }]
|
|
} as any;
|
|
});
|
|
const runGuardRuntime = vi.fn((input) => {
|
|
callOrder.push("guard");
|
|
expect(input.retrievalResults[0].fragment_id).toBe("F1");
|
|
return {
|
|
retrievalResults: [{ fragment_id: "F1-guarded", requirement_ids: ["R1"] }],
|
|
polarityGuardResult: { audit: { polarity: "supplier_payable" } },
|
|
targetedEvidenceResult: {
|
|
audit: {
|
|
targeted_evidence_hit_rate: 0.5
|
|
}
|
|
},
|
|
evidenceGateResult: {
|
|
audit: {
|
|
admissible_evidence_count: 3
|
|
}
|
|
}
|
|
} as any;
|
|
});
|
|
const runGroundingRuntime = vi.fn((input) => {
|
|
callOrder.push("grounding");
|
|
expect(input.claimType).toBe("prove_settlement_closure_state");
|
|
expect(input.targetedEvidenceHitRate).toBe(0.5);
|
|
expect(input.businessScopeResolved).toEqual(["company_specific_accounting"]);
|
|
return {
|
|
rbpLiveRouteAudit: { routed: 1 },
|
|
faLiveRouteAudit: { routed: 1 },
|
|
coverageEvaluation: {
|
|
requirements: [{ id: "R1" }],
|
|
coverage: { requirements_total: 1, requirements_covered: 1 }
|
|
},
|
|
groundedAnswerEligibilityGuard: { eligible: true },
|
|
groundingCheck: { status: "grounded", reasons: [] }
|
|
} as any;
|
|
});
|
|
const runCompositionRuntime = vi.fn((input) => {
|
|
callOrder.push("composition");
|
|
expect(input.retrievalResults[0].fragment_id).toBe("F1-guarded");
|
|
return {
|
|
questionTypeClass: "causal_trace",
|
|
composition: { reply_type: "factual", answer: "ok" }
|
|
} as any;
|
|
});
|
|
|
|
const runtime = await runAssistantDeepTurnAnalysisRuntime({
|
|
userMessage: "where closure failed",
|
|
runContextRuntime,
|
|
runExecutionPlanRuntime,
|
|
runRetrievalRuntime,
|
|
runGuardRuntime,
|
|
runGroundingRuntime,
|
|
runCompositionRuntime
|
|
});
|
|
|
|
expect(callOrder).toEqual(["context", "plan", "retrieval", "guard", "grounding", "composition"]);
|
|
expect(runtime.retrievalResults[0].fragment_id).toBe("F1-guarded");
|
|
expect(runtime.questionTypeClass).toBe("causal_trace");
|
|
expect(runtime.composition.reply_type).toBe("factual");
|
|
});
|
|
|
|
it("passes null business scope when not resolved", async () => {
|
|
const runGroundingRuntime = vi.fn(() => ({
|
|
rbpLiveRouteAudit: {},
|
|
faLiveRouteAudit: {},
|
|
coverageEvaluation: { requirements: [], coverage: {} },
|
|
groundedAnswerEligibilityGuard: {},
|
|
groundingCheck: { status: "no_grounded_answer", reasons: [] }
|
|
}));
|
|
|
|
await runAssistantDeepTurnAnalysisRuntime({
|
|
userMessage: "question",
|
|
runContextRuntime: () =>
|
|
({
|
|
companyAnchors: {},
|
|
focusDomainForGuards: null,
|
|
temporalGuard: {},
|
|
domainPolarityGuardInitial: {},
|
|
claimAnchorAudit: { claim_type: "unknown" },
|
|
businessScopeResolution: {},
|
|
resolvedRouteSummary: null,
|
|
liveTemporalHint: null
|
|
}) as any,
|
|
runExecutionPlanRuntime: () =>
|
|
({
|
|
requirementExtraction: { requirements: [], byFragment: new Map() },
|
|
executionPlan: [],
|
|
rbpRoutePlanEnforcement: { executionPlan: [], audit: {} },
|
|
faRoutePlanEnforcement: { executionPlan: [], audit: {} }
|
|
}) as any,
|
|
runRetrievalRuntime: async () =>
|
|
({
|
|
retrievalCalls: [],
|
|
retrievalResultsRaw: [],
|
|
retrievalResults: []
|
|
}) as any,
|
|
runGuardRuntime: () =>
|
|
({
|
|
retrievalResults: [],
|
|
polarityGuardResult: { audit: {} },
|
|
targetedEvidenceResult: { audit: { targeted_evidence_hit_rate: null } },
|
|
evidenceGateResult: { audit: {} }
|
|
}) as any,
|
|
runGroundingRuntime: runGroundingRuntime as any,
|
|
runCompositionRuntime: () =>
|
|
({
|
|
questionTypeClass: "single_fact_lookup",
|
|
composition: { reply_type: "partial_coverage" }
|
|
}) as any
|
|
});
|
|
|
|
expect(runGroundingRuntime).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
routeSummary: null,
|
|
businessScopeResolved: null
|
|
})
|
|
);
|
|
});
|
|
});
|