feat(models): add Claude Fable 5.1 - #928
Merged
Merged
Conversation
… 5.1 The Fable 5.1 change bumped @anthropic-ai/claude-code in package.json and package-lock.json, but CI installs from bun.lock and a separate workflow verifies bun.nix is in sync with it — so the CLI bump never reached the lockfile that matters. Regenerate both (2.1.259). The bump is load-bearing: the 2.1.198 binary contains no claude-fable-5-1 string, 2.1.259 does, so the older CLI genuinely rejects the model. Also covers what rides along with a new fable generation: - pricing: add claude-fable-5-1 and claude-mythos-5-1 as exact keys. The family fallback already priced them, but the settings page lists the exact-key table as the overridable set, so they were absent there. - tests: claude-fable-5-1 and claude-mythos-5-1 route through the fable tier ([1m] primary, base for subagents) — the tier mapping had no coverage for either id. - docs/agents.md: add Fable 5.1 to the Crush and Droid example configs. - comments: the fable branch describes a tier with several generations on one SDK alias, not just Fable 5.
The bump to @anthropic-ai/claude-code ^2.1.257 outpaced the claude-code in the pinned nixpkgs, so the flake stopped evaluating. check-claude-code verified that a nixpkgs bump satisfies the floor; this is that bump, to the rev the workflow resolved (2026-09-02). Only reachable because bun.lock moved in this PR — check-claude-code and the nix build key off bun.lock/flake changes, so a claude-code bump that lands in package.json alone never runs them.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds Claude Fable 5.1 (
claude-fable-5-1) support.Supersedes #921 by @emaadshamsi, cherry-picked here to satisfy
main'ssigned-commit requirement (fork PRs sit at
BLOCKEDregardless of CI).Their commit is preserved as-is; the second commit adds what it missed.
From #921
claude-fable-5-1becomes the canonical fable pin;claude-fable-5stays available as an explicit per-request pin
/v1/modelsadvertises Fable 5.1 with Max 1M context metadata@anthropic-ai/claude-code— the older CLI rejects the modelAdded here
bun.lock/bun.nixwere never updated. #921 bumpedpackage.jsonand
package-lock.jsononly, but CI installs withbun installfrombun.lock, andbun-nix-sync.ymlverifiesbun.nixmatches it. Thatworkflow only triggers on
bun.lockchanges, so it was skipped entirelyon #921 — and CI's non-frozen
bun installresolved the new versionanyway, so green checks hid a stale lockfile.
bun install --frozen-lockfilewould have broken onmainafter merge.claude-fable-5-1andclaude-mythos-5-1as exact keys. Thefamily fallback already priced them, but the settings page derives its
overridable model list from the exact-key table, so both were missing there.
claude-fable-5-1andclaude-mythos-5-1— neither id had any. Mythos 5.1 shipped alongsideFable 5.1 and rides the same alias.
docs/agents.md: Fable 5.1 in the Crush and Droid example configs.one SDK alias, not just Fable 5.
The CLI bump is load-bearing
Not taken on faith. The 2.1.198 binary contains no
claude-fable-5-1string; 2.1.259 does. At runtime the old CLI returns:
while
claude-fable-5still returns 200 on that same binary — so thefailure is model-specific, not a broken setup. The true floor is
2.1.251;
^2.1.257clears it.Not affected: forced tool choice
Fable 5.1 returns 400 on
tool_choiceany/tool. Meridian only readstool_choiceclient-side (theforceSingleToolUsecapture-dedupheuristic in
server.ts) and never forwards it upstream — tools reachClaude through the passthrough MCP server. Verified live below.
Testing
npm test: 2983 pass / 0 fail across 178 files, plus all 12 isolatedfiles green.
npm run typecheckclean. (#921 reported a pre-existingproxy-stale-uuid-retryfailure; it does not reproduce here.)Live E2E against Claude Max, proxy running the bundled 2.1.259 CLI:
/v1/modelsclaude-fable-5-1at 1M ctxmodel=fable[1m]stop_reason=tool_use, valid blockend_turn,lineage=continuationclaude-fable-5model=fable agent=subagent(no[1m])MERIDIAN_FABLE_MODEL=fablemodel=fableon a 5.1 requestclaude-mythos-5-1fable[1m], gated by account accessclaude-fable-5-99The bogus-version check is the one that proves the feature is real: a
nonexistent fable version is rejected rather than silently served by
another model, which means the per-request pin genuinely reaches the SDK
and determines model selection. That is what makes
claude-fable-5-1succeeding evidence that Fable 5.1 actually served the request — the
failure mode this guards against is #529, where fable requests silently
answered as Sonnet.
Unrelated pre-existing issue (not fixed here)
An unavailable model returns HTTP 500
api_errorrather than a 400 —applies to
claude-fable-5-99,claude-mythos-5-1, and the old-CLIrejection alike. 500 is retryable, so clients will retry a permanently
invalid model. Adjacent to #919; worth a follow-up issue.
Closes #921.