Skip to content

fix(core): stop offering deprecated models in fallback lists - #3494

Merged
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models
Aug 22, 2026
Merged

fix(core): stop offering deprecated models in fallback lists#3494
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models

Conversation

@yihanzhu

Copy link
Copy Markdown
Contributor

Summary

fallbackModels is a recommendation, not an inventory: everything in it lands in the catalog as available and default-capable, and its head is what a new connection defaults to and what the connection test probes. toolCallingModelIds filters on tool-calling capability only, so six providers still offered 28 models their vendors have deprecated.

This applies the call-site lifecycle filter #3324 established for ZenMux to xiaomi, nvidia, mistral, togetherai and deepinfra, and drops the one deprecated id from openai's hand-written list. That empties PROVIDERS_WITH_DEPRECATED_FALLBACKS, so the recorded boundary goes away with it and the remaining assertion becomes the unconditional invariant — which is what its comment says it was built to do.

Removal is from the offer only. An id a user already chose still sends (authorizeConnectionModel never reads this list), and all six do kind: 'protocol' discovery, so the endpoint's own catalog returns on the first /models fetch. Every list head is unchanged, so no connection default or connection-test probe model moves.

Reasoning for the offer-policy question the issue poses, and the measurements behind the notes below, are in #3355 (comment).

Fixes#3355

Review focus

  • Two corrections to the issue body. The 28 is right as a registry count, but only 27 are user-visible: CURATED_CATALOG_FALLBACK_MODELS.openai shadows the registry list at model-catalog.ts:239, so gpt-4-turbo is in no picker today — removing it is hygiene for the non-catalog consumers (connection test, onboarding verify, CLI projection) and for the contract test, which reads the registry directly. And "discovery keeps only the fallback set" is the kind: 'fallback' branch; none of these six is on it, which is why the exclusion costs no reachability.
  • Two product judgments worth naming. mistral loses its whole devstral line from the pre-credential list (all eight deprecated ids are devstral plus open-mistral-nemo), and xiaomi is the largest proportional cut, 6 → 3. Both come straight back from live discovery.
  • The clause now sits at 13 call sites, so a new provider is wrong by default. Folding it into toolCallingModelIds would be a no-op today — of 46 snapshots, the only ones carrying a tool-capable deprecated id are the nine now filtered at their call site plus openai, google and the three xiaomi-token-plan entries, which all use hand-written lists that never reach the helper. Happy to roll that in here or leave it as a follow-up; the wrinkle is placement, since ollama-cloud's pre-filter is what makes a deprecated recommended id throw at module load rather than vanish.
  • Known limit, pre-existing: the invariant sweeps CATALOG_PROVIDER_TYPES, which is 55 of 59 registry entries. xai-oauth, github-copilot, claude-subscription and openai-codex sit outside it; I checked and none carries a deprecated id today.

Verification

  • Red state: with the registry change reverted, keeps deprecated snapshot models out of fallback lists fails naming all six providers and all 28 ids (togetherai 11, mistral 8, xiaomi 3, deepinfra 3, nvidia 2, openai 1)
  • @maka/core 588 pass; @maka/storage 895 pass; @maka/runtime 3066 pass with one environment failure (claude-subscription-usage cannot reach the OAuth token endpoint in my sandbox — fails identically on unmodified main)
  • Root lint, format:check and typecheck all pass
  • Post-fix list sizes, zero deprecated remaining in each, heads unchanged: togetherai 19, mistral 22, xiaomi 3, deepinfra 56, nvidia 59, openai 3
  • No protocol files touched, so RUNTIME_HOST_COMPATIBILITY_EPOCH stays put. model-pricing.generated.ts still carries rows for the removed ids and is deliberately untouched — it is generated and keyed independently.

AI use

Select exactly one:

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

Tool(s) and scope: Claude Code (Opus 5) — implementation, tests and the supporting measurements, under my direction and review. The commit carries a Generated-by trailer.

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — a connection created after this change sees a shorter pre-discovery model list; described under Summary above
  • No

yihanzhuand others added 2 commits August 22, 2026 08:30
`fallbackModels` is a recommendation, not an inventory: everything in it
lands in the catalog as available and default-capable, and its head is
what a new connection defaults to and what the connection test probes.
`toolCallingModelIds` filters on tool-calling capability only, so six
providers still offered 28 models their vendors have deprecated.
Apply the lifecycle filter the other eight derivations already use to
xiaomi, nvidia, mistral, togetherai and deepinfra, and drop the one
deprecated id from openai's hand-written list. Removal is from the offer
only: an id a user already chose still sends (`authorizeConnectionModel`
never reads this list), and all six do live protocol discovery, so the
endpoint's own catalog still comes back on the first fetch.
Every head is unchanged, so no connection default or probe model moves.
The recorded boundary in the contract test empties and goes away with
it, which is what it was built to do.
Closesapache#3355
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment said the catalog marks whatever the list contains available
and default-capable, then singled out `openai` — but `openai` is one of
eight providers whose `CURATED_CATALOG_FALLBACK_MODELS` entry replaces
the registry list before the catalog is built, so for those eight this
list reaches CLI onboarding and the connection-test probe candidates
rather than the picker. It also said each derivation drops deprecated
ids at its call site; thirteen of twenty-seven do.
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jackwenerjackwener left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head against the current base. The fallback lifecycle policy and scope are sound, the follow-up only corrects the contract comment, and I found no blocking correctness issue.

@jackwener
jackwener merged commit 8b60ddf into apache:mainAug 22, 2026
1 check passed
Sign up for freeto 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.

Fallback model lists still offer deprecated models for six providers

2 participants

@yihanzhu@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(core): stop offering deprecated models in fallback lists by yihanzhu · Pull Request #3494 · apache/maka · GitHub
Skip to content

