排障
Claude Fable 5 报错速查
五种故障覆盖了几乎所有跑不通的 Fable 5 集成。按状态码找到你的那一种,然后照修复顺序执行。
30 秒版本
529 是 Anthropic 的容量问题,退避重试即可。429 是你的吞吐量撞上了 Fable 5 自己的限流池,而这个池子比 Opus 和 Sonnet 的小得多。400 要么是请求体,要么是你所在组织的数据留存设置。拒答根本不是报错:它以 HTTP 200 返回,stop_reason 为 refusal,不会抛异常。404 说明模型 ID 写错了,或者你的账号访问不到 claude-fable-5。
529 overloaded_error
Anthropic 平台在所有客户维度上都满载了。不是你的账号,不是你的配额,除了退避你这边也做不了别的。
429 rate_limit_error
你在 Fable 5 自己的限流池上超了每分钟请求数、输入 token 或输出 token。retry-after 头会准确告诉你要等多久。
400 invalid_request_error
通常是 Fable 5 已经移除的参数,比如 temperature 或 thinking budget;也可能是组织的数据留存设置低于要求的 30 天。
stop_reason: refusal
安全分类器拒绝了这个请求,并返回 HTTP 200。读 stop_details.category 就知道是哪个策略领域命中的。
404 not_found_error
模型 ID 写错了,或者你的账号、工作区、订阅方案、Claude Code 版本访问不到 claude-fable-5。
Fable 5 速率限制
各用量档位的 RPM、ITPM、OTPM 具体数字,缓存读取如何改变这笔账,以及怎么申请提额。
Fable 5 为什么坏得不一样
从 Opus 4.8 或 Opus 5 迁过来时踩的坑,绝大多数能归到这四个结构性差异上。
拒答是成功响应
Fable 5 跑着安全分类器,可以拒绝一个请求。拒答返回 HTTP 200,stop_reason 为 refusal,并带一个 stop_details 对象。错误率看板和 try/except 都看不到它,所以线上表现通常是「返回了个空响应」,而不是告警。
可接受的参数面更窄
temperature、top_p、top_k 传非默认值返回 400。assistant prefill 返回 400。thinking 传 disabled、或手动指定 budget_tokens,同样返回 400。SDK 的请求类型为了向后兼容仍然定义了这些字段,所以代码能通过类型检查,运行时被 API 拒掉。
Fable 5 有自己独立的限流池
限流按模型分别计算,而 Fable 5 的池子比 Opus 5 小很多。Start 档下 Fable 5 是每分钟 500,000 输入 token、100,000 输出 token,Opus 5 则是 2,000,000 和 400,000。在 Opus 上从没触发过 429 的流量,切到 Fable 5 可能立刻就撞上。
有些 400 和 404 是组织级的,不是请求级的
Fable 5 要求 30 天数据留存,不提供零数据留存。组织的留存配置不满足这一要求时,无论请求体写什么,每一个请求都返回 400。管理员配置的模型白名单会造成同样的「全有或全无」现象。
按这个顺序修
先给故障分类,再写重试逻辑。分错类的重试要么白烧钱,要么把配置 bug 掩盖掉。
1. 读状态码和 error type
每个 API 错误体都带 error.type 和 request_id。429 是 rate_limit_error,529 是 overloaded_error,400 是 invalid_request_error,404 是 not_found_error。把 request_id 记下来:这是 Anthropic 支持团队唯一能据以排查的东西。
3. 遵守 retry-after,指数退避
429、500、504、529 用指数退避重试,且至少等待 retry-after 头给出的秒数。早于这个时间重试必然失败。400、401、403、404 不要重试:同样的请求结果一模一样。
2. 每个 200 都要判断 stop_reason
在读 content 之前先判断 stop_reason 是否等于 refusal。不要靠 content 数组为空来推断,也不要去解析 stop_details.explanation,它的措辞不稳定。合法的拒答里 category 和 explanation 都可能是 null。
4. 接一个回退模型,并验证它真的触发了
服务端 fallbacks 参数只在安全分类器拒答时触发。Fable 5 上的 429、529、500 会原样返回给你,所以容量层面的回退是你必须自己写的代码。