Files
OmniRoute/tests/unit/openrouter-context-length-3202.test.ts
Diego Rodrigues de Sa e Souza 9bc2c89924 fix(openrouter): report true upstream context_length for passthrough models (#3202) (#3207)
normalizeDiscoveredModels only copied record.inputTokenLimit, but OpenRouter
returns the window as context_length / top_provider.context_length, so every
synced model fell back to the 128K default. Read context_length (and
top_provider.max_completion_tokens for output) as a fallback.

Co-authored-by: pulyankote <pulyankote@users.noreply.github.com>
2026-06-05 02:50:51 -03:00

59 lines
2.1 KiB
TypeScript

import { test } from "node:test";
import assert from "node:assert/strict";
import { normalizeDiscoveredModels } from "@/lib/providerModels/modelDiscovery";
// Regression guard for #3202.
//
// OpenRouter's /api/v1/models returns the context window as `context_length`
// (and `top_provider.context_length`), NOT `inputTokenLimit`. The provider
// discovery path (`parseResponse: (data) => data.data || []`) passes these raw
// records straight into `normalizeDiscoveredModels`, so before the fix synced
// OpenRouter models never carried `inputTokenLimit` and `/v1/models` fell back
// to the 128K provider default for every model.
test("#3202 maps OpenRouter context_length into inputTokenLimit", () => {
const [model] = normalizeDiscoveredModels([
{ id: "deepseek/deepseek-v4", context_length: 1048576 },
]);
assert.equal(model.id, "deepseek/deepseek-v4");
assert.equal(model.inputTokenLimit, 1048576);
});
test("#3202 preserves an explicit inputTokenLimit when already present", () => {
const [model] = normalizeDiscoveredModels([
{ id: "vendor/with-explicit", inputTokenLimit: 200000, context_length: 999999 },
]);
// Explicit inputTokenLimit wins over the context_length fallback.
assert.equal(model.inputTokenLimit, 200000);
});
test("#3202 falls back to top_provider.context_length", () => {
const [model] = normalizeDiscoveredModels([
{ id: "vendor/top-provider-window", top_provider: { context_length: 262144 } },
]);
assert.equal(model.inputTokenLimit, 262144);
});
test("#3202 maps OpenRouter output cap (top_provider.max_completion_tokens)", () => {
const [model] = normalizeDiscoveredModels([
{
id: "vendor/with-output-cap",
context_length: 131072,
top_provider: { max_completion_tokens: 32768 },
},
]);
assert.equal(model.inputTokenLimit, 131072);
assert.equal(model.outputTokenLimit, 32768);
});
test("#3202 leaves inputTokenLimit unset when no window field is present", () => {
const [model] = normalizeDiscoveredModels([{ id: "vendor/no-window" }]);
assert.equal(model.inputTokenLimit, undefined);
});