安装
在 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 模式格式(用于复杂验证):
返回值
一个装饰器函数,包装工具实现并返回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] | [] | 允许的工具名称列表 |
max_thinking_tokens | int | 8000 | 思考过程的最大令牌数 |
system_prompt | str | None | None | 系统提示配置。传递字符串用于自定义提示,或使用 Claude Code 系统提示的预设格式 |
mcp_servers | dict[str, McpServerConfig] | str | Path | {} | MCP 服务器配置或配置文件路径 |
permission_mode | PermissionMode | None | None | 工具使用的权限模式 |
continue_conversation | bool | False | 继续最近的对话 |
resume | str | None | None | 要恢复的会话 ID |
fork_session | bool | False | 使用 resume 恢复时,分叉到新会话 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 可以访问的其他目录 |
extra_args | dict[str, str | None] | {} | 直接传递给 CLI 的其他 CLI 参数 |
can_use_tool | CanUseTool | None | None | 工具权限回调函数 |
hooks | dict[HookEvent, list[HookMatcher]] | None | None | 拦截事件的钩子配置 |
agents | dict[str, AgentDefinition] | None | None | 程序化定义的子代理 |
setting_sources | list[SettingSource] | None | None (无设置) | 控制 SDK 从哪些文件系统设置加载设置。省略时,不加载任何设置 |
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
消息类型
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
输入:
MultiEdit
工具名称:MultiEdit
输入:
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 参考 - 命令行界面
- 常见工作流程 - 分步指南