Claude API 流式输出(SSE)实战指南:从打字机效果到 Agent 工具调用完整落地
很多人第一次接 Claude API,基本都从开始:发请求、等返回、打印结果。刚开始做 Demo 没问题,但只要项目进入真实场景,很快就会发现这种模式根本撑不住。聊天框会白屏十几秒,长文本生成经常超时,Agent 工具调用必须傻等整轮响应结束,Cursor 那种“边生成边输出”的体验完全做不出来。真正到了生产环境,你会发现:Claude API 的核心能力,其实不是 messages.create
Claude API 流式输出(SSE)实战指南:从打字机效果到 Agent 工具调用完整落地
很多人第一次接 Claude API,基本都从 messages.create() 开始:发请求、等返回、打印结果。刚开始做 Demo 没问题,但只要项目进入真实场景,很快就会发现这种模式根本撑不住。
聊天框会白屏十几秒,长文本生成经常超时,Agent 工具调用必须傻等整轮响应结束,Cursor 那种“边生成边输出”的体验完全做不出来。
真正到了生产环境,你会发现:Claude API 的核心能力,其实不是 messages.create(),而是 SSE 流式输出。
尤其是现在越来越多人开始做:
-
Claude Code 工作流
-
AI IDE
-
Agent 框架
-
RAG 问答系统
-
AI 客服
-
自动代码修复
-
长文生成平台
这些场景里,不上流式基本等于不可用。
本文会完整讲清楚:
-
Claude SSE 的事件结构
-
Python / Node.js / cURL 三套可运行代码
-
Tool Use 流式调用
-
前端打字机效果
-
断流重连
-
Nginx / Cloudflare 反代避坑
-
国内环境如何稳定接入 Claude SSE
为什么 Claude API 必须使用流式输出
很多开发者会把流式理解成“体验优化”,但实际上,它已经属于工程层面的刚需。
最典型的问题就是长输出。
现在 Claude Opus 4.7 很多人拿来跑:
-
AI 写作
-
长代码生成
-
项目分析
-
多文件重构
-
Agent 推理
这种场景下,一次输出几千 tokens 很正常。如果走普通非流式请求,用户会面对:
白屏几十秒。
更麻烦的是,大量反向代理默认超时只有 60 秒。很多人看到的 524、504,本质上不是 Claude 崩了,而是:
你的代理层先断了。
流式模式最大的意义不是“更快结束”,而是:
更快出现首 token。
哪怕总耗时一样,只要 700ms 内能看到首字,用户感知就完全不同。
Cursor、Claude Code、Cherry Studio 之所以体验顺滑,本质上全靠 SSE。
Claude API 流式输出的核心结构
Claude 的流式协议底层走的是 SSE(Server-Sent Events)。很多人第一次解析会懵,因为它和 OpenAI 的 chunk 结构不一样。Claude SSE 最重要的不是代码,而是先理解事件结构。一次完整响应,本质上是一串连续事件。
最核心的几个:
-
message_start -
content_block_start -
content_block_delta -
content_block_stop -
message_delta -
message_stop
其中真正决定你前端显示逻辑的,是:
content_block_delta
文本内容会不断以 delta 形式推送。而且 Claude 的 content block 不一定是 text。它还可能是:
-
thinking
-
tool_use
-
tool_result
所以很多人第一次做 Agent 会踩坑。因为tool_use 的增量不是 text,而是 partial_json。
这个后面会重点讲。
国内开发者如何稳定接入 Claude SSE
这是现在很多人真正卡住的地方。
理论上官方 Anthropic API 支持流式没问题,但国内环境里实际会出现:
-
长连接断流
-
npm 安装失败
-
Claude Code 无法连接
-
SSE 中途 reset
-
Cloudflare 超时
-
HTTP/2 异常断开
尤其流式输出对网络稳定性要求比普通 API 高很多。因为SSE 本质是长连接。如果网络不稳定,前端会频繁中断。所以现在很多开发者会直接换成兼容 Anthropic 协议的国内优化入口。
我自己最近在跑:
-
Claude Code
-
RooCode
-
OpenHands
-
Cursor Agent
-
长文本流式生成
时,用得比较稳定的是 ClaudeAPI 的 SSE 接入点。打开 ClaudeAPI.com,注册登录后进入控制台。在 API 令牌页面创建 Key,会得到一串 sk- 开头的字符串。
这里有三个必须注意的点:
这个 Key 只会显示一次,之后无法完整查看 很多 401 错误来自复制时多了空格 Key 一旦泄露,会直接被盗刷这一点在生产环境里非常关键。创建 Key 后,直接替换 base_url 即可。
流式接口入口:
base_url="https://gw.claudeapi.com"
这一点非常关键。因为很多人其实代码没问题,真正的问题是官方 SSE 长连接在国内网络下不稳定。
Python 流式输出(推荐方案)
Anthropic SDK 已经帮你封装好了 SSE 解析,所以 Python 是最简单的。安装 SDK:
pip install anthropic
最小流式示例:
import anthropic
client = anthropic.Anthropic(
api_key="sk-你的ClaudeAPI密钥",
base_url="https://gw.claudeapi.com"
)
with client.messages.stream(
model="claude-opus-4-7",
max_tokens=2048,
messages=[
{
"role": "user",
"content": "写一篇关于 AI Agent 的技术博客"
}
]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final_message = stream.get_final_message()
print(
final_message.usage.input_tokens,
final_message.usage.output_tokens
)
这里最关键的是:
stream.text_stream
它已经自动帮你过滤掉:
-
thinking
-
tool_use
-
message_delta
只保留文本增量。如果你只是做聊天框,这种方式最省事。
Node.js 流式输出
Node.js 的 SDK 写法和 Python 很像。安装:
npm install @anthropic-ai/sdk
然后直接:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "sk-你的ClaudeAPI密钥",
baseURL: "https://gw.claudeapi.com",
});
const stream = client.messages.stream({
model: "claude-opus-4-7",
max_tokens: 2048,
messages: [
{
role: "user",
content: "解释什么是 SSE 流式输出"
}
]
});
for await (const event of stream) {
if (
event.type === "content_block_delta" &&
event.delta.type === "text_delta"
) {
process.stdout.write(event.delta.text);
}
}
很多人第一次看到这里会觉得复杂。其实核心就一句Claude SSE 本质就是不断收到 delta。
cURL 调试 SSE(非常重要)
真正排查问题时,不要先怀疑 SDK。直接用 cURL 看原始事件流最快。
curl -N https://gw.claudeapi.com/v1/messages \
-H "x-api-key: sk-你的ClaudeAPI密钥" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model":"claude-opus-4-7",
"stream":true,
"max_tokens":1024,
"messages":[
{
"role":"user",
"content":"Hello"
}
]
}'
重点一定是:
-N
否则 cURL 默认会缓冲输出,你会误以为 SSE 没生效。
Tool Use 流式输出才是真正的大坑
很多人做 Agent 时,最大的坑都在这里。因为:
tool_use
返回的不是普通文本。工具参数会以:
partial_json
的形式一点点推送。错误写法:
json.loads(delta.partial_json)
这会直接报错。因为JSON 还没传完。正确方式一定是:
-
先字符串拼接
-
content_block_stop 后再 parse
示例:
tool_inputs = {}
if event.delta.type == "input_json_delta":
tool_inputs[event.index] += event.delta.partial_json
等:
content_block_stop
时再:
json.loads(...)
这是现在绝大多数 Agent 项目都会踩的坑。
前端打字机效果怎么做
很多人以为浏览器直接 EventSource 就行。但实际上:EventSource 不支持自定义 Header。也就是说:
API Key 没法传。
正确方式一般是前端 → 自己后端 → Claude API
由后端做代理转发 SSE。
Express 示例:
res.setHeader("Content-Type", "text/event-stream");
res.setHeader("Cache-Control", "no-cache");
res.setHeader("Connection", "keep-alive");
前端再用:
fetch + ReadableStream
持续读取 chunk。
这里还有个经典坑:
SSE 的:
\n\n
分隔符可能被 chunk 截断。
所以必须维护 buffer。
否则前端一定丢字。
SSE 生产环境最容易踩的几个坑
第一个坑是 Nginx 默认缓冲。
很多人明明开了 stream,但前端就是等几十秒才一起返回。
原因其实是:
proxy_buffering on;
必须关闭:
proxy_buffering off;
第二个坑是 Cloudflare。
很多人 CDN 默认缓存 SSE。
结果首 token 永远出不来。
第三个坑是移动网络断流。
尤其国内移动端切 WiFi / 4G 时,SSE 特别容易中断。
所以生产环境一定要做:
-
网络异常重试
-
上下文续写
-
增量恢复
否则用户体验会非常差。
为什么现在越来越多 AI IDE 都基于 SSE
因为真正的 AI 编程体验,本质上就是:
持续增量输出。
你会发现:
-
Cursor
-
Claude Code
-
RooCode
-
OpenHands
-
Continue.dev
底层几乎都 heavily 依赖流式。
因为 Agent 的本质不是“一次回答”。
而是:
-
边思考
-
边调用工具
-
边生成内容
-
边更新状态
SSE 恰好就是最适合这种工作流的协议。
小结
很多人以为 Claude API 最核心的是模型能力,但真正开始做工程后会发现:
流式输出能力,才决定了产品体验。
尤其现在 AI 应用越来越 Agent 化之后:
-
Tool Use
-
长上下文
-
多轮推理
-
IDE 集成
-
实时生成
这些能力都高度依赖 SSE。
真正要记住的核心其实只有三件事:
第一,先理解 Claude 的事件结构,再写解析逻辑。
第二,Tool Use 的 partial_json 必须拼接后再解析。
第三,国内环境下做 SSE,一定优先考虑稳定长连接。
否则你会发现:
模型明明很强,但用户体验烂得像 2015 年的网页聊天室。
更多推荐




所有评论(0)