mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-13 18:32:12 +03:00
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.
78 lines
2.1 KiB
TypeScript
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"]
|
|
);
|
|
});
|