Files
OmniRoute/tests/unit/opencode-strip-client-metadata-1442.test.ts
Diego Rodrigues de Sa e Souza d7d08f4f2a fix(executors): strip client_metadata on the OpenCode path (port from 9router#1442)
OpenCode upstreams (e.g. kimi-k2.6 via opencode-go) return 400 "Extra inputs
are not permitted, field: 'client_metadata'" — an OpenAI-Codex/Claude-CLI
passthrough field with no equivalent upstream. The DefaultExecutor strip only
covers cerebras/mistral, and OpencodeExecutor extends BaseExecutor directly, so
nothing removed it on this path. Strip it in OpencodeExecutor.transformRequest.

Regression guard: tests/unit/opencode-strip-client-metadata-1442.test.ts.

Reported-by: yanpaing007 (https://github.com/decolua/9router/issues/1442)
2026-07-06 16:47:20 -03:00

53 lines
1.8 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
const { OpencodeExecutor } = await import("../../open-sse/executors/opencode.ts");
/**
* Regression test for upstream decolua/9router#1442:
*
* OpenCode upstreams (e.g. kimi-k2.6 via opencode-go) reject the
* `client_metadata` passthrough field (an OpenAI-Codex/Claude-CLI artifact)
* with 400 "Extra inputs are not permitted, field: 'client_metadata'".
* DefaultExecutor strips it only for cerebras/mistral, and OpencodeExecutor
* extends BaseExecutor directly, so nothing removed it on the opencode path.
* OpencodeExecutor.transformRequest must strip it.
*/
describe("OpencodeExecutor — strips client_metadata (#1442)", () => {
const executor = new OpencodeExecutor("opencode-go");
const CREDENTIALS = { apiKey: "k" } as Record<string, unknown>;
function body() {
return {
model: "oc/kimi-k2.6",
stream: true,
client_metadata: { user_id: "abc" },
messages: [{ role: "user", content: "hi" }],
};
}
it("removes client_metadata from the forwarded body", () => {
const out = executor.transformRequest("oc/kimi-k2.6", body(), true, CREDENTIALS) as Record<
string,
unknown
>;
assert.equal(
Object.prototype.hasOwnProperty.call(out, "client_metadata"),
false,
"opencode forward body must not carry client_metadata"
);
assert.ok(Array.isArray(out.messages), "messages preserved");
});
it("is a no-op when client_metadata is absent", () => {
const b = body();
delete (b as Record<string, unknown>).client_metadata;
const out = executor.transformRequest("oc/kimi-k2.6", b, true, CREDENTIALS) as Record<
string,
unknown
>;
assert.equal("client_metadata" in out, false);
assert.ok(Array.isArray(out.messages));
});
});