在 Claude Code 里干活时,回答写到一半突然停住,屏幕上出现这一行:

API Error: Connection closed mid-response. The response above may be incomplete.

它可能出现在写长报告的途中、读多个文件的途中,也可能出现在刚开启新会话之后。时机毫无规律,也没有可靠的复现方法。这不是你的提示词写得不好,而是传输层事件:承载流式响应的连接,在响应还在传输的过程中被关闭了。

而有一个事实比任何猜测都重要。这个错误的公开报告,绝大多数都来自 Claude Code 改变断连处理方式之前的版本。翻一遍官方 CHANGELOG 就会发现,从 2.1.179 开始,与连接和重试相关的修复一共有五项。本文只依据官方错误参考、官方 CHANGELOG,以及带抓包证据的真实 Issue,梳理①这条消息的准确含义 ②此刻该做什么 ③连接究竟断在哪一层 ④各版本之间发生了什么变化 ⑤开发者如何从设计上规避

先说结论
① 眼下
屏幕上的内容仍然有效

已经传过来的部分完好无损。官方给出的恢复方式是回复 continue

② 性价比最高的处理
升级 Claude Code

2.1.198 解决了短暂网络中断导致整轮失败的问题,2.1.214 解决了重试复用已死连接的问题。

③ 仍然复现时
按层次逐一排查

本机、链路(代理/VPN)、服务端——各层的应对方式不同。已有服务端主动关闭连接的报告。

1. 这条消息到底在说什么——官方定义

首先要明确:这段文字是 Claude Code 自己写出来的提示,并不是 API 返回的错误响应。Claude Code 官方错误参考对所有以「The response above may be incomplete.」结尾的消息给出了统一解释:当流式响应在 Claude 已经产生可见输出之后失败时,重新发送请求可能会把同样的工具调用执行两遍,因此 Claude Code 会保留已经传输的内容,并附上这条提示,而不是把整轮丢弃。

而句尾的措辞,就是原因的名字。该参考列出了三种。

本文主题
Connection closed mid-response

官方解释只有一句:连接被断开了。流本身在正常工作,但承载它的连接关闭了。

另有专文
Response stalled mid-stream

官方说法是「流不再发送数据」。连接还活着,只是陷入沉默。不是断开,而是停滞。

服务端故障
Server error mid-response

流传输中途出现过载或 5xx。据官方文档,这种显示本身需要 v2.1.199 及以后版本;在此之前会丢弃已输出内容,把整轮当作错误。

一句话区分三者。切断的是 Connection closed,陷入沉默的是 Response stalled,服务端摔倒的是 Server error。表面上都是「中途停住了」,但发生在传输的不同位置。

官方还明确了另一个值得知道的行为:如果同样的失败发生在任何可见输出之前,Claude Code 会重试请求,而不是就此收尾。换句话说,你能看到这条消息,恰恰说明此前已经有输出出现——重发有可能造成副作用重复执行,所以 Claude Code 才刻意没有自动重试。出现错误并不等于什么都没尝试过。

2. 第一件该做的事——内容并没有丢

先别慌着把同样的指令再发一遍,按下面的顺序确认。

STEP 1 读一遍已传过来的内容

如官方文档所说,什么都没有丢失。缺的多半只是最后几句话,或者最后一次工具调用。

STEP 2 回复 continue

官方错误参考明确给出的恢复步骤。让它从停下的地方继续,而不是从头再来。

STEP 3 确认副作用

若断在文件编辑或命令执行途中,可能已经执行了一部分。先用 git status 等看清实际状态再继续。

STEP 4 反复出现就先看版本

如果一次会话内出现多次,先确认版本再谈其他。这一块一直在被持续修复。

不要轻视 STEP 3。官方之所以写「重发可能把同样的工具调用执行两遍」,反过来说就是断开的那一刻,部分工具可能已经执行完毕。如果是在写文件、提交、部署的途中断掉,先看实际状态才是最短的恢复路径。

