Skip to content

fix(catalog): union picker customModels into the dispatch-time live catalog (#12597) - #12934

Merged
diegosouzapw merged 2 commits into
cheaper-inference:release/v3.8.51from
HouMinXi:fix/custom-models-live-catalog-12597
Sep 7, 2026
Merged

diegosouzapw merged 2 commits into
cheaper-inference:release/v3.8.51from
HouMinXi:fix/custom-models-live-catalog-12597

Conversation

@HouMinXi

@HouMinXi HouMinXi commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Models added through the provider dashboard picker land in customModels. The picker REST already merges them; dispatch did not.

getActiveSyncedCatalog() and getActiveProvidersWithSyncedModel() only read syncedAvailableModels. Combo members and bare inference then 400:

Model '<id>' is not available in the active live catalog for provider '<provider>'

even though GET /api/providers/{id}/models shows the model.

Fix

  • Union customModels into getActiveSyncedCatalog (and getAllActiveSyncedModels).
  • Same-id custom rows overlay only defined fields so a sparse picker write does not wipe synced capability metadata.
  • getActiveProvidersWithSyncedModel UNION-selects customModels keyed on pc.provider.

lookupModelMeta already admitted custom rows; this closes the combo / inference gate Diego named in #12597.

Closes #12597

Tests

tests/unit/custom-models-live-catalog-12597.test.ts — 6/6.

Injection: drop the defined-field overlay → sparse-overlay test red; restore → green.

Not in this PR

  • Does not write picker models into syncedAvailableModels (a later sync would still overwrite that namespace).
  • Does not change the picker REST merge.

⚠️ base-red inherited

Same Fast Quality Gates fingerprints as sibling OPEN PRs on release/v3.8.51. This diff does not touch those files.

…atalog

GET /api/providers/{id}/models already merged customModels. getActiveSyncedCatalog
and getActiveProvidersWithSyncedModel only read syncedAvailableModels, so a
picker-added model 400'd on combo members and bare inference (cheaper-inference#12597).

Sparse overlays keep synced capability fields. Duplicate ids last-win.

Signed-off-by: Minxi Hou <houminxi@gmail.com>
Signed-off-by: Minxi Hou <houminxi@gmail.com>
@diegosouzapw
diegosouzapw merged commit aa35d46 into cheaper-inference:release/v3.8.51 Sep 7, 2026
8 of 16 checks passed
diegosouzapw pushed a commit that referenced this pull request Sep 7, 2026
…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á.
@HouMinXi
HouMinXi deleted the fix/custom-models-live-catalog-12597 branch September 7, 2026 13:27
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…atalog (cheaper-inference#12597) (cheaper-inference#12934)

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 (ambos sob a baseline), 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.

A assimetria era exatamente o defeito: o REST do picker já mesclava `customModels`, o despacho não, e o operador via o modelo na tela e tomava 400 na inferência. O overlay só de campos definidos é o detalhe que impede uma escrita esparsa do picker de apagar metadata de capacidade que veio do sync.

Nota de integração: este arquivo colidiu com o cheaper-inference#12866, que extraiu o mesmo bloco para `loadConnectionCatalog` e uniu os catálogos irmãos agy/antigravity. Integrei os dois na worktree combinada — a união de irmãos primeiro, o `unionCustomModels` por cima — e a resolução vai junto no merge do cheaper-inference#12866.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…heaper-inference#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 cheaper-inference#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á.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(backend): chat dispatch ignores model-picker additions (customModels vs syncedAvailableModels)

2 participants