mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-17 20:32:25 +03:00
Validado numa worktree combinada com as 16 PRs desta leva sobre `release/v3.8.51`: typecheck:core limpo, check-file-size e check-changelog-integrity OK, complexity 2788/3218 e cognitive 1261/1437, ESLint 0 erros nos 152 arquivos alterados, 771 testes unitários focados, 49 de integração e a suíte vitest:ui completa (2149) verdes. O ponto que sustenta a PR é o `models.dev` virar overlay de preço em vez de fonte de catálogo. Um catálogo estático que sobrevive à conta já ter listado ids mais novos é o tipo de defeito que só aparece quando o modelo novo é justamente o que se quer usar. Nota de integração: `activeSyncedCatalog.ts` colidiu com o #12934 (união dos `customModels` do picker no catálogo de despacho). Como você extraiu o bloco original para `loadConnectionCatalog`, os dois se compõem: a união dos irmãos agy/antigravity primeiro, o `unionCustomModels` por cima. Revalidei com `custom-models-live-catalog-12597`, `live-model-catalog-reconciliation-8926`, `sync-models-degraded-cached-catalog-9683`, `models-dev-catalog-read-gate`, `discovery-class`, `reactive-model-sync` e `l1-oauth-autosync-default` juntos — 48/48 — mais typecheck:core limpo. Sobre o `autoSync` padrão em Claude/Codex/Copilot com scheduler de 6h: passei isso pelo dono antes de mergear e a decisão foi manter como está.
65 lines
3.2 KiB
TypeScript
65 lines
3.2 KiB
TypeScript
// #5420 — "Import Models" must be hidden for tool-only (search/fetch) providers,
|
|
// including ones whose id does NOT end in "-search" (e.g. firecrawl → webFetch),
|
|
// while staying visible for LLM and media providers that DO list models.
|
|
import { strict as assert } from "node:assert";
|
|
import { describe, it } from "node:test";
|
|
import {
|
|
providerLacksModelListing,
|
|
providerUsesCuratedModelsOnly,
|
|
providerUsesExclusiveSyncedListing,
|
|
} from "@/lib/providers/modelListingCapability";
|
|
|
|
describe("providerLacksModelListing (#5420)", () => {
|
|
it("hides model listing for -search suffixed providers regardless of kinds", () => {
|
|
assert.equal(providerLacksModelListing("brave-search", []), true);
|
|
assert.equal(providerLacksModelListing("brave-search", ["webSearch"]), true);
|
|
assert.equal(providerLacksModelListing("brave-search", ["llm"]), true);
|
|
});
|
|
|
|
it("hides model listing for tool-only providers without the -search suffix", () => {
|
|
assert.equal(providerLacksModelListing("firecrawl", ["webFetch"]), true);
|
|
assert.equal(providerLacksModelListing("x", ["webSearch"]), true);
|
|
assert.equal(providerLacksModelListing("y", ["webSearch", "webFetch"]), true);
|
|
});
|
|
|
|
it("keeps model listing for LLM and media providers", () => {
|
|
assert.equal(providerLacksModelListing("openai", []), false);
|
|
assert.equal(providerLacksModelListing("openai", ["llm"]), false);
|
|
assert.equal(providerLacksModelListing("falai", ["image"]), false);
|
|
assert.equal(providerLacksModelListing("x", ["webSearch", "llm"]), false);
|
|
assert.equal(providerLacksModelListing("z", ["embedding"]), false);
|
|
});
|
|
|
|
it("keeps curated web providers visible while disabling remote model import", () => {
|
|
assert.equal(providerLacksModelListing("kimi-web", ["llm"]), false);
|
|
assert.equal(providerLacksModelListing("zai-web", ["llm"]), false);
|
|
assert.equal(providerUsesCuratedModelsOnly("kimi-web"), true);
|
|
assert.equal(providerUsesCuratedModelsOnly("zai-web"), true);
|
|
assert.equal(providerUsesCuratedModelsOnly("chatgpt-web"), true);
|
|
assert.equal(providerUsesCuratedModelsOnly("cgpt-web"), false);
|
|
assert.equal(providerUsesCuratedModelsOnly("qwen-cloud"), false);
|
|
assert.equal(providerUsesCuratedModelsOnly("kimi-coding"), false);
|
|
});
|
|
});
|
|
|
|
describe("providerUsesExclusiveSyncedListing", () => {
|
|
it("is true only for Cursor (id or alias)", () => {
|
|
assert.equal(providerUsesExclusiveSyncedListing("cursor"), true);
|
|
assert.equal(providerUsesExclusiveSyncedListing("cu"), true);
|
|
assert.equal(providerUsesExclusiveSyncedListing("Cursor"), true);
|
|
});
|
|
|
|
it("is false for other providers including authoritative live-catalog ones", () => {
|
|
assert.equal(providerUsesExclusiveSyncedListing("github"), false);
|
|
assert.equal(providerUsesExclusiveSyncedListing("command-code"), false);
|
|
assert.equal(providerUsesExclusiveSyncedListing("openai"), false);
|
|
assert.equal(providerUsesExclusiveSyncedListing(""), false);
|
|
});
|
|
|
|
it("test 10: exclusive listing stays cursor-only; claude is not cursor", () => {
|
|
assert.equal(providerUsesExclusiveSyncedListing("claude"), false);
|
|
assert.equal(providerUsesExclusiveSyncedListing("codex"), false);
|
|
assert.equal(providerUsesExclusiveSyncedListing("agy"), false);
|
|
});
|
|
});
|