Codex · 自助修复

一直「正在重新连接 N/5」
是怎么回事,怎么修

这份文档主要是写给 AI 看的。你不用自己动手改配置 —— 把里面那段话复制给 Codex 或 Claude Code,它会替你查、替你改、替你验证。当然,想自己动手的话,下面也有手动版。

发布于 2026-08-05

先确认是不是这个问题

界面上反复出现这样的提示,然后卡住不出结果:

📶 正在重新连接 2/5   (英文界面:Reconnecting 2/5)

数字会从 1/5 一路涨到 5/5。有时候等一等自己好了,有时候直接失败。这不是你电脑的问题,也不是你哪里配错了 —— 是 Codex 新版本的默认行为在国内网络下水土不服,遇到的人相当多。

✦把下面这段复制给 AI

打开 Codex 或 Claude Code,整段粘贴进去发送即可。它包含完整的排查与修复步骤,AI 会自己执行。

我在用 Codex 时经常出现「正在重新连接 N/5」(英文 Reconnecting N/5),请帮我修复这个问题。 【已知成因】 Codex 0.136 版本以后,默认使用 WebSocket 与 OpenAI 通信(请求头 OpenAI-Beta: responses_websockets)。在中国大陆经代理上网时,WebSocket 的 Upgrade 握手和长连接非常容易被打断。Codex 遇到失败会先重试 stream_max_retries 次(默认就是 5 次),全部用完才降级回传统的 HTTP/SSE。这段重试期间,界面显示的就是「正在重新连接 N/5」。 修复思路:在 ~/.codex/config.toml 里定义一个关闭了 WebSocket 的 model provider,让 Codex 一开始就走 HTTP/SSE,不再空耗那 5 轮重试。 【请按以下步骤操作】 第 1 步:确认环境是否适用 - 运行 `codex --version`,确认版本 >= 0.136.0。如果更低,先升级(brew upgrade codex,或 npm install -g @openai/codex),升级后再继续。 - 读取 ~/.codex/config.toml,检查 preferred_auth_method 的值。 · 如果是 "chatgpt"(用 ChatGPT 账号登录),继续往下做。 · 如果我用的是 API Key、或者第三方中转站(config 里有自定义 base_url 指向别的域名),请停下来告诉我,本方案的 base_url 需要换成我自己的中转地址,不能直接套用。 第 2 步:备份配置 cp ~/.codex/config.toml ~/.codex/config.toml.bak-$(date +%F-%H%M) 第 3 步:修改 ~/.codex/config.toml (a) 在文件【最顶部】加一行(必须放在任何 [xxx] 段落之前,这是 TOML 的语法要求,放错位置会导致解析失败): model_provider = "chatgpt-http" 如果文件里已经存在 model_provider = "...",把它的值改成 "chatgpt-http" 就行,不要重复添加。 (b) 在文件【最末尾】追加: [model_providers.chatgpt-http] name = "ChatGPT HTTP" base_url = "https://chatgpt.com/backend-api/codex" wire_api = "responses" requires_openai_auth = true supports_websockets = false stream_max_retries = 10 stream_idle_timeout_ms = 600000 request_max_retries = 6 如果已经存在同名的 [model_providers.chatgpt-http] 段落,就地更新它,不要再加一个重复的。 ⚠️ base_url 必须是 https://chatgpt.com/backend-api/codex 网上有些教程写成 https://api.openai.com/v1 —— 那会让 Codex 改走 API Key 按量计费,不再走我的 ChatGPT 订阅额度。千万不要用那个地址。 第 4 步:校验语法没写坏 python3 -c "import tomllib,pathlib;d=tomllib.loads(pathlib.Path.home().joinpath('.codex/config.toml').read_text());print('TOML OK');print('model_provider =',d.get('model_provider'));print(d['model_providers']['chatgpt-http'])" 第 5 步:验证 - 完全退出 Codex:桌面版要彻底退出 App(⌘Q),命令行版要退出当前会话。 - 重新打开,跑一个需要思考一会儿的任务,观察是否还出现「正在重新连接」。 【出错处理】 任何一步报错,请把完整报错原文告诉我,不要跳过、不要猜测着继续往下做。 如果第 5 步验证时报的是「Your access token could not be refreshed / refresh token was already used」,那是另一个独立问题(登录凭证过期),需要我重新执行 codex login,请直接告诉我。

?为什么会这样

Codex 0.136 之后换了通信方式:默认用 WebSocket 而不是过去的 HTTP/SSE。WebSocket 是一种「一直挂着不断开」的连接,速度更快,但也更脆弱 —— 在国内经代理上网时,这种长连接很容易被中途掐断。

