1. 问题现象
最近在 Ubuntu 22.04 的 VSCode 中使用 Codex 时,一直出现如下报错:
stream disconnected before completion: error sending request for url (https://chatgpt.com/backend-api/codex/responses)
从报错信息看,请求目标是:
https://chatgpt.com/backend-api/codex/responses
也就是说,这不是普通的 api.openai.com API 调用问题,而是 VSCode 中 Codex 扩展访问 ChatGPT 后端接口时,流式请求中途断开。
最开始容易误判为 Codex 服务不可用,或者账号权限问题。但经过排查后发现,问题核心更偏向于本地网络代理、Cloudflare challenge、VSCode 代理继承以及流式连接稳定性。
2. 初步判断
该错误中的关键词是:
stream disconnected before completion
它说明请求并不是完全无法发出,而是流式响应还没有完成时,连接被中途断开了。
Codex 在 VSCode 中并不是一次性请求-响应,而是依赖持续的 streaming 连接。普通网页能打开 ChatGPT,并不代表 VSCode Codex 的流式连接一定稳定。
因此,排查方向主要包括:
- VSCode 是否正确走代理;
- 代理节点是否支持稳定的长连接;
- ChatGPT/Codex 相关域名是否走同一个代理策略;
- Cloudflare 是否对当前代理出口触发 challenge;
- Codex 登录态是否异常。
3. 使用 curl 测试网络连通性
首先使用 curl 测试 ChatGPT 主站:
curl -I --proxy http://127.0.0.1:7897 --max-time 20 https://chatgpt.com
返回结果中出现:
HTTP/1.1 403 Forbidden
Cf-Mitigated: challenge
Server: cloudflare
这说明请求已经到达了 Cloudflare,但被 Cloudflare challenge 拦截。对于 curl 来说,这种情况并不罕见,因为 curl 没有浏览器环境,无法完成 JS challenge 或携带完整浏览器指纹。
然后继续测试 Codex 后端接口:
curl -I --proxy http://127.0.0.1:7897 --max-time 20 https://chatgpt.com/backend-api/codex/responses
返回结果如下:
HTTP/1.1 405 Method Not Allowed
allow: POST
x-oai-request-id: ...
原因是 curl -I 发送的是 HEAD 请求,而 backend-api/codex/responses 这个接口只允许 POST 请求。因此返回 405 Method Not Allowed 是正常的,它说明网络层已经能够访问到 Codex 后端接口。
因此可以排除“接口完全不可达”的问题。
4. 关键结论
排查后可以得到如下判断:
backend-api/codex/responses 能够访问;
405 是正常结果,因为该接口只允许 POST;
问题不是 Codex 后端完全连不上;
真正的问题是 VSCode Codex 的 POST 流式请求在传输过程中被中断。
结合 Cf-Mitigated: challenge 和 stream disconnected before completion,问题大概率出在以下几类情况:
- 当前代理节点被 Cloudflare 风控;
- 代理节点对 streaming / WebSocket / 长连接支持不稳定;
- VSCode 没有正确继承系统代理;
- ChatGPT 网页、VSCode 扩展、登录浏览器走了不同网络路径;
- Clash / Mihomo 规则中部分 OpenAI 相关域名没有统一走代理。
5. 解决方法
最终采用的处理方式是:让 VSCode 明确走代理,并保证 ChatGPT/Codex 相关流量走同一个稳定节点。
首先关闭 VSCode:
pkill -f code
然后在终端中设置代理环境变量:
export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897
export all_proxy=socks5h://127.0.0.1:7897
再从当前终端启动 VSCode:
code
这样可以确保 VSCode 进程继承当前终端的代理环境变量。
同时,在 VSCode 的 settings.json 中显式配置代理:
{
"http.proxy": "http://127.0.0.1:7897",
"http.proxySupport": "on",
"http.proxyStrictSSL": true,
"http.systemCertificates": true
}
如果代理端口不是 7897,需要改成自己 Clash / Mihomo 中实际使用的端口。
6. 重新登录 Codex
网络切换后,最好重新登录 VSCode 中的 Codex。
在 VSCode 中执行:
Ctrl + Shift + P
搜索:
Codex: Sign Out
退出后重新登录。
这里要注意,浏览器登录 ChatGPT 和 VSCode 使用 Codex 时,最好保持同一个代理节点。否则可能出现网页登录成功,但 VSCode 内部请求仍然异常的问题。
7. 总结
这次问题的本质不是代码错误,也不是 Codex 接口完全不可用,而是 VSCode Codex 的流式请求在代理链路中被中断。
排查过程中最关键的判断点是:
curl -I https://chatgpt.com/backend-api/codex/responses
返回:
405 Method Not Allowed
allow: POST
这说明 Codex 后端接口是能访问到的。由于 curl -I 使用的是 HEAD 请求,而接口只允许 POST,所以 405 是正常现象。
真正需要处理的是:
- VSCode 是否正确走代理;
- 代理节点是否稳定支持 streaming;
- ChatGPT/Codex 相关域名是否统一走代理;
- 是否触发了 Cloudflare challenge;
- Codex 登录态是否需要刷新。
最终解决:通过显式配置 VSCode 代理、从终端带代理环境变量启动 VSCode、切换稳定节点并重新登录 Codex,问题得到解决。