
CLIProxyAPI v8.0.45 里,Codex 凭据的 websockets: true 只在下游本身是 websocket 时才生效;走 HTTP 的客户端每题多花 0.5 秒,今天没有配置项能绕开。
websockets: true。在 v8.0.45 里,这个开关只在下游本身是 websocket 时才被读到;Claude Code 打 /v1/messages、以及任何走 HTTP 的 /v1/responses,都会落到每请求新建连接的 HTTP 执行器。CodexAutoExecutor 的 Execute 和 ExecuteStream 各写了一遍同一个判断:DownstreamWebsocket(ctx) && codexWebsocketsEnabled(auth)。两处分别在 v8.0.45 的第 78 行与第 91 行。两个条件同时成立,请求才被交给 websocket 执行器。3
codex_websockets_executor.go 第 74–98 行:Execute(第 78 行)与 ExecuteStream(第 91 行)用的是同一个双条件,条件不成立就落到第 84 行与第 97 行的 httpExec。Attributes["websockets"],再看 Metadata["websockets"],解析不出来就当假(第 142 行起)。/v1/responses 的升级处理(第 831 行),以及 Realtime 的直连与 sideband 两条 WS 路径。45
openai_responses_websocket.go 第 826–836 行:WithDownstreamWebsocket 紧接在 GetContextWithCancel 之后被调用(第 831 行),HTTP 进来的请求走不到这里。websockets: true 也改不了这个结果。这个开关决定的是上游那一跳用不用 WS,前提是下游本来就是 WS。NewUtlsHTTPClient 在 Codex 侧每次执行都调一次:codex_executor_execute.go 第 122 与第 310 行、codex_executor_stream.go 第 130 行各有一处。6NewClientConn 现开(第 131 行),响应体读完跟着关(第 168 行)。
helps/utls_client.go 第 443–452 行:第 447 行 Chrome / ChatGPT 档每次新建 newUtlsRoundTripper,第 448 行 Anthropic 档取的是按代理地址缓存的 cachedClaudeCodeRoundTripper。同一次调用里,两条路的连接寿命不一样。7| 路径 | 慢网(10 月 22 日原始) | 快网(10 月 28 日复测) |
|---|---|---|
| 官方 Codex CLI 0.163,持久 websocket | 1.7 秒 | 2.0 秒 |
Codex CLI → 中转,websocket(凭据 websockets: true) | 1.8 秒 | 1.9 秒 |
| Codex CLI → 中转,HTTP | 2.7 秒 | 2.5 秒 |
websockets: true 时,让 HTTP 下游也走 websocket 执行器,按执行会话分组。这条提案不改任何默认行为。/v1/messages,或者走 HTTP 的 /v1/responses,都落在 HTTP 执行器这一侧。/v1/responses WS 入口、凭据保持 websockets: true,量到的就是 1.9 到 2.0 秒那一档;Claude Code 走 /v1/messages 的没有这条路。websockets 字段容易误读。GET /v8/management/credentials 每条记录带的 websockets(第 784 行)只反映凭据允许用上游 websocket,哪条请求真走了 WS 要看下游协议。8
config.example.yaml 第 706–730 行:第 712 行 Codex 凭据的 websockets 注释没有写下游限制;第 721–728 行同屏给出 disable-cooling 与 request-scoped-errors(action: "stop")的写法,下节处置要用。| PR | 状态 | 提交与改动(截至 13:05) | 在 v8.0.45 里 | 今天按什么行为配 |
|---|---|---|---|---|
| #7019 | open,base dev,mergeable clean | 7 笔提交,4 文件 +649 / −10 | 不含 | disable-cooling 会让 model_not_found 的 12 小时冷却清零,坏凭据被反复选中 11 |
| #7041 | open,base dev,分支叠着 #7019 | 15 笔提交,6 文件 +1021 / −15 | 不含 | 每轮换 X-Session-ID 的客户端仍会 miss 会话亲和 12 |
conductor_cooldown.go 第 1052–1060 行:命中 model_not_found 时,disable-cooling 为真就把 NextRetryAfter 清零,为假才给 12 小时。13 判据本身从第 2426 行起:状态码 400、404、422,加上响应文案命中模型不存在。disable-cooling,可以给这把 key 配 request-scoped-errors,把 404 和你自己上游那句模型不存在的文案归成 stop。stop 走请求级错误,不换号也不进凭证冷却。14github.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.claude.com
x.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.