3. 为什么会断——连接被关闭的三个层次

只说「连接被断开」无从下手,所以要把关闭可能发生的位置拆开来看。已有的报告大致分为三层。

第 1 层:本机
设备、链路、休眠

Wi-Fi 瞬断、移动网络切换、电脑从睡眠中唤醒。官方 CHANGELOG 里就有「机器从睡眠唤醒后流式请求失败」的修复(2.1.186),说明这一层确实存在。

有效对策:有线或稳定链路;长任务期间不要让机器休眠。

第 2 层:链路
代理、VPN、空闲断开

Claude API 官方错误文档明确写道,有些网络会在不定时长后断开空闲连接,并建议设置 TCP keep-alive。企业代理和 VPN 恰恰容易有这种行为。

有效对策:临时绕过代理/VPN,看是否还能复现。

第 3 层:服务端
服务端主动关闭

有抓包层面的报告显示,连接是在流传输过程中被服务端关闭的(见下一节)。这种情况下,本机怎么调整都防不住。

有效对策:客户端侧的重试设计——这正是升级有效的原因。

事实上,GitHub Issue #69415[BUG] API Error: Connection closed mid-response ==> frequent enough to make Claude Code unusable for any task,2026 年 6 月 18 日创建,本文撰写时仍为 open)的报告者给出的条件是:Windows 11/WSL2,没有企业防火墙也没有代理的直连环境,Claude Code 2.1.181。也就是说,其主张是在排除第 1、2 层之后依然会发生。该 Issue 带有 area:networkingplatform:vscodeplatform:wsl 标签。

同一位报告者还写道,在同一台机器、同一条网络上,其他 AI 助手(GitHub Copilot、Cursor 等)能把同样的任务跑完。不过这是报告者自己的对比,并非 Anthropic 对原因的认定,这一点需要区分清楚。

另有一份条件明显不同的报告。Issue #69336occurs immediately in new context window,2026 年 6 月 18 日创建、open,Claude Code 2.1.173,Debian 13,自建的 Claude Agent SDK)报告称,上下文摘要(compact)跑完之后频率上升。它带有 area:agent-sdkarea:apiplatform:linux 标签,并把开启全新对话描述为临时规避手段。Issue #69517(发生在 Claude Cowork,2026 年 6 月 19 日,macOS,2.1.183)已被作为重复问题关闭

4. 抓包揭示的事实:服务端主动关闭

关于这类错误,目前最深入的一手调查是 Issue #67766(2026 年 6 月 12 日创建,仍为 open)。报告者在自己的环境里抓了包,并对十次发生做了交叉比对。

Issue #67766 报告者公开的抓包实测值
10 / 10
全部为服务端发起的正常关闭(FIN)。既不是中间设备发的 RST,也不是客户端关闭
3〜105 ms
从 FIN 到达到 CLI 报错的时间。几乎是即刻显现
7〜20 KB
关闭时已经收到的响应数据量。请求体(1〜2.5 MB)在数秒前就已确认送达
约 20 ms
紧接着新建的连接上,下一个请求就成功了。链路本身没有问题
23 天 200 次
同一报告者本地会话记录中留下的报错次数(共 171 次事件)
171 中 87 次
发生在距上一次 API 通信不到 5 秒之内,也就是正干活的当口

出处:GitHub Issue #67766 报告者公开的抓包与会话记录。这是单个用户环境下的实测,并非 Anthropic 的验证结果。

技术上最关键的一点是「关闭是有选择性的」。据该报告,当时连向同一目标的其他连接都保持存活,被关闭的只有正在执行请求的那个进程所持有的连接。同时运行的另外两个 claude 进程的连接毫发无损。如果是链路掉线,理应全部一起遭殃,而事实并非如此。

此外,十次中有四次观测到多个连接池中的连接被「成批」发送 FIN,还有三次发生在相邻分钟的第 54 秒(01:19:54/01:20:54/01:22:54 UTC)——报告者据此推测可能存在某种 60 秒周期的处理。

