安装
在 query() 和 ClaudeSDKClient 之间选择
Python SDK 提供了两种与 Claude Code 交互的方式:
快速比较
| 功能 | query() | ClaudeSDKClient |
|---|---|---|
| 会话 | 每次创建新会话 | 重用同一会话 |
| 对话 | 单次交换 | 同一上下文中的多次交换 |
| 连接 | 自动管理 | 手动控制 |
| 流式输入 | ✅ 支持 | ✅ 支持 |
| 中断 | ❌ 不支持 | ✅ 支持 |
| 钩子 | ❌ 不支持 | ✅ 支持 |
| 自定义工具 | ❌ 不支持 | ✅ 支持 |
| 继续聊天 | ❌ 每次新会话 | ✅ 保持对话 |
| 用例 | 一次性任务 | 持续对话 |
何时使用 query()(每次新会话)
最适合:
- 不需要对话历史的一次性问题
- 不需要来自之前交换的上下文的独立任务
- 简单的自动化脚本
- 当你想每次都重新开始时
何时使用 ClaudeSDKClient(持续对话)
最适合:
- 继续对话 - 当你需要 Claude 记住上下文时
- 后续问题 - 基于之前的回应进行构建
- 交互式应用程序 - 聊天界面、REPL
- 响应驱动的逻辑 - 当下一步操作取决于 Claude 的响应时
- 会话控制 - 显式管理对话生命周期
函数
query()
为每次与 Claude Code 的交互创建一个新会话。返回一个异步迭代器,当消息到达时产生消息。每次调用 query() 都会从头开始,没有之前交互的记忆。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
prompt | str | AsyncIterable[dict] | 输入提示,可以是字符串或异步可迭代对象(用于流式模式) |
options | ClaudeAgentOptions | None | 可选配置对象(如果为 None,默认为 ClaudeAgentOptions()) |
返回
返回一个AsyncIterator[Message],从对话中产生消息。
示例 - 带选项
tool()
用于定义具有类型安全的 MCP 工具的装饰器。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 工具的唯一标识符 |
description | str | 工具功能的人类可读描述 |
input_schema | type | dict[str, Any] | 定义工具输入参数的模式(见下文) |
输入模式选项
-
简单类型映射(推荐):
-
JSON Schema 格式(用于复杂验证):
返回
一个装饰器函数,包装工具实现并返回一个SdkMcpTool 实例。
示例
create_sdk_mcp_server()
创建在 Python 应用程序中运行的进程内 MCP 服务器。
参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
name | str | - | 服务器的唯一标识符 |
version | str | "1.0.0" | 服务器版本字符串 |
tools | list[SdkMcpTool[Any]] | None | None | 使用 @tool 装饰器创建的工具函数列表 |
返回
返回一个McpSdkServerConfig 对象,可以传递给 ClaudeAgentOptions.mcp_servers。
示例
类
ClaudeSDKClient
在多次交换中维护对话会话。 这是 TypeScript SDK 的 query() 函数内部工作方式的 Python 等价物 - 它创建一个可以继续对话的客户端对象。
关键特性
- 会话连续性:在多个
query()调用中维护对话上下文 - 同一对话:Claude 记住会话中的所有之前消息
- 中断支持:可以在 Claude 执行中途停止
- 显式生命周期:你控制会话何时开始和结束
- 响应驱动的流程:可以对响应做出反应并发送后续消息
- 自定义工具和钩子:支持自定义工具(使用
@tool装饰器创建)和钩子
方法
| 方法 | 描述 |
|---|---|
__init__(options) | 使用可选配置初始化客户端 |
connect(prompt) | 连接到 Claude,可选初始提示或消息流 |
query(prompt, session_id) | 在流式模式下发送新请求 |
receive_messages() | 以异步迭代器形式接收来自 Claude 的所有消息 |
receive_response() | 接收消息直到并包括 ResultMessage |
interrupt() | 发送中断信号(仅在流式模式下工作) |
disconnect() | 从 Claude 断开连接 |
上下文管理器支持
客户端可以用作异步上下文管理器以实现自动连接管理:
重要: 在迭代消息时,避免使用 break 提前退出,因为这可能会导致 asyncio 清理问题。相反,让迭代自然完成或使用标志来跟踪何时找到了你需要的内容。
示例 - 继续对话
示例 - 使用 ClaudeSDKClient 进行流式输入
示例 - 使用中断
示例 - 高级权限控制
类型
SdkMcpTool
使用 @tool 装饰器创建的 SDK MCP 工具的定义。
| 属性 | 类型 | 描述 |
|---|---|---|
name | str | 工具的唯一标识符 |
description | str | 人类可读的描述 |
input_schema | type[T] | dict[str, Any] | 输入验证的模式 |
handler | Callable[[T], Awaitable[dict[str, Any]]] | 处理工具执行的异步函数 |
ClaudeAgentOptions
Claude Code 查询的配置数据类。
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
allowed_tools | list[str] | [] | 允许的工具名称列表 |
system_prompt | str | SystemPromptPreset | None | None | 系统提示配置。传递字符串以获得自定义提示,或使用 {"type": "preset", "preset": "claude_code"} 获得 Claude Code 的系统提示。添加 "append" 以扩展预设 |
mcp_servers | dict[str, McpServerConfig] | str | Path | {} | MCP 服务器配置或配置文件路径 |
permission_mode | PermissionMode | None | None | 工具使用的权限模式 |
continue_conversation | bool | False | 继续最近的对话 |
resume | str | None | None | 要恢复的会话 ID |
max_turns | int | None | None | 最大对话轮数 |
disallowed_tools | list[str] | [] | 不允许的工具名称列表 |
model | str | None | None | 要使用的 Claude 模型 |
permission_prompt_tool_name | str | None | None | 权限提示的 MCP 工具名称 |
cwd | str | Path | None | None | 当前工作目录 |
settings | str | None | None | 设置文件的路径 |
add_dirs | list[str | Path] | [] | Claude 可以访问的其他目录 |
env | dict[str, str] | {} | 环境变量 |
extra_args | dict[str, str | None] | {} | 直接传递给 CLI 的其他 CLI 参数 |
max_buffer_size | int | None | None | 缓冲 CLI stdout 时的最大字节数 |
debug_stderr | Any | sys.stderr | 已弃用 - 用于调试输出的类文件对象。改用 stderr 回调 |
stderr | Callable[[str], None] | None | None | CLI 中 stderr 输出的回调函数 |
can_use_tool | CanUseTool | None | None | 工具权限回调函数 |
hooks | dict[HookEvent, list[HookMatcher]] | None | None | 用于拦截事件的钩子配置 |
user | str | None | None | 用户标识符 |
include_partial_messages | bool | False | 包括部分消息流式传输事件 |
fork_session | bool | False | 使用 resume 恢复时,分叉到新会话 ID 而不是继续原始会话 |
agents | dict[str, AgentDefinition] | None | None | 以编程方式定义的子代理 |
plugins | list[SdkPluginConfig] | [] | 从本地路径加载自定义插件。有关详细信息,请参阅 Plugins |
setting_sources | list[SettingSource] | None | None(无设置) | 控制要加载的文件系统设置。省略时,不加载任何设置。注意: 必须包括 "project" 以加载 CLAUDE.md 文件 |
SystemPromptPreset
使用 Claude Code 的预设系统提示和可选添加的配置。
| 字段 | 必需 | 描述 |
|---|---|---|
type | 是 | 必须是 "preset" 以使用预设系统提示 |
preset | 是 | 必须是 "claude_code" 以使用 Claude Code 的系统提示 |
append | 否 | 要附加到预设系统提示的其他说明 |
SettingSource
控制 SDK 加载设置的文件系统配置源。
| 值 | 描述 | 位置 |
|---|---|---|
"user" | 全局用户设置 | ~/.claude/settings.json |
"project" | 共享项目设置(版本控制) | .claude/settings.json |
"local" | 本地项目设置(gitignored) | .claude/settings.local.json |
默认行为
当setting_sources 被省略或为 None 时,SDK 不会加载任何文件系统设置。这为 SDK 应用程序提供了隔离。
为什么使用 setting_sources?
加载所有文件系统设置(旧版行为):设置优先级
加载多个源时,设置按此优先级(从高到低)合并:- 本地设置(
.claude/settings.local.json) - 项目设置(
.claude/settings.json) - 用户设置(
~/.claude/settings.json)
agents、allowed_tools)始终覆盖文件系统设置。
AgentDefinition
以编程方式定义的子代理的配置。
| 字段 | 必需 | 描述 |
|---|---|---|
description | 是 | 何时使用此代理的自然语言描述 |
tools | 否 | 允许的工具名称数组。如果省略,继承所有工具 |
prompt | 是 | 代理的系统提示 |
model | 否 | 此代理的模型覆盖。如果省略,使用主模型 |
PermissionMode
用于控制工具执行的权限模式。
McpSdkServerConfig
使用 create_sdk_mcp_server() 创建的 SDK MCP 服务器的配置。
McpServerConfig
MCP 服务器配置的联合类型。
McpStdioServerConfig
McpSSEServerConfig
McpHttpServerConfig
SdkPluginConfig
SDK 中加载插件的配置。
| 字段 | 类型 | 描述 |
|---|---|---|
type | Literal["local"] | 必须是 "local"(目前仅支持本地插件) |
path | str | 插件目录的绝对或相对路径 |
消息类型
Message
所有可能消息的联合类型。
UserMessage
用户输入消息。
AssistantMessage
具有内容块的助手响应消息。
SystemMessage
带有元数据的系统消息。
ResultMessage
带有成本和使用信息的最终结果消息。
内容块类型
ContentBlock
所有内容块的联合类型。
TextBlock
文本内容块。
ThinkingBlock
思考内容块(用于具有思考能力的模型)。
ToolUseBlock
工具使用请求块。
ToolResultBlock
工具执行结果块。
错误类型
ClaudeSDKError
所有 SDK 错误的基础异常类。
CLINotFoundError
当 Claude Code CLI 未安装或未找到时引发。
CLIConnectionError
当连接到 Claude Code 失败时引发。
ProcessError
当 Claude Code 进程失败时引发。
CLIJSONDecodeError
当 JSON 解析失败时引发。
钩子类型
HookEvent
支持的钩子事件类型。请注意,由于设置限制,Python SDK 不支持 SessionStart、SessionEnd 和 Notification 钩子。
HookCallback
钩子回调函数的类型定义。
input_data:钩子特定的输入数据(参见 钩子文档)tool_use_id:可选的工具使用标识符(用于工具相关的钩子)context:带有其他信息的钩子上下文
decision:"block"以阻止操作systemMessage:要添加到记录的系统消息hookSpecificOutput:钩子特定的输出数据
HookContext
传递给钩子回调的上下文信息。
HookMatcher
用于将钩子匹配到特定事件或工具的配置。
钩子使用示例
工具输入/输出类型
所有内置 Claude Code 工具的输入/输出模式文档。虽然 Python SDK 不将这些导出为类型,但它们代表消息中工具输入和输出的结构。Task
工具名称:Task
输入:
Bash
工具名称:Bash
输入:
Edit
工具名称:Edit
输入:
Read
工具名称:Read
输入:
Write
工具名称:Write
输入:
Glob
工具名称:Glob
输入:
Grep
工具名称:Grep
输入:
NotebookEdit
工具名称:NotebookEdit
输入:
WebFetch
工具名称:WebFetch
输入:
WebSearch
工具名称:WebSearch
输入:
TodoWrite
工具名称:TodoWrite
输入:
BashOutput
工具名称:BashOutput
输入:
KillBash
工具名称:KillBash
输入:
ExitPlanMode
工具名称:ExitPlanMode
输入:
ListMcpResources
工具名称:ListMcpResources
输入:
ReadMcpResource
工具名称:ReadMcpResource
输入:
使用 ClaudeSDKClient 的高级功能
构建持续对话界面
使用钩子进行行为修改
实时进度监控
示例用法
基本文件操作(使用 query)
错误处理
使用客户端的流式模式
使用 ClaudeSDKClient 的自定义工具
另请参阅
- Python SDK 指南 - 教程和示例
- SDK 概述 - 一般 SDK 概念
- TypeScript SDK 参考 - TypeScript SDK 文档
- CLI 参考 - 命令行界面
- 常见工作流 - 分步指南