[BUG] modelPicker drops aws regional Fable rows as duplicates of the built-in Fable row
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
When modelPicker.replaceBuiltInOptions is unset, a curated modelPicker.options row whose model is a regional Bedrock inference profile for a Fable model (us.anthropic.claude-fable-5-1[1m], eu.anthropic.claude-fable-5-1[1m]) does not appear in /model. The CLI treats it as a duplicate of the built-in Fable row (global.anthropic.claude-fable-5-1[1m]) and drops it without a warning. The same configuration works for Opus: us./eu. Opus rows appear next to the built-in global. Opus row.
Cause (from the 2.1.292 bundle, minified names)
The picker appends each curated row only when no existing row matches it:
if (s.replaceBuiltInOptions === !0) return [...e.filter((x) => x.value === null), ...S];
let w = [...e];
for (let x of S) if (!w.some((C) => ts(C, x))) w.push(x);
The matcher ts has a Fable-family special case. Before comparing full IDs, it reduces both values with vO:
function ts(e, n) {
if (e.value === n.value) return !0;
...
let r = vO(e.value), s = vO(n.value);
if (r !== void 0 && s !== void 0 && (r === s || r === OS || s === OS)) return !0;
...
}
vO pulls the bare model ID out with a regex that accepts any prefix ending in . or /:
new RegExp(`(?:^|[./])(${fableIds.join("|")})(?:[-@]\\d{8})?(?:-v\\d+(?::\\d+)?)?(?:\\[[12]m\\])?$`, "i")
So us.anthropic.claude-fable-5-1[1m], eu.anthropic.claude-fable-5-1[1m] and global.anthropic.claude-fable-5-1[1m] all reduce to claude-fable-5-1 and are treated as the same model. The inference-profile prefix is thrown away, even though these are different routing targets that an admin may want to offer separately (data residency, regional capacity, failover). Non-Fable families don't go through this path, which is why Opus behaves differently.
Workaround (issues)
Setting "replaceBuiltInOptions": true skips the dedup. The admin then has to list every built-in model by hand. Per the setting's own description, this also hides gateway-discovered models and ANTHROPIC_CUSTOM_MODEL_OPTION.
What Should Happen?
Any one of these would solve it:
- When deduping curated
modelPickerrows against the built-in lineup, match only on exactvalueand skip family-level matching. An admin who lists a row explicitly almost certainly wants it shown. - Keep the inference-profile or provider prefix (
us.,eu.,apac.,global., ARNs) as part of the identity invO, so that only alias-vs-full-ID cases (fablevsclaude-fable-5-1) collapse. - At minimum, show a settings warning when a curated row is dropped as a duplicate, naming the row it matched.
Error Messages/Logs
Steps to Reproduce
Managed settings:
{
"env": {
"ANTHROPIC_DEFAULT_FABLE_MODEL": "global.anthropic.claude-fable-5-1[1m]",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "global.anthropic.claude-opus-5-5[1m]"
},
"modelPicker": {
"options": [
{ "model": "us.anthropic.claude-fable-5-1[1m]", "label": "Fable 5.1 (US)" },
{ "model": "eu.anthropic.claude-fable-5-1[1m]", "label": "Fable 5.1 (EU)" },
{ "model": "us.anthropic.claude-opus-5-5[1m]", "label": "Opus 5.5 (US)" },
{ "model": "eu.anthropic.claude-opus-5-5[1m]", "label": "Opus 5.5 (EU)" }
]
}
}
- Start Claude Code and open
/model. - Expected: the built-in rows, then all four curated rows.
- Actual: the built-in rows, then only "Opus 5.5 (US)" and "Opus 5.5 (EU)". Both Fable rows are missing. No settings warning is shown.
/model us.anthropic.claude-fable-5-1[1m] still works and shows the label "Fable 5.1 (US)". The rows are loaded, they just aren't listed.
Claude Model
Other
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.1.192
Platform
AWS Bedrock
Operating System
Ubuntu/Debian Linux
Terminal/Shell
VS Code integrated terminal
Additional Information
_No response_