
CLIProxyAPI v8.0.44 把下游响应压缩与 Codex WebSocket 压缩都设成默认开启,11 张跟踪单在发版前一分钟结清;这篇给出三个键、各自的生效边界,以及那条仍被误判成额度耗尽的 429 今晚怎么绕。
Codex is at capacity 这类 429 仍被本地当成额度耗尽,这一版没有动它。server.response-compression 只有两个键:enabled 默认 true,min-bytes 默认 1024。3代码里 IsEnabled() 在 Enabled 为 nil 时返回真,EffectiveMinBytes() 在小于等于 0 时回落 1024。4Accept-Encoding 里声明了 zstd 或 gzip。同 q 值服务器优先 zstd,其次 gzip。Upgrade: websocket 并直通。text/*、application/json、+json 结尾、javascript、svg+xml。
internal/api/response_compression.go 第 269–300 行:第 285 行把 text/event-stream 记成 streaming,第 286 行起的 min-bytes 与 Content-Length 两道门槛都只在这个分支之外执行。5GET /v8/management/credentials 这类返回同样会被压。6Vary: Accept-Encoding,且压缩后删掉 Content-Length、改走分块。前置 nginx 若自己开过 gzip,看到已有 Content-Encoding 不会再压一次。
config.example.yaml 第 37–44 行:注释写明「包括 SSE 流」、「只在客户端声明 zstd 或 gzip 时压」、「WebSocket 升级永不包裹」,与代码里的三道判断一致。3upstream.codex.websocket-compression 默认 true,对 Codex 的 WebSocket 上下行开 permessage-deflate。7upgrader.EnableCompression,也就是升级响应根本没有压缩;上行那边是读压缩开着、写压缩被硬关。8WebsocketCompressionEnabled() 调 EnableWriteCompression,级别用 flate 的默认档。9下行则由 upgrader 的 EnableCompression 决定,值来自同一个开关。10Codex.WebsocketCompressionEnabled()。11设成 false,两条一起关。
config.example.yaml 第 355–368 行:上行请求体压缩默认 false、其大小门槛 1024、WebSocket 压缩默认 true,逐条写在注释里。7upstream.codex.upstream-request-compression 是 false,作用域窄得出奇:只对 OAuth 凭证、且目标主机是 chatgpt.com、路径以 /backend-api/codex/ 开头、body 不小于 1024 字节、压完确实更小,才换成 zstd 发出去。API key、自定义 base-url、SIWC 一律不压。12| 单号 | 改的对象 | 落地提交 | 对运维的意义 |
|---|---|---|---|
| #7008 | interactions 顶层裸内容块丢图片 | 37bd18b0 | 裸块数组写的调用方不再静默丢图 |
| #7005 | Gemini 截断的 200 流触发 60 秒冷却 | aa4130e6 | 少一个结束帧不再牵连凭证 |
| #7000 | Antigravity 上 Claude 5.5 强制 tool_choice 报 400 | 1d45a5f3 | 工具选择改走兼容路径 |
| #7003 | interactions 流正常收尾后不发 [DONE] | ede07caf | 严格客户端不再等超时 |
| #6998 | 请求拦截器全文编码与复制开销 | 6fe654bf | 插件侧每 chunk 的 body 可省 |
| #6999 | CORS 预检显式放行 Authorization | 058b803b | 严格 non-wildcard 规则下浏览器能带凭证 |
| #6994 | Codex commentary 在转 Claude thinking 后丢失 | 531721bf | 多轮历史不再掉段 |
| #6991 | Claude 转 OpenAI chat 时 thinking_tokens 没映射 | 43f5386b | 记账里的 reasoning 归位 |
| #6905 | 跨部署重复浪费 Codex 带宽(enhancement) | 064e008b | 就是上面两条压缩的由来 |
| #6988 | 调度与用量记录共享同一个 selection ID | e5321f53 | 插件账目能对上号 |
| #6987 | 首个流读取把取消记成成功 | 712e4970 | 内部流取消不再算成功 |
request_interceptor_omit_body_before 与 request_interceptor_omit_body_after)。声明了的插件从此不再付 body 克隆、Base64 编码与跨 ABI 拷贝的成本,没声明的照旧。15discovery.advertise-management 这个字段还在,但已被忽略——注释写明保留它只是为了让旧配置文件仍然能加载。16txtvers、path、tls、auth、protocols、auth_type、product、id、role。旧的 version、auth_required、api_openai 这类键仍能被读取,所以老网关不会从邻居列表里消失。17gpt-6.1-sol,形态固定:HTTP 429
Retry-After: 8–515
{"error":{"type":"rate_limit_error","code":"turn_rate_limit_exceeded",
"message":"Codex is at capacity, please try again later"}}gpt-6-astra 不受影响。18isCodexUsageLimitError 只认 error.type == usage_limit_reached。注释还专门写了 rate_limit_error 有意排除、应当重试。19isCodexModelCapacityError 要求文案里同时出现 model 与 at capacity。Codex is at capacity 里没有 model,落空。20Auth.Quota.Reason 写成 quota、StatusMessage 写 quota exhausted,冷却按 1 秒起翻倍、10 秒下限、30 分钟封顶。2122parseCodexRetryAfter 只从响应体的 resets_at 与 resets_in_seconds 取恢复时刻,而且同样要求 usage_limit_reached。上游这次给的 Retry-After 头,在这条路上从头到尾没被读过。23
internal/runtime/executor/codex_executor_terminal.go 第 378–422 行:上一个是容量判定,第 395 行要求 model 与 at capacity 同时出现;下一个是额度判定,第 417 行只等 usage_limit_reached。两处都不命中,这个 429 才会掉进通用分支。20
sdk/cliproxy/auth/conductor_cooldown.go 第 2777–2797 行:case 429 先写 quota exhausted 与 Reason: "quota",再在没有 retryAfter 时走 quotaCooldownAfterFailure 的退避阶梯。下一行 case 408, 500, 502… 才是那批瞬时错误。21auth unavailable: ... in cooldown: [... reason=quota ...];如果所有候选都在冷却,客户端拿到的是模型冷却 429,带一个 Retry-After 和 reset_seconds,而 Codex CLI 会按秒级节奏重试,很快把重试预算烧完,最后给用户一句没有恢复时刻的「到限额了」。1824request-retry: 0 / max-retry-interval: 0」,与示例配置不符。v8.0.37、v8.0.43、v8.0.44 三个版本的示例文件里都是 request-retry: 3 与 max-retry-interval: 30。25routing.retry 整段省掉的配置才等于 0,他的实例大概属于这种。request_retry(按凭证覆盖,0 关闭、负数继承全局),再把全局 max-retry-interval 提到能覆盖中位值——报障人用的是 600,代价是客户端最长被挂几分钟。1826gpt-6.1-sol 从这张账号的可用模型里摘掉,等上游恢复。routing.cooldown.disable-cooling 全局关冷却来绕。它连真正的额度耗尽一起关掉,等于把「凭证被限」这件事从系统里抹掉。1f917e77。1zstd。不认的话要么别让客户端声明它,要么升级后把 server.response-compression.enabled 设成 false。min-bytes 管不到它。Codex is at capacity 的 429,别只看 429 本身:日志里搜 reason=quota,确认是不是被误判;然后按模型摘除或调重试参数,别全局关冷却。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.claude.com
status.cloud.google.com
codex-reset.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.