Files
OmniRoute/tests/unit/opencode-zen-reasoning-effort.test.ts
Praveen K Palaniswamy 65e81158ab fix(ollama): route models by advertised capability (#11088)
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host.

Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean.

Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
2026-08-23 11:45:01 -03:00

102 lines
3.6 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import { sanitizeReasoningEffortForProvider } from "../../open-sse/executors/base/reasoningEffort.ts";
/**
* Regression tests for #9318: OpenCode Zen DeepSeek models should accept `max`
* reasoning effort (not normalized to `xhigh`).
*
* OpenCode Zen proxies DeepSeek with the native DeepSeek API contract, which
* accepts {high, max} literally — same as opencode-go. Without this opt-in,
* `max` would be normalized to `xhigh` and rejected by the upstream.
*/
describe("opencode-zen reasoning effort — max support (#9318)", () => {
// ── max passes through for opencode-zen with DeepSeek models ──────────
it("opencode-zen + deepseek model with max keeps max (not downgraded)", () => {
const result = sanitizeReasoningEffortForProvider(
{ reasoning_effort: "max", messages: [{ role: "user", content: "hi" }] },
"opencode-zen",
"oc/deepseek-v4-flash-free"
);
assert.equal(
(result as Record<string, unknown>).reasoning_effort,
"max",
"expected max to pass through for opencode-zen + deepseek"
);
});
it("opencode-zen + deepseek-v4-pro with max keeps max", () => {
const result = sanitizeReasoningEffortForProvider(
{ reasoning_effort: "max", messages: [] },
"opencode-zen",
"deepseek-v4-pro"
);
assert.equal(
(result as Record<string, unknown>).reasoning_effort,
"max",
"expected max to pass through for opencode-zen + deepseek-v4-pro"
);
});
// ── high passes through for opencode-zen with any model (already works) ─
it("opencode-zen + non-deepseek model with high keeps high", () => {
const result = sanitizeReasoningEffortForProvider(
{ reasoning_effort: "high", messages: [] },
"opencode-zen",
"oc/gpt-5"
);
assert.equal(
(result as Record<string, unknown>).reasoning_effort,
"high",
"expected high to pass through for opencode-zen + non-deepseek model"
);
});
// ── opencode (noauth) max passthrough ─────────────────────────────────
it("opencode (noauth) with max preserves max", () => {
const result = sanitizeReasoningEffortForProvider(
{ reasoning_effort: "max", messages: [] },
"opencode",
"deepseek-v4-flash"
);
assert.equal((result as Record<string, unknown>).reasoning_effort, "max");
});
it("opencode (noauth) with high keeps high", () => {
const result = sanitizeReasoningEffortForProvider(
{ reasoning_effort: "high", messages: [] },
"opencode",
"deepseek-v4-flash"
);
assert.equal(
(result as Record<string, unknown>).reasoning_effort,
"high",
"expected high to remain high for opencode (noauth)"
);
});
// ── opencode-go effort tiers unaffected (regression guard) ────────────
it("opencode-go + deepseek model with max keeps max (regression guard)", () => {
const result = sanitizeReasoningEffortForProvider(
{ reasoning_effort: "max", messages: [] },
"opencode-go",
"deepseek-v4-pro"
);
assert.equal(
(result as Record<string, unknown>).reasoning_effort,
"max",
"expected max to pass through for opencode-go + deepseek"
);
});
it("opencode-go + non-deepseek model with max preserves max", () => {
const result = sanitizeReasoningEffortForProvider(
{ reasoning_effort: "max", messages: [] },
"opencode-go",
"some-other-model"
);
assert.equal((result as Record<string, unknown>).reasoning_effort, "max");
});
});