“API Error: The response stopped arriving”表示:响应正在输出时,连接仍然开着,数据却不再送达,于是 Claude Code 自己的监视计时器切断了这个连接。在此之前已经完成的输出会留在屏幕上。如果是交互式会话,回复 continue 就能从最后完成的地方接着做。

API Error: The response stopped arriving. The response above may be incomplete.

在 v2.1.227 之前,这条提示的文字是 Response stalled mid-stream。官方错误参考明确写了这次改名,发生的情况完全相同。查找用旧文字写成的资料或问题报告时,请用新旧两种文字都搜一遍。

先看“API Error:”后面的措辞

“停住了”和“断开了”的提示,按原因用的是不同的文字

The response stopped arriving
输出开始之后,连接仍然开着,数据却停了
→ 用 continue 接着做
本文讨论的对象
Connection lost mid-response
输出开始之后,连接本身断开了
→ 看断开与无声的区别
旧文字是 Connection closed
The response stalled before a response was produced
思考结束后,一个输出都还没开始就停了
→ 重新发送的处理不同
没有留下任何输出
Streaming response ended before any complete data was received
响应在没有可用数据的情况下结束,已改用非流式重新发送
→ 怀疑链路上的代理
不是停住,而是空着结束
根据官方错误参考的说明,从提示文字选择排查方向的图。

1. 这条提示的含义——不是断开,而是“无声”

Claude Code 官方错误参考对这条提示的解释是:“连接一直开着,但不再传送数据,因此流式传输的空闲监视(idle watchdog)将其切断”。它不是 API 返回的错误正文,而是正在接收响应的 Claude Code 自己加上的注记。

同样是“中途停住”,Claude Code 会按原因换用不同的措辞。官方列出了下面 4 条,结尾的“The response above may be incomplete.(上面的响应可能不完整)”是共同的。

API Error: Server error mid-response. The response above may be incomplete.
API Error: Connection lost mid-response. The response above may be incomplete.
API Error: Your computer went to sleep mid-response. The response above may be incomplete.
API Error: The response stopped arriving. The response above may be incomplete.

第 1 行是响应途中服务器返回过载或 5xx 错误,第 2 行是连接断开,第 3 行是响应途中电脑进入了睡眠。只有第 4 行的这条提示表示既没有出错也没有断开,数据却不再到来。

负责切断的是 4 个监视计时器

根据官方的网络配置文档,Claude Code 有 4 个计时器,用来切断变得安静的数据流。这样,已经死掉的连接就不会一直卡住,而是能作为失败来处理。在响应开始流动之后起作用的,是下表中的前 3 个。

计时器切断条件默认时长
字节级监视线路上一个字节都没有到达(连 SSE 的保活信号也没有)直连 Anthropic API 时 180 秒,其他情况 300 秒
事件级监视一个响应事件都读不出来300 秒(所有提供商)
正文空闲超时5 分钟没有字节到达5 分钟(直连 Anthropic API 和 Claude Platform on AWS 除外)
首字节期限发送后,一个响应头都没有到达直连 API 时 180 秒,其他情况 300 秒(正文每 32KB 追加 1 秒)。出现的不是这条提示,而是 No response from API

直连 Anthropic API 时,大致以字节级监视的 180 秒为准。也就是说,在这条提示出现之前,屏幕看起来会停住好几分钟。官方说明,如果请求还活着但 20 秒没有数据,会先出现下面这条横幅。它表示“还没有失败”,倒计时指的是到切断为止的时间(v2.1.185 之前是 10 秒,文字也不同)。

Waiting for API response · will retry in … · check your network

数据恢复后,横幅会自动消失。如果横幅没有消失、一直走到切断,而且部分输出已经完成,就会出现本文讨论的这条提示。

2. v2.1.227 起由“Response stalled mid-stream”改名而来

官方错误参考在 4 条提示的说明之后紧接着写道:“v2.1.227 之前,Connection lost mid-response 显示为 Connection closed mid-response,The response stopped arriving 显示为 Response stalled mid-stream”。在同一个版本里,输出开始前的那条提示也换了文字。

v2.1.227 之前的提示现在的提示本站文章
Response stalled mid-streamThe response stopped arriving本文
Response stalled while thinking, before producing a responseThe response stalled before a response was produced本文第 3 章
Connection closed mid-responseConnection lost mid-responseclosed 和 lost 的文章(见下文)

旧文字 Response stalled mid-stream 与模型没完没了地重复同一个词的现象一起出现的例子,整理在讨论 Response stalled mid-stream 与“court”无限循环的文章里。连接断开那一侧的提示,旧文字时代的报告见 Connection closed mid-response 的文章,改名后的文字见 Connection lost mid-response 的文章,分开讲解。

