安装
在虚拟环境中安装该包。在最近的 Debian、Ubuntu 和 Homebrew Python 安装上,针对系统 Python 运行pip install 会失败,出现 error: externally-managed-environment 错误。
在 query() 和 ClaudeSDKClient 之间选择
Python SDK 提供了两种与 Claude Code 交互的方式:
快速比较
何时使用 query()(一次性任务)
最适合:
- 不需要对话历史的一次性问题
- 不需要来自之前交换的上下文的独立任务
- 简单的自动化脚本
- 当你想每次都重新开始时
何时使用 ClaudeSDKClient(持续对话)
最适合:
- 继续对话 - 当你需要 Claude 记住上下文时
- 后续问题 - 基于之前的响应进行构建
- 交互式应用程序 - 聊天界面、REPL
- 响应驱动的逻辑 - 当下一步操作取决于 Claude 的响应时
- 会话控制 - 显式管理对话生命周期
函数
query()
为每次与 Claude Code 的交互创建一个新会话。默认情况下返回一个异步迭代器,当消息到达时产生消息。每次调用 query() 都会重新开始,不记得之前的交互,除非你传递 continue_conversation=True 或在 ClaudeAgentOptions 中传递 resume。参见 Sessions。
参数
返回
返回一个AsyncIterator[Message],从对话中产生消息。
示例 - 带选项
tool()
用于定义具有类型安全的 MCP 工具的装饰器。
参数
输入模式选项
-
简单类型映射(推荐):
-
JSON Schema 格式(用于复杂验证):
返回
一个装饰器函数,包装工具实现并返回一个SdkMcpTool 实例。
示例
ToolAnnotations
从 mcp.types 重新导出(也可以从 claude_agent_sdk 导入为 from claude_agent_sdk import ToolAnnotations)。所有字段都是可选的提示;客户端不应依赖它们做出安全决策。
create_sdk_mcp_server()
创建在 Python 应用程序中运行的进程内 MCP 服务器。
参数
返回
返回一个McpSdkServerConfig 对象,可以传递给 ClaudeAgentOptions.mcp_servers。
示例
list_sessions()
列出带有元数据的过去会话。按项目目录过滤或列出所有项目中的会话。同步;立即返回。
参数
返回类型:SDKSessionInfo
示例
打印项目的 10 个最近会话。结果按last_modified 降序排序,所以第一项是最新的。省略 directory 以搜索所有项目。
get_session_messages()
从过去的会话中检索消息。同步;立即返回。
参数
返回类型:SessionMessage
示例
get_session_info()
按 ID 读取单个会话的元数据,无需扫描完整项目目录。同步;立即返回。
参数
返回
SDKSessionInfo,如果找不到会话则返回 None。
示例
查找单个会话的元数据,无需扫描项目目录。当你已经从之前的运行中获得会话 ID 时很有用。rename_session()
通过追加自定义标题条目来重命名会话。重复调用是安全的;最新的标题获胜。同步。
参数
如果
session_id 不是有效的 UUID 或 title 为空,则抛出 ValueError;如果找不到会话,则抛出 FileNotFoundError。
示例
重命名最近的会话,使其更容易找到。新标题在后续读取时出现在SDKSessionInfo.custom_title 中。
tag_session()
标记会话。传递 None 以清除标签。重复调用是安全的;最新的标签获胜。同步。
参数
如果
session_id 不是有效的 UUID 或 tag 在清理后为空,则抛出 ValueError;如果找不到会话,则抛出 FileNotFoundError。
示例
标记会话,然后在稍后的读取中按该标签过滤。传递None 以清除现有标签。
类
ClaudeSDKClient
在多次交换中维持对话会话。 这是 TypeScript SDK 的 query() 函数内部工作方式的 Python 等价物 - 它创建一个可以继续对话的客户端对象。
关键特性
- 会话连续性:在多个
query()调用中维持对话上下文 - 同一对话:会话保留之前的消息
- 中断支持:可以在任务中途停止执行
- 显式生命周期:你控制会话何时开始和结束
- 响应驱动的流程:可以对响应做出反应并发送后续消息
- 自定义工具和 hooks:支持自定义工具(使用
@tool装饰器创建)和 hooks
方法
上下文管理器支持
客户端可以用作异步上下文管理器以自动管理连接:
重要: 迭代消息时,避免使用 break 提前退出,因为这可能导致 asyncio 清理问题。相反,让迭代自然完成或使用标志来跟踪何时找到了你需要的内容。
示例 - 继续对话
示例 - 使用 ClaudeSDKClient 进行流式输入
示例 - 使用中断
中断后的缓冲行为:
interrupt() 发送停止信号但不清除消息缓冲区。被中断任务已产生的消息,包括其 ResultMessage(带 subtype="error_during_execution"),保留在流中。你必须在读取新查询的响应之前用 receive_response() 清空它们。如果在 interrupt() 之后立即发送新查询并仅调用一次 receive_response(),你将收到被中断任务的消息,而不是新查询的响应。示例 - 高级权限控制
类型
@dataclass vs TypedDict: 此 SDK 使用两种类型。用 @dataclass 装饰的类(如 ResultMessage、AgentDefinition、TextBlock)在运行时是对象实例,支持属性访问:msg.result。用 TypedDict 定义的类(如 ThinkingConfigEnabled、McpStdioServerConfig、SyncHookJSONOutput)在运行时是普通字典,需要键访问:config["budget_tokens"],而不是 config.budget_tokens。ClassName(field=value) 调用语法对两者都有效,但只有数据类产生具有属性的对象。SdkMcpTool
使用 @tool 装饰器创建的 SDK MCP 工具的定义。
Transport
自定义传输实现的抽象基类。使用此类通过自定义通道与 Claude 进程通信(例如,远程连接而不是本地子进程)。
导入:
from claude_agent_sdk import Transport
ClaudeAgentOptions
Claude Code 查询的配置数据类。
处理缓慢或停滞的 API 响应
CLI 子进程读取多个环境变量,这些变量控制 API 超时和停滞检测。通过ClaudeAgentOptions.env 传递它们:
API_TIMEOUT_MS:Anthropic 客户端上的每个请求超时,以毫秒为单位。默认600000。适用于主循环和所有子代理。CLAUDE_CODE_MAX_RETRIES:最大 API 重试次数。默认10,上限为15。每次重试都有自己的API_TIMEOUT_MS窗口,因此最坏情况下的实际时间大约是API_TIMEOUT_MS × (CLAUDE_CODE_MAX_RETRIES + 1)加上退避。对于需要等待更长时间中断的无人值守运行,设置CLAUDE_CODE_RETRY_WATCHDOG=1:它无限期重试容量错误,自 Claude Code v2.1.199 起,对其他瞬时错误将默认值提高到300并移除此变量的上限。CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS:使用run_in_background启动的子代理的停滞监视器。默认600000。在每个流事件时重置;停滞时中止子代理,将任务标记为失败,并将错误与任何部分结果一起呈现给父代理。不适用于同步子代理。CLAUDE_ENABLE_STREAM_WATCHDOG与CLAUDE_STREAM_IDLE_TIMEOUT_MS:当标头已到达但响应体停止流式传输时中止请求。监视器对所有提供商默认启用;设置CLAUDE_ENABLE_STREAM_WATCHDOG=0以禁用它。CLAUDE_STREAM_IDLE_TIMEOUT_MS默认为300000并被限制为该最小值。中止的请求通过正常重试路径进行。
OutputFormat
结构化输出验证的配置。将其作为 dict 传递给 ClaudeAgentOptions 上的 output_format 字段:
SystemPromptPreset
使用 Claude Code 的预设系统提示和可选添加的配置。
SystemPromptFile
从文件加载自定义系统提示而不是作为字符串传递的配置。SDK 将其映射到 CLI --system-prompt-file 标志。当提示很大时使用文件形式:SDK 在 CLI 子进程 argv 上传递字符串 system_prompt,这受到 OS 命令行长度限制的限制,然后 SDK 才能发送任何 API 请求。在 Linux 上,单个参数长于大约 128 KB 会在进程生成时失败,出现 Argument list too long。在 Windows 上,整个命令行被限制为大约 32 KB,因此字符串形式在更低的阈值处失败。
SettingSource
控制 SDK 从哪些基于文件系统的配置源加载设置。
默认行为
当setting_sources 被省略或为 None 时,query() 加载与 Claude Code CLI 相同的文件系统设置:用户、项目和本地。无论如何都会加载托管策略设置;当会话使用组织凭证在符合条件的配置上进行身份验证时,会获取服务器管理的设置。见 settingSources 不控制什么 了解无论此选项如何都会读取的输入,以及如何禁用它们。
为什么使用 setting_sources
禁用文件系统设置:在 Python SDK 0.1.59 及更早版本中,空列表的处理方式与省略选项相同,因此
setting_sources=[] 不会禁用文件系统设置。如果你需要空列表生效,请升级到较新版本。TypeScript SDK 不受影响。设置优先级
加载多个源时,设置按此优先级合并(从高到低):- 本地设置(
.claude/settings.local.json) - 项目设置(
.claude/settings.json) - 用户设置(
~/.claude/settings.json)
agents 和 allowed_tools)覆盖用户、项目和本地文件系统设置。托管策略设置优先于编程选项。
AgentDefinition
以编程方式定义的子代理的配置。
AgentDefinition 字段名称使用 camelCase,如 disallowedTools、permissionMode 和 maxTurns。这些名称直接映射到与 TypeScript SDK 共享的线路格式。这与 ClaudeAgentOptions 不同,后者对等效的顶级字段(如 disallowed_tools 和 permission_mode)使用 Python snake_case。因为 AgentDefinition 是数据类,传递 snake_case 关键字在构造时会引发 TypeError。PermissionMode
用于控制工具执行的权限模式。
EffortLevel
用于指导思考深度的努力级别。
CanUseTool
工具权限回调函数的类型别名。
tool_name:被调用的工具的名称input_data:工具的输入参数context:带有附加信息的ToolPermissionContext
PermissionResult(PermissionResultAllow 或 PermissionResultDeny)。
回调是 SDK 对交互式权限提示的替代:它仅在权限评估流解析为提示时调用。已由 allowed_tools 条目、设置允许规则或权限模式(如 acceptEdits 或 bypassPermissions)批准的工具调用永远不会调用它。要限制每个工具调用,改用 PreToolUse hook。
AskUserQuestion、标记为 requiresUserInteraction 的 MCP 工具,以及你的组织设置为 ask 的连接器工具即使允许规则匹配也会到达回调。在 dontAsk 模式下,这些调用被拒绝,不调用回调。
ToolPermissionContext
传递给工具权限回调的上下文信息。
PermissionResult
权限回调结果的联合类型。
PermissionResultAllow
指示应允许工具调用的结果。
PermissionResultDeny
指示应拒绝工具调用的结果。
PermissionUpdate
用于以编程方式更新权限的配置。
PermissionRuleValue
要在权限更新中添加、替换或移除的规则。
ToolsPreset
使用 Claude Code 的默认工具集的预设工具配置。
ThinkingConfig
控制扩展思考行为。三种配置的联合:
可选的
display 字段控制思考文本是否返回为 "summarized" 或 "omitted"。在 Claude Opus 4.7 及更高版本上,API 默认值为 "omitted",因此设置 "summarized" 以在 ThinkingBlock 输出中接收思考内容。
因为这些是 TypedDict 类,它们在运行时是普通字典。要么将它们构造为字典字面量,要么调用类作为构造函数;两者都产生 dict。使用 config["budget_tokens"] 访问字段,而不是 config.budget_tokens:
SdkBeta
SDK 测试功能的字面类型。
ClaudeAgentOptions 中的 betas 字段一起使用以启用测试功能。
McpSdkServerConfig
使用 create_sdk_mcp_server() 创建的 SDK MCP 服务器的配置。
McpServerConfig
MCP 服务器配置的联合类型。
McpStdioServerConfig
McpSSEServerConfig
McpHttpServerConfig
McpServerStatusConfig
由 get_mcp_status() 报告的 MCP 服务器的配置。这是所有 McpServerConfig 传输变体加上用于通过 claude.ai 代理的服务器的仅输出 claudeai-proxy 变体的联合。
McpSdkServerConfigStatus 是 McpSdkServerConfig 的可序列化形式,仅包含 type("sdk")和 name(str)字段;进程内 instance 被省略。McpClaudeAIProxyServerConfig 具有 type("claudeai-proxy")、url(str)和 id(str)字段。
McpStatusResponse
来自 ClaudeSDKClient.get_mcp_status() 的响应。在 mcpServers 键下包装服务器状态列表。
McpServerStatus
连接的 MCP 服务器的状态,包含在 McpStatusResponse 中。
SdkPluginConfig
SDK 中加载插件的配置。
示例:
消息类型
Message
所有可能消息的联合类型。
UserMessage
用户输入消息。
AssistantMessage
带有内容块的助手响应消息。
AssistantMessageError
助手消息的可能错误类型。
SystemMessage
带有元数据的系统消息。
ResultMessage
带有成本和使用信息的最终结果消息。
subtype 字段确定填充哪些其他字段。它是 "success"、"error_during_execution"、"error_max_turns"、"error_max_budget_usd" 或 "error_max_structured_output_retries" 之一。Python 数据类将所有变体展平为一种形状,因此不适用于返回的子类型的字段为 None。
当对话以错误结束时,多个字段会携带诊断详情:
is_error:当对话以错误状态结束时为True。在error_*子类型上始终为True。在subtype="success"上,当最终模型请求失败时为True,这意味着代理循环完成但最后一个 API 调用返回了错误。api_error_status:终止 API 错误的 HTTP 状态代码。当轮次结束时没有错误时为None。仅在subtype="success"上填充。result:在subtype="success"上为最终助手消息的文本,或在error_*子类型上为None。当subtype="success"且is_error=True时,如果可用,此字段保存 API 错误字符串,但可能为空,因此请检查api_error_status和前面的AssistantMessage内容以获取详情。errors:循环级别的错误字符串,例如最大轮次消息。仅在error_*子类型上填充。
usage 字典在存在时包含以下键:
model_usage 字典将模型名称映射到每个模型的使用情况。内部字典键使用 camelCase,因为该值从底层 CLI 进程未修改地传递,匹配 TypeScript ModelUsage 类型:
StreamEvent
流式事件,用于流式传输期间的部分消息更新。仅在 ClaudeAgentOptions 中 include_partial_messages=True 时接收。通过 from claude_agent_sdk.types import StreamEvent 导入。
RateLimitEvent
当速率限制状态更改时发出(例如,从 "allowed" 到 "allowed_warning")。使用此来在用户达到硬限制之前警告他们,或在状态为 "rejected" 时退避。
RateLimitInfo
由 RateLimitEvent 携带的速率限制状态。
TaskStartedMessage
当后台任务启动时发出。后台任务是在主轮次之外跟踪的任何内容:后台 Bash 命令、Monitor 监视、通过 Agent 工具生成的子代理或远程代理。task_type 字段告诉你是哪一个。此命名与 Task 到 Agent 工具重命名无关。
TaskUsage
后台任务的令牌和计时数据。
TaskProgressMessage
定期为运行的后台任务发出进度更新。
TaskNotificationMessage
当后台任务完成、失败或停止时发出。后台任务包括 run_in_background Bash 命令、Monitor 监视和后台子代理。
内容块类型
ContentBlock
所有内容块的联合类型。
TextBlock
文本内容块。
ThinkingBlock
思考内容块(用于具有思考能力的模型)。
ToolUseBlock
工具使用请求块。
ToolResultBlock
工具执行结果块。
错误类型
ClaudeSDKError
所有 SDK 错误的基础异常类。
CLINotFoundError
当 Claude Code CLI 未安装或找不到时引发。
CLIConnectionError
当连接到 Claude Code 失败时引发。
ProcessError
当 Claude Code 进程失败时引发。
CLIJSONDecodeError
当 JSON 解析失败时引发。
Hook 类型
有关使用 hooks 的综合指南,包括示例和常见模式,见 Hooks 指南。HookEvent
支持的 hook 事件类型。
TypeScript SDK 支持 Python 中尚未提供的其他 hook 事件:
SessionStart、SessionEnd、Setup、TeammateIdle、TaskCompleted、ConfigChange、WorktreeCreate、WorktreeRemove、PostToolBatch 和 MessageDisplay。HookCallback
hook 回调函数的类型定义。
input:强类型 hook 输入,具有基于hook_event_name的判别联合(见HookInput)tool_use_id:可选工具使用标识符(用于工具相关的 hooks)context:带有附加信息的 hook 上下文
HookJSONOutput:
decision:"block"以阻止操作systemMessage:显示给用户的警告消息hookSpecificOutput:hook 特定的输出数据
HookContext
传递给 hook 回调的上下文信息。
HookMatcher
用于将 hooks 匹配到特定事件或工具的配置。
HookInput
所有 hook 输入类型的联合类型。实际类型取决于 hook_event_name 字段。
BaseHookInput
所有 hook 输入类型中存在的基础字段。
PreToolUseHookInput
PreToolUse hook 事件的输入数据。
PostToolUseHookInput
PostToolUse hook 事件的输入数据。
PostToolUseFailureHookInput
PostToolUseFailure hook 事件的输入数据。当工具执行失败时调用。
UserPromptSubmitHookInput
UserPromptSubmit hook 事件的输入数据。
StopHookInput
Stop hook 事件的输入数据。
SubagentStopHookInput
SubagentStop hook 事件的输入数据。
PreCompactHookInput
PreCompact hook 事件的输入数据。
NotificationHookInput
Notification hook 事件的输入数据。
SubagentStartHookInput
SubagentStart hook 事件的输入数据。
PermissionRequestHookInput
PermissionRequest hook 事件的输入数据。允许 hooks 以编程方式处理权限决策。
HookJSONOutput
hook 回调返回值的联合类型。
SyncHookJSONOutput
具有控制和决策字段的同步 hook 输出。
在 Python 代码中使用
continue_(带下划线)。发送到 CLI 时会自动转换为 continue。HookSpecificOutput
包含 hook 事件名称和事件特定字段的 TypedDict。形状取决于 hookEventName 值。有关每个 hook 事件的可用字段的完整详情,见 使用 hooks 控制执行。
事件特定输出类型的判别联合。hookEventName 字段确定哪些字段有效。
AsyncHookJSONOutput
延迟 hook 执行的异步 hook 输出。
在 Python 代码中使用
async_(带下划线)。发送到 CLI 时会自动转换为 async。Hook 使用示例
此示例注册两个 hooks:一个阻止危险的 bash 命令(如rm -rf /),另一个记录所有工具使用以进行审计。安全 hook 仅在 Bash 命令上运行(通过 matcher),而日志 hook 在所有工具上运行。
工具输入/输出类型
所有内置 Claude Code 工具的输入/输出模式文档。虽然 Python SDK 不将这些导出为类型,但它们代表消息中工具输入和输出的结构。Agent
工具名称:Agent(之前为 Task,仍然接受作为别名)
输入:
AskUserQuestion
工具名称:AskUserQuestion
在执行期间向用户提出澄清问题。见 处理批准和用户输入 了解使用详情。
输入:
Bash
工具名称:Bash
输入:
Monitor
工具名称:Monitor
运行后台源并将每个事件传递给 Claude,以便它可以做出反应而无需轮询:command 运行脚本并每个 stdout 行发出一个事件,ws 打开 WebSocket 并每个文本帧发出一个事件。恰好提供 command 或 ws 中的一个。
当 Monitor 运行命令时,它遵循与 Bash 相同的权限规则;WebSocket 监视会单独提示批准。ws 源需要 Claude Code v2.1.195 或更高版本。见 Monitor 工具参考 了解行为和提供商可用性。
输入:
Edit
工具名称:Edit
输入:
Read
工具名称:Read
输入:
Write
工具名称:Write
输入:
Glob
工具名称:Glob
输入:
Grep
工具名称:Grep
输入:
NotebookEdit
工具名称:NotebookEdit
输入:
WebFetch
工具名称:WebFetch
输入:
WebSearch
工具名称:WebSearch
输入:
TodoWrite
工具名称:TodoWrite
自 Claude Code v2.1.142 起,
TodoWrite 默认被禁用。改用 TaskCreate、TaskGet、TaskUpdate 和 TaskList。见 迁移到 Task 工具 更新您的监视代码,或设置 CLAUDE_CODE_ENABLE_TASKS=0 以恢复到 TodoWrite。TaskCreate
工具名称:TaskCreate
输入:
TaskUpdate
工具名称:TaskUpdate
输入:
TaskGet
工具名称:TaskGet
输入:
TaskList
工具名称:TaskList
输入:
BashOutput
工具名称:BashOutput
输入:
KillBash
工具名称:KillBash
输入:
ExitPlanMode
工具名称:ExitPlanMode
输入:
ListMcpResources
工具名称:ListMcpResourcesTool
输入:
ReadMcpResource
工具名称:ReadMcpResourceTool
输入:
ClaudeSDKClient 的高级功能
构建持续对话界面
使用 Hooks 进行行为修改
实时进度监控
示例用法
基本文件操作(使用 query)
错误处理
使用客户端的流式模式
使用 ClaudeSDKClient 的自定义工具
沙箱配置
SandboxSettings
沙箱行为的配置。使用此来启用命令沙箱和以编程方式配置网络限制。
沙箱取决于平台支持,在 Linux 上,需要
bubblewrap 和 socat 等工具。默认情况下,当 enabled 为 True 但沙箱无法启动时,命令在沙箱外运行,并在 stderr 上显示警告。此默认值与 TypeScript SDK 不同,后者中 failIfUnavailable 默认为 true。在沙箱设置中设置 "failIfUnavailable": True 以改为停止。该键尚未在 SandboxSettings 上声明,但 SDK 会将其转发给 Claude Code,后者会遵守它。然后 query() 报告一个 ResultMessage,其 subtype="error_during_execution" 和 errors 中的原因。监视该子类型,而不是期望 query() 在生成消息之前引发。示例用法
SandboxNetworkConfig
沙箱模式的网络特定配置。这些设置适用于当父 SandboxSettings 中的 enabled 为 True 时的沙箱化 Bash 命令。它们不限制 WebFetch 工具,该工具改用 权限规则。
SandboxIgnoreViolations
用于忽略特定沙箱违规的配置。
沙箱外命令的权限回退
当allowUnsandboxedCommands 启用时,模型可以通过在工具输入中设置 dangerouslyDisableSandbox: True 来请求在沙箱外运行命令。这些请求回退到现有权限系统,意味着你的 can_use_tool 处理程序将被调用,允许你实现自定义授权逻辑。
excludedCommands vs allowUnsandboxedCommands:excludedCommands:始终自动绕过沙箱的命令的静态列表(例如["docker"])。模型对此无控制权。allowUnsandboxedCommands:让模型在运行时通过在工具输入中设置dangerouslyDisableSandbox: True来决定是否请求沙箱外执行。
- 审计模型请求:记录模型何时请求沙箱外执行
- 实现允许列表:仅允许特定命令在沙箱外运行
- 添加批准工作流:需要显式授权以进行特权操作
另见
- SDK 概述 - 一般 SDK 概念
- TypeScript SDK 参考 - TypeScript SDK 文档
- CLI 参考 - 命令行界面
- 常见工作流 - 分步指南