fix(core): stop offering deprecated models in fallback lists - #3494

Merged
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models
Aug 22, 2026
Merged

fix(core): stop offering deprecated models in fallback lists#3494
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models

Conversation

@yihanzhu

Copy link
Copy Markdown
Contributor

Summary

fallbackModels is a recommendation, not an inventory: everything in it lands in the catalog as available and default-capable, and its head is what a new connection defaults to and what the connection test probes. toolCallingModelIds filters on tool-calling capability only, so six providers still offered 28 models their vendors have deprecated.

This applies the call-site lifecycle filter #3324 established for ZenMux to xiaomi, nvidia, mistral, togetherai and deepinfra, and drops the one deprecated id from openai's hand-written list. That empties PROVIDERS_WITH_DEPRECATED_FALLBACKS, so the recorded boundary goes away with it and the remaining assertion becomes the unconditional invariant — which is what its comment says it was built to do.

Removal is from the offer only. An id a user already chose still sends (authorizeConnectionModel never reads this list), and all six do kind: 'protocol' discovery, so the endpoint's own catalog returns on the first /models fetch. Every list head is unchanged, so no connection default or connection-test probe model moves.

Reasoning for the offer-policy question the issue poses, and the measurements behind the notes below, are in #3355 (comment).

Fixes#3355

Review focus

  • Two corrections to the issue body. The 28 is right as a registry count, but only 27 are user-visible: CURATED_CATALOG_FALLBACK_MODELS.openai shadows the registry list at model-catalog.ts:239, so gpt-4-turbo is in no picker today — removing it is hygiene for the non-catalog consumers (connection test, onboarding verify, CLI projection) and for the contract test, which reads the registry directly. And "discovery keeps only the fallback set" is the kind: 'fallback' branch; none of these six is on it, which is why the exclusion costs no reachability.
  • Two product judgments worth naming. mistral loses its whole devstral line from the pre-credential list (all eight deprecated ids are devstral plus open-mistral-nemo), and xiaomi is the largest proportional cut, 6 → 3. Both come straight back from live discovery.
  • The clause now sits at 13 call sites, so a new provider is wrong by default. Folding it into toolCallingModelIds would be a no-op today — of 46 snapshots, the only ones carrying a tool-capable deprecated id are the nine now filtered at their call site plus openai, google and the three xiaomi-token-plan entries, which all use hand-written lists that never reach the helper. Happy to roll that in here or leave it as a follow-up; the wrinkle is placement, since ollama-cloud's pre-filter is what makes a deprecated recommended id throw at module load rather than vanish.
  • Known limit, pre-existing: the invariant sweeps CATALOG_PROVIDER_TYPES, which is 55 of 59 registry entries. xai-oauth, github-copilot, claude-subscription and openai-codex sit outside it; I checked and none carries a deprecated id today.

Verification

  • Red state: with the registry change reverted, keeps deprecated snapshot models out of fallback lists fails naming all six providers and all 28 ids (togetherai 11, mistral 8, xiaomi 3, deepinfra 3, nvidia 2, openai 1)
  • @maka/core 588 pass; @maka/storage 895 pass; @maka/runtime 3066 pass with one environment failure (claude-subscription-usage cannot reach the OAuth token endpoint in my sandbox — fails identically on unmodified main)
  • Root lint, format:check and typecheck all pass
  • Post-fix list sizes, zero deprecated remaining in each, heads unchanged: togetherai 19, mistral 22, xiaomi 3, deepinfra 56, nvidia 59, openai 3
  • No protocol files touched, so RUNTIME_HOST_COMPATIBILITY_EPOCH stays put. model-pricing.generated.ts still carries rows for the removed ids and is deliberately untouched — it is generated and keyed independently.

AI use

Select exactly one:

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

Tool(s) and scope: Claude Code (Opus 5) — implementation, tests and the supporting measurements, under my direction and review. The commit carries a Generated-by trailer.

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — a connection created after this change sees a shorter pre-discovery model list; described under Summary above
  • No

yihanzhuand others added 2 commits August 22, 2026 08:30
`fallbackModels` is a recommendation, not an inventory: everything in it
lands in the catalog as available and default-capable, and its head is
what a new connection defaults to and what the connection test probes.
`toolCallingModelIds` filters on tool-calling capability only, so six
providers still offered 28 models their vendors have deprecated.
Apply the lifecycle filter the other eight derivations already use to
xiaomi, nvidia, mistral, togetherai and deepinfra, and drop the one
deprecated id from openai's hand-written list. Removal is from the offer
only: an id a user already chose still sends (`authorizeConnectionModel`
never reads this list), and all six do live protocol discovery, so the
endpoint's own catalog still comes back on the first fetch.
Every head is unchanged, so no connection default or probe model moves.
The recorded boundary in the contract test empties and goes away with
it, which is what it was built to do.
Closesapache#3355
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment said the catalog marks whatever the list contains available
and default-capable, then singled out `openai` — but `openai` is one of
eight providers whose `CURATED_CATALOG_FALLBACK_MODELS` entry replaces
the registry list before the catalog is built, so for those eight this
list reaches CLI onboarding and the connection-test probe candidates
rather than the picker. It also said each derivation drops deprecated
ids at its call site; thirteen of twenty-seven do.
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jackwenerjackwener left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head against the current base. The fallback lifecycle policy and scope are sound, the follow-up only corrects the contract comment, and I found no blocking correctness issue.

@jackwener
jackwener merged commit 8b60ddf into apache:mainAug 22, 2026
1 check passed
Sign up for freeto 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.

Fallback model lists still offer deprecated models for six providers

2 participants

@yihanzhu@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(core): stop offering deprecated models in fallback lists by yihanzhu · Pull Request #3494 · apache/maka · GitHub
Skip to content