可以用来判断版本

显示 stopped arriving,说明这个 Claude Code 是 v2.1.227 或更新的版本。显示 stalled mid-stream,则是更早的版本。

CHANGELOG 里没有记载

2026 年 9 月 22 日查阅了官方 CHANGELOG 的 v2.1.227 条目,没有写到文字的变更。npm 上的发布日期是 2026 年 8 月 10 日(UTC)。

报告要用两种文字去找

同一个现象以两个名字被报告过。在 GitHub 搜索 Issue 时,新旧两种文字都要试。

v2.1.222 之前可能是误报

官方说明,v2.1.222 之前的 Claude Code 有两种误报。一种是经由 ANTHROPIC_BASE_URL 或 ANTHROPIC_AWS_BASE_URL 的网关:服务器的保活信号明明在到达,却只统计读出来的事件,结果把连接切断。另一种是响应完成之后连接停住时也加上这条注记,把完整的响应当作错误处理。如果 claude --version 小于 2.1.222,请先更新。

3. 与相似提示的区别

会出现哪一条提示,取决于响应进行到哪一步时停住。把官方“Automatic retries”的说明按响应的进展顺序排列,就是下面这样。

停住的时间点越靠后,留下的输出越多,自动重新发送越少

① 等待响应头时

期限内响应头没有到达。最多重新发送 1 次

No response from API

② 还没有任何内容完成时

响应头到了但内容没来,或者思考结束后在输出前停住。在常规的 10 次之外另行最多重新发送 1 次,思考结束后再次停住,就以下面的提示结束

The response stalled before a response was produced

③ 完成一个块之后

完成了一段文字或一次工具调用之后(包括思考结束、开始写出之后)停住。不重新发送

The response stopped arriving(本文)

④ 响应完成之后

保留完整的响应,正常结束这一轮。不加注记

无提示(v2.1.222 及以后)

出处:根据 Claude Code 官方错误参考“Automatic retries”“No response from API”“The response above may be incomplete”绘制。

③ 不重新发送的理由,官方也写明了:在完成一段文字或一次工具调用之后重新发送请求,有可能把同一个工具调用执行两次。所以 Claude Code 会保留已完成的部分,不丢弃这一轮,而是加上注记。

提示发生了什么留下的输出与重新发送
The response stopped arriving连接仍然开着,数据停了已完成的部分保留。不重新发送
Connection lost mid-response连接本身断开了已完成的部分保留。不重新发送
Server error mid-response途中服务器返回了过载或 5xx已完成的部分保留(v2.1.199 及以后)。不重新发送
The response stalled before a response was produced思考结束后、输出开始前,连续停住了 2 次没有留下输出。这是重新发送 1 次之后的提示
No response from API期限内一个响应头都没有到达没有留下输出。这是重新发送 1 次之后的提示
Streaming response ended before any complete data was received响应在没有可用数据的情况下结束了自动改用非流式重新发送(仅警告)

与 Connection lost mid-response 的区别在于“断开还是无声”

两者都是在输出进行到一半之后出现的提示,已完成的输出都会保留,也都可以用 continue 接着做。不同的是停住的方式。lost 判定的是连接丢失,应怀疑本地线路的瞬断、VPN 重连或途中设备的切断。stopped arriving 判定的是连接还在,内容却不再流过来,而且是等到监视计时器的时间用完之后才切断的。因此,第 6 章讲的计时器调整只可能对 stopped arriving 这一侧起作用。

与 Streaming response ended… 的区别在于“停住还是空着结束”

据官方说明,Streaming response ended before any complete data was received 是响应一条可用数据都没送来就结束时的警告。Claude Code 会放弃流式传输,重新发送同一个请求,并继续这一轮。在交互式会话中,这个警告每个会话只出现 1 次(v2.1.239 之前是悄悄重新发送)。官方写道,常见原因是途中的代理或网关消耗或改写了响应正文。stopped arriving 则是响应来到一半之后停住,不会自动重新发送。

4. 已经做到一半的工作会怎样

按照官方的说明,Claude Code 会保留所有已完成的块,并在这一轮结束时丢弃最后那个没完成的块。屏幕上最后几句话或最后一次工具调用有时会缺失,就是这个原因。已经完成的工具调用会被执行,这一轮会根据其结果继续。不同的运行环境,停住之后的处理也不同。

交互式会话

读一下屏幕上留下的响应,回复 continue,就会从最后完成的块继续。如果从头重新下指令,可能会把已经执行过的操作再做一遍。