🟡 关于本节的确信度

Issue #67766 屏幕上显示的是「API Error: The socket connection was closed unexpectedly」,与本文这条消息措辞不同,不能断定是同一个缺陷。不过,就「流传输过程中连接被关闭」这一同层现象而言,它是目前唯一公开的抓包级证据,作为原因推测仍有参考价值。另外需要说明,截至本文撰写时,Anthropic 尚未就该报告公开任何说明

5. 先看版本——修复的时间线

这是本文最有实用价值的部分。翻一遍 Claude Code 官方 CHANGELOG 就会发现,流传输中断连的处理一直在被持续改进。以下每一条都真实记载于 CHANGELOG。

v2.1.179

流传输中断连时,已输出的部分开始被保留。此前只会抛出原始错误,而且转圈提示会卡在「running tool」。

v2.1.185

流停滞时的提示改为「Waiting for API response · will retry in …」,并且触发条件由静默 10 秒改为 20 秒,短暂波动不再弹出警告。

v2.1.198 ★ 关键

修复了响应途中短暂网络中断导致整轮被中止的问题。ECONNRESET 这类临时性错误改为带退避的重试,而不是直接失败。

v2.1.199

修复了流传输中途出现过载/服务端错误时丢弃已输出内容的问题。现在会保留已输出部分并附上「不完整」提示——前述 Server error mid-response 的显示正来源于此。

v2.1.214 ★ 关键

keep-alive 连接池改为在出现「陈旧连接」错误后停用,使重试改开新的 socket。这直接对应 #67766 指出的「被复用的连接遭到关闭」的结构。

把这条时间线,与开头那些报告所用的版本对照一下。

报告报告时的版本当时尚未包含的修复
#693362.1.1732.1.179/198/199/214 全部
#694152.1.1812.1.198/199/214(即重试改进与连接池修复)
#695172.1.1832.1.198/199/214

三份报告都早于用重试吸收临时断连的 2.1.198。所以首先该确认的是自己的版本。

claude --version

若低于 2.1.198,比起排查,先升级更快见效。本文撰写时 CHANGELOG 的最新版本是 2.1.220,上述修复均已包含在内。

但也不能说「升级就一定不再出现」。CHANGELOG 中并没有直接点名「Connection closed」的修复条目,上述都是相邻的连接处理改进。请把升级理解为性价比最高的第一步,而非根治的保证。

6. 更容易触发的条件

各份报告中反复出现、会抬高发生概率的因素如下。

📄 长响应

