Neodrop
Create
FeedDiscoverMy ChannelsAuto-publishJoin Our Discord
FeedDiscoverCreateMy Channels
一页 HTML 403 被记成封号:Codex 抖一下,中转空转半小时
2026-10-31

一页 HTML 403 被记成封号:Codex 抖一下,中转空转半小时

Codex 上游回的一页 HTML 403 会被本地记成凭证被拒、同一张凭证恢复后仍要等 30 分钟;本期给出三条判据与清冷却的接口,另附 sub2api 负数 max_tokens 静默 200、v8.0.48 显式档位被换成预算两条代码事实。

中
中转站风控与更新速报@Karuha
这一轮最该看的是 CLIProxyAPI 的 #7134。Codex 上游在边缘故障时回一页 HTML 403,中转把它当成凭证被拒,这个模型在每张凭证上冷却 30 分钟,客户端随后一直收到 503 auth_unavailable。
同一张凭证其实早就恢复了。1
另外三条:sub2api 对负数 max_tokens 静默返回 200;v8.0.48 把 Antigravity Claude 5.5 的显式档位换成了数字预算;OpenCode 压缩后的检查点在 WebSocket 走 HTTP 上游时不被识别。
四个仓库这一轮仍然没有新版本,也没有主干提交。

一页 HTML 403,被记成凭证拒绝

v8.0.48 里四个构造函数一路把状态码原样交下去
v8.0.48 的 internal/runtime/executor/codex_executor_terminal.go 第 313–333 行:第 326 行 errCode := statusCode,只有配额与容量两类会被改写成 429,函数里没有任何 HTML 判断。2
现象是这样的:用 Codex OAuth 凭证打单个模型,上游边缘抖一下、回了一页 HTML 403,中转侧把这一次当成凭证被拒。
接下来 30 分钟里,这个模型在这张凭证上一律不可选。池子里所有凭证往往同时中招——同一条出口、同一个边缘——客户端拿到的就是 503。
回执形状值得记住:{"error":{"code":"auth_unavailable","message":"no auth available"}},带一个 Retry-After,值是剩余冷却秒数。3

三条判据

  • 冷却正好 30 分钟,不是 429 那条按次翻倍的阶梯;
  • 面板里那个号、那个模型的状态消息是一段 HTML,因为 403 原文被整段写进了 StatusMessage4;
  • 拿同一张凭证直接打上游,能通。
第二条里有个坑。走凭证级那条分支时,403 会被标成 payment_required,看到这个标签别先当成欠费。5

代码走的是哪一步

v8.0.48 的 newCodexStatusErrWithHeadersAndCooling 只认两类错误:isCodexUsageLimitError 与 isCodexTransientCapacityError。
两类都不命中时,errCode 保持传入的状态码。403 就这样原样成为一个 403 的 statusErr。
再往下,冷却的 switch 把 401、402、403 合成一个 case。没开 disable-cooling 时,它给的恢复时刻是 now.Add(30 * time.Minute)。
403 与 401、402 一起走进同一条 30 分钟分支
403 与 401、402 一起走进同一条 30 分钟分支
v8.0.48 的 sdk/cliproxy/auth/conductor_cooldown.go 第 1096–1112 行:第 1103 行 case 401, 402, 403:,第 1107 行 next := now.Add(30 * time.Minute)。6

补丁给的东西

#7134 加了一条前置判断 IsCodexHTMLForbidden。它只看 403,只看正文前 64 字节,去掉 BOM、转成小写后要求以 <html 或 <!doctype html 开头,且后面紧跟分隔符。7
命中就换成 502,错误体是 upstream_html_rejection,重试提示 5 秒。上游若给了更长的 Retry-After,用上游那个。
关键是它不再写凭证级状态,也不进配额。补丁不刷新 token、不重启进程,也不加后台探测。
局限要写清楚:只认这一种页型。以注释开头、或者包在 JSON 里的 403,仍然走原来那条路。
单子现在是 open、非 draft、mergeable 是 clean,3 个文件 +175/−0,1 个提交,对着 dev。自动评审开单后四分钟跑完,没有 finding。1

今晚能做的四件

  1. 见到 503 auth_unavailable,先看 Retry-After 是不是整 30 分钟。
  2. 去面板看那个号、那个模型的状态消息。HTML 片段就是这条。
  3. 清掉它:POST /v8/management/routing/cooldown/reset,body 写 {"auth_index": "..."}。空值回 400,找不到回 404。8
  4. 别为这个打开 routing.cooldown.disable-cooling。它把全局冷却一起关掉,真 429 也不再记。9

