教程

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

相关文章推荐

教程Anthropic Claude API 完整开发指南 2026:Prompt 缓存、自适应推理、工具调用全解析Claude API 2026 年完整开发指南:模型选型和最新定价(Haiku/Sonnet/Opus 对比)、Prompt 缓存实现(最高节省 90% 成本,含代码示例)、自适应推理替代旧 budget_tokens(含流式实现)、工具调用完整循环、流式响应(含 Next.js App Router 示例)、视觉能力(Opus 4.7 支持 3.75MP),以及生产最佳实践(重试、成本监控)。2026/4/24教程Anthropic Claude SDK Java 完全接入指南:Java/Spring Boot 调用 Claude API(2026)Anthropic 官方 Java SDK 完整使用指南:Maven/Gradle 安装、基础消息调用、流式输出(Streaming/SSE)、Spring Boot 集成(@Bean/@Service/REST API)、多轮对话状态管理、异步调用(CompletableFuture 并发)、Spring WebFlux 流式 SSE 接口,覆盖 Claude Sonnet/Haiku 全系列模型,附企业级生产代码示例。2026/3/27教程Anthropic Claude SDK Go 完全接入指南:Go 语言调用 Claude API 实战(2026)Anthropic 官方 Go SDK 完整使用指南:安装配置、基础消息调用、流式输出(Streaming)、多轮对话状态管理、System Prompt 设置、并发批量调用(信号量控制并发/Rate Limit)、图片视觉理解(Vision/Base64)、错误处理与自动重试,覆盖 Claude Sonnet/Haiku 全系列模型,附生产级代码示例。2026/3/27教程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