-p、Agent SDK、云端会话

如果中途停住的响应只有文字、不含工具调用,Claude Code 会自己催促继续。最多连续尝试 3 次,全部用完时才会出现注记(v2.1.246 及以后)。

子代理

无论交互式还是非交互式,只要是纯文字的响应,就会催促子代理继续。催促用完后,注记会成为子代理的最后一条消息(v2.1.257 及以后)。

钩子

根据官方的钩子说明,以 API 错误结束的一轮触发的不是 Stop,而是 StopFailure。它的输出和退出码都会被忽略,所以无法用钩子自动让它 continue。

用 -p 时停住的输出和继续方法

在非交互模式默认的文本输出中,Claude Code 会输出这一轮最后完成的文字块,并在其后接上这条提示(v2.1.219 之前只有提示,响应会被丢弃)。不过,如果手头没有留下已完成的文字,例如这一轮途中会话被压缩、那段文字已经消失,就只会输出提示(2026 年 9 月 26 日在官方错误参考中确认后补充)。使用 --output-format json 或 stream-json 时,这条提示放在 result 字段里。官方的做法是:等连接稳定之后,恢复会话并发送 continue。

# 继续上一次的会话
claude -p "continue" --continue

# 指定会话 ID 继续
claude -p "continue" --resume "$session_id"

另外,关于用钩子自动恢复,Issue #87972 的报告者写道:“旧文字的时代 Stop 钩子会触发,能自动继续,但大约在改名的同时就不再触发了”。这是报告者的观察,官方没有说明以前的行为是否是有意设计的。按照现在的官方文档,钩子可以用来记录或通知,但无法让这一轮重新开始。

5. 原因——官方写了什么,用户报告了什么

这条提示只告诉你“数据不再到来”这个结果,从提示本身看不出为什么停住。下面按可信程度分开整理。

✅ 官方文档和 CHANGELOG 写明的、让数据流沉默或被切断的因素

  • 机制:连接仍然开着,数据停了,监视计时器将其切断。直连 API 时,连保活信号在内 180 秒没有字节到达就会被切断
  • 网关上的误报:v2.1.222 之前,经由 ANTHROPIC_BASE_URL 等的网关,即使保活信号在到达,也可能被切断。经由 ANTHROPIC_BEDROCK_BASE_URL 这类提供商基础 URL 的网关,不在字节级监视的范围内
  • 长时间思考期间的无声:CHANGELOG 的 v2.1.229 写着“在长时间思考期间也向网关的流式响应发送 SSE 保活信号,防止以 Vertex 或 Bedrock 为上游时的空闲断开”,v2.1.257 写着“修复了 Opus 4.7 及以后版本在 Bedrock 和 Bedrock Mantle 上,不对外显示的长时间思考期间请求变得无声、因空闲超时而被断开的问题”
  • 从切断中恢复:v2.1.232 修复了“在 Bedrock、Vertex、网关的配置中,流的空闲超时无法恢复并导致请求失败的问题”
  • 代理的缓冲:官方的环境变量说明写道,CLAUDE_STREAM_IDLE_TIMEOUT_MS 的下限定为 5 分钟,是“为了容纳长时间思考和代理的缓冲”

官方把这条提示放在错误参考的“Server errors”一节。该节开头写着“大多数来自 Anthropic 的服务等推理提供商一侧”,但官方对这条文字的说明只到上面的机制为止。究竟是停在本地线路、途中设备还是服务器,官方并没有指明。

🟡 在 GitHub 上有报告、但原因尚未确定的案例

2026 年 9 月 22 日,打开并阅读了下面这些包含这条文字的 Issue。它们都是用户的报告或推测,在我们读到的范围内没有 Anthropic 的公开回复。

  • #88900(Linux、2.1.240,没有代理也没有网关):报告称响应到达约 0.5~2.7KB 时停住,180 秒后被字节级监视切断。报告者说同一分钟内不同的会话同时停住,要求检查服务器端的日志
  • #90005(Windows 11、2.1.246):报告称一天出现了 33 次,而之前的日子都是 0 次。报告者测量了带宽、丢包和代理,认为都正常,但也声明这不是测量长时间保持打开的连接的测试,并写道无法排除运营商级 NAT 的空闲断开
  • #89027(macOS、VS Code 扩展 2.1.238~2.1.241):报告称日志中记录了“byte-level”的切断和 180000ms 的无声。发生在子代理执行 WebFetch 的途中
  • #87246(macOS、2.1.232):只贴了这条文字的报告,以不计划处理(not planned)关闭。追加的评论中有人观察到,后台的子代理接连因这条提示停住

