Claude Code官方文档Agent SDK流式输入
Claude Agent SDK 流式 vs 单次模式 - 输入模式对比
了解 Claude Agent SDK 的两种输入模式及何时使用每种模式。(原文为英文,已翻译)
· 阅读约 10 分钟
概述
Claude Agent SDK 支持两种不同的输入模式来与代理交互:
- 流式输入模式(默认且推荐) - 持久的、交互式会话
- 单消息输入 - 使用会话状态和恢复的一次性查询
本指南解释了每种模式的差异、优势和用例,以帮助你为应用程序选择正确的方法。
流式输入模式(推荐)
流式输入模式是使用 Claude Agent SDK 的首选方式。它提供对代理功能的完全访问,并实现丰富的交互式体验。
它允许代理作为一个长期运行的进程运行,该进程接收用户输入、处理中断、显示权限请求并管理会话。
工作原理
sequenceDiagram
participant App as Your Application
participant Agent as Claude Agent
participant Tools as Tools/Hooks
participant FS as Environment/<br/>File System
App->>Agent: Initialize with AsyncGenerator
activate Agent
App->>Agent: Yield Message 1
Agent->>Tools: Execute tools
Tools->>FS: Read files
FS-->>Tools: File contents
Tools->>FS: Write/Edit files
FS-->>Tools: Success/Error
Agent-->>App: Stream partial response
Agent-->>App: Stream more content...
Agent->>App: Complete Message 1
App->>Agent: Yield Message 2 + Image
Agent->>Tools: Process image & execute
Tools->>FS: Access filesystem
FS-->>Tools: Operation results
Agent-->>App: Stream response 2
App->>Agent: Queue Message 3
App->>Agent: Interrupt/Cancel
Agent->>App: Handle interruption
Note over App,Agent: Session stays alive
Note over Tools,FS: Persistent file system<br/>state maintained
deactivate Agent
优势
- 图像上传:直接将图像附加到消息中以进行视觉分析和理解
- 排队消息:发送依次处理的多个消息,并具有中断功能
- 工具集成:在会话期间完全访问所有工具和自定义 MCP 服务器
- Hooks 支持:使用生命周期 hooks 在各个点自定义行为
- 实时反馈:在生成时查看响应,而不仅仅是最终结果
- 上下文持久性:自然地在多个回合中维护对话上下文
实现示例
TypeScript
import { query } from "@anthropic-ai/claude-agent-sdk";
import { readFile } from "fs/promises";
async function* generateMessages() {
// First message
yield {
type: "user" as const,
message: {
role: "user" as const,
content: "Analyze this codebase for security issues"
}
};
// Wait for conditions or user input
await new Promise((resolve) => setTimeout(resolve, 2000));
// Follow-up with image
yield {
type: "user" as const,
message: {
role: "user" as const,
content: [
{
type: "text",
text: "Review this architecture diagram"
},
{
type: "image",
source: {
type: "base64",
media_type: "image/png",
data: await readFile("diagram.png", "base64")
}
}
]
}
};
}
// Process streaming responses
for await (const message of query({
prompt: generateMessages(),
options: {
maxTurns: 10,
allowedTools: ["Read", "Grep"]
}
})) {
if (message.type === "result") {
console.log(message.result);
}
}
Python
from claude_agent_sdk import (
ClaudeSDKClient,
ClaudeAgentOptions,
AssistantMessage,
TextBlock,
)
import asyncio
import base64
async def streaming_analysis():
async def message_generator():
# First message
yield {
"type": "user",
"message": {
"role": "user",
"content": "Analyze this codebase for security issues",
},
}
# Wait for conditions
await asyncio.sleep(2)
# Follow-up with image
with open("diagram.png", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
yield {
"type": "user",
"message": {
"role": "user",
"content": [
{"type": "text", "text": "Review this architecture diagram"},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data,
},
},
],
},
}
# Use ClaudeSDKClient for streaming input
options = ClaudeAgentOptions(max_turns=10, allowed_tools=["Read", "Grep"])
async with ClaudeSDKClient(options) as client:
# Send streaming input
await client.query(message_generator())
# Process responses
async for message in client.receive_response():
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
print(block.text)
asyncio.run(streaming_analysis())
单消息输入
单消息输入更简单,但有更多限制。
何时使用单消息输入
在以下情况下使用单消息输入:
- 你需要一次性响应
- 你不需要图像附件、hooks 等
- 你需要在无状态环境中运行,例如 lambda 函数
限制
⚠️ 单消息输入模式不支持:
- 消息中的直接图像附件
- 动态消息排队
- 实时中断
- Hook 集成
- 自然的多轮对话
实现示例
TypeScript
import { query } from "@anthropic-ai/claude-agent-sdk";
// Simple one-shot query
for await (const message of query({
prompt: "Explain the authentication flow",
options: {
maxTurns: 1,
allowedTools: ["Read", "Grep"]
}
})) {
if (message.type === "result") {
console.log(message.result);
}
}
// Continue conversation with session management
for await (const message of query({
prompt: "Now explain the authorization process",
options: {
continue: true,
maxTurns: 1
}
})) {
if (message.type === "result") {
console.log(message.result);
}
}
Python
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
import asyncio
async def single_message_example():
# Simple one-shot query using query() function
async for message in query(
prompt="Explain the authentication flow",
options=ClaudeAgentOptions(max_turns=1, allowed_tools=["Read", "Grep"]),
):
if isinstance(message, ResultMessage):
print(message.result)
# Continue conversation with session management
async for message in query(
prompt="Now explain the authorization process",
options=ClaudeAgentOptions(continue_conversation=True, max_turns=1),
):
if isinstance(message, ResultMessage):
print(message.result)
asyncio.run(single_message_example())
本文翻译自 Anthropic Claude Code 官方文档,最近一次同步:2025-05-01。