fix(core): stop offering deprecated models in fallback lists - #3494

Merged
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models
Aug 22, 2026
Merged

fix(core): stop offering deprecated models in fallback lists#3494
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models

Conversation

@yihanzhu

Copy link
Copy Markdown
Contributor

Summary

fallbackModels is a recommendation, not an inventory: everything in it lands in the catalog as available and default-capable, and its head is what a new connection defaults to and what the connection test probes. toolCallingModelIds filters on tool-calling capability only, so six providers still offered 28 models their vendors have deprecated.

This applies the call-site lifecycle filter #3324 established for ZenMux to xiaomi, nvidia, mistral, togetherai and deepinfra, and drops the one deprecated id from openai's hand-written list. That empties PROVIDERS_WITH_DEPRECATED_FALLBACKS, so the recorded boundary goes away with it and the remaining assertion becomes the unconditional invariant — which is what its comment says it was built to do.

Removal is from the offer only. An id a user already chose still sends (authorizeConnectionModel never reads this list), and all six do kind: 'protocol' discovery, so the endpoint's own catalog returns on the first /models fetch. Every list head is unchanged, so no connection default or connection-test probe model moves.

Reasoning for the offer-policy question the issue poses, and the measurements behind the notes below, are in #3355 (comment).

Fixes#3355

Review focus

  • Two corrections to the issue body. The 28 is right as a registry count, but only 27 are user-visible: CURATED_CATALOG_FALLBACK_MODELS.openai shadows the registry list at model-catalog.ts:239, so gpt-4-turbo is in no picker today — removing it is hygiene for the non-catalog consumers (connection test, onboarding verify, CLI projection) and for the contract test, which reads the registry directly. And "discovery keeps only the fallback set" is the kind: 'fallback' branch; none of these six is on it, which is why the exclusion costs no reachability.
  • Two product judgments worth naming. mistral loses its whole devstral line from the pre-credential list (all eight deprecated ids are devstral plus open-mistral-nemo), and xiaomi is the largest proportional cut, 6 → 3. Both come straight back from live discovery.
  • The clause now sits at 13 call sites, so a new provider is wrong by default. Folding it into toolCallingModelIds would be a no-op today — of 46 snapshots, the only ones carrying a tool-capable deprecated id are the nine now filtered at their call site plus openai, google and the three xiaomi-token-plan entries, which all use hand-written lists that never reach the helper. Happy to roll that in here or leave it as a follow-up; the wrinkle is placement, since ollama-cloud's pre-filter is what makes a deprecated recommended id throw at module load rather than vanish.
  • Known limit, pre-existing: the invariant sweeps CATALOG_PROVIDER_TYPES, which is 55 of 59 registry entries. xai-oauth, github-copilot, claude-subscription and openai-codex sit outside it; I checked and none carries a deprecated id today.

Verification

  • Red state: with the registry change reverted, keeps deprecated snapshot models out of fallback lists fails naming all six providers and all 28 ids (togetherai 11, mistral 8, xiaomi 3, deepinfra 3, nvidia 2, openai 1)
  • @maka/core 588 pass; @maka/storage 895 pass; @maka/runtime 3066 pass with one environment failure (claude-subscription-usage cannot reach the OAuth token endpoint in my sandbox — fails identically on unmodified main)
  • Root lint, format:check and typecheck all pass
  • Post-fix list sizes, zero deprecated remaining in each, heads unchanged: togetherai 19, mistral 22, xiaomi 3, deepinfra 56, nvidia 59, openai 3
  • No protocol files touched, so RUNTIME_HOST_COMPATIBILITY_EPOCH stays put. model-pricing.generated.ts still carries rows for the removed ids and is deliberately untouched — it is generated and keyed independently.

AI use

Select exactly one:

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

Tool(s) and scope: Claude Code (Opus 5) — implementation, tests and the supporting measurements, under my direction and review. The commit carries a Generated-by trailer.

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — a connection created after this change sees a shorter pre-discovery model list; described under Summary above
  • No

yihanzhuand others added 2 commits August 22, 2026 08:30
`fallbackModels` is a recommendation, not an inventory: everything in it
lands in the catalog as available and default-capable, and its head is
what a new connection defaults to and what the connection test probes.
`toolCallingModelIds` filters on tool-calling capability only, so six
providers still offered 28 models their vendors have deprecated.
Apply the lifecycle filter the other eight derivations already use to
xiaomi, nvidia, mistral, togetherai and deepinfra, and drop the one
deprecated id from openai's hand-written list. Removal is from the offer
only: an id a user already chose still sends (`authorizeConnectionModel`
never reads this list), and all six do live protocol discovery, so the
endpoint's own catalog still comes back on the first fetch.
Every head is unchanged, so no connection default or probe model moves.
The recorded boundary in the contract test empties and goes away with
it, which is what it was built to do.
Closesapache#3355
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment said the catalog marks whatever the list contains available
and default-capable, then singled out `openai` — but `openai` is one of
eight providers whose `CURATED_CATALOG_FALLBACK_MODELS` entry replaces
the registry list before the catalog is built, so for those eight this
list reaches CLI onboarding and the connection-test probe candidates
rather than the picker. It also said each derivation drops deprecated
ids at its call site; thirteen of twenty-seven do.
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jackwenerjackwener left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head against the current base. The fallback lifecycle policy and scope are sound, the follow-up only corrects the contract comment, and I found no blocking correctness issue.

@jackwener
jackwener merged commit 8b60ddf into apache:mainAug 22, 2026
1 check passed
Sign up for freeto 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.

Fallback model lists still offer deprecated models for six providers

2 participants

@yihanzhu@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(core): stop offering deprecated models in fallback lists by yihanzhu · Pull Request #3494 · apache/maka · GitHub
Skip to content