#88900 和 #90005 都写道,本地线路看不出异常却停住了。不过,仅凭这一点并不能断定原因在服务器端。正如 #90005 的报告者自己所写,短时间的通信测试无法再现“保持打开几分钟的连接中途沉默”的情况。

6. 停住时的处理步骤

按从上到下的顺序排列,越靠前越省事、效果越大。如果只出现一次,做到第 2 步就可以了。

01

确认留下的输出和工作的实际状态

已完成的工具调用已经执行了。如果停在改写文件或执行命令的途中,先用 git status 或 git diff 看看改到了哪里。

02

回复 continue

这是官方的恢复步骤,让它从最后完成的块继续。如果把原来的指令从头再贴一遍,就会把已经做完的操作再跑一次。

03

检查版本并更新

用 claude --version 查看版本,用 claude update 更新。如果低于 2.1.222,可能是第 2 章所说的误报。如果使用 Bedrock、Vertex 或网关,2.1.229、2.1.232、2.1.257 中也有相关修复(第 5 章)。

04

逐段排查链路

在 /status 的 Proxy 一行确认正在使用的代理。关掉 VPN 或代理、换一条线路、去掉网关(ANTHROPIC_BASE_URL)直接连接,只要其中某一项让它不再停住,原因就在被去掉的东西里。

05

把单次响应缩短

像“读大量文件之后再写一份长报告”这样的指令,拆成读取和撰写两步。这不是官方针对这条提示列出的对策,但官方在“Request timed out”一项中建议把长任务拆成小的指令。#87972 中也有用户介绍了自己的做法:让单次响应保持简短,就不容易停住。

06

查看故障信息

在 status.claude.com 确认是否有正在发生的故障。不过 #90005 的报告者写道,在一直停住的时间段里,状态页显示的是“一切正常”。不要因为是绿色就断定是本地的问题。

07

如果链路会长时间沉默,就延长监视时间

在代理或网关会把响应囤积起来的环境中,延长字节级监视可以减少被切断的情况。像下面这样写在配置文件的 env 里。后台代理有时收不到 shell 的环境变量,所以官方推荐用配置文件,而不是在 shell 里 export。

写在 ~/.claude/settings.json 中的例子(把字节级监视设为 10 分钟)。

{
  "env": {
    "CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS": "600000"
  }
}
环境变量官方说明
CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS只设定字节级监视的时间。会被限制在 10 秒~30 分钟之间。v2.1.210 及以后
CLAUDE_STREAM_IDLE_TIMEOUT_MS同时设定字节级和事件级的时间。不足 5 分钟的会被提高到 5 分钟,字节级的上限是 30 分钟
API_FORCE_IDLE_TIMEOUT设为 0 关闭 5 分钟的正文空闲超时,设为 1 则对所有提供商生效。与监视计时器相互独立
CLAUDE_CODE_MAX_RETRIES重试次数(默认 10)。这条提示的场景本来就设计为不重新发送,所以调大也不会让它变少

不建议关闭监视

把 CLAUDE_ENABLE_BYTE_WATCHDOG 或 CLAUDE_ENABLE_STREAM_WATCHDOG 设为 0,监视本身就会停止。官方把这些计时器说明为“为了让死掉的连接不会一直卡住,而是失败并被重试”。关掉之后提示虽然消失了,却会对真正停住的连接一直等下去。另外,如果服务器的数据确实停了,延长时间也只会让失败来得更晚。

7. 确认是否已经解决

不要因为一次没出现就算完事,要在跑同等规模的工作时检查下面 4 点。

版本

用 claude --version 确认更新是否生效。IDE 扩展或桌面应用中捆绑的版本,有时与 CLI 分开更新

等待横幅

即使出现 Waiting for API response,只要能自动消失,说明无声的时间很短。官方建议,如果每次尝试都出现,就当作网络问题处理

调试日志

用 claude --debug 启动,日志会写到 ~/.claude/debug/<session-id>.txt。#88900 和 #89027 的报告者在切断的时间点看到了以“Streaming idle timeout (byte-level)”开头的行(这行文字没有写在官方文档里)

会话日志中的次数

会话以 JSONL 格式保存在 ~/.claude/projects/ 下。在更新或修改设置的前后,数一数这条文字出现的次数并比较。官方提醒,该格式供内部使用,会随版本变化

# 查看版本
claude --version

# 一边记录调试日志一边启动
claude --debug