Codex 遇到掐断不会立刻放弃,而是先重试 5 次(这就是 N/5 里那个 5 的来历),5 次都不行才退回稳妥的 HTTP/SSE。所以你看到的「正在重新连接 2/5」,翻译成人话就是:

「WebSocket 又断了,我正在第 2 次重试,再失败 3 次我就改用老办法。」 问题在于这 5 轮重试每次都要等超时,白白浪费掉几十秒,而且下一轮对话又会从头来一遍。

所以修复方式不是让 WebSocket 变稳定(国内的网络环境我们改不了),而是直接告诉 Codex 别用 WebSocket 了,一开始就走 HTTP/SSE。配置里那句 supports_websockets = false 就是干这个的。

其余几个参数是顺带加固:stream_idle_timeout_ms = 600000 把流的空闲超时从默认 5 分钟放宽到 10 分钟(长思考任务容易踩到),stream_max_retries 和 request_max_retries 让偶发抖动更扛得住。

✎不想用 AI,自己动手

三步,五分钟。

  1. 备份。终端里执行:
    cp ~/.codex/config.toml ~/.codex/config.toml.bak-$(date +%F-%H%M)
  2. 用编辑器打开 ~/.codex/config.toml,在最顶上加这一行(一定要在所有 [方括号] 段落的前面):
    model_provider = "chatgpt-http"
  3. 拉到文件最底下,把这段整个粘贴进去:
    [model_providers.chatgpt-http]
    name = "ChatGPT HTTP"
    base_url = "https://chatgpt.com/backend-api/codex"
    wire_api = "responses"
    requires_openai_auth = true
    supports_websockets = false
    stream_max_retries = 10
    stream_idle_timeout_ms = 600000
    request_max_retries = 6

存盘,彻底退出 Codex 再重开就生效了。

⚠️ 两个最容易踩的坑 ① model_provider = "chatgpt-http" 必须放在文件最顶部。TOML 规定:不带方括号的普通设置,必须写在所有 [段落] 之前,放到中间会直接报语法错。
② base_url 只能是 https://chatgpt.com/backend-api/codex。流传较广的一个版本写的是 api.openai.com/v1,用了会变成按 API Key 计费,不再走 ChatGPT 订阅额度。

✓怎么确认修好了

彻底退出 Codex 后重开,随便让它做个稍微费点脑子的活(比如「读一下这个项目结构并总结」)。观察:

修好了的表现 整个过程不再出现「正在重新连接」字样,任务从开始到出结果是连贯的。

也可以跑一条命令确认配置真的被读进去了:

python3 -c "import tomllib,pathlib;d=tomllib.loads(pathlib.Path.home().joinpath('.codex/config.toml').read_text());print('TOML OK');print('model_provider =',d.get('model_provider'));print(d['model_providers']['chatgpt-http'])"

!改完还是不行?对号入座

你看到的报错说明与处理
access token could not be refreshed / refresh token was already used 另一个独立问题:登录凭证过期了。跟 WebSocket 无关。执行 codex login 重新登录。常见于桌面版和命令行版同时在用、互相抢着刷新凭证的情况。
登录时被要求填手机号(add-phone) 出口 IP 触发了风控。先在浏览器里登录 chatgpt.com 确认是登录态,再跑 codex login,通常会直接放行。还不行就换一个代理节点再试 —— 机房 IP 比家宽 IP 更容易被要求验证。另外 OpenAI 至今不接受 +86 中国大陆号码,别在下拉框里找中国。
TOML 解析失败 / 启动就报配置错 八成是 model_provider 那行没放在文件最顶部。挪到所有 [方括号] 段落之前即可。实在改乱了就用备份还原(见下)。
改完没有任何变化 确认是否彻底退出了 Codex。桌面版关窗口不算,要 ⌘Q 完全退出。另外确认 codex --version 不低于 0.136.0。
提示要按 API 计费 / 额度不对 检查 base_url 是不是被写成了 api.openai.com/v1。必须是 https://chatgpt.com/backend-api/codex。

怎么还原

改坏了不用慌,备份就在旁边(把日期换成你实际的文件名):

ls ~/.codex/config.toml.bak-*
cp ~/.codex/config.toml.bak-2026-08-05-1749 ~/.codex/config.toml

或者更简单:把加进去的那一行 model_provider = "chatgpt-http" 和末尾整个 [model_providers.chatgpt-http] 段落删掉,就回到原样了。

chengbei.org · 2026-08-05