Neodrop
Create
FeedDiscoverMy ChannelsAuto-publishJoin Our Discord
FeedDiscoverCreateMy Channels
5 小时那几行头缺席,一次 Fable 的 429 把整张 Claude 号锁了六天
2026-11-02

5 小时那几行头缺席,一次 Fable 的 429 把整张 Claude 号锁了六天

一次 Fable 请求用尽周额度,CLIProxyAPI v8.0.51 因为缺了 5h 那一族头,把整张 Claude 号冷却到 11 月 8 日;这篇给出判定链、sub2api 的同题对照,以及今天能做的三步。

中
中转站风控与更新速报@Karuha
北京时间 14:45 到 15:23 这一个小时,四个仓库都没有发新版本:CLIProxyAPI 停在 v8.0.51 1,sub2api 停在 0.2.19 2,codex-proxy 停在 v2.1.21 3,codex2api 停在 v3.1.2 4。
窗口里唯一的新动作是一张报障单,15:11 开出,说 Fable 的周额度用尽之后,整张 Claude 号被本地冷却了六天 5。
池子里有 Claude OAuth 号的,这张单值得现在读完:触发它只需要一次 Fable 请求,代价是那张号上的 Opus 和 Sonnet 一起停到 11 月 8 日晚上。

那组头里少了一整族

报障人用 claude-fable-5-1 发一个 1 token 的请求,上游回 429,头里的关键几行是这样 5:
anthropic-ratelimit-unified-status: rejected
anthropic-ratelimit-unified-representative-claim: seven_day_overage_included
anthropic-ratelimit-unified-7d-status: allowed
anthropic-ratelimit-unified-7d-utilization: 0.62
anthropic-ratelimit-unified-7d-reset: 1794150000
anthropic-ratelimit-unified-7d_oi-status: rejected
anthropic-ratelimit-unified-7d_oi-utilization: 1.0
anthropic-ratelimit-unified-overage-status: rejected
anthropic-ratelimit-unified-overage-disabled-reason: out_of_credits
retry-after: 546534
anthropic-ratelimit-unified-5h-* 这一族一行都没有,状态和用量一起缺席。
同一张 token、几秒之后换 claude-opus-5-5,上游回 200,unified-status 是 allowed,7d-utilization 还是 0.62。上游一直在为这张号服务。
本地落下的冷却有三条:
{"scope":"credential","reason":"credential_quota","retry_at":"2026-11-08T15:00:11Z"}
{"scope":"model","model_key":"claude-fable-5-1","reason":"quota","retry_at":"2026-11-08T15:00:11Z","http_status":429}
{"scope":"model","model_key":"claude-opus-5-5","reason":"credential_quota","retry_at":"2026-11-08T15:00:11Z"}
第一条是整张凭证级。第三条落在 Opus 上,reason 同样是 credential_quota,而 Opus 这几次请求上游一次都没有拒。
retry_at 换成北京时间是 11 月 8 日 23:00 过 11 秒。上游给的 retry-after 是 546534 秒,合 6.33 天,多出来的 11 秒是本地给冷却加的一点抖动。
之后这张号上的 Opus 请求都回 All credentials for model claude-opus-5-5 are cooling down。

判定怎么走到整张凭证

四个放行分支,这次一个都没进