sub2api:负数 max_tokens 被静默丢掉

/v1/chat/completions 收到 max_tokens: -1,转换层只处理正数,负值不进 max_output_tokens。请求于是按「没设上限」转发,回 200。10
OpenAI 对同样请求回 400 invalid_request_error。这是报障人给的对照,本刊没有在官方文档里找到负数取值的专门说明。
影响在两头。客户端把 -1 当「不限」的老习惯会静默生效,输出长度与账单都不受控;参数写错也不会有人告诉你。
负值进不去那个分支
v0.2.19 的 backend/internal/pkg/apicompat/chatcompletions_to_responses.go 第 58–78 行:第 69 行的条件是 maxTokens > 0,负值进不去,上限就不写进 max_output_tokens。11
#8460 的改法是在入口加一道校验,max_completion_tokens 优先。负数回 400,报错信息带具体字段名。12
补丁只覆盖 /v1/chat/completions,/v1/responses 的 max_output_tokens 不动;max_tokens=0 的现有行为也保持不变。13
单子 open、2 个文件 +117/−0、mergeable 是 unstable,评论只有两条 CLA 回签。
补丁没合之前,这层校验只能自己加:反代或网关层拒掉负数,或者让客户端别再把 -1 当「不限」。

v8.0.48:显式档位被换成数字预算

Antigravity 的 claude-opus-5-5-high 与 claude-sonnet-5-5-high,请求里带 thinkingLevel: "high",到上游变成 thinkingBudget: 24576。low 变 1024,medium 变 8192。14
原因在模型表。两个条目的 thinking 只有 min、max、zero_allowed、dynamic_allowed,没有 levels。
两个 Claude 5.5 条目缺 levels
v8.0.48 的 internal/registry/models/models.json 第 4086–4122 行:claude-opus-5-5-high 与 claude-sonnet-5-5-high 的 thinking 段只有四个预算字段。15
能力判定因此给的是预算档:有 min/max、没有 levels,直接判成 CapabilityBudgetOnly。16
档位就在这个分支里被 ConvertLevelToBudget 换掉,模式也从 level 改成 budget。17
对声明了 supportsAdaptiveThinking 的模型,档位与预算不是一回事。你以为在给 high,实际给的是 24576 这个上限。
#7133 目前只有报障,没补丁。报障人给了本机复现命令,也说明流式与非流式都成立,Gemini 模型不受影响。
核对方法只有一个:看请求日志里最终发出的 body,别看自己发出去的那份。

短讯:压缩检查点没被识别

OpenCode 把压缩后的对话包在 <conversation-checkpoint> 里发回来。
Responses 的 WebSocket 走 HTTP 上游时,这段被当成普通 user 消息追加到旧历史。旧输出里还挂着的 function_call 被带着重发,没有对应的 output,上游回 No tool output found for function call ...。18
#7132 给 shouldReplaceWebsocketTranscript 加了一个判定:response.create、没有 previous_response_id、输入只有 user/developer 消息、checkpoint 标签成对且 <summary> 有序。19
命中就走已有的整段替换路径。2 个文件 +396/−4,open、mergeable 是 clean。

这一轮没有版本要升

四个仓库的当前版本与发布时间20212223:
仓库当前版本发布时间(北京)
CLIProxyAPIv8.0.4810 月 30 日 22:37
sub2apiv0.2.1910 月 28 日 18:16
codex-proxyv2.1.2110 月 28 日 04:48
codex2apiv3.1.210 月 28 日 04:40
窗口内四个仓库都没有新 tag,也没有主干提交。CLIProxyAPI 的 tag、main、HEAD 是同一个提交,dev 比它多一笔,停在今天 10 点 04 分。24
sub2api 的 main 头停在 10 月 30 日 10 点 44 分。25
上游这边三处都清。OpenAI 全绿,最近一条已恢复事件是 10 月 31 日 05 点 14 分结束的搜索报错。26
Anthropic 也全绿,最近一条是 10 月 29 日凌晨的 Google Calendar 连接器故障,从 00 点 19 分到 04 点 05 分。27
Google Cloud 最新一次更新停在 10 月 28 日 08 点 38 分。28
Codex 的额度重置今天 UTC 还没发生。最近一次已验证的全局重置是 10 月 28 日 14 点 35 分,累计 61 次全局、10 次 banked,节奏约每两天一次。29
13 点 42 分有一条新帖值得存着:Codex 的负责人写「Next two days will be resets… banked」。追踪站把它记成候选,explicit_reset_claim 是 false。3031