读取多个大文件并生成结构化报告等,会让流长时间保持开启的任务(#69415)。

🗜️ compact 之后

有报告称上下文摘要跑完之后频率上升(#69336)。摘要之后发送的请求往往会变大。

📦 超大请求

#67766 的实测中,被关闭的连接所承载的请求体为 1〜2.5 MB。作为参考,Messages API 的官方请求上限是 32 MB。

📡 链路中有中间设备

企业代理、VPN、跨境连接。正是官方文档提到「有些网络会断开空闲连接」的那一层。

💤 从睡眠唤醒

官方 CHANGELOG 2.1.186 修复了「机器唤醒后流式请求失败」。长任务期间别让电脑睡过去。

🔁 连续作业

#67766 中 171 次里有 87 次发生在距上次 API 通信不到 5 秒之内,仅用空闲断开无法解释。

7. 立刻处理——用户侧检查清单

从上往下、由低成本到高成本依次尝试即可。

顺序做什么目的
1回复 continue官方给出的恢复步骤。利用已输出的内容从中断处继续。
2执行 claude --version,版本旧就升级让 2.1.198 的重试改进和 2.1.214 的连接池修复生效。最优先
3确认副作用(git status 等)看断开时工具是否已经执行了一部分,避免重复执行造成事故。
4把任务拆小缩短单次响应,减少流的暴露时间。把「读完所有文件再写报告」拆成几步。
5临时关闭代理/VPN 再复现一次排查第 2 层。关掉就不再出现,即可确定是链路问题。
6关闭休眠与省电,改用有线排查第 1 层。笔记本长时间跑任务时尤其重要。
7换一个全新会话试试#69336 报告的临时规避手段。摘要之后频发的场景有时有效。
8能复现就带信息去反馈按官方 API 文档的建议附上 request_id(以 req_ 开头的标识符),调查会快得多。

绝对不要做的事。因为「连接老是断」就去关闭 TLS 校验(NODE_TLS_REJECT_UNAUTHORIZED=0 之类),既是在治另一种完全不同的症状,又等于放弃了通信安全,非常不可取。证书错误属于另一类错误,处理方式也不同。

8. 面向开发者——在 API/SDK 层面预防

如果你是在 Claude Agent SDK 或自建的 API 集成中被同类断连困扰,Claude API 官方错误文档给出了具体的设计指引。

① 长响应务必走流式

官方建议「超过 10 分钟这类长请求,使用流式 Messages API 或 Message Batches API」。把大 max_tokens 用非流式发出去,是最容易被切断的形态

② 设置 TCP keep-alive

官方明确指出,自行编写 API 集成时设置 TCP keep-alive 可减轻空闲断开的影响。官方 SDK 已默认设置。自己写 HTTP 客户端的话务必确认。

③ 弄清官方 SDK 的重试

官方 SDK 对连接错误、限流、5xx 等临时性失败默认重试两次,采用指数退避并尊重 retry-after 头。次数可通过客户端选项调整或禁用。

④ 200 之后的错误要另行处理

官方点名的陷阱:SSE 下返回 200 之后仍可能发生错误,因此不会走常规 HTTP 错误处理路径。必须单独处理流传输中的错误事件。

⑤ 不要丢弃已收到的部分

Claude Code 自己在 2.1.179 和 2.1.199 就转向了这个方向。断开时保留已接收的块并请求后续,无论在成本还是副作用上都优于全部丢弃后重发。

⑥ 怀疑连接池

Claude Code 在 2.1.214 改为「出现陈旧连接错误后停用 keep-alive 池,重试改开新 socket」。值得确认你的重试是不是抓着同一条已死的连接

对于批处理这类「本来就不想依赖不间断连接」的工作负载,按官方推荐改用 Message Batches API 并以轮询取结果,能从结构上消除网络风险,而不只是缓解。

9. 与相似错误的区分方法

Claude Code 的通信类错误显示得很像,容易混淆。按「走到了哪一步」来区分最快。

消息停在哪里主要对策
Connection closed mid-response(本文)已连上、响应也开始传输之被切断continue/升级版本/排查链路
Response stalled mid-stream连接还活着但陷入沉默另有专文(注意与重复循环的连锁)
Server error mid-response流传输中服务端出现 5xx/过载等一会儿再试。参见 529/500 一文
Unable to connect / SSL certificate verification failed根本没连上代理、企业 CA、防火墙。参见 连接错误一文
Prompt is too long发送前就被拒绝(通信正常)削减上下文。参见专文

最大的分岔点,就是「屏幕上有没有出现过响应」。一个字都没出现,就怀疑连接本身(配置与链路);已经出现了一部分,那就是连接成功过的证据,与其去改配置,不如按本文的排查步骤往下走。

10. 官方处理状况与尚未确定的部分

为避免误解,把「官方可确认的」和「不可确认的」分开列出。

✅ 官方可确认
  • 该消息已正式记载于官方错误参考,含义是「连接被断开」
  • 已传输的输出会被保留(有意为之的设计)
  • 恢复步骤是回复 continue
  • 输出出现之前的失败会自动重试
  • 断连相关修复分别在 2.1.179/198/199/214
🟡 有报告但未确定
  • 服务端在流传输中发送 FIN(#67766 的实测,但显示消息不同)
  • 可能存在 60 秒周期的清理处理(同一报告者的推测)
  • compact 之后频发(#69336 的报告)
  • 同等条件下其他 AI 助手不出问题(#69415 报告者的对比)
🔴 撰写时未提供/未公开
  • Anthropic 对原因的官方说明(#69415/#69336/#67766 均无公开回复)
  • 点名「Connection closed」的修复条目(CHANGELOG 中不存在该字符串)
  • #69415、#69336、#67766 均仍为 open

简而言之,症状与对策已被官方文档化,但「为什么会断」的官方说明尚未给出。在这种局面下,与其追查原因,不如把运维习惯做实:把每一轮拆短、涉及副作用的操作边确认状态边推进、版本保持最新——这些做法的收益更确定。

常见问题

Q1. 出现「Connection closed mid-response」后,之前的输出会消失吗?

不会。正如官方错误参考明确写的那样,已经传输过来的内容会原样保留。Claude Code 之所以不重发而是附上提示,是因为重发有可能把同样的工具调用执行两遍。缺的多半只是最后几句话或最后一次工具调用。

Q2. 回复什么才能从中断处继续?

回复 continue。这是官方错误参考给出的恢复步骤。从头重新下指令,则有让已执行操作重复的风险。

Q3. token 会白白浪费吗?

已经生成的那部分是被消耗掉的。Issue #69336 的报告者也写道「消耗的 token 不会退回」。正因如此,用 continue 从中断处继续、而不是从头再来,在成本上同样重要。

Q4. 它和「Response stalled mid-stream」是一回事吗?

不是。按官方定义,Connection closed 是「连接被断开」,Response stalled 是「流不再发送数据」——断开与停滞是两回事。表面症状相似,但 stalled 一侧有与模型重复循环连锁发生的报告,处理方式也不同。详见Response stalled mid-stream 一文

Q5. 是我的网络不好吗?

有这个可能,但未必只是如此。Issue #69415 的报告者是在没有代理也没有防火墙的直连环境下遇到的,而 Issue #67766 的抓包显示关闭是由服务端发起的。先临时绕过代理/VPN 看是否还能复现;若毫无变化,就可以判断不只是本机的问题。

Q6. 升级 Claude Code 就能解决吗?

这是最值得优先尝试的一步。官方 CHANGELOG 中,2.1.198 修复了「响应途中短暂网络中断导致整轮被中止」,2.1.214 改为「出现陈旧连接错误后停用 keep-alive 池,让重试开启新 socket」。报告集中的 2.1.173〜2.1.183 都早于这些版本。不过 CHANGELOG 中并无点名「Connection closed」的修复条目,因此升级是改善的可能性,而不是根治的保证

Q7. 长任务下频发,有规避办法吗?

把任务拆小、让单次响应更短,是最可靠的做法。「读完多个大文件再写报告」这类一次性处理会让流长时间开着;仅仅把读取与撰写分开,暴露窗口就会缩短,撞上断连的概率随之下降。Issue #69336 中也有「开启新对话可临时规避」的报告。

Q8. 作为开发者,如何在自己的应用里预防?

Claude API 官方文档的指引很清楚:①长响应务必走流式(超过 10 分钟可考虑 Batches API);②设置 TCP keep-alive(官方 SDK 已默认设置);③SSE 下 200 之后仍可能来错误,须单独处理流中的错误事件;④断开时保留已接收内容并请求后续。联系支持时请附上 request_id

Q9. 在 Claude Cowork 和 Agent SDK 里也遇到同样的错误。

同样的消息在那里也有报告。Issue #69517 是 Claude Cowork 上的报告(已作为重复关闭),#69336 则是经由自建 Claude Agent SDK 的报告。这是处理流式响应那一层的共通现象,因此思路不变:从中断处继续、保持版本最新、把重试设计好。

相关文章