fix(core): stop offering deprecated models in fallback lists - #3494

Merged
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models
Aug 22, 2026
Merged

fix(core): stop offering deprecated models in fallback lists#3494
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models

Conversation

@yihanzhu

Copy link
Copy Markdown
Contributor

Summary

fallbackModels is a recommendation, not an inventory: everything in it lands in the catalog as available and default-capable, and its head is what a new connection defaults to and what the connection test probes. toolCallingModelIds filters on tool-calling capability only, so six providers still offered 28 models their vendors have deprecated.

This applies the call-site lifecycle filter #3324 established for ZenMux to xiaomi, nvidia, mistral, togetherai and deepinfra, and drops the one deprecated id from openai's hand-written list. That empties PROVIDERS_WITH_DEPRECATED_FALLBACKS, so the recorded boundary goes away with it and the remaining assertion becomes the unconditional invariant — which is what its comment says it was built to do.

Removal is from the offer only. An id a user already chose still sends (authorizeConnectionModel never reads this list), and all six do kind: 'protocol' discovery, so the endpoint's own catalog returns on the first /models fetch. Every list head is unchanged, so no connection default or connection-test probe model moves.

Reasoning for the offer-policy question the issue poses, and the measurements behind the notes below, are in #3355 (comment).

Fixes#3355

Review focus

  • Two corrections to the issue body. The 28 is right as a registry count, but only 27 are user-visible: CURATED_CATALOG_FALLBACK_MODELS.openai shadows the registry list at model-catalog.ts:239, so gpt-4-turbo is in no picker today — removing it is hygiene for the non-catalog consumers (connection test, onboarding verify, CLI projection) and for the contract test, which reads the registry directly. And "discovery keeps only the fallback set" is the kind: 'fallback' branch; none of these six is on it, which is why the exclusion costs no reachability.
  • Two product judgments worth naming. mistral loses its whole devstral line from the pre-credential list (all eight deprecated ids are devstral plus open-mistral-nemo), and xiaomi is the largest proportional cut, 6 → 3. Both come straight back from live discovery.
  • The clause now sits at 13 call sites, so a new provider is wrong by default. Folding it into toolCallingModelIds would be a no-op today — of 46 snapshots, the only ones carrying a tool-capable deprecated id are the nine now filtered at their call site plus openai, google and the three xiaomi-token-plan entries, which all use hand-written lists that never reach the helper. Happy to roll that in here or leave it as a follow-up; the wrinkle is placement, since ollama-cloud's pre-filter is what makes a deprecated recommended id throw at module load rather than vanish.
  • Known limit, pre-existing: the invariant sweeps CATALOG_PROVIDER_TYPES, which is 55 of 59 registry entries. xai-oauth, github-copilot, claude-subscription and openai-codex sit outside it; I checked and none carries a deprecated id today.

Verification

  • Red state: with the registry change reverted, keeps deprecated snapshot models out of fallback lists fails naming all six providers and all 28 ids (togetherai 11, mistral 8, xiaomi 3, deepinfra 3, nvidia 2, openai 1)
  • @maka/core 588 pass; @maka/storage 895 pass; @maka/runtime 3066 pass with one environment failure (claude-subscription-usage cannot reach the OAuth token endpoint in my sandbox — fails identically on unmodified main)
  • Root lint, format:check and typecheck all pass
  • Post-fix list sizes, zero deprecated remaining in each, heads unchanged: togetherai 19, mistral 22, xiaomi 3, deepinfra 56, nvidia 59, openai 3
  • No protocol files touched, so RUNTIME_HOST_COMPATIBILITY_EPOCH stays put. model-pricing.generated.ts still carries rows for the removed ids and is deliberately untouched — it is generated and keyed independently.

AI use

Select exactly one:

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

Tool(s) and scope: Claude Code (Opus 5) — implementation, tests and the supporting measurements, under my direction and review. The commit carries a Generated-by trailer.

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — a connection created after this change sees a shorter pre-discovery model list; described under Summary above
  • No

yihanzhuand others added 2 commits August 22, 2026 08:30
`fallbackModels` is a recommendation, not an inventory: everything in it
lands in the catalog as available and default-capable, and its head is
what a new connection defaults to and what the connection test probes.
`toolCallingModelIds` filters on tool-calling capability only, so six
providers still offered 28 models their vendors have deprecated.
Apply the lifecycle filter the other eight derivations already use to
xiaomi, nvidia, mistral, togetherai and deepinfra, and drop the one
deprecated id from openai's hand-written list. Removal is from the offer
only: an id a user already chose still sends (`authorizeConnectionModel`
never reads this list), and all six do live protocol discovery, so the
endpoint's own catalog still comes back on the first fetch.
Every head is unchanged, so no connection default or probe model moves.
The recorded boundary in the contract test empties and goes away with
it, which is what it was built to do.
Closesapache#3355
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment said the catalog marks whatever the list contains available
and default-capable, then singled out `openai` — but `openai` is one of
eight providers whose `CURATED_CATALOG_FALLBACK_MODELS` entry replaces
the registry list before the catalog is built, so for those eight this
list reaches CLI onboarding and the connection-test probe candidates
rather than the picker. It also said each derivation drops deprecated
ids at its call site; thirteen of twenty-seven do.
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jackwenerjackwener left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head against the current base. The fallback lifecycle policy and scope are sound, the follow-up only corrects the contract comment, and I found no blocking correctness issue.

@jackwener
jackwener merged commit 8b60ddf into apache:mainAug 22, 2026
1 check passed
Sign up for freeto 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.

Fallback model lists still offer deprecated models for six providers

2 participants

@yihanzhu@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(core): stop offering deprecated models in fallback lists by yihanzhu · Pull Request #3494 · apache/maka · GitHub
Skip to content

