From ab6e99d7c7a7e793610e57d2eeedf3d1eaacea2e Mon Sep 17 00:00:00 2001 From: backryun Date: Thu, 6 Aug 2026 10:30:34 +0900 Subject: [PATCH] fix(types): preserve non-streaming response metadata (#9118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Validated in local merge-train (devbox-vm-06-dev002) @ combined-tip (FAST gates: typecheck/complexity/cognitive/changelog/vitest — only pre-existing audit.test.ts flake). Evidence: /home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/merge-train-20260805-222248-suite.log --- .../9118-ts7-response-meta-header-inputs.md | 1 + .../chatCore/nonStreamingResponseHeaders.ts | 4 +-- ...core-nonstreaming-response-headers.test.ts | 26 +++++++++++++++---- 3 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 changelog.d/maintenance/9118-ts7-response-meta-header-inputs.md 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")); });