教程

Claude API 流式输出完全指南:Server-Sent Events 实时响应实战

Claude API 流式输出(Streaming)完整教程:为什么用流式输出(用户体验提升50%+)、Server-Sent Events 协议原理、Python/Node.js/curl 三种实现方式、stream=True 的事件类型(message_start/content_block_delta/message_stop)、流式 Tool Use 的特殊处理、在 FastAPI/Express/Next.js 中实现流式 API 端点,以及流式输出的错误处理和超时配置。

2026/3/204分钟 阅读ClaudeEagle

流式输出让用户看到 Claude 「边想边说」,而不是等待整个回复生成完再显示, 大幅提升交互体验——尤其是长回复时效果最明显。

为什么用流式输出?

对比普通请求流式请求
用户等待时间完整生成才显示(可能 10s+)几百毫秒内开始看到文字
感知响应速度快(提升 50%+ 主观体验)
适合场景程序批处理聊天界面、代码生成
实现复杂度简单略复杂(需处理 SSE 事件流)

Python 流式输出

方式一:with_streaming_response(推荐)

python
import anthropic

client = anthropic.Anthropic()

with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    messages=[{"role": "user", "content": "写一个完整的 Python 爬虫示例"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

# 获取最终消息(含 usage 统计)
final = stream.get_final_message()
print(f"

共消耗 {final.usage.input_tokens} 输入 + {final.usage.output_tokens} 输出 tokens")

方式二:raw 事件流

python
with client.messages.stream(...) as stream:
    for event in stream:
        if event.type == "content_block_delta":
            if event.delta.type == "text_delta":
                print(event.delta.text, end="", flush=True)
        elif event.type == "message_stop":
            print("\n[生成完毕]")

异步版本(async/await)

python
import asyncio
import anthropic

async def stream_response(prompt: str):
    client = anthropic.AsyncAnthropic()
    async with client.messages.stream(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    ) as stream:
        async for text in stream.text_stream:
            print(text, end="", flush=True)

asyncio.run(stream_response("解释什么是协程"))

Node.js / TypeScript 流式输出

typescript
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

async function streamChat(prompt: string) {
  const stream = await client.messages.stream({
    model: "claude-sonnet-4-6",
    max_tokens: 2048,
    messages: [{ role: "user", content: prompt }],
  });

  // 方式一:async iterator
  for await (const chunk of stream) {
    if (
      chunk.type === "content_block_delta" &&
      chunk.delta.type === "text_delta"
    ) {
      process.stdout.write(chunk.delta.text);
    }
  }

  // 方式二:事件监听
  stream.on("text", (text) => process.stdout.write(text));
  stream.on("message", (msg) => console.log("
使用量:", msg.usage));
  await stream.done();
}

SSE 事件类型完整说明

流式响应由多个 SSE 事件组成:

event: message_start ← 消息开始,包含 message_id 和初始 usage data: {"type": "message_start", "message": {"id": "msg_xxx", ...}} event: content_block_start ← 内容块开始(文本或工具调用) data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text"}} event: content_block_delta ← 增量文本(核心事件,持续发送) data: {"type": "content_block_delta", "delta": {"type": "text_delta", "text": "你好"}} event: content_block_stop ← 内容块结束 data: {"type": "content_block_stop", "index": 0} event: message_delta ← 消息结束,包含 stop_reason 和最终 usage data: {"type": "message_delta", "delta": {"stop_reason": "end_turn"}, "usage": {...}} event: message_stop ← 流结束 data: {"type": "message_stop"}

在 Web 框架中实现流式 API

FastAPI(Python)

python
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import anthropic

app = FastAPI()
client = anthropic.Anthropic()

@app.get("/chat/stream")
async def chat_stream(prompt: str):
    async def generate():
        with client.messages.stream(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            messages=[{"role": "user", "content": prompt}],
        ) as stream:
            for text in stream.text_stream:
                # SSE 格式
                yield f"data: {json.dumps({'text': text})}\n\n"
        yield "data: [DONE]\n\n"

    return StreamingResponse(generate(), media_type="text/event-stream")

Next.js App Router(Edge Runtime)

typescript
// app/api/chat/route.ts
import Anthropic from "@anthropic-ai/sdk";

export const runtime = "edge";

export async function POST(req: Request) {
  const { messages } = await req.json();
  const client = new Anthropic();

  const encoder = new TextEncoder();
  const stream = new ReadableStream({
    async start(controller) {
      const anthropicStream = await client.messages.stream({
        model: "claude-sonnet-4-6",
        max_tokens: 2048,
        messages,
      });

      for await (const chunk of anthropicStream) {
        if (
          chunk.type === "content_block_delta" &&
          chunk.delta.type === "text_delta"
        ) {
          controller.enqueue(
            encoder.encode(`data: ${JSON.stringify({ text: chunk.delta.text })}\n\n`)
          );
        }
      }
      controller.enqueue(encoder.encode("data: [DONE]\n\n"));
      controller.close();
    },
  });

  return new Response(stream, {
    headers: {
      "Content-Type": "text/event-stream",
      "Cache-Control": "no-cache",
    },
  });
}

前端消费 SSE

typescript
// 使用 EventSource API
const evtSource = new EventSource("/api/chat/stream?prompt=你好");
evtSource.onmessage = (event) => {
  if (event.data === "[DONE]") {
    evtSource.close();
    return;
  }
  const { text } = JSON.parse(event.data);
  setResponse((prev) => prev + text);
};

// 或使用 fetch + ReadableStream(支持 POST)
const resp = await fetch("/api/chat", {
  method: "POST",
  body: JSON.stringify({ messages }),
  headers: { "Content-Type": "application/json" },
});
const reader = resp.body!.getReader();
const decoder = new TextDecoder();
while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  const chunk = decoder.decode(value);
  // 解析 SSE 数据
}

来源:Anthropic 官方文档 - docs.anthropic.com/en/api/messages-streaming

相关文章推荐

教程Claude API Vision 图像理解完全指南:图片分析、截图解读与多图处理Claude API 视觉能力(Vision)完整使用指南:支持的图像格式(PNG/JPEG/GIF/WebP)与大小限制、Base64 编码图像传入方式、URL 直接引用图像、多张图片同时分析、图像与文字混合输入、典型应用场景(截图调试/图表解读/文档扫描/UI分析)、图像 Token 计算方式和成本优化,以及 Python/TypeScript 完整代码示例。2026/3/20教程Anthropic Node.js SDK 完全指南:TypeScript/JavaScript 接入 Claude APIAnthropic 官方 Node.js SDK(@anthropic-ai/sdk)完整教程:安装与初始化、基础对话调用、流式输出(stream)、图像输入(Base64/URL)、Tool Use 函数调用、系统提示、消息历史管理、Prompt Caching 配置、错误处理最佳实践(指数退避重试),以及 TypeScript 类型系统深度使用,适合 Node.js / Next.js / NestJS 开发者快速上手。2026/3/20教程Claude Code 输出格式控制完全指南:JSON、流式、结构化输出使用方法Claude Code 和 Claude API 输出格式完整控制指南:--output-format 参数(text/json/stream-json)、非交互模式(-p)的输出控制、结构化 JSON 输出(--json-schema 字段约束)、流式输出(Server-Sent Events)的处理方式、include-partial-messages 流式渐进显示、以及 CI/CD 管道中解析 JSON 输出的实用技巧。2026/3/18教程Anthropic Python SDK 完全指南:从安装到生产级集成的最佳实践Anthropic Python SDK 完整使用指南:安装配置、同步与异步客户端、流式输出、工具调用(Tool Use)、视觉 API、Prompt Caching、错误处理与重试、Token 用量追踪、httpx 客户端自定义,以及在 Django/FastAPI/Flask 框架中的集成最佳实践。2026/3/16教程Claude API Key 申请完整教程:从注册 Anthropic Console 到第一次调用Claude API Key 申请完整指南:Anthropic Console 注册、充值方式、API Key 生成与管理、Python/curl 第一次调用验证、用量监控、费用控制与限额设置,以及免费额度和各模型计费说明。2026/3/15教程大模型 Token 是什么?如何估算成本并减少 API 费用大模型 Token 完整解析:Token 定义与中英文计算规律、API 费用双向计费机制、上下文长度与成本关系,以及 5 个降低 API 费用的方法(选对模型/批量 API 省 50%/Prompt 缓存省 90%/控制输出长度/管理对话上下文),附 Anthropic Console 成本监控指南。2026/3/13