fix(core): stop offering deprecated models in fallback lists - #3494

Merged
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models
Aug 22, 2026
Merged

fix(core): stop offering deprecated models in fallback lists#3494
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models

Conversation

@yihanzhu

Copy link
Copy Markdown
Contributor

Summary

fallbackModels is a recommendation, not an inventory: everything in it lands in the catalog as available and default-capable, and its head is what a new connection defaults to and what the connection test probes. toolCallingModelIds filters on tool-calling capability only, so six providers still offered 28 models their vendors have deprecated.

This applies the call-site lifecycle filter #3324 established for ZenMux to xiaomi, nvidia, mistral, togetherai and deepinfra, and drops the one deprecated id from openai's hand-written list. That empties PROVIDERS_WITH_DEPRECATED_FALLBACKS, so the recorded boundary goes away with it and the remaining assertion becomes the unconditional invariant — which is what its comment says it was built to do.

Removal is from the offer only. An id a user already chose still sends (authorizeConnectionModel never reads this list), and all six do kind: 'protocol' discovery, so the endpoint's own catalog returns on the first /models fetch. Every list head is unchanged, so no connection default or connection-test probe model moves.

Reasoning for the offer-policy question the issue poses, and the measurements behind the notes below, are in #3355 (comment).

Fixes#3355

Review focus

  • Two corrections to the issue body. The 28 is right as a registry count, but only 27 are user-visible: CURATED_CATALOG_FALLBACK_MODELS.openai shadows the registry list at model-catalog.ts:239, so gpt-4-turbo is in no picker today — removing it is hygiene for the non-catalog consumers (connection test, onboarding verify, CLI projection) and for the contract test, which reads the registry directly. And "discovery keeps only the fallback set" is the kind: 'fallback' branch; none of these six is on it, which is why the exclusion costs no reachability.
  • Two product judgments worth naming. mistral loses its whole devstral line from the pre-credential list (all eight deprecated ids are devstral plus open-mistral-nemo), and xiaomi is the largest proportional cut, 6 → 3. Both come straight back from live discovery.
  • The clause now sits at 13 call sites, so a new provider is wrong by default. Folding it into toolCallingModelIds would be a no-op today — of 46 snapshots, the only ones carrying a tool-capable deprecated id are the nine now filtered at their call site plus openai, google and the three xiaomi-token-plan entries, which all use hand-written lists that never reach the helper. Happy to roll that in here or leave it as a follow-up; the wrinkle is placement, since ollama-cloud's pre-filter is what makes a deprecated recommended id throw at module load rather than vanish.
  • Known limit, pre-existing: the invariant sweeps CATALOG_PROVIDER_TYPES, which is 55 of 59 registry entries. xai-oauth, github-copilot, claude-subscription and openai-codex sit outside it; I checked and none carries a deprecated id today.

Verification

  • Red state: with the registry change reverted, keeps deprecated snapshot models out of fallback lists fails naming all six providers and all 28 ids (togetherai 11, mistral 8, xiaomi 3, deepinfra 3, nvidia 2, openai 1)
  • @maka/core 588 pass; @maka/storage 895 pass; @maka/runtime 3066 pass with one environment failure (claude-subscription-usage cannot reach the OAuth token endpoint in my sandbox — fails identically on unmodified main)
  • Root lint, format:check and typecheck all pass
  • Post-fix list sizes, zero deprecated remaining in each, heads unchanged: togetherai 19, mistral 22, xiaomi 3, deepinfra 56, nvidia 59, openai 3
  • No protocol files touched, so RUNTIME_HOST_COMPATIBILITY_EPOCH stays put. model-pricing.generated.ts still carries rows for the removed ids and is deliberately untouched — it is generated and keyed independently.

AI use

Select exactly one:

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

Tool(s) and scope: Claude Code (Opus 5) — implementation, tests and the supporting measurements, under my direction and review. The commit carries a Generated-by trailer.

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — a connection created after this change sees a shorter pre-discovery model list; described under Summary above
  • No

yihanzhuand others added 2 commits August 22, 2026 08:30
`fallbackModels` is a recommendation, not an inventory: everything in it
lands in the catalog as available and default-capable, and its head is
what a new connection defaults to and what the connection test probes.
`toolCallingModelIds` filters on tool-calling capability only, so six
providers still offered 28 models their vendors have deprecated.
Apply the lifecycle filter the other eight derivations already use to
xiaomi, nvidia, mistral, togetherai and deepinfra, and drop the one
deprecated id from openai's hand-written list. Removal is from the offer
only: an id a user already chose still sends (`authorizeConnectionModel`
never reads this list), and all six do live protocol discovery, so the
endpoint's own catalog still comes back on the first fetch.
Every head is unchanged, so no connection default or probe model moves.
The recorded boundary in the contract test empties and goes away with
it, which is what it was built to do.
Closesapache#3355
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment said the catalog marks whatever the list contains available
and default-capable, then singled out `openai` — but `openai` is one of
eight providers whose `CURATED_CATALOG_FALLBACK_MODELS` entry replaces
the registry list before the catalog is built, so for those eight this
list reaches CLI onboarding and the connection-test probe candidates
rather than the picker. It also said each derivation drops deprecated
ids at its call site; thirteen of twenty-seven do.
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jackwenerjackwener left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head against the current base. The fallback lifecycle policy and scope are sound, the follow-up only corrects the contract comment, and I found no blocking correctness issue.

@jackwener
jackwener merged commit 8b60ddf into apache:mainAug 22, 2026
1 check passed
Sign up for freeto 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.

Fallback model lists still offer deprecated models for six providers

2 participants

@yihanzhu@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(core): stop offering deprecated models in fallback lists by yihanzhu · Pull Request #3494 · apache/maka · GitHub
Skip to content