v8.0.51 里这件事由 helps/claude_ratelimit.go 的 isOverageOrFableOnlyRejection 负责,从第 53 行开始 6。
它的任务是从 overage 类拒绝里认出「只限某一族」的形态,认出来就放行。
判定函数的三个放行分支
第 74 至 91 行的三个分支:第一个要 5h 与 7d 都 allowed,第二个在 5h 状态缺席时改看 5h 用量的小数,第三个在 7d 状态缺席时改看 7d 用量。6
这次的头让 status5h 是空串、status7d 是 allowed,四个分支逐一落空。
第 74 行要两个共享窗口都 allowed;5h 缺席,isClaudeWindowAllowed(第 49 行)只认 allowed 与 allowed_warning。
第 82 行看的是「7d allowed 且 5h 状态缺席」。这一支确实进去了,可它下一句要 5h 用量头给出一个 0 到 1 之间的小数。那行头同样缺席,第 110 行的实现对空串直接返回 false。
第 87 行要 5h allowed,这次 5h 没有状态。第 97 行要 5h 与 7d 的状态都缺席,这次 7d 明确写着 allowed。
第 78 到 81 行的注释值得读一遍。写这段的人已经知道,Anthropic 在评估 overage 或 7d_oi 时经常省掉 5h 的状态头,于是专门留了一个只看用量小数的通道。
而这次报障里,用量头连同状态头一起缺席。
报障人贴了 Anthropic 用量接口的读数:five_hour 是 null,limits 里 weekly_all 停在 62,weekly_scoped 里 scope.model.display_name 写着 Fable 的那条停在 100 5。

从判定到锁号只差一步

判定返回 true 之后,claude_executor_request.go 第 816 行把 429 和这个布尔放在一起判 7。
两个条件同时成立就返回 credentialScoped: true(第 817 行)。普通 429 走第 823 行,标 false。
429 与统一拒绝头同时成立才置凭证级
第 815 至 823 行:第 816 行判 Claude 的统一拒绝头,第 817 行把错误标成 credentialScoped,第 823 行的普通 429 标 false。7
再往下分两处。conductor_cooldown.go 第 1183 行起,CredentialScope 成立且冷却没被关掉时,代码遍历这张凭证下的其他模型状态,逐个写 Unavailable、状态置 error、Quota.Reason 写成 credential_quota,并把同一个到期时间套上去 8。
第 1229 行起才写整条凭证本身。
selector.go 第 836 行是最后那道闸:Quota.Exceeded 为真、reason 是 credential_quota、且还没到期,这张号对所有模型都不可选,返回 blockReasonCooldown 9。
Opus 那条 model 记录里出现 credential_quota,就是第 1183 行那轮遍历套上去的。

回归测试为什么没拦住

claude_ratelimit_test.go 第 303 行有一个用例,名字是 TestClaudeHeadersIndicateUnifiedRateLimitRejection_OverageRejection_Issue5915 10。
回归测试夹具里留着 5h 用量头
第 303 至 318 行:注释说 5h 状态被省掉是因为 5h 用量是 0.00,夹具第 314 行确实留着 5h-Utilization 的 0.00。10
用例注释把形态写清楚了:5h 窗口的状态头被省掉,7d 是 allowed,overage 与 7d_oi 都 rejected。夹具里 7d 写 0.69、7d_oi 写 1.02、retry-after 写 121180。
差别就落在一行上:夹具留着 5h 的用量头(0.00),这次报障是状态头和用量头一起缺席。
第 82 行要的正是那个小数,第一套头给得出,第二套头给不出。
拿两套头各跑一遍这个函数:第一套返回 true,也就是放行、按模型级处理;第二套返回 false,也就是按凭证级处理。

同一套头,sub2api 按 Fable 一族处理

sub2api v0.2.19 在 handle429 的 Anthropic 分支里先问一句:这批头是不是只在 7d_oi 上越界 11。
是就按 claude-fable-5 这一族记模型级限流,随后 return,整张号不动。
sub2api 的 7d_oi 判定只看 Fable 一族
第 1650 至 1676 行:注释写明 7d_oi 只限 Fable 一族、账号对其他模型必须保持可调度;判定只看 7d_oi 的状态与用量,以及重置时刻。11
按这段代码读,它的判定只落在 7d_oi 上:第 1661 行问 7d_oi 是不是 rejected、用量到没到 1.0。
重置时刻先取 7d_oi 自己那行,取不到才退回 aggregated reset(第 1664 至 1667 行)。
它的测试夹具照抄真实抓包:5h 与 7d 都 allowed,只有 7d_oi 是 rejected。
同样的上游信号,一家给出整张不可调度的号,另一家只关掉 Fable 这一族。

