Files
OmniRoute/tests/unit/provider-field-strips.test.ts
Jan Leon b2b568b08e Fix routed target request parameters (#7323)
* fix routed target request parameters

* chore: rerun CI

* test(chatcore): align PR #7323 Codex-routing test with #7533 verbosity gating

The "Codex Responses routing keeps reasoning effort while dropping GPT-only
verbosity" test translated a Responses-shape request with credentials=null
and only the positional `provider` arg set to "opencode-go". #7533's
verbosity carry-over (Responses `text.verbosity` -> Chat `verbosity`) reads
the destination from `credentials.provider`, which the source->openai
translation step never threads from the positional provider arg — so
`translated.verbosity` came back undefined instead of "low", failing before
prepareUpstreamBody's sanitizer was even reached.

The test's intent (per its own name/comment) is a combo/fallback reroute:
translate while still addressed at Codex (an #7533-allowlisted OpenAI-param
destination, so verbosity legitimately survives translateRequest), then
resolve the final upstream target to opencode-go/GLM so prepareUpstreamBody's
sanitizeRequestForResolvedTarget (#7050/#7533) strips the GPT-only verbosity
for that concrete target while preserving reasoning_effort. Fixed by passing
`credentials: { provider: "codex" }` to the first translateRequest call to
match how production actually carries the destination provider, instead of
relying on the provider positional argument. No production code changed —
#7050 and #7533's sanitization are intentional and protected; only the test's
setup was misaligned with them.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>

---------

Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
2026-07-18 21:18:34 -03:00

56 lines
2.0 KiB
TypeScript

import { test } from "node:test";
import assert from "node:assert/strict";
import {
findOffendingField,
stripGroqUnsupportedFields,
} from "../../open-sse/config/providerFieldStrips.ts";
test("findOffendingField matches known field names in a 400 body", () => {
assert.equal(
findOffendingField("Invalid argument: reasoning_budget not supported"),
"reasoning_budget"
);
assert.equal(findOffendingField("unexpected field chat_template"), "chat_template");
assert.equal(findOffendingField("reasoning_content is not allowed"), "reasoning_content");
// #1468: Claude Code's top-level context_management field rejected by strict
// anthropic-compatible gateways → strip + retry regardless of the contextEditing flag.
assert.equal(
findOffendingField("context_management: Extra inputs are not permitted"),
"context_management"
);
assert.equal(
findOffendingField("Extra inputs are not permitted, field: 'verbosity', value: 'low'"),
"verbosity"
);
assert.equal(findOffendingField("all good"), null);
assert.equal(findOffendingField(""), null);
});
test("stripGroqUnsupportedFields drops non-empty messages[].name", () => {
const out = stripGroqUnsupportedFields({
messages: [{ role: "user", content: "hi", name: "bob" }],
});
assert.equal("name" in out.messages[0], false);
assert.equal(out.messages[0].content, "hi");
});
test("stripGroqUnsupportedFields drops logprobs/logit_bias/top_logprobs", () => {
const out = stripGroqUnsupportedFields({
messages: [],
logprobs: true,
logit_bias: { 1: 2 },
top_logprobs: 5,
});
assert.equal("logprobs" in out, false);
assert.equal("logit_bias" in out, false);
assert.equal("top_logprobs" in out, false);
});
test("stripGroqUnsupportedFields is immutable (does not mutate input)", () => {
const input = { messages: [{ role: "user", content: "hi", name: "bob" }], logprobs: true };
stripGroqUnsupportedFields(input);
assert.equal(input.messages[0].name, "bob");
assert.equal(input.logprobs, true);
});