fix(core): stop offering deprecated models in fallback lists - #3494

Merged
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models
Aug 22, 2026
Merged

fix(core): stop offering deprecated models in fallback lists#3494
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models

Conversation

@yihanzhu

Copy link
Copy Markdown
Contributor

Summary

fallbackModels is a recommendation, not an inventory: everything in it lands in the catalog as available and default-capable, and its head is what a new connection defaults to and what the connection test probes. toolCallingModelIds filters on tool-calling capability only, so six providers still offered 28 models their vendors have deprecated.

This applies the call-site lifecycle filter #3324 established for ZenMux to xiaomi, nvidia, mistral, togetherai and deepinfra, and drops the one deprecated id from openai's hand-written list. That empties PROVIDERS_WITH_DEPRECATED_FALLBACKS, so the recorded boundary goes away with it and the remaining assertion becomes the unconditional invariant — which is what its comment says it was built to do.

Removal is from the offer only. An id a user already chose still sends (authorizeConnectionModel never reads this list), and all six do kind: 'protocol' discovery, so the endpoint's own catalog returns on the first /models fetch. Every list head is unchanged, so no connection default or connection-test probe model moves.

Reasoning for the offer-policy question the issue poses, and the measurements behind the notes below, are in #3355 (comment).

Fixes#3355

Review focus

  • Two corrections to the issue body. The 28 is right as a registry count, but only 27 are user-visible: CURATED_CATALOG_FALLBACK_MODELS.openai shadows the registry list at model-catalog.ts:239, so gpt-4-turbo is in no picker today — removing it is hygiene for the non-catalog consumers (connection test, onboarding verify, CLI projection) and for the contract test, which reads the registry directly. And "discovery keeps only the fallback set" is the kind: 'fallback' branch; none of these six is on it, which is why the exclusion costs no reachability.
  • Two product judgments worth naming. mistral loses its whole devstral line from the pre-credential list (all eight deprecated ids are devstral plus open-mistral-nemo), and xiaomi is the largest proportional cut, 6 → 3. Both come straight back from live discovery.
  • The clause now sits at 13 call sites, so a new provider is wrong by default. Folding it into toolCallingModelIds would be a no-op today — of 46 snapshots, the only ones carrying a tool-capable deprecated id are the nine now filtered at their call site plus openai, google and the three xiaomi-token-plan entries, which all use hand-written lists that never reach the helper. Happy to roll that in here or leave it as a follow-up; the wrinkle is placement, since ollama-cloud's pre-filter is what makes a deprecated recommended id throw at module load rather than vanish.
  • Known limit, pre-existing: the invariant sweeps CATALOG_PROVIDER_TYPES, which is 55 of 59 registry entries. xai-oauth, github-copilot, claude-subscription and openai-codex sit outside it; I checked and none carries a deprecated id today.

Verification

  • Red state: with the registry change reverted, keeps deprecated snapshot models out of fallback lists fails naming all six providers and all 28 ids (togetherai 11, mistral 8, xiaomi 3, deepinfra 3, nvidia 2, openai 1)
  • @maka/core 588 pass; @maka/storage 895 pass; @maka/runtime 3066 pass with one environment failure (claude-subscription-usage cannot reach the OAuth token endpoint in my sandbox — fails identically on unmodified main)
  • Root lint, format:check and typecheck all pass
  • Post-fix list sizes, zero deprecated remaining in each, heads unchanged: togetherai 19, mistral 22, xiaomi 3, deepinfra 56, nvidia 59, openai 3
  • No protocol files touched, so RUNTIME_HOST_COMPATIBILITY_EPOCH stays put. model-pricing.generated.ts still carries rows for the removed ids and is deliberately untouched — it is generated and keyed independently.

AI use

Select exactly one:

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

Tool(s) and scope: Claude Code (Opus 5) — implementation, tests and the supporting measurements, under my direction and review. The commit carries a Generated-by trailer.

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — a connection created after this change sees a shorter pre-discovery model list; described under Summary above
  • No

yihanzhuand others added 2 commits August 22, 2026 08:30
`fallbackModels` is a recommendation, not an inventory: everything in it
lands in the catalog as available and default-capable, and its head is
what a new connection defaults to and what the connection test probes.
`toolCallingModelIds` filters on tool-calling capability only, so six
providers still offered 28 models their vendors have deprecated.
Apply the lifecycle filter the other eight derivations already use to
xiaomi, nvidia, mistral, togetherai and deepinfra, and drop the one
deprecated id from openai's hand-written list. Removal is from the offer
only: an id a user already chose still sends (`authorizeConnectionModel`
never reads this list), and all six do live protocol discovery, so the
endpoint's own catalog still comes back on the first fetch.
Every head is unchanged, so no connection default or probe model moves.
The recorded boundary in the contract test empties and goes away with
it, which is what it was built to do.
Closesapache#3355
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment said the catalog marks whatever the list contains available
and default-capable, then singled out `openai` — but `openai` is one of
eight providers whose `CURATED_CATALOG_FALLBACK_MODELS` entry replaces
the registry list before the catalog is built, so for those eight this
list reaches CLI onboarding and the connection-test probe candidates
rather than the picker. It also said each derivation drops deprecated
ids at its call site; thirteen of twenty-seven do.
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jackwenerjackwener left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head against the current base. The fallback lifecycle policy and scope are sound, the follow-up only corrects the contract comment, and I found no blocking correctness issue.

@jackwener
jackwener merged commit 8b60ddf into apache:mainAug 22, 2026
1 check passed
Sign up for freeto 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.

Fallback model lists still offer deprecated models for six providers

2 participants

@yihanzhu@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(core): stop offering deprecated models in fallback lists by yihanzhu · Pull Request #3494 · apache/maka · GitHub
Skip to content

