Files
OmniRoute/tests/unit/opencode-go-effort-aliases-6922.test.ts
Paijo 8a8d0cf336 fix(providers): stop silently dropping reasoning effort on opencode families (#10788) (#11409)
Validated in a combined 3-PR batch worktree off release/v3.8.51 tip (a sibling PR from the same author, #11495, was held out after an interaction-only typecheck error was isolated to it — reproduced clean without it, see #11495's own comment).
- Focused tests: opencode-go-effort-aliases-6922.test.ts, opencode-go-effort-aliases-8353.test.ts, chatcore-upstream-body.test.ts — part of batch's 94/94 node:test run
- typecheck:core, file-size, changelog-integrity, complexity, cognitive-complexity — all OK
- Full-repo lint: 228 pre-existing dashboard react-hooks/* findings, unrelated to this diff

Thanks for tracing this all the way to the wire format — forwarding the aliased id verbatim instead of injecting a field the non-DeepSeek families never had is exactly the right fix.
2026-08-25 18:22:23 -03:00

169 lines
6.6 KiB
TypeScript

/**
* Issue #6922 — Effort-tier aliases for glm-5.2 and mimo-v2.5 on opencode-go.
*
* Tests import and call the real `parseEffortLevel` from OpencodeExecutor
* to verify effort-tier parsing works for all registered models.
*
* The OpencodeExecutor must:
* 1. Rewrite effort-alias model ids to their canonical base id
* 2. Inject `reasoning_effort` if not already set
*
* Previously only deepseek-v4-pro had aliases. Now glm-5.2 and mimo-v2.5
* also have high/max tiers.
*/
import test from "node:test";
import assert from "node:assert/strict";
// ─── Stub ESM loader hooks so the executor can be imported in a bare
// node:test process without triggering side effects (DB init, fetch,
// etc.). We only need parseEffortLevel, which is a pure function. ───
const { parseEffortLevel, OpencodeExecutor } =
(await import("../../open-sse/executors/opencode.ts")) as {
parseEffortLevel: (model: string) => { baseModel: string; effort: string } | null;
OpencodeExecutor: new (provider: string) => {
transformRequest: (
model: string,
body: Record<string, unknown>,
stream: boolean,
credentials: unknown
) => Record<string, unknown>;
};
};
// ─── DeepSeek V4 Pro: none/low/high/max ───────────────────────────────────
for (const effort of ["none", "low", "high", "max"]) {
test(`#6922 parseEffortLevel: deepseek-v4-pro-${effort}${effort}`, () => {
assert.deepEqual(parseEffortLevel(`deepseek-v4-pro-${effort}`), {
baseModel: "deepseek-v4-pro",
effort,
});
});
}
// ─── GLM-5.2: high + max only ────────────────────────────────────────────
test("#6922 parseEffortLevel: glm-5.2-high → high", () => {
const result = parseEffortLevel("glm-5.2-high");
assert.deepEqual(result, { baseModel: "glm-5.2", effort: "high" });
});
test("#6922 parseEffortLevel: glm-5.2-max → max", () => {
const result = parseEffortLevel("glm-5.2-max");
assert.deepEqual(result, { baseModel: "glm-5.2", effort: "max" });
});
// ─── MiMo-V2.5: high + max only ──────────────────────────────────────────
test("#6922 parseEffortLevel: mimo-v2.5-high → high", () => {
const result = parseEffortLevel("mimo-v2.5-high");
assert.deepEqual(result, { baseModel: "mimo-v2.5", effort: "high" });
});
test("#6922 parseEffortLevel: mimo-v2.5-max → max", () => {
const result = parseEffortLevel("mimo-v2.5-max");
assert.deepEqual(result, { baseModel: "mimo-v2.5", effort: "max" });
});
// ─── Negative cases ────────────────────────────────────────────────────────
test("#6922 parseEffortLevel: deepseek-v4-pro-medium → null (unsupported tier)", () => {
assert.strictEqual(parseEffortLevel("deepseek-v4-pro-medium"), null);
});
test("#6922 parseEffortLevel: unknown model → null", () => {
const result = parseEffortLevel("nonexistent-model-high");
assert.strictEqual(result, null);
});
test("#6922 parseEffortLevel: glm-5.2-low → null (unsupported tier)", () => {
const result = parseEffortLevel("glm-5.2-low");
assert.strictEqual(result, null);
});
test("#6922 parseEffortLevel: mimo-v2.5-medium → null (unsupported tier)", () => {
const result = parseEffortLevel("mimo-v2.5-medium");
assert.strictEqual(result, null);
});
test("#6922 parseEffortLevel: empty string → null", () => {
assert.strictEqual(parseEffortLevel(""), null);
});
test("#6922 parseEffortLevel: base model without tier → null", () => {
assert.strictEqual(parseEffortLevel("glm-5.2"), null);
});
// ─── transformRequest: #6922 wiring, updated by #10788 ─────────────────────
//
// parseEffortLevel is a pure function, but the original bug (#6922) surfaces
// through OpencodeExecutor.transformRequest. Since #10788, glm-5.2 / mimo-v2.5
// (non-DeepSeek families) forward the effort-suffixed alias VERBATIM — the
// suffix is their only native effort mechanism and opencode-go has no flat
// reasoning_effort field to receive a rewritten tier. Only DeepSeek V4 keeps
// the base-rewrite + field-injection contract.
const CREDENTIALS = { apiKey: "k" } as Record<string, unknown>;
test("#6922/#10788 transformRequest: glm-5.2-high forwards the alias verbatim", () => {
const executor = new OpencodeExecutor("opencode-go");
const body = { model: "glm-5.2-high", messages: [{ role: "user", content: "hi" }] };
const out = executor.transformRequest("glm-5.2-high", body, true, CREDENTIALS);
assert.equal(out.model, "glm-5.2-high", "alias id must reach the wire untouched");
assert.equal(
out.reasoning_effort,
undefined,
"no flat reasoning_effort may be injected for non-DeepSeek families"
);
});
test("#6922/#10788 transformRequest: mimo-v2.5-max forwards the alias verbatim", () => {
const executor = new OpencodeExecutor("opencode-go");
const body = { model: "mimo-v2.5-max", messages: [{ role: "user", content: "hi" }] };
const out = executor.transformRequest("mimo-v2.5-max", body, true, CREDENTIALS);
assert.equal(out.model, "mimo-v2.5-max", "alias id must reach the wire untouched");
assert.equal(
out.reasoning_effort,
undefined,
"no flat reasoning_effort may be injected for non-DeepSeek families"
);
});
test("#6922 transformRequest: does not clobber an already-set reasoning_effort", () => {
const executor = new OpencodeExecutor("opencode-go");
const body = {
model: "glm-5.2-high",
reasoning_effort: "caller-supplied",
messages: [{ role: "user", content: "hi" }],
};
const out = executor.transformRequest("glm-5.2-high", body, true, CREDENTIALS);
assert.equal(out.model, "glm-5.2-high", "non-DeepSeek alias id is left untouched");
assert.equal(
out.reasoning_effort,
"caller-supplied",
"an explicit reasoning_effort already on the body must not be overwritten"
);
});
test("#6922 transformRequest: unaliased model passes through unchanged", () => {
const executor = new OpencodeExecutor("opencode-go");
const body = { model: "gpt-4o-mini", messages: [{ role: "user", content: "hi" }] };
const out = executor.transformRequest("gpt-4o-mini", body, true, CREDENTIALS);
assert.equal(out.model, "gpt-4o-mini", "unaliased model id is left untouched");
assert.equal(
out.reasoning_effort,
undefined,
"no reasoning_effort is injected for a non-tier model"
);
});