124 lines
4.0 KiB
TypeScript
124 lines
4.0 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { AssistantRequirement, UnifiedRetrievalResult } from "../src/types/assistant";
|
|
import { buildAssistantEvidenceBundleContractV1 } from "../src/services/assistantOrchestrationContracts";
|
|
import { assembleAssistantContractsBundleV1 } from "../src/services/assistantContractsBundleAssembler";
|
|
|
|
function buildRequirement(): AssistantRequirement {
|
|
return {
|
|
requirement_id: "R1",
|
|
source_fragment_id: "F1",
|
|
requirement_text: "req1",
|
|
subject_tokens: ["account_60.01"],
|
|
status: "covered",
|
|
route: "hybrid_store_plus_live"
|
|
};
|
|
}
|
|
|
|
function buildRetrieval(input?: Partial<UnifiedRetrievalResult>): UnifiedRetrievalResult {
|
|
return {
|
|
fragment_id: "F1",
|
|
requirement_ids: ["R1"],
|
|
route: "hybrid_store_plus_live",
|
|
status: "ok",
|
|
result_type: "summary",
|
|
items: [],
|
|
summary: {},
|
|
evidence: [],
|
|
why_included: [],
|
|
selection_reason: [],
|
|
risk_factors: [],
|
|
business_interpretation: [],
|
|
confidence: "medium",
|
|
limitations: [],
|
|
errors: [],
|
|
...input
|
|
};
|
|
}
|
|
|
|
describe("assistant contracts bundle assembler", () => {
|
|
it("assembles query/execution/coverage contracts with outcome class", () => {
|
|
const retrievalResults = [buildRetrieval({ status: "ok" })];
|
|
const bundle = assembleAssistantContractsBundleV1({
|
|
userMessage: "проверь хвосты по 60.01",
|
|
normalizedQuestion: "проверь хвосты по 60.01",
|
|
normalized: {
|
|
schema_version: "normalized_query_v2_0_2",
|
|
user_message_raw: "проверь хвосты по 60.01",
|
|
message_in_scope: true,
|
|
scope_confidence: "high",
|
|
contains_multiple_tasks: false,
|
|
fragments: [{ fragment_id: "F1" }],
|
|
discarded_fragments: [],
|
|
global_notes: {
|
|
needs_clarification: false,
|
|
clarification_reason: null
|
|
}
|
|
} as any,
|
|
routeSummary: {
|
|
mode: "deterministic_v2",
|
|
message_in_scope: true,
|
|
scope_confidence: "high",
|
|
planner: {
|
|
total_fragments: 1,
|
|
in_scope_fragments: 1,
|
|
out_of_scope_fragments: 0,
|
|
discarded_fragments: 0,
|
|
contains_multiple_tasks: false
|
|
},
|
|
decisions: [],
|
|
fallback: {
|
|
type: "none",
|
|
message: null
|
|
}
|
|
},
|
|
droppedIntentSegments: [],
|
|
analysisContext: {
|
|
as_of_date: "2020-07-31",
|
|
period_from: null,
|
|
period_to: null,
|
|
source: "eval_analysis_date",
|
|
snapshot_mode: "auto"
|
|
},
|
|
executionPlan: [
|
|
{
|
|
fragment_id: "F1",
|
|
requirement_ids: ["R1"],
|
|
route: "hybrid_store_plus_live",
|
|
should_execute: true,
|
|
no_route_reason: null,
|
|
clarification_reason: null
|
|
}
|
|
],
|
|
requirements: [buildRequirement()],
|
|
evidenceBundleContractV1: buildAssistantEvidenceBundleContractV1({
|
|
retrievalCalls: [{ route: "hybrid_store_plus_live" }],
|
|
retrievalResults
|
|
}),
|
|
replyType: "factual_with_explanation",
|
|
coverageReport: {
|
|
requirements_total: 1,
|
|
requirements_covered: 1,
|
|
requirements_uncovered: [],
|
|
requirements_partially_covered: [],
|
|
clarification_needed_for: [],
|
|
out_of_scope_requirements: []
|
|
},
|
|
grounding: {
|
|
status: "grounded",
|
|
route_subject_match: true,
|
|
missing_requirements: [],
|
|
reasons: [],
|
|
why_included_summary: [],
|
|
selection_reason_summary: []
|
|
},
|
|
retrievalResults
|
|
});
|
|
|
|
expect(bundle.queryFrameContractV1.schema_version).toBe("assistant_query_frame_v1");
|
|
expect(bundle.executionPlanContractV1.schema_version).toBe("assistant_execution_plan_v1");
|
|
expect(bundle.coverageContractV1.schema_version).toBe("assistant_coverage_contract_v1");
|
|
expect(bundle.outcomeClassV1).toBe("FULLY_ANSWERED");
|
|
expect(bundle.assistantOrchestrationContractsV1.evidence_bundle.schema_version).toBe("assistant_evidence_bundle_v1");
|
|
});
|
|
});
|