所有文章

Claude Code Streaming response ended before any complete data 是什么意思?原因和解决办法

Claude Code 提示 Streaming response ended before any complete data,多半是代理或中转缓冲了流。让 SSE 原样转发,再用 curl -N 测试,2.1.318 实测。

Claude Code streaming response ended before any complete data

Streaming response ended before any complete data was received 表示模型服务商返回的流式响应还没给出一个完整事件就结束了,Claude Code 只好用非流式方式把同一个请求再发一遍,把这一轮回答补完。常见原因是 Claude Code 和服务商之间的代理、网关或中转把流缓冲了、改写了或丢掉了。解决办法是让中间层原样转发 text/event-stream 响应体和响应头,再用 curl -N 测一遍。我们在 2026 年 11 月 5 日用 Claude Code 2.1.318 复现了这条提示,以下内容以 官方报错文档为准。

完整提示:

Streaming response ended before any complete data was received. Retrying without streaming. If this keeps happening, check any proxy or gateway between Claude Code and your model provider.

Streaming response ended before any complete data 是什么意思

Claude Code 用 SSE(server-sent events)流式接收每一次回复,逐个事件读取。流在第一个完整事件到达前就结束,Claude Code 就改发普通请求,并显示这条警告。文档里写明的几点:

  • 这条警告每个会话只显示一次,而且只在交互会话里显示。v2.1.239 之前,Claude Code 会静默重试。
  • 受影响的请求都会发两次:一次空的流式请求,一次非流式重试。
  • 这一轮回答通常还是能出来,因为重试拿到了结果。代价是每轮都多一次请求、多等一段时间。

实测:Claude Code 2.1.318 收到空的流

我们让隔离环境里的 Claude Code 2.1.318 连接本地模拟 API。模拟 API 对流式请求返回 200、text/event-stream 和空响应体,对非流式请求正常返回:

❯ say ok
● Streaming response ended before any complete data was received. Retrying without streaming. If this keeps happening, check any proxy or gateway between Claude Code and your model provider.
● ok

# what our mock API received for that one prompt
POST /v1/messages  stream=true   -> 200 text/event-stream, empty body
POST /v1/messages  stream=false  -> 200 JSON message

同一会话里再发一句,模拟 API 又收到两个请求,但没有再出现警告,和“每个会话一次”的说明一致。用 claude -p 时界面上什么都不显示,回答照常返回,只有 debug 日志里能看到回退记录:

[ERROR] Stream completed without receiving message_start event - triggering non-streaming fallback
[ERROR] Error streaming, falling back to non-streaming mode: Stream ended without receiving any events

在脚本里跑 Claude Code 的话,要看 --debug-file 的输出,或者在网关日志里找成对出现的请求,一个带 "stream": true,一个不带。

Streaming response ended before any complete data 怎么解决

  1. 找出中间层。检查 ANTHROPIC_BASE_URL、HTTPS_PROXY,以及公司代理、VPN 客户端或中转。接的是第三方接口,比如 Claude Code 国内模型推荐里的配置,那个接口也在这条链路上。
  2. 绕开 Claude Code 单独测流。用 curl 向同一个地址发一个流式请求。用 Bearer token 的话,把 x-api-key 那行换成 Authorization 头:
  3. 看结果。正常的接口会边收边打印事件,最后是 message_stop。响应体为空、只返回一个 JSON、返回 HTML 页面,或者停顿很久后一次性全部吐出来,都说明中间层在吞流或缓冲。
  4. 关掉缓冲和改写。按 官方网关协议文档的要求,流式响应要返回 content-type: text/event-stream,事件按顺序转发到 message_delta 和 message_stop,ping 事件也要保留。nginx 对应的配置是 proxy_buffering off。
  5. Amazon Bedrock 的流是二进制事件流,规则不同,见 Streaming errors behind a gateway or proxy。
  6. 开一个新的交互会话复测。警告不再出现,网关日志里每轮只有一个请求,就说明修好了。
curl -N "$ANTHROPIC_BASE_URL/v1/messages" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"YOUR_MODEL","max_tokens":32,"stream":true,"messages":[{"role":"user","content":"say ok"}]}'

正常的返回是这样的:

event: message_start
data: {"type":"message_start", ...}

event: content_block_delta
data: {"type":"content_block_delta", ...}
...
event: message_stop
data: {"type":"message_stop"}

反向代理模型 API 时,nginx 的最小配置:

location /v1/ {
    proxy_pass https://upstream.example.com;
    proxy_http_version 1.1;
    proxy_buffering off;
}
  • 非流式重试也收到了不是 Claude API 消息的内容(比如 HTML 登录页),会报 API returned an empty or malformed response (HTTP 200),这一轮直接结束(官方说明)。
  • Unable to connect to API 表示根本连不上接口,见 Unable to connect to API 解决办法。
  • 529 是服务商那边繁忙,和代理无关,见 Claude Code 529 Overloaded。

常见问题

这条警告可以不管吗?

回答照样能出来,但每轮都要发两次请求、等两次。把代理修好就能省掉多出来的这一次。

能关掉这条警告吗?

截至 2.1.318,我们在 Claude Code 文档里没找到关闭它的设置。

是 API key 填错了吗?

可能性很小。服务商已经接受了请求(返回 200),问题出在回复回来的路上。认证问题的提示不一样,可以在 Claude Code 报错速查里查。

资料来源:Claude Code 报错文档、LLM 网关协议、Amazon Bedrock 流式说明、nginx proxy_buffering、Claude Code 更新日志(2.1.239)。GitHub 上没有找到引用这条原文的 issue。2026 年 11 月 5 日按 Claude Code 2.1.318 核对。

留下你的想法

你的邮箱不会公开。