blog

Welcome to my blog!

Codex 每次启动都卡在 Reconnecting?可能是 WebSocket 没走代理

ab's Avatar 2026-07-07 Bug

  1. 1. Codex 每次启动都卡在 Reconnecting?可能是 WebSocket 没走代理
    1. 1.1. 现象
    2. 1.2. 为什么会这样
    3. 1.3. 方案一:禁用 WebSocket,强制走 HTTP
      1. 1.3.1. 这个方案的副作用
    4. 1.4. 方案二:配置 .env,让 WebSocket 也能走代理
    5. 1.5. 方案三:开启代理软件的 TUN 模式
    6. 1.6. 建议排查顺序
    7. 1.7. 小结

Codex 每次启动都卡在 Reconnecting?可能是 WebSocket 没走代理

最近折腾 Codex 的时候,遇到一个很烦人的现象:

1
2
3
4
5
Reconnecting... 1/5
Reconnecting... 2/5
Reconnecting... 3/5
Reconnecting... 4/5
Reconnecting... 5/5

最迷惑的是,它最后并不是完全不能用。

前面会卡住一会儿,反复重连。等你开始怀疑账号、模型、网络、客户端是不是哪里坏了,它又突然正常开始回答。

这种问题最难受的地方就在这里:不是彻底失败,而是每次都要先罚站一会儿。

现象

典型表现一般是:

  • 打开 Codex 后,第一次提问或者等待模型响应时,会出现多次 Reconnecting...
  • 通常会重试 5 次
  • 每次重试中间都会卡一段时间
  • 重试结束后,Codex 又能继续工作

所以它很容易误导排查方向,让人以为是:

  • 模型响应慢
  • 账号异常
  • OpenAI 服务不稳定
  • Codex 客户端出问题
  • 代理软件没开好

但很多时候,真正的问题可能是:WebSocket 没有正常走代理

为什么会这样

Codex 默认会优先尝试使用 WebSocket,也就是 WSS 协议,和服务器建立实时连接。

如果 WebSocket 连接成功,体验会更实时。但在一些代理环境里,尤其是终端环境、Windows 代理、Clash、v2rayN 这类组合下,可能会出现一种情况:

HTTP / HTTPS 请求能正常走代理,但 WebSocket 不一定能正常走代理。

于是流程就变成了这样:

1
2
3
4
5
6
7
先尝试 WebSocket
失败
继续重试
连续失败几次
放弃 WebSocket
回退到普通 HTTP 请求
突然又能用了

所以我们看到的现象就是:前面一直 Reconnecting,后面又恢复正常。

这不一定是账号突然好了,也不一定是模型突然变快了,而是 Codex 最后回退到了 HTTP。

方案一:禁用 WebSocket,强制走 HTTP

如果只是想快速解决这个问题,可以直接让 Codex 不再优先尝试 WebSocket。

打开 Codex 配置文件:

macOS / Linux:

1
~/.codex/config.toml

Windows:

1
C:\Users\你的用户名\.codex\config.toml

在配置文件里添加或修改:

1
model_provider = "openai_http"

然后在文件末尾添加:

1
2
3
4
[model_providers.openai_http]
name = "OpenAI HTTP only"
wire_api = "responses"
supports_websockets = false

保存之后,重启 Codex。

这段配置的意思很简单:新建一个只走 HTTP 的 provider,并明确告诉 Codex 不要使用 WebSocket。

如果问题确实出在 WebSocket 代理上,重启后一般就不会再出现开头那一串重连了。

这个方案的副作用

需要注意一点:Codex 的历史会话可能会按 provider 分组。

从默认 provider 切换到 openai_http 后,原来 provider 下的部分历史会话可能暂时看不到。

这不一定代表历史记录丢了,只是 provider 变了,显示分组也跟着变了。如果后面想恢复,把配置改回去即可。

方案二:配置 .env,让 WebSocket 也能走代理

如果想保留 Codex 默认连接方式,可以显式告诉 Codex 代理地址在哪里。

在 Codex 配置目录下创建 .env 文件:

macOS / Linux:

1
~/.codex/.env

Windows:

1
C:\Users\你的用户名\.codex\.env

Windows 用户要注意,文件名必须是 .env,不是 .env.txt。如果系统隐藏了文件后缀,很容易看起来叫 .env,实际却是 .env.txt

.env 内容可以这样写:

1
2
3
HTTP_PROXY="http://127.0.0.1:你的代理端口"
HTTPS_PROXY="http://127.0.0.1:你的代理端口"
NO_PROXY="localhost,127.0.0.1,::1"

比如 Clash 常见端口是 7890

1
2
3
HTTP_PROXY="http://127.0.0.1:7890"
HTTPS_PROXY="http://127.0.0.1:7890"
NO_PROXY="localhost,127.0.0.1,::1"

v2rayN 常见端口可能是 10808

1
2
3
HTTP_PROXY="http://127.0.0.1:10808"
HTTPS_PROXY="http://127.0.0.1:10808"
NO_PROXY="localhost,127.0.0.1,::1"

端口不要照抄,一定要以自己代理软件里显示的 HTTP 代理端口为准。

配置好之后,重启 Codex 再试。

这个方案的思路不是禁用 WebSocket,而是让 Codex 启动时就拿到代理环境变量,这样 WebSocket 握手也有机会正常走代理。

方案三:开启代理软件的 TUN 模式

还有一个更彻底的办法,是在代理软件里开启 TUN 模式。

TUN 模式不是只代理某个终端,也不是只靠环境变量,而是从虚拟网卡层面接管系统流量。理论上,Codex 的 WebSocket、HTTPS 以及其他请求,都更容易被代理软件接住。

但我不建议一上来就开 TUN。

它的影响范围比较大,可能会影响:

  • 其他软件联网
  • 公司内网访问
  • 本地开发服务
  • 局域网设备访问
  • 某些 App 的网络行为

也就是说,Codex 可能好了,别的软件又开始出问题。

所以 TUN 更适合作为兜底方案:前两个方案都不行,再考虑它。

建议排查顺序

如果只是想最快恢复使用:

  1. 先用方案一,禁用 WebSocket,强制 Codex 走 HTTP。
  2. 如果想保留默认连接方式,再用方案二,给 Codex 配好代理环境变量。
  3. 如果前两个都不行,再考虑 TUN 模式。

我的倾向是:先用 openai_http 快速验证问题是不是 WebSocket,再决定要不要回头把代理环境变量配完整。

小结

如果 Codex 每次启动或首次响应时都出现:

1
2
3
4
5
Reconnecting... 1/5
Reconnecting... 2/5
Reconnecting... 3/5
Reconnecting... 4/5
Reconnecting... 5/5

但最后又能正常回答,那它大概率不是账号问题,也不是模型问题。

更常见的原因是:

1
WebSocket 没有正常走代理

处理思路也就两条:

  • 要么禁用 WebSocket,直接走 HTTP
  • 要么把代理环境变量配好,让 WebSocket 也能走代理

能用 openai_http 解决的,就先别把问题想复杂。网络问题有时候就是这么朴素,但它折磨人的方式一点也不朴素。

本文最后更新于 天前,文中所描述的信息可能已发生改变
Perfect Night
LE SSERAFIM