fix(core): stop offering deprecated models in fallback lists - #3494

Merged
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models
Aug 22, 2026
Merged

fix(core): stop offering deprecated models in fallback lists#3494
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models

Conversation

@yihanzhu

Copy link
Copy Markdown
Contributor

Summary

fallbackModels is a recommendation, not an inventory: everything in it lands in the catalog as available and default-capable, and its head is what a new connection defaults to and what the connection test probes. toolCallingModelIds filters on tool-calling capability only, so six providers still offered 28 models their vendors have deprecated.

This applies the call-site lifecycle filter #3324 established for ZenMux to xiaomi, nvidia, mistral, togetherai and deepinfra, and drops the one deprecated id from openai's hand-written list. That empties PROVIDERS_WITH_DEPRECATED_FALLBACKS, so the recorded boundary goes away with it and the remaining assertion becomes the unconditional invariant — which is what its comment says it was built to do.

Removal is from the offer only. An id a user already chose still sends (authorizeConnectionModel never reads this list), and all six do kind: 'protocol' discovery, so the endpoint's own catalog returns on the first /models fetch. Every list head is unchanged, so no connection default or connection-test probe model moves.

Reasoning for the offer-policy question the issue poses, and the measurements behind the notes below, are in #3355 (comment).

Fixes#3355

Review focus

  • Two corrections to the issue body. The 28 is right as a registry count, but only 27 are user-visible: CURATED_CATALOG_FALLBACK_MODELS.openai shadows the registry list at model-catalog.ts:239, so gpt-4-turbo is in no picker today — removing it is hygiene for the non-catalog consumers (connection test, onboarding verify, CLI projection) and for the contract test, which reads the registry directly. And "discovery keeps only the fallback set" is the kind: 'fallback' branch; none of these six is on it, which is why the exclusion costs no reachability.
  • Two product judgments worth naming. mistral loses its whole devstral line from the pre-credential list (all eight deprecated ids are devstral plus open-mistral-nemo), and xiaomi is the largest proportional cut, 6 → 3. Both come straight back from live discovery.
  • The clause now sits at 13 call sites, so a new provider is wrong by default. Folding it into toolCallingModelIds would be a no-op today — of 46 snapshots, the only ones carrying a tool-capable deprecated id are the nine now filtered at their call site plus openai, google and the three xiaomi-token-plan entries, which all use hand-written lists that never reach the helper. Happy to roll that in here or leave it as a follow-up; the wrinkle is placement, since ollama-cloud's pre-filter is what makes a deprecated recommended id throw at module load rather than vanish.
  • Known limit, pre-existing: the invariant sweeps CATALOG_PROVIDER_TYPES, which is 55 of 59 registry entries. xai-oauth, github-copilot, claude-subscription and openai-codex sit outside it; I checked and none carries a deprecated id today.

Verification

  • Red state: with the registry change reverted, keeps deprecated snapshot models out of fallback lists fails naming all six providers and all 28 ids (togetherai 11, mistral 8, xiaomi 3, deepinfra 3, nvidia 2, openai 1)
  • @maka/core 588 pass; @maka/storage 895 pass; @maka/runtime 3066 pass with one environment failure (claude-subscription-usage cannot reach the OAuth token endpoint in my sandbox — fails identically on unmodified main)
  • Root lint, format:check and typecheck all pass
  • Post-fix list sizes, zero deprecated remaining in each, heads unchanged: togetherai 19, mistral 22, xiaomi 3, deepinfra 56, nvidia 59, openai 3
  • No protocol files touched, so RUNTIME_HOST_COMPATIBILITY_EPOCH stays put. model-pricing.generated.ts still carries rows for the removed ids and is deliberately untouched — it is generated and keyed independently.

AI use

Select exactly one:

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

Tool(s) and scope: Claude Code (Opus 5) — implementation, tests and the supporting measurements, under my direction and review. The commit carries a Generated-by trailer.

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — a connection created after this change sees a shorter pre-discovery model list; described under Summary above
  • No

yihanzhuand others added 2 commits August 22, 2026 08:30
`fallbackModels` is a recommendation, not an inventory: everything in it
lands in the catalog as available and default-capable, and its head is
what a new connection defaults to and what the connection test probes.
`toolCallingModelIds` filters on tool-calling capability only, so six
providers still offered 28 models their vendors have deprecated.
Apply the lifecycle filter the other eight derivations already use to
xiaomi, nvidia, mistral, togetherai and deepinfra, and drop the one
deprecated id from openai's hand-written list. Removal is from the offer
only: an id a user already chose still sends (`authorizeConnectionModel`
never reads this list), and all six do live protocol discovery, so the
endpoint's own catalog still comes back on the first fetch.
Every head is unchanged, so no connection default or probe model moves.
The recorded boundary in the contract test empties and goes away with
it, which is what it was built to do.
Closesapache#3355
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment said the catalog marks whatever the list contains available
and default-capable, then singled out `openai` — but `openai` is one of
eight providers whose `CURATED_CATALOG_FALLBACK_MODELS` entry replaces
the registry list before the catalog is built, so for those eight this
list reaches CLI onboarding and the connection-test probe candidates
rather than the picker. It also said each derivation drops deprecated
ids at its call site; thirteen of twenty-seven do.
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jackwenerjackwener left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head against the current base. The fallback lifecycle policy and scope are sound, the follow-up only corrects the contract comment, and I found no blocking correctness issue.

@jackwener
jackwener merged commit 8b60ddf into apache:mainAug 22, 2026
1 check passed
Sign up for freeto 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.

Fallback model lists still offer deprecated models for six providers

2 participants

@yihanzhu@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix(core): stop offering deprecated models in fallback lists by yihanzhu · Pull Request #3494 · apache/maka · GitHub
Skip to content

