“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:”后面的措辞
“停住了”和“断开了”的提示,按原因用的是不同的文字
输出开始之后,连接仍然开着,数据却停了
输出开始之后,连接本身断开了
思考结束后,一个输出都还没开始就停了
响应在没有可用数据的情况下结束,已改用非流式重新发送
目录
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-stream | The response stopped arriving | 本文 |
Response stalled while thinking, before producing a response | The response stalled before a response was produced | 本文第 3 章 |
Connection closed mid-response | Connection lost mid-response | closed 和 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 会保留已完成的部分,不丢弃这一轮,而是加上注记。
| 提示 | 发生了什么 | 留下的输出与重新发送 |
|---|---|---|
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 步就可以了。
确认留下的输出和工作的实际状态
已完成的工具调用已经执行了。如果停在改写文件或执行命令的途中,先用 git status 或 git diff 看看改到了哪里。
回复 continue
这是官方的恢复步骤,让它从最后完成的块继续。如果把原来的指令从头再贴一遍,就会把已经做完的操作再跑一次。
检查版本并更新
用 claude --version 查看版本,用 claude update 更新。如果低于 2.1.222,可能是第 2 章所说的误报。如果使用 Bedrock、Vertex 或网关,2.1.229、2.1.232、2.1.257 中也有相关修复(第 5 章)。
逐段排查链路
在 /status 的 Proxy 一行确认正在使用的代理。关掉 VPN 或代理、换一条线路、去掉网关(ANTHROPIC_BASE_URL)直接连接,只要其中某一项让它不再停住,原因就在被去掉的东西里。
把单次响应缩短
像“读大量文件之后再写一份长报告”这样的指令,拆成读取和撰写两步。这不是官方针对这条提示列出的对策,但官方在“Request timed out”一项中建议把长任务拆成小的指令。#87972 中也有用户介绍了自己的做法:让单次响应保持简短,就不容易停住。
查看故障信息
在 status.claude.com 确认是否有正在发生的故障。不过 #90005 的报告者写道,在一直停住的时间段里,状态页显示的是“一切正常”。不要因为是绿色就断定是本地的问题。
如果链路会长时间沉默,就延长监视时间
在代理或网关会把响应囤积起来的环境中,延长字节级监视可以减少被切断的情况。像下面这样写在配置文件的 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 这一侧起作用。
参考的一手资料
- Claude Code — Error reference(官方文档):The response above may be incomplete 的 4 条提示与 v2.1.227 的改名、v2.1.222 之前的误报、Automatic retries、等待横幅、No response from API、Streaming response ended before any complete data was received、Report an error
- Claude Code — Enterprise network configuration(官方文档):4 个监视计时器与默认时长、设置用的环境变量、调试日志、向后台代理传递设置的方法
- Claude Code — Environment variables(官方文档):
CLAUDE_STREAM_IDLE_TIMEOUT_MS、CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS、API_FORCE_IDLE_TIMEOUT的说明 - Claude Code — Hooks reference(官方文档):以 API 错误结束的一轮触发的 StopFailure
- Claude Code — Run Claude Code programmatically(官方文档):用
--continue、--resume恢复 - anthropics/claude-code — CHANGELOG(官方):v2.1.222、v2.1.227、v2.1.229、v2.1.232、v2.1.246、v2.1.257 各条目
- GitHub Issue:#88900、#90005、#89027、#87246、#87972(均为用户报告。2026 年 9 月 22 日确认)