
上游从 10 月 18 日起给 reasoning 项带上 encrypted_content,CLIProxyAPI 的 overload 换号因此失效,一周 1197 次拒绝全成截断的 200;这篇给出取证办法、三条处置路径和今晚该改的键。
upstream.codex.stream-bootstrap-buffering,这条保护从 10 月 18 日起就没有在工作。response.output_item.added 带上 encrypted_content。代理把这帧读成「模型已经开始产出」,随即把流交给客户端。server_is_overloaded 因此绕着换号逻辑过去了,落到客户端那片已经开始的 200 流里,变成一次半途断流。1server_is_overloaded 帧的 sequence_number 把两周的日志切成两段。变化点在 10 月 18 日,那天他的实例还停在 v8.0.26,所以这是一次上游改动,发生在一周之前。1| 期间 | 落在第 2 帧 | 落在第 3 帧 | 落在第 4 帧及以后 |
|---|---|---|---|
| 10-11 至 10-14 | 3,092 | 265 | 24 |
| 10-18 至 10-21 | 0 | 1,192 | 5 |
response.output_item.added。拒绝落在第 3 帧,意思是它会晚一帧才到,而那一帧已经在缓冲之外。logs_2.sqlite 里 232 条「stream closed before response.completed」警告,有 216 条落在代理 server_is_overloaded 行之后的 15 秒内。server_is_overloaded 塞在一条 HTTP 200 的流里送回来,而不在线上回 503;把开头的帧按住,下游响应头就没提交,代理还来得及换一张凭证重试。4*.added。名单之外的帧一律放行,注释里给了理由——认不出的帧可能已经在上游产生了副作用,按住它再换号就等于把副作用重放一遍。5
internal/runtime/executor/codex_executor_terminal.go 第 528–556 行,CLIProxyAPI v8.0.38,截于 2026-10-22 09:24(北京)。第 542–544 行是这次失效的入口。.added 帧上带的 encrypted_content 是一段约 1,336 字符的不透明状态,客户端还没看到任何东西。作者的说法是:按住这帧再换号,不会重放任何可见或产生副作用的内容,与空 reasoning 项没有区别。1
internal/runtime/executor/codex_executor_stream.go 第 305–340 行,CLIProxyAPI v8.0.38。第 334–339 行是流被提交的那三行。stream-bootstrap-timeout 到了时间上限。7 你现在撞上的是名单判据,预算还没轮到。encrypted_content 早退,把「只有 encrypted_content 的 reasoning」从放行名单挪进持有名单,保留「有 encrypted_content 且 summary 非空」的放行,再加 SSE 与 websocket 两个用例。2TestIsCodexBootstrapBufferableEvent 一起失败;打上之后通过,./internal/runtime/executor/...、./sdk/api/handlers/...、./sdk/cliproxy/auth/... 三组测试都过。service_unavailable_error 不在专门的名单里,落进默认分支,成为 502。9503 | 3ms,响应体里 error.code 是通用的 internal_server_error。11upstream.codex.stream-bootstrap-buffering 是不是 true。它在 upstream: 下面的 codex: 段里,v8 之前的老写法 codex.stream-bootstrap-buffering 会迁到同一个位置,默认 false。13bootstrap overload rejection 那一行(缓冲期命中拒绝时打的 debug 日志,后半句是 failing over,日志级别要开到 debug 才看得到)。6server_is_overloaded 仍有,那就对上了。用 sequence_number 再核一遍更稳:分布落在第 3 帧就是这次的问题。routing.cooldown.transient-error-cooldown-seconds 设成负数,瞬时冷却就彻底关掉;设成 15 这类小值,冷却从 60 秒缩到 15 秒。1014 这条只管冷却时长,坏凭证被重新选中的间隔会变短,代价按你的池子掂量。sequence_number 计数;毫秒级的 503 单独算一类,那是本地拒绝,记在上游错误里会把容量账算歪。fix(auth): track Vertex service account identity,把 Vertex 的 service account 与 project 变化纳入 CredentialsChanged 判定。整单现在 4 笔提交、4 个文件、+482,状态 open、可合并、未合并。15credential_quota 这一种冷却会被搬回,其余运行状态照抄快照。16
sdk/cliproxy/auth/conductor_lifecycle.go 第 396–419 行,CLIProxyAPI v8.0.38。第 407–418 行是唯一一段「把旧冷却搬回来」的代码。backend/go.mod 已经要求 go 1.27.3,而镜像默认还是 1.27.2,不带 --build-arg 从 main 构建会在编译阶段停下。18 现在 Dockerfile 已是 1.27.3;手里还是旧代码的,构建时加 --build-arg GOLANG_IMAGE=golang:1.27.3-alpine。stream-bootstrap-buffering 开没开。开着,就把「overload 会自动换号」这句从你的容量预案里删掉,直到补丁进版本。server_is_overloaded 帧的 sequence_number。落在第 3 帧的占多数,就是这一条,动手打补丁或把 transient-error-cooldown-seconds 调小。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.anthropic.com
status.cloud.google.com
codex-reset.com
opentherank.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.