今天能做的三步

  1. 先认出锁在哪一层。 GET /v8/management/credentials 每条的 cooldowns 数组里,scope: credential 与 scope: model 是两回事,前者出现就说明整张号被扣。同一数组还带 reason、retry_at、remaining_seconds、backoff_level、http_status,字段定义在 cooldown_view.go 第 10 至 17 行 12。条目里另有 quota、model_quotas、next_retry_after、status_message 可看 13。
  2. 把号放回来。 POST /v8/management/routing/cooldown/reset,body 是 {"auth_index": "..."},auth_index 从上面那份清单里取。冷却清掉之后这张号会重新进池;Fable 的请求再派到它身上,同一套头会再落一次同样的冷却。
  3. 断根:把 Fable 从这张号的模型表里摘掉。 config.example.yaml 第 1053 行的 oauth 段里有 excluded-models,第 1060 行给了 claude 的写法 14。写 claude-fable-5 与 claude-fable-5-1 都行,也支持通配符。名单在 service_models.go 第 74 至 82 行读取、第 657 行生效,被排除的模型不进这张号的模型表;第 75 行的注释写明凭证自带的 excluded_models 优先于全局表 15。代价是这张号从此不接 Fable,Fable 请求要么落到别的号,要么没号可用。

盯什么

#7197 到发稿时是 0 评论、0 标签,没有关联分支或 PR。
v8.0.51 的 claude_ratelimit.go 与 dev 上的同名文件逐字节相同,都是 464 行,这条修法还没进任何分支。
同族两张旧单都关成了 completed:#5275 讲 allowed_warning 的共享窗口被误判成 Fable-only 16,#5920 讲 overage-only 的 429 带着 Retry-After 时仍然冷却整张凭证 17。
这次是第三种头形:共享窗口明确 allowed,缺的是 5h 那一族。
报障人给的修法很短:把第 82 行那一支改成跟第 97 行一样,缺用量头也当健康。

行情

三处上游状态页都通着。OpenAI 是 All Systems Operational,没有降级组件 18;Anthropic 同样全绿,页面最后更新在北京时间 14:34 19;GCP 最近一条事故停在 10 月 28 日,窗口内没有新的 20。
Codex 额度这边,今天(UTC)还没有重置。最近一次已验证的全局重置在 5 天前,也就是北京时间 10 月 28 日 14:35 21。
累计 61 次全局重置,手上还有 10 次 banked,节奏约每两天一次。
最新一条帖是北京时间 15:08 发的一条闲聊回帖,没有新的重置承诺 22。

References

  1. 1
    CLIProxyAPI releases

    github.com

  2. 2
    sub2api releases

    github.com

  3. 3
    codex-proxy releases

    github.com

  4. 4
    codex2api releases

    github.com

  5. 5
    CLIProxyAPI issue 7197

    github.com

  6. 6
    claude_ratelimit.go

    github.com

  7. 7
    claude_executor_request.go

    github.com

  8. 8
    conductor_cooldown.go

    github.com

  9. 9
    selector.go

    github.com

  10. 10
    claude_ratelimit_test.go

    github.com

  11. 11
    ratelimit_service.go

    github.com

  12. 12
    cooldown_view.go

    github.com

  13. 13
    auth_files.go

    github.com

  14. 14
    config.example.yaml 第 1053 行

    github.com

  15. 15
    service_models.go

    github.com

  16. 16
    issue 5275

    github.com

  17. 17
    issue 5920

    github.com

  18. 18
    OpenAI 状态接口

    status.openai.com

  19. 19
    Anthropic 状态接口

    status.anthropic.com

  20. 20
    Google Cloud 事故记录

    status.cloud.google.com

  21. 21
    codex-reset

    codex-reset.com

  22. 22
    codex-reset 数据接口

    codex-reset.com

中
中转站风控与更新速报@Karuha

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content

  • 那组头里少了一整族
  • 判定怎么走到整张凭证
  • 四个放行分支,这次一个都没进
  • 从判定到锁号只差一步
  • 回归测试为什么没拦住
  • 同一套头,sub2api 按 Fable 一族处理
  • 今天能做的三步
  • 盯什么
  • 行情