# 统计包含这条文字的会话日志文件数(macOS、Linux)
grep -rl "The response stopped arriving" ~/.claude/projects/ | wc -l

# 同样,统计包含这条文字的行数(PowerShell)
Get-ChildItem "$HOME\.claude\projects" -Recurse -Filter *.jsonl | Select-String -SimpleMatch "The response stopped arriving" | Measure-Object

次数请只作为参考。#90005 的报告者写道,某段 85 分钟内屏幕上停了 15 次,会话日志里留下的记录却只有 1 条。即使会话日志是 0 次,自己也记下屏幕上停住的次数会更可靠。

8. 报告时要留下的信息

官方错误参考列出了问题无法解决时的 4 个渠道。

  • 在 Claude Code 中执行 /feedback。会话记录和说明会发送给 Anthropic,也可以打开一个已填好内容的 GitHub Issue。使用 Bedrock、Vertex 等提供商时,不会发送,而是保存在本地
  • 在 shell 中执行 claude doctor,查看对安装情况的只读诊断
  • 在 status.claude.com 确认故障
  • 查找 GitHub 上已有的 Issue。新旧两种文字都要搜索

报告备忘模板

环境
claude --version 的结果/操作系统/使用的位置(终端的 CLI、VS Code 扩展、桌面应用)
链路
直连 API,还是 Bedrock、Vertex、网关(ANTHROPIC_BASE_URL)/有无代理和 VPN
提示
错误全文/发生时间和时区/之前是否出现过 Waiting for API response/是主会话还是子代理
频率
每天的次数和开始出现的日期/当天是否做过更新或修改设置
试过的办法
更新、关掉 VPN 或代理、换线路、拆分轮次,前后有什么变化

9. 已确定的事与未确定的事

✅ 可以在官方资料中确认的

  • 含义是“连接仍然开着,数据停了,监视计时器将其切断”
  • v2.1.227 之前显示为 Response stalled mid-stream
  • 已完成的输出会保留,恢复方法是 continue
  • 为了不把同一个工具调用执行两次,不重新发送
  • v2.1.222 之前,在网关或完成后停住的情况下有误报

🟡 有报告但未确定

  • 本地线路正常也会停住(#88900、#90005)
  • 到达几 KB 时停住,多个会话同时发生(#88900)
  • 会话日志中的记录比屏幕上的次数少(#90005)
  • 旧文字的时代可以用 Stop 钩子自动恢复(#87972)

🔴 尚未公布的

  • 数据停住原因的官方说明(上述 Issue 没有公开回复)
  • 停在本地、链路还是服务器
  • 改名的理由(CHANGELOG 没有记载)

10. 总结

“API Error: The response stopped arriving”表示响应输出到一半之后,连接仍然开着,数据却停了,Claude Code 的监视计时器将其切断。它和 v2.1.227 之前的 Response stalled mid-stream 是同一回事,已完成的输出会保留下来。请先确认工作的状态,再回复 continue。

如果反复出现,就按顺序尝试:更新版本;逐一排查 VPN、代理和网关;设法缩短单次响应。仅在链路会长时间沉默的环境中,才有延长字节级监视时间这个办法。它与连接本身断开的 Connection lost mid-response 要怀疑的地方不同,所以请先对照提示的文字。其他错误整理在 Claude Code 常见错误与解决方法汇总中。

FAQ

Q. “API Error: The response stopped arriving”是什么意思?
A. 意思是响应正在输出时,连接仍然开着,数据却不再送达,于是 Claude Code 的监视计时器切断了这个连接。这是在完成一段文字或一次工具调用之后停住时的提示,之前的输出都会保留。

Q. 它和“Response stalled mid-stream”是不同的错误吗?
A. 是同一个。官方错误参考明确写着,v2.1.227 之前这条提示是 Response stalled mid-stream。只是显示的文字变了,并不是出现了新的故障类型。

Q. 回复什么才能接着做?
A. 请回复 continue,它会从最后完成的块继续。如果停在文件操作或命令执行的途中,先用 git status 等确认实际状态再回复,会更稳妥。

Q. 调大重试次数就不会再出现了吗?
A. 不会。在这个场景下,为了不把同一个工具调用执行两次,Claude Code 本来就设计为不重新发送。CLAUDE_CODE_MAX_RETRIES 起作用的是输出开始之前的失败。

Q. 它和“Connection lost mid-response”有什么不同?
A. lost 判定的是连接本身断开,stopped arriving 判定的是连接还在但数据不再到来。两者已完成的输出都会保留,都能用 continue 接着做,但调整监视时间只可能对 stopped arriving 这一侧起作用。

参考的一手资料