使用 VPN 时 OpenAI Codex 报错「stream disconnected before completion」怎么办?
如果你在连接 VPN 的情况下使用 OpenAI Codex(命令行工具),可能会遇到类似下面的报错, 导致任务中断、代码审查跑不完:
■ stream disconnected before completion: error sending request for url
(https://chatgpt.com/backend-api/codex/responses)或者在重试若干次后失败:
Reconnecting... 1/5 (stream disconnected before completion ...)
Reconnecting... 2/5 ...
...
Falling back from WebSockets to HTTPS transport.这篇文章解释原因,并给出在 Windows 和 macOS 上的完整解决方法。
一句话结论
如果你使用 ZibVPN 1.4.0 或更新版本,请优先在客户端中将协议锁定为 VLESS。这样连接期间不会再由自动协议切换打断 Codex 的长连接;根据我们的测试,锁定 VLESS 后可解决 这类 stream disconnected before completion 中断。
重要更新(2026-07):ZibVPN 1.4.0+ 已支持协议锁定。对 Codex、AI Agent、 远程终端等依赖长连接的工具,建议优先选择 VLESS(VLESS+Reality)。 旧版客户端请先从官方下载页面升级。
优先解决方法:在 ZibVPN 中锁定 VLESS 协议
Codex 的 WebSocket 或 HTTP/SSE 响应可能持续数分钟。ZibVPN 处于「自动」模式时,会根据延迟和 近期连接质量在 Reality、ShadowTLS、Hysteria2、AnyTLS 之间选择路径;正常网页访问通常感觉不到 切换,但正在运行的 Codex 流式连接可能因此需要重新建立。
如果你正在使用 ZibVPN 1.4.0 或更新版本,请按下面操作:
- 打开 ZibVPN 客户端,确认版本为 1.4.0 或更新版本;
- 进入客户端的协议选择 / 协议偏好设置;
- 将「自动」改为 VLESS(实际连接为 VLESS+Reality);
- 重新连接 ZibVPN,再重新运行 Codex 任务。
重点:运行 Codex 时不要保持「自动」协议,直接锁定 VLESS。 锁定后客户端会持续使用同一类协议,不再因健康度调度切换传输路径,从而避免 Codex 长连接在 思考或输出过程中被中断。
为什么会断开?
OpenAI Codex 新版默认使用 WebSocket 作为传输通道。WebSocket 是一种「长连接」—— 需要长时间保持不断开。而这种长连接在经过任何代理/VPN 时,都容易因为以下原因被中断:
- 中间网络设备对长时间连接的空闲回收;
- WebSocket 握手在代理环境下超时;
- 基于 UDP/QUIC 的传输协议在长连接场景下更易被运营商网络掐断。
这是 Codex 客户端层面的传输兼容性问题,社区已有大量相同反馈。好在有成熟的解决办法。
兼容方案:让 Codex 改走 HTTP/SSE
如果你暂时无法升级 ZibVPN,或者锁定 VLESS 后仍受其它网络因素影响,可以继续采用下面的 Codex 兼容方案:禁用 WebSocket、强制使用更稳定的 HTTP/SSE 传输。 只需修改 Codex 的配置文件 config.toml。
已经改过配置、现在还是频繁断开?请重点检查下方「第 2 步」: 九成情况是关键配置顺序放错、没有真正生效(每次启动被 Codex 删掉),或需要调大流式超时与 重试参数。
第 1 步:找到 / 创建配置文件
Windows:
C:\Users\你的用户名\.codex\config.tomlmacOS:
~/.codex/config.toml~ 代表你的用户主目录,完整路径通常是 /Users/你的用户名/.codex/config.toml。 如果 .codex 文件夹或 config.toml 文件不存在,手动创建即可 (.codex 是隐藏文件夹)。
如何快速打开(可选)
Windows(PowerShell):
notepad "$env:USERPROFILE\.codex\config.toml"macOS(终端):
mkdir -p ~/.codex && open -e ~/.codex/config.toml第 2 步:写入以下配置
把下面内容写入 config.toml。如果文件里已经有内容,切勿整段直接追加到末尾——model_provider = "openai_http" 这一行必须放到文件最顶端(所有 [...] 段之前), 下方的 [model_providers.openai_http] 配置块才可以和其它段落并列摆放:
model_provider = "openai_http" # ← 必须是第一行,放在所有 [ ] 段之前
[model_providers.openai_http]
name = "OpenAI HTTP only"
base_url = "https://chatgpt.com/backend-api/codex"
wire_api = "responses"
requires_openai_auth = true
supports_websockets = false
# ↓ 容忍长时间无数据的推理阶段,断开后多重试几次
stream_idle_timeout_ms = 600000
stream_max_retries = 10
request_max_retries = 8supports_websockets = false 会让 Codex 跳过最容易断开的 WebSocket 通道、改用更稳定的 HTTP/SSE;最后三行则放宽「长时间无数据」的断线判定、增加断开后的重试次数。 模型深度思考时经常几十秒不返回任何数据,而默认的 5 分钟 idle 超时在代理环境下容易被误判为断线—— 调大后能明显减少中断。(这几项只对自定义 provider 生效,我们这里用的正是自定义的openai_http,所以会真正起作用。)
最容易踩的坑:model_provider = "openai_http" 这一行必须放在文件最顶端、 在任何 [...] 段落之前。否则按 TOML 规则它会被算进 [model_providers.openai_http] 段里,顶层设置等于没写; 而且 Codex 每次启动重写配置时会把这行放错位置的键删掉——表现就是「明明改了,每次启动又变回断开」。
❌ 错误顺序(写在段落后面 → 每次启动被删、失效):
[model_providers.openai_http]
name = "OpenAI HTTP only"
supports_websockets = false
model_provider = "openai_http" # ← 放这里无效,会被删掉✅ 正确顺序:model_provider = "openai_http" 就是文件第一行, 所有 [...] 段落都排在它之后(即上方完整示例的写法)。改完后可在 Codex 里用/status 确认 Model provider 显示为 openai_http。
第 3 步:保存并重启 Codex
保存文件后,完全关闭并重新启动 Codex(命令行用户请退出当前会话、重新运行codex),让新配置生效。
验证是否解决
- 重新运行一个 Codex 任务(例如代码审查或较长的对话)。
- 观察是否还会出现
stream disconnected或Reconnecting... x/5。
绝大多数情况下,禁用 WebSocket 后即可恢复稳定。如果仍偶发断开,可尝试切换到 VPN 的 其他节点后再试。
常见疑问
Q:改了配置会影响 Codex 其他功能吗?
这是社区广泛采用的稳定性解法。它只是切换传输通道(从 WebSocket 改为 HTTP/SSE), 不影响你正常使用 Codex 的能力。如果未来 Codex 官方修复了 WebSocket 兼容问题, 你可以随时删除这段配置恢复默认。
Q:这是 VPN 的问题吗?
不是。该报错在任何代理/VPN 环境下都可能出现,根源是 Codex 客户端默认传输方式与代理的兼容性, 按上面的方法修改 Codex 配置即可解决。
Q:我不用命令行,用的是图形界面 / 其他工具?
原理相同——核心是避免不稳定的 WebSocket 长连接。若该工具支持切换传输方式, 同样建议关闭 WebSocket、改用 HTTP/SSE。