import { describe, expect, it, vi } from "vitest"; import { buildAssistantDeepTurnNormalizationRuntime } from "../src/services/assistantDeepTurnNormalizationRuntimeAdapter"; describe("assistant deep turn normalization runtime adapter", () => { it("uses followup state binding when feature flags are enabled and state exists", async () => { const followupBinding = { normalizedQuestion: "normalized question", mergedContext: { period_hint: "2020-07", business_context: "ctx-from-followup" }, usage: { applied: true } }; const buildFollowupStateBinding = vi.fn(() => followupBinding); const normalize = vi.fn(async (request) => ({ trace_id: "trace-1", ok: true, normalized: { schema_version: "normalized_query_v2_0_2" } as any, route_hint_summary: null, raw_model_output: {}, validation: { passed: true, errors: [] }, usage: { input_tokens: 10, output_tokens: 20, total_tokens: 30 }, latency_ms: 7, prompt_version: String(request.promptVersion ?? ""), schema_version: "normalized_query_v2_0_2", request_count_for_case: 1 })); const runtime = await buildAssistantDeepTurnNormalizationRuntime({ userMessage: "raw question", payload: { llmProvider: "openai", apiKey: "k", model: "m", baseUrl: "https://api.example.com", temperature: 0.2, maxOutputTokens: 333, promptVersion: "normalizer_v2_0_2", systemPrompt: "sys", developerPrompt: "dev", domainPrompt: "dom", fewShotExamples: "few", context: { period_hint: "2020-06" }, useMock: true }, featureInvestigationStateV1: true, featureStateFollowupBindingV1: true, sessionInvestigationState: { active_domain: "settlements_60_62" }, buildFollowupStateBinding, normalize }); expect(buildFollowupStateBinding).toHaveBeenCalledTimes(1); expect(normalize).toHaveBeenCalledTimes(1); expect(normalize).toHaveBeenCalledWith({ llmProvider: "openai", apiKey: "k", model: "m", baseUrl: "https://api.example.com", temperature: 0.2, maxOutputTokens: 333, promptVersion: "normalizer_v2_0_2", systemPrompt: "sys", developerPrompt: "dev", domainPrompt: "dom", fewShotExamples: "few", userQuestion: "normalized question", context: { period_hint: "2020-07", business_context: "ctx-from-followup" }, useMock: true }); expect(runtime.followupBinding).toBe(followupBinding); expect(runtime.normalizePayload.userQuestion).toBe("normalized question"); }); it("falls back to raw user message when followup binding is disabled", async () => { const buildFollowupStateBinding = vi.fn(); const normalize = vi.fn(async () => ({ trace_id: "trace-2", ok: true, normalized: { schema_version: "normalized_query_v2_0_2" } as any, route_hint_summary: null, raw_model_output: {}, validation: { passed: true, errors: [] }, usage: { input_tokens: 1, output_tokens: 1, total_tokens: 2 }, latency_ms: 1, prompt_version: "address_query_runtime_v1", schema_version: "normalized_query_v2_0_2", request_count_for_case: 1 })); const runtime = await buildAssistantDeepTurnNormalizationRuntime({ userMessage: "raw fallback", payload: { llmProvider: "openai", context: { business_context: "payload-context" }, useMock: undefined }, featureInvestigationStateV1: false, featureStateFollowupBindingV1: true, sessionInvestigationState: { some: "state" }, buildFollowupStateBinding, normalize }); expect(buildFollowupStateBinding).not.toHaveBeenCalled(); expect(normalize).toHaveBeenCalledWith({ llmProvider: "openai", apiKey: undefined, model: undefined, baseUrl: undefined, temperature: undefined, maxOutputTokens: undefined, promptVersion: "address_query_runtime_v1", systemPrompt: undefined, developerPrompt: undefined, domainPrompt: undefined, fewShotExamples: undefined, userQuestion: "raw fallback", context: { business_context: "payload-context" }, useMock: false }); expect(runtime.followupBinding).toEqual({ normalizedQuestion: "raw fallback", mergedContext: { business_context: "payload-context" }, usage: null }); }); });