排障

Claude Fable 5 报错速查

五种故障覆盖了几乎所有跑不通的 Fable 5 集成。按状态码找到你的那一种,然后照修复顺序执行。

30 秒版本

529 是 Anthropic 的容量问题,退避重试即可。429 是你的吞吐量撞上了 Fable 5 自己的限流池,而这个池子比 Opus 和 Sonnet 的小得多。400 要么是请求体,要么是你所在组织的数据留存设置。拒答根本不是报错:它以 HTTP 200 返回,stop_reason 为 refusal,不会抛异常。404 说明模型 ID 写错了,或者你的账号访问不到 claude-fable-5。

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 会原样返回给你,所以容量层面的回退是你必须自己写的代码。

修你真正遇到的那个故障

从状态码开始。每个子页面给出该故障的成因、修复顺序,以及开发者问得最多的问题。

常见问题