
CLIProxyAPI 三张修 Codex WebSocket 的补丁在凌晨被作者重推、至今未合,v8.0.44 里三处缺口原样在:握手断一次就没了第二次机会、上游掉线会把下游一起关掉、Home 下答完的一轮会被换连接重发;这篇给出「你的凭证开没开 websockets」的自查、三处缺口各自的触发与观察信号,以及今晚可选的三档处置。
previous_response_id 接着聊,客户端会收到 1012,连接被关掉。
sdk/cliproxy/auth/selector.go 第 411–443 行:先看凭证 Attributes,再看 Metadata,两处都没有就返回 false——这就是「默认不走原生 WebSocket」的出处3。 generate 删掉4。下面三处缺口与这条路径无关。DialContext,整段没有任何循环7。
internal/runtime/executor/codex_websockets_connection.go 第 26–55 行:30 秒预算写在常量里,dialCodexWebsocket 只调用一次 DialContext,失败即返回8。 io.EOF 或 io.ErrUnexpectedEOF 时重试,上游回了 HTTP 状态码就停手9。response.create。
internal/runtime/executor/codex_websockets_session.go 第 846–892 行:清理连接后第 881 行通知下游,第 889 行结束这一轮的 lifecycle,两步之间没有条件判断13。 
sdk/api/handlers/openai/openai_responses_websocket.go 第 194–224 行:closeForUpstreamDisconnect 在错误不需要外露时直接走 closeWithoutError,也就是第 159 行那个不带关闭帧的 conn.Close()14。 upstream_websocket_lost(带 error.event_id),下一次 create 才懒重连,previous_response_id 与 response.append 改回 40915。补丁落地后,这条路径上的 1006 会变成一条 502 错误帧。response.create 换新连接重发。dispatch=2 creates=2 dials=2:一次请求,两次派发、两次 create、两条上游连接16。上游看到两次 create,额度多半也按两次走。previous_response_not_found,新的 create 仍按钉住的凭证派18。websockets 关掉,回到 HTTP 重放。代价是原生 WebSocket 用不了;全双工的开关 client.codex.response-steering 本来默认就关着,多数部署损失有限22。previous_response_id 续接同一条连接;ID 续接在 Home 下正好踩着 1012。stream closed before response.completed 是上游没发完就断了。补丁落地后 1006 会变成 502 的 upstream_websocket_lost,到那时才能量出自己中过多少次。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
patch-diff.githubusercontent.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.