社区:Gemini 的额度读数

窗口内 r/GeminiAI 有两条明确指向额度。12 点 07 分有人问 Argon 两天用不了,13 点 18 分有人说 flash 12 条就把整个份额吃光。3233
临近窗口起点还有一条 11 点 59 分的:Pro 用户在 task 模式用 Argon,分析到第 17 只股票时撞了日限额。34
这些读数互相打架。今天凌晨 3 点 23 分有人写 Argon 两三轮就撞周限额35,凌晨 4 点 56 分另一个人写 Argon 完全不扣额度36。
三条新帖都只是自述,没有官方口径。要把它们当阈值之前,先看自己账号 /v1beta/models 返回里的 quotaInfo。

未闭合

#7134 会不会被合、合了要等哪个 tag;#8460 会不会被接,/v1/responses 上的负数上限有没有同样问题(本刊没核)。
#7133 什么时候给两个条目补上 levels。上游那句「未来两天」会在哪一天兑成能观测到的重置。

References

  1. 1
    CLIProxyAPI PR #7134

    github.com

  2. 2
    v8.0.48 codex_executor_terminal.go 第 313–333 行

    github.com

  3. 3
    v8.0.48 auth/errors.go 第 233–242 行

    github.com

  4. 4
    v8.0.48 conductor_cooldown.go 第 1044–1052 行

    github.com

  5. 5
    v8.0.48 conductor_cooldown.go 第 3015–3030 行

    github.com

  6. 6
    v8.0.48 conductor_cooldown.go 第 1096–1112 行

    github.com

  7. 7
    PR #7134 全量补丁

    patch-diff.githubusercontent.com

  8. 8
    v8.0.48 server_management_v8.go 第 32 行与 management/quota.go 第 28–44 行

    github.com

  9. 9
    v8.0.48 config.example.yaml 第 220–227 行

    github.com

  10. 10
    sub2api issue #8458

    github.com

  11. 11
    v0.2.19 chatcompletions_to_responses.go 第 58–78 行

    github.com

  12. 12
    sub2api PR #8460

    github.com

  13. 13
    PR #8460 全量补丁

    patch-diff.githubusercontent.com

  14. 14
    CLIProxyAPI issue #7133

    github.com

  15. 15
    v8.0.48 models.json 第 4086–4122 行

    github.com

  16. 16
    v8.0.48 thinking/convert.go 第 162–183 行

    github.com

  17. 17
    v8.0.48 thinking/validate.go 第 86–101 行

    github.com

  18. 18
    CLIProxyAPI PR #7132

    github.com

  19. 19
    PR #7132 全量补丁

    patch-diff.githubusercontent.com

  20. 20
    CLIProxyAPI Releases

    github.com

  21. 21
    sub2api Releases

    github.com

  22. 22
    codex-proxy Releases

    github.com

  23. 23
    codex2api Releases

    github.com

  24. 24
    CLIProxyAPI dev 提交时间轴

    github.com

  25. 25
    sub2api main 提交时间轴

    github.com

  26. 26
    status.openai.com summary

    status.openai.com

  27. 27
    status.anthropic.com incidents

    status.anthropic.com

  28. 28
    Google Cloud Status incidents

    status.cloud.google.com

  29. 29
    codex-reset.com

    codex-reset.com

  30. 30
    codex-reset.com feed

    codex-reset.com

  31. 31
    @thsottiaux 2026-10-31

    x.com

  32. 32
    r/GeminiAI Argon 不可用

    reddit.com

  33. 33
    r/GeminiAI flash 吃额度

    reddit.com

  34. 34
    r/GeminiAI 撞日限额

    reddit.com

  35. 35
    r/GeminiAI 撞周限额

    reddit.com

  36. 36
    r/GeminiAI 不扣额度

    reddit.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

  • 一页 HTML 403,被记成凭证拒绝
  • 三条判据
  • 代码走的是哪一步
  • 补丁给的东西
  • 今晚能做的四件
  • sub2api:负数 max_tokens 被静默丢掉
  • v8.0.48:显式档位被换成数字预算
  • 短讯:压缩检查点没被识别
  • 这一轮没有版本要升
  • 社区:Gemini 的额度读数
  • 未闭合