Codex 报 stream disconnected before completion 怎么解决
stream disconnected before completion: stream closed before response.completed
Codex 反复显示 Reconnecting... 1/5,最后报 stream disconnected before completion,说明流式连接在收到 response.completed 之前断了。先看报错里的 url 有没有指对,再排查本地代理、单轮任务是否超过 5 分钟,并适当调大 stream_max_retries。
3 步解决
- 1
看报错里的 url 是不是 CCSub
error sending request for url (...) 括号里应该是 https://www.ccsub.net/api/v1/responses。如果是别的地址,说明配置被改写或没生效,先修 ~/.codex/config.toml,再看下面的步骤。
- 2
排除本地代理的干扰
检查终端里的 HTTPS_PROXY / HTTP_PROXY / ALL_PROXY,以及代理软件的 TUN、全局模式。CCSub 在国内可以直连,给 ccsub.net 设置直连或 NO_PROXY,流式长连接就不会被代理节点中途切断。
- 3
调大重试次数,缩短单轮时长
在 [model_providers.ccsub] 里设置 stream_max_retries(默认 5)和 request_max_retries(默认 4);单轮生成超过 5 分钟会被服务端截断,可以把 model_reasoning_effort 调低一档,或把大任务拆成几步。
同一个问题的其他写法
stream disconnected before completion: error sending request for url (https://www.ccsub.net/api/v1/responses)Reconnecting... 2/5
这个报错是怎么来的
Codex 通过 Responses 接口以流式(SSE)方式接收结果,一轮回答要以一个 response.completed 事件结束。如果连接在这个事件到来之前就断了,Codex 会先自动重连,界面显示 Reconnecting... 1/5,重连次数用完后报 stream disconnected before completion。冒号后面跟的是具体原因:
stream closed before response.completed:连接是建立起来了,也收到了一部分数据,但流在结束前被关闭。error sending request for url (...):请求根本没发出去或没收到响应头,括号里是 Codex 实际请求的地址。
OpenAI 官方在 Codex 的 GitHub 上回复同类问题时,给出的原因集中在网络层:防火墙、代理干扰 TLS、VPN、DNS 解析、公司网络限制,以及 provider 配置写错。接 CCSub 时也是这几类原因。
原因一:地址不对或被改写
先看 error sending request for url (...) 括号里的地址。接 CCSub 应该是 https://www.ccsub.net/api/v1/responses。如果是别的地址:
~/.codex/config.toml里的model_provider、base_url写错,或者顶层配置被写到了表的下面(详见 Codex 401 页 的 TOML 说明);- 用 CC Switch 等工具切换过供应商,配置被改写成了其他地址。
原因二:本地代理切断长连接
流式响应是一条持续几十秒到几分钟的长连接,比普通网页请求更容易被代理节点切断。如果终端里设置了 HTTPS_PROXY 之类的代理变量,或者代理软件开着 TUN、全局模式,请求就会绕到代理节点再回来,链路一长,中途断开的概率就高。CCSub 在国内可以直连,建议:
env | grep -i proxy # 看看有没有代理变量
export NO_PROXY="www.ccsub.net,ccsub.net" # 让 CCSub 直连
用 Clash 一类代理软件的,可以加一条 DOMAIN-SUFFIX,ccsub.net,DIRECT 直连规则。
原因三:单轮任务太长
CCSub 单个请求最长约 5 分钟。推理强度开得很高、又要一次性写很多文件的单轮任务,可能在结束前就超过这个时间,流被服务端截断,表现为 stream closed before response.completed。处理方法:
- 在 config.toml 顶层把
model_reasoning_effort调低一档,例如从high调到medium; - 一次只让 Codex 做一件事,大重构拆成几步;
- 对话太长时先压缩或开新会话,减少每轮的输入量。
调大 Codex 的重试参数
Codex 官方配置里,每个 model provider 都可以单独设置重试和超时:stream_max_retries 是流中断后的重连次数(默认 5),request_max_retries 是 HTTP 请求的重试次数(默认 4),stream_idle_timeout_ms 是流式空闲超时(默认 300000 毫秒)。网络偶尔抖动时,适当调大重试次数能让 Codex 自己扛过去:
[model_providers.ccsub]
name = "CCSub"
base_url = "https://www.ccsub.net/api/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
request_max_retries = 6
stream_max_retries = 10
stream_idle_timeout_ms = 300000
调大重试只能缓解偶发断线。如果每一轮都要重连到上限,一定是上面三类原因之一,重试次数再多也解决不了。
常见问题
Reconnecting... 1/5 是什么意思?
这是 Codex 在流中断后自动重连,分母就是 stream_max_retries,默认 5 次。偶尔出现一两次、随后恢复正常不需要处理;每次都要重连到 5/5 再失败,才需要按本页排查。
为什么是 Codex 报错,Claude Code 却正常?
两者走的接口和超时设置不同。Codex 用 Responses 流式接口,要求收到 response.completed 事件才算完成,流中途断开就会报这个错;同样的网络问题在 Claude Code 里通常表现为 Connection error 或自动重试。
单轮请求的时间上限是多少?
CCSub 单个请求最长约 5 分钟。推理强度很高、又要输出很长内容的单轮任务可能超过这个时间,流会在结束前被切断。另外 Codex 自己的流式空闲超时 stream_idle_timeout_ms 默认也是 5 分钟。
流断开的请求会扣费吗?
CCSub 按上游实际返回的用量计费。如果流在中途断开,已经生成并返回的部分仍可能计入用量;在开始返回之前就失败的请求不计费。
还是不行?
- 按症状查《故障排查》文档
- 联系客服:发邮件到 support@ccsub.net,附上工具名和版本、系统、完整报错文本和注册邮箱(不要发 API Key)。
- 对照接入教程重新检查配置:Codex CLI 接入教程、CC Switch 接入教程
相关报错
unexpected status 401 Unauthorized: {"type":"error","error":{"type":"authentication_error","message":"Missing or invalid API key"}}, url: https://www.ccsub.net/api/v1/responses看报错里的 url 判断请求发去了哪;用自定义 provider + env_key 指定 CCSub 的 Key,并在启动 Codex 的同一个环境里设置好这个变量。Unable to connect to API (ECONNREFUSED)请求没到 CCSub,多半是本地代理变量指向了没开的代理。env | grep -i proxy 查一下,unset 掉或给 ccsub.net 加 NO_PROXY;首次启动卡在连不上 api.anthropic.com 则改 ~/.claude.json。API Error: 504 {"type":"error","error":{"type":"timeout_error","message":"Upstream timed out"}}等上游的时间超过上限了。自己调用时改成流式(stream: true),上下文太长就 /compact,长输出拆成几次;偶发一次直接重试即可,不计费。
还没有 CCSub 账号?
注册后在控制台创建 API Key,填进 Claude Code、Codex 等工具即可使用,按实际用量计费。