Repository navigation
feat(models): functional gateway mirrors + fix synced-substitution - #9217
Conversation
93549e9 to
ad94301
Compare
CI verde + Build (advisory) resolvido via VPS runnerTodos os 21 checks estão verdes. Nota sobre o Build (advisory) que historicamente falhava: Causa raiz
ResoluçãoFlipamos Nota operacional: |
|
Tick the box to add this pull request to the merge queue (same as
|
…heaper-inference#9217) * fix(models): preserve static registry models not covered by synced discovery * feat(models): add functional gateway mirror synthesizer * feat(models): add functional gateway mirror gate predicate * feat(models): add functional gateway mirror DB gate * feat(models): wire functional gateway mirrors into /v1/models * refactor(models): extract synced-coverage helper to pure leaf (file-size gate) * fix(db): re-export functional gateway mirrors gate from localDb (db-rules) * fix(i18n): translate functional gateway mirror flag for Vietnamese (locale completeness) --------- Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
Resumo
Resolve o descompasso no
/v1/modelsonde modelos funcionalmente roteáveis não eram anunciados no catálogo — clientes de discovery (omp, jcode, etc.) viam rotas que falham (deepseek/deepseek-v4-flash→ 404) e escondiam rotas que funcionam (cmd/deepseek/deepseek-v4-flash→ 200).Duas mudanças independentes:
1. Fix do synced-substitution (
catalog.ts)Causa raiz: quando um provider tem synced models (descobertos via
modelsUrl), o catálogo descartava todos os modelos estáticos do registry. O command-code sincroniza só 9 dos seus 18 modelos estáticos — entãocmd/deepseek/deepseek-v4-flash,cmd/claude-opus-4-7,cmd/gpt-5.5, etc. sumiam do catálogo mesmo com o gateway funcional.Fix: preservar modelos estáticos que o synced não cobre (via
shouldSuppressStaticModelBySyncedCoverage). Confirmado com dados reais: os 18 estáticos do command-code voltam, ecmd/deepseek/deepseek-v4-flashresponde 200.2. Mirror funcional de gateway (default-off)
Para o caso geral (dono canônico sem credencial, gateway passthrough com credencial): sintetiza
<gateway-alias>/<model>no/v1/models. Gated 3 níveis (global > provider > model), flagEXPOSE_FUNCTIONAL_GATEWAY_MIRRORS(env > DB > default off), seguindo o padrãoccDiscoveryAliases.Arquivos
src/app/api/v1/models/catalog.ts— fix synced-substitution + helper puroopen-sse/utils/functionalGatewayMirrors.ts— synthesizer puro (novo)src/app/api/v1/models/functionalGatewayPredicate.ts— gate predicate (novo)src/lib/db/functionalGatewayMirrors.ts— DB gate (novo)src/app/api/v1/models/catalogResponse.ts— wiring do mirror no post-filtersrc/shared/constants/featureFlagDefinitions.ts— flagEXPOSE_FUNCTIONAL_GATEWAY_MIRRORSsrc/i18n/messages/*.json— chave i18n da flag (43 locales)Testes
17 testes novos (TDD, falhando-antes → passando-depois):
catalog-synced-static-preservation.test.ts(4)functional-gateway-mirrors-append.test.ts(4)functional-gateway-predicate.test.ts(3)functional-gateway-mirrors-db.test.ts(4)models-catalog-functional-gateway.test.ts(2)feature-flags-settings.test.ts(42→43)Validação
typecheck:core✅ · lint (com suppressions) ✅ · gate i18n-ui-coverage ✅Validação pendente (após deploy)
curl /v1/models | grep 'cmd/deepseek/deepseek-v4-flash'→ deve aparecercmd/deepseek/deepseek-v4-flash→ deve retornar 200