diff --git a/changelog.d/maintenance/9118-ts7-response-meta-header-inputs.md b/changelog.d/maintenance/9118-ts7-response-meta-header-inputs.md new file mode 100644 index 0000000000..983269b392 --- /dev/null +++ b/changelog.d/maintenance/9118-ts7-response-meta-header-inputs.md @@ -0,0 +1 @@ +- **fix(types):** narrowed non-streaming chat response metadata inputs to the shared header contract without changing emitted metadata headers ([#9118](https://github.com/diegosouzapw/OmniRoute/pull/9118)) diff --git a/open-sse/handlers/chatCore/nonStreamingResponseHeaders.ts b/open-sse/handlers/chatCore/nonStreamingResponseHeaders.ts index 62ad018ccb..1a58391806 100644 --- a/open-sse/handlers/chatCore/nonStreamingResponseHeaders.ts +++ b/open-sse/handlers/chatCore/nonStreamingResponseHeaders.ts @@ -16,9 +16,9 @@ export function buildNonStreamingResponseHeaders( provider: string | null | undefined; model: string | null | undefined; startTime: number; - responseUsage: unknown; + responseUsage: Record | null | undefined; estimatedCost: number; - requestId: unknown; + requestId: string | null | undefined; compressionResponseMeta?: string | null | undefined; comboStrategy?: string | null | undefined; }, diff --git a/tests/unit/chatcore-nonstreaming-response-headers.test.ts b/tests/unit/chatcore-nonstreaming-response-headers.test.ts index d5a7a74044..b0ba09b59d 100644 --- a/tests/unit/chatcore-nonstreaming-response-headers.test.ts +++ b/tests/unit/chatcore-nonstreaming-response-headers.test.ts @@ -6,14 +6,16 @@ import { test } from "node:test"; import assert from "node:assert/strict"; -const { buildNonStreamingResponseHeaders } = await import( - "../../open-sse/handlers/chatCore/nonStreamingResponseHeaders.ts" -); +const { buildNonStreamingResponseHeaders } = + await import("../../open-sse/handlers/chatCore/nonStreamingResponseHeaders.ts"); function makeDeps(now = 1000) { const metaCalls: Array<{ headers: Record; meta: Record }> = []; const deps = { - attachOmniRouteMetaHeaders: (headers: Record, meta: Record) => { + attachOmniRouteMetaHeaders: ( + headers: Record, + meta: Record + ) => { metaCalls.push({ headers, meta }); headers["x-omniroute-meta"] = "attached"; }, @@ -35,6 +37,17 @@ function baseArgs(overrides: Record = {}) { } as Parameters[0]; } +function acceptsAttachMetaInputContract(args: { + responseUsage: Record | null | undefined; + requestId: string | null | undefined; +}) { + return args; +} + +test("builder input types match the metadata attachment contract", () => { + acceptsAttachMetaInputContract(baseArgs()); +}); + test("static headers: Content-Type json + cache MISS", () => { const { deps } = makeDeps(); const h = buildNonStreamingResponseHeaders(baseArgs(), deps); @@ -59,7 +72,10 @@ test("meta receives provider/model/cacheHit false/latency/usage/cost/requestId", test("no compression meta → no compression header", () => { const { deps } = makeDeps(); - const h = buildNonStreamingResponseHeaders(baseArgs({ compressionResponseMeta: undefined }), deps); + const h = buildNonStreamingResponseHeaders( + baseArgs({ compressionResponseMeta: undefined }), + deps + ); assert.ok(!Object.values(h).includes("engine:x")); });