Files
OmniRoute/src/lib/providerModels/discoveryClass.ts
Bob.Hou ebdbd2c67d feat(models): live account catalog for Claude, Codex, Copilot, AGY (#12866)
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á.
2026-09-07 09:02:59 -03:00

32 lines
984 B
TypeScript

import { getRegistryEntry } from "@omniroute/open-sse/config/providerRegistry";
import { providerUsesCuratedModelsOnly } from "@/lib/providers/modelListingCapability";
import { HARDCODED_MODELS_CONFIG_IDS } from "./hardcodedModelsConfigIds.ts";
export type DiscoveryClass = "account-live" | "openai-compat" | "static-only";
export const ACCOUNT_LIVE_PROVIDER_IDS = [
"claude",
"codex",
"github",
"ghe-copilot",
"agy",
"antigravity",
"gemini",
"cursor",
"cu",
"grok-cli",
] as const;
const ACCOUNT_LIVE = new Set<string>(ACCOUNT_LIVE_PROVIDER_IDS);
export function getDiscoveryClass(providerId: string): DiscoveryClass {
const id = providerId.trim().toLowerCase();
if (!id) return "static-only";
if (providerUsesCuratedModelsOnly(id)) return "static-only";
if (ACCOUNT_LIVE.has(id)) return "account-live";
if (HARDCODED_MODELS_CONFIG_IDS.has(id) || Boolean(getRegistryEntry(id)?.modelsUrl)) {
return "openai-compat";
}
return "static-only";
}