客户端报错本地网络与连接Codex CLICC Switch

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. 1

    看报错里的 url 是不是 CCSub

    error sending request for url (...) 括号里应该是 https://www.ccsub.net/api/v1/responses。如果是别的地址,说明配置被改写或没生效,先修 ~/.codex/config.toml,再看下面的步骤。

  2. 2

    排除本地代理的干扰

    检查终端里的 HTTPS_PROXY / HTTP_PROXY / ALL_PROXY,以及代理软件的 TUN、全局模式。CCSub 在国内可以直连,给 ccsub.net 设置直连或 NO_PROXY,流式长连接就不会被代理节点中途切断。

  3. 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 按上游实际返回的用量计费。如果流在中途断开,已经生成并返回的部分仍可能计入用量;在开始返回之前就失败的请求不计费。

还是不行?

还没有 CCSub 账号?

注册后在控制台创建 API Key,填进 Claude Code、Codex 等工具即可使用,按实际用量计费。