fallbackModels entries are offered to users as usable choices: discovery keeps only the fallback set (model-fetcher.ts), and the catalog marks what survives available and canUseAsChatDefault: true. Deprecated snapshot models in that list are therefore presented as selectable defaults.
toolCallingModelIds (packages/core/src/provider-registry.ts) filters on tool-calling capability only. Seven providers exclude deprecated ids by filtering at the call site; the rest do not, and openai writes its list by hand without going through the helper at all.
Measured on #3324's head, which fixes ZenMux — 28 deprecated models still ship in fallback lists:
| provider |
count |
examples |
togetherai |
11 |
deepseek-ai/DeepSeek-V3, essentialai/Rnj-1-Instruct |
mistral |
8 |
devstral-2512, devstral-latest |
xiaomi |
3 |
mimo-v2-flash, mimo-v2-pro |
deepinfra |
3 |
MiniMaxAI/MiniMax-M2.5 |
nvidia |
2 |
moonshotai/kimi-k2.6 |
openai |
1 |
gpt-4-turbo |
Why this is not just a missing filter
Converging every list onto toolCallingModelIds would not cover openai, whose list is hand-written. The decision worth making explicitly is whether deprecated should exclude a model from being offered at all — it is an upstream lifecycle marker, not a statement that the endpoint rejects the call — and answering yes changes which models six providers present.
Current boundary
packages/core/src/__tests__/provider-catalog-contract.test.ts records these six as PROVIDERS_WITH_DEPRECATED_FALLBACKS. It fails when another provider regresses into the set, and also when a listed provider is cleaned up but left in the list, so the list shrinks as this work lands rather than going stale.
Split out of the #3324 review by @hqhq1025.
fallbackModelsentries are offered to users as usable choices: discovery keeps only the fallback set (model-fetcher.ts), and the catalog marks what survivesavailableandcanUseAsChatDefault: true. Deprecated snapshot models in that list are therefore presented as selectable defaults.toolCallingModelIds(packages/core/src/provider-registry.ts) filters on tool-calling capability only. Seven providers exclude deprecated ids by filtering at the call site; the rest do not, andopenaiwrites its list by hand without going through the helper at all.Measured on #3324's head, which fixes ZenMux — 28 deprecated models still ship in fallback lists:
togetheraideepseek-ai/DeepSeek-V3,essentialai/Rnj-1-Instructmistraldevstral-2512,devstral-latestxiaomimimo-v2-flash,mimo-v2-prodeepinfraMiniMaxAI/MiniMax-M2.5nvidiamoonshotai/kimi-k2.6openaigpt-4-turboWhy this is not just a missing filter
Converging every list onto
toolCallingModelIdswould not coveropenai, whose list is hand-written. The decision worth making explicitly is whetherdeprecatedshould exclude a model from being offered at all — it is an upstream lifecycle marker, not a statement that the endpoint rejects the call — and answering yes changes which models six providers present.Current boundary
packages/core/src/__tests__/provider-catalog-contract.test.tsrecords these six asPROVIDERS_WITH_DEPRECATED_FALLBACKS. It fails when another provider regresses into the set, and also when a listed provider is cleaned up but left in the list, so the list shrinks as this work lands rather than going stale.Split out of the #3324 review by @hqhq1025.