Files
OmniRoute/tests/unit/model-endpoint-policy.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

78 lines
2.1 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
const { filterChatSelectableModels, getModelEndpointDecision, isChatSelectableModel } =
await import("../../open-sse/services/modelEndpointPolicy.ts");
test("OpenAI image models are not chat-selectable without upstream endpoint metadata", () => {
for (const modelId of [
"gpt-image-2",
"gpt-image-1.5",
"gpt-image-1-mini",
"dall-e-3",
"chatgpt-image-latest",
]) {
assert.deepEqual(getModelEndpointDecision("openai", modelId), {
kind: "image",
chatSelectable: false,
reason: "provider-policy",
});
}
});
test("OpenAI video models are not chat-selectable without upstream endpoint metadata", () => {
assert.deepEqual(getModelEndpointDecision("openai", "sora-2-pro"), {
kind: "video",
chatSelectable: false,
reason: "provider-policy",
});
});
test("provider policy is scoped and does not classify another provider by model name", () => {
assert.equal(
isChatSelectableModel("custom-provider", { id: "gpt-image-shaped-chat-model" }),
true
);
});
test("explicit chat capability wins for a multi-endpoint model", () => {
assert.equal(
isChatSelectableModel("openai", {
id: "gpt-image-shaped-multimodal-model",
supportedEndpoints: ["/v1/images/generations", "/v1/responses"],
}),
true
);
});
test("a synthetic chat default does not override a known OpenAI specialty model", () => {
assert.equal(
isChatSelectableModel("openai", {
id: "sora-2",
supportedEndpoints: ["chat"],
}),
false
);
});
test("explicit non-chat endpoints are excluded even when the model ID is unknown", () => {
assert.equal(
isChatSelectableModel("openai-compatible", {
id: "vendor-specialty-model",
supportedEndpoints: ["videos/generations"],
}),
false
);
});
test("chat import filtering keeps ordinary OpenAI models only", () => {
assert.deepEqual(
filterChatSelectableModels("openai", [
{ id: "gpt-5.6" },
{ id: "gpt-image-2" },
{ id: "sora-2" },
]).map((model) => model.id),
["gpt-5.6"]
);
});