Files
OmniRoute/tests/unit/command-code-mimo-v2-5-safety.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

49 lines
2.1 KiB
TypeScript

/**
* Verify that mimo-v2.5 is safe to use with images across all providers
* (xiaomi-mimo, command-code, bazaarlink, opencode-go, bare model id).
*
* mimo-v2.5 is registered in ModelSpec (`modelSpecs.ts:410-415`) with
* `supportsVision: true`, so resolveVisionCapability() picks it up from
* `spec.supportsVision` without needing a registry flag.
*
* This test proves that the scenario described in the issue report
* (image-bearing request → vision-bridge auto-reroute to opencode-zen → 401)
* never applies to mimo-v2.5 — it has always been correctly identified as
* vision-capable even before the registry + heuristic fix for other CC models.
*/
import test from "node:test";
import assert from "node:assert/strict";
import { getResolvedModelCapabilities } from "../../src/lib/modelCapabilities.ts";
import { isVisionModelId } from "../../src/shared/constants/visionModels.ts";
const MIMO_V25_CASES: [string, string, boolean][] = [
["xiaomi-mimo/mimo-v2.5", "via xiaomi-mimo", true],
["command-code/mimo-v2.5", "via command-code", true],
["bazaarlink/mimo-v2.5", "via bazaarlink", true],
["opencode-go/mimo-v2.5", "via opencode-go", true],
["mimo-v2.5", "bare model name", true],
// Text-only variants must stay false
["mimo-v2.5-pro", "text-only variant", false],
["command-code/mimo-v2.5-pro", "text-only via command-code", false],
];
for (const [modelId, desc, expected] of MIMO_V25_CASES) {
test(`${desc} (${modelId}) → supportsVision=${expected}`, () => {
const caps = getResolvedModelCapabilities(modelId);
assert.equal(caps.supportsVision, expected, `${modelId} supportsVision must be ${expected}`);
});
}
test("mimo-v2.5 heuristic is correct (no false positive from mimo-vl fragment)", () => {
// mimo-vl matches "mimo-vl-a3b", not "mimo-v2.5"
assert.equal(isVisionModelId("mimo-vl-a3b"), true, "mimo-vl must be detected as vision");
assert.equal(
isVisionModelId("mimo-v2.5"),
false,
"mimo-v2.5 must NOT match the mimo-vl heuristic"
);
// But getResolvedModelCapabilities still returns true via ModelSpec
assert.equal(getResolvedModelCapabilities("mimo-v2.5").supportsVision, true);
});