fix(core): stop offering deprecated models in fallback lists - #3494

Merged
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models
Aug 22, 2026
Merged

fix(core): stop offering deprecated models in fallback lists#3494
jackwener merged 2 commits into
apache:mainfrom
yihanzhu:fix/deprecated-fallback-models

Conversation

@yihanzhu

Copy link
Copy Markdown
Contributor

Summary

fallbackModels is a recommendation, not an inventory: everything in it lands in the catalog as available and default-capable, and its head is what a new connection defaults to and what the connection test probes. toolCallingModelIds filters on tool-calling capability only, so six providers still offered 28 models their vendors have deprecated.

This applies the call-site lifecycle filter #3324 established for ZenMux to xiaomi, nvidia, mistral, togetherai and deepinfra, and drops the one deprecated id from openai's hand-written list. That empties PROVIDERS_WITH_DEPRECATED_FALLBACKS, so the recorded boundary goes away with it and the remaining assertion becomes the unconditional invariant — which is what its comment says it was built to do.

Removal is from the offer only. An id a user already chose still sends (authorizeConnectionModel never reads this list), and all six do kind: 'protocol' discovery, so the endpoint's own catalog returns on the first /models fetch. Every list head is unchanged, so no connection default or connection-test probe model moves.

Reasoning for the offer-policy question the issue poses, and the measurements behind the notes below, are in #3355 (comment).

Fixes#3355

Review focus

  • Two corrections to the issue body. The 28 is right as a registry count, but only 27 are user-visible: CURATED_CATALOG_FALLBACK_MODELS.openai shadows the registry list at model-catalog.ts:239, so gpt-4-turbo is in no picker today — removing it is hygiene for the non-catalog consumers (connection test, onboarding verify, CLI projection) and for the contract test, which reads the registry directly. And "discovery keeps only the fallback set" is the kind: 'fallback' branch; none of these six is on it, which is why the exclusion costs no reachability.
  • Two product judgments worth naming. mistral loses its whole devstral line from the pre-credential list (all eight deprecated ids are devstral plus open-mistral-nemo), and xiaomi is the largest proportional cut, 6 → 3. Both come straight back from live discovery.
  • The clause now sits at 13 call sites, so a new provider is wrong by default. Folding it into toolCallingModelIds would be a no-op today — of 46 snapshots, the only ones carrying a tool-capable deprecated id are the nine now filtered at their call site plus openai, google and the three xiaomi-token-plan entries, which all use hand-written lists that never reach the helper. Happy to roll that in here or leave it as a follow-up; the wrinkle is placement, since ollama-cloud's pre-filter is what makes a deprecated recommended id throw at module load rather than vanish.
  • Known limit, pre-existing: the invariant sweeps CATALOG_PROVIDER_TYPES, which is 55 of 59 registry entries. xai-oauth, github-copilot, claude-subscription and openai-codex sit outside it; I checked and none carries a deprecated id today.

Verification

  • Red state: with the registry change reverted, keeps deprecated snapshot models out of fallback lists fails naming all six providers and all 28 ids (togetherai 11, mistral 8, xiaomi 3, deepinfra 3, nvidia 2, openai 1)
  • @maka/core 588 pass; @maka/storage 895 pass; @maka/runtime 3066 pass with one environment failure (claude-subscription-usage cannot reach the OAuth token endpoint in my sandbox — fails identically on unmodified main)
  • Root lint, format:check and typecheck all pass
  • Post-fix list sizes, zero deprecated remaining in each, heads unchanged: togetherai 19, mistral 22, xiaomi 3, deepinfra 56, nvidia 59, openai 3
  • No protocol files touched, so RUNTIME_HOST_COMPATIBILITY_EPOCH stays put. model-pricing.generated.ts still carries rows for the removed ids and is deliberately untouched — it is generated and keyed independently.

AI use

Select exactly one:

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

Tool(s) and scope: Claude Code (Opus 5) — implementation, tests and the supporting measurements, under my direction and review. The commit carries a Generated-by trailer.

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — a connection created after this change sees a shorter pre-discovery model list; described under Summary above
  • No

yihanzhuand others added 2 commits August 22, 2026 08:30
`fallbackModels` is a recommendation, not an inventory: everything in it
lands in the catalog as available and default-capable, and its head is
what a new connection defaults to and what the connection test probes.
`toolCallingModelIds` filters on tool-calling capability only, so six
providers still offered 28 models their vendors have deprecated.
Apply the lifecycle filter the other eight derivations already use to
xiaomi, nvidia, mistral, togetherai and deepinfra, and drop the one
deprecated id from openai's hand-written list. Removal is from the offer
only: an id a user already chose still sends (`authorizeConnectionModel`
never reads this list), and all six do live protocol discovery, so the
endpoint's own catalog still comes back on the first fetch.
Every head is unchanged, so no connection default or probe model moves.
The recorded boundary in the contract test empties and goes away with
it, which is what it was built to do.
Closesapache#3355
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment said the catalog marks whatever the list contains available
and default-capable, then singled out `openai` — but `openai` is one of
eight providers whose `CURATED_CATALOG_FALLBACK_MODELS` entry replaces
the registry list before the catalog is built, so for those eight this
list reaches CLI onboarding and the connection-test probe candidates
rather than the picker. It also said each derivation drops deprecated
ids at its call site; thirteen of twenty-seven do.
Generated-by: Claude Code (Opus 5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@jackwenerjackwener left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head against the current base. The fallback lifecycle policy and scope are sound, the follow-up only corrects the contract comment, and I found no blocking correctness issue.

@jackwener
jackwener merged commit 8b60ddf into apache:mainAug 22, 2026
1 check passed
Sign up for freeto 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.

Fallback model lists still offer deprecated models for six providers

2 participants

@yihanzhu@jackwener