Files
OmniRoute/tests/unit/poolside-registry-models-9085.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

51 lines
2.4 KiB
TypeScript

// Poolside (inference.poolside.ai) — first-party Preview catalog.
//
// The registry entry shipped with an empty `models` list because the public
// matrix could only reach the unauthenticated endpoint (401 "No Authorization
// header provided"). An authenticated probe on 2026-08-07 (#9085) returned the
// live catalog, so the two Preview models are now static. These tests lock the
// exact IDs — the XS one is routinely mis-listed as `laguna-xs.2` — and the
// capability numbers the catalog reported, so a later sweep cannot quietly
// reintroduce the wrong form or drop the entries back to passthrough-only.
import { test } from "node:test";
import assert from "node:assert/strict";
import { poolsideProvider } from "../../open-sse/config/providers/registry/poolside/index.ts";
test("#9085: poolside statically exposes the two probed Laguna Preview models", () => {
assert.deepEqual(
poolsideProvider.models.map((m) => m.id),
["poolside/laguna-xs-2.1", "poolside/laguna-s-2.1"]
);
});
test("#9085: the XS id is the catalog form, not the third-party `laguna-xs.2`", () => {
const ids = poolsideProvider.models.map((m) => m.id);
assert.ok(
ids.includes("poolside/laguna-xs-2.1"),
"live /v1/models returns poolside/laguna-xs-2.1"
);
assert.ok(
!ids.some((id) => id.includes("laguna-xs.2")),
"laguna-xs.2 is a third-party/aggregator listing form and does not address this host"
);
});
test("#9085: both Laguna models carry the probed capabilities", () => {
for (const model of poolsideProvider.models) {
assert.equal(model.contextLength, 262144, `${model.id} context window`);
assert.equal(model.maxOutputTokens, 32768, `${model.id} max completion tokens`);
assert.equal(model.toolCalling, true, `${model.id} advertises tools`);
assert.equal(model.supportsReasoning, true, `${model.id} advertises reasoning`);
// Text-only upstream: no vision/audio in supported_features.
assert.notEqual(model.supportsVision, true, `${model.id} is text-only`);
assert.notEqual(model.supportsAudio, true, `${model.id} is text-only`);
}
});
test("#9085: live discovery still admits models the Preview adds later", () => {
// The static list is what the catalog returned, not a ceiling — keep the
// passthrough flag so a newly published Laguna does not need a release.
assert.equal(poolsideProvider.passthroughModels, true);
assert.equal(poolsideProvider.modelsUrl, "https://inference.poolside.ai/v1/models");
});