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.
64 lines
2.4 KiB
TypeScript
64 lines
2.4 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import { PROVIDER_MODELS_CONFIG } from "../../src/app/api/providers/[id]/models/discovery/providerModelsConfig.ts";
|
|
|
|
// Regression guard for #11060 — Perplexity's /v1/models endpoint lists the
|
|
// Agent API catalog (vendor-prefixed ids like "anthropic/claude-fable-5"), but
|
|
// chat requests always go to the classic /chat/completions endpoint, which only
|
|
// accepts the Sonar family. Without a PROVIDER_MODELS_CONFIG entry, generic
|
|
// model import pulled those agent-style ids into the connection's chat model
|
|
// list and every routed request failed with 400 "Invalid model". The discovery
|
|
// entry must exist and its parseResponse must keep only Sonar-family ids.
|
|
|
|
test("perplexity has a discovery entry in PROVIDER_MODELS_CONFIG", () => {
|
|
const cfg = PROVIDER_MODELS_CONFIG.perplexity;
|
|
assert.ok(cfg, "expected a perplexity entry in PROVIDER_MODELS_CONFIG");
|
|
assert.equal(cfg.method, "GET");
|
|
assert.equal(cfg.url, "https://api.perplexity.ai/v1/models");
|
|
assert.equal(typeof cfg.parseResponse, "function");
|
|
});
|
|
|
|
test("perplexity parseResponse keeps only the Sonar family (#11060)", () => {
|
|
const cfg = PROVIDER_MODELS_CONFIG.perplexity;
|
|
const models = cfg.parseResponse({
|
|
object: "list",
|
|
data: [
|
|
{ id: "anthropic/claude-fable-5", object: "model", owned_by: "anthropic" },
|
|
{ id: "sonar-pro", object: "model", owned_by: "perplexity" },
|
|
{ id: "sonar", object: "model", owned_by: "perplexity" },
|
|
],
|
|
}) as Array<{ id: string }>;
|
|
|
|
assert.deepEqual(
|
|
models.map((model) => model.id),
|
|
["sonar-pro", "sonar"]
|
|
);
|
|
});
|
|
|
|
test("perplexity parseResponse keeps every Sonar variant and drops non-Sonar ids", () => {
|
|
const cfg = PROVIDER_MODELS_CONFIG.perplexity;
|
|
const models = cfg.parseResponse({
|
|
data: [
|
|
{ id: "sonar-deep-research" },
|
|
{ id: "sonar-reasoning-pro" },
|
|
{ id: "sonar-pro" },
|
|
{ id: "sonar" },
|
|
{ id: "openai/gpt-5" },
|
|
{ id: "sonarish" },
|
|
],
|
|
}) as Array<{ id: string }>;
|
|
|
|
assert.deepEqual(
|
|
models.map((model) => model.id),
|
|
["sonar-deep-research", "sonar-reasoning-pro", "sonar-pro", "sonar"]
|
|
);
|
|
});
|
|
|
|
test("perplexity parseResponse tolerates empty and malformed payloads", () => {
|
|
const cfg = PROVIDER_MODELS_CONFIG.perplexity;
|
|
assert.deepEqual(cfg.parseResponse({ data: [] }), []);
|
|
assert.deepEqual(cfg.parseResponse(undefined), []);
|
|
assert.deepEqual(cfg.parseResponse({}), []);
|
|
});
|