ModelPricing.table has no entry for claude-fable-5-1, so rate(for:) falls through to the family fallback:
if m.contains("fable") { return .perMillion(10, 50, 12.5, 1.0) }
Three of those four numbers are right for Fable 5.1 — input $10, output $50, cache write $12.50. The cache read rate is not: Fable 5.1 lowered cache reads to $0.25/MTok, while the fallback applies Fable 5's $1.00/MTok. That is a 4× overcharge on the one token class that dominates agentic sessions, so displayed cost is materially overstated for anyone using claude-fable-5-1 heavily.
Suggested fix
"claude-fable-5-1": .perMillion(10, 50, 12.5, 0.25),
Note: claude-opus-5 needs no change
Worth recording so this doesn't get "fixed" too — claude-opus-5 is also absent from the table, but its opus fallback returns .perMillion(5, 25, 6.25, 0.5), which matches Opus 5 exactly. I verified against a real day of usage (5.87M cache-read tokens): fallback and true rate both produce $6.3298, a $0.0000 difference. The version-drift fallback is doing its job there; only the Fable 5.1 cache-read rate diverges.
ModelPricing.tablehas no entry forclaude-fable-5-1, sorate(for:)falls through to the family fallback:Three of those four numbers are right for Fable 5.1 — input $10, output $50, cache write $12.50. The cache read rate is not: Fable 5.1 lowered cache reads to $0.25/MTok, while the fallback applies Fable 5's $1.00/MTok. That is a 4× overcharge on the one token class that dominates agentic sessions, so displayed cost is materially overstated for anyone using
claude-fable-5-1heavily.Suggested fix
Note:
claude-opus-5needs no changeWorth recording so this doesn't get "fixed" too —
claude-opus-5is also absent from the table, but itsopusfallback returns.perMillion(5, 25, 6.25, 0.5), which matches Opus 5 exactly. I verified against a real day of usage (5.87M cache-read tokens): fallback and true rate both produce $6.3298, a $0.0000 difference. The version-drift fallback is doing its job there; only the Fable 5.1 cache-read rate diverges.