安装
在虚拟环境中安装该包。在最近的 Debian、Ubuntu 和 Homebrew Python 安装上,针对系统 Python 运行pip install 会失败,出现 error: externally-managed-environment 错误。
在 query() 和 ClaudeSDKClient 之间选择
Python SDK 提供了两种与 Claude Code 交互的方式:
对于交互式应用程序(如聊天界面)或当下一步操作取决于 Claude 的响应时,请使用
ClaudeSDKClient。
函数
此页面上的签名块和裸
async for / async with 片段仅供说明之用。要运行它们,请将主体包装在 async def main(): ... 中并调用 asyncio.run(main())。query()
默认情况下,为与 Claude Code 的每次交互创建一个新会话。返回一个异步迭代器,在消息到达时产生消息。每次调用 query() 都会重新开始,除非您在 ClaudeAgentOptions 中传递 continue_conversation=True 或 resume,否则不会记住之前的交互。请参阅 Sessions。
参数
返回值
返回一个AsyncIterator[Message],从对话中产生消息。
示例 - 带选项
tool()
用于定义具有类型安全的 MCP 工具的装饰器。
参数
输入 schema 选项
-
简单类型映射(推荐):
-
JSON Schema 格式(用于复杂验证):
-
TypedDict 类:一种类型化的 schema,其中
NotRequired键不会包含在required中。- Python 3.11 及更高版本:从
typing导入TypedDict和NotRequired。 - Python 3.10:
typing中没有NotRequired。请从typing_extensions导入TypedDict和NotRequired,SDK 会在 Python 3.10 上安装该包。
- Python 3.11 及更高版本:从
Annotated[type, "description"] 中即可设置该字段的描述。
返回值
一个装饰器函数,包装工具实现并返回一个SdkMcpTool 实例。
示例
ToolAnnotations
工具的行为提示,作为 tool() 的 annotations 参数传递。ToolAnnotations 扩展了 MCP SDK 的 mcp.types.ToolAnnotations,添加了 maxResultSizeChars 字段,您可以用 camelCase 或 snake_case 编写每个提示:ToolAnnotations(readOnlyHint=True) 和 ToolAnnotations(read_only_hint=True) 是等效的。要从对象中读回某个提示,请使用已安装的 mcp 包所声明的拼写:在 mcp 1.x 上为 .readOnlyHint,在 2.x 上为 .read_only_hint,而 .maxResultSizeChars 在两者上均可使用。您也可以在 SDK 接受注解的任何地方传递普通的 mcp.types.ToolAnnotations。
snake_case 名称和类型化的 maxResultSizeChars 字段需要 Python Agent SDK 0.2.140 或更高版本。版本 0.1.31 到 0.2.139 重新导出 mcp.types.ToolAnnotations 不变。在版本 0.1.55 到 0.2.139 上,您仍然可以将 maxResultSizeChars 作为关键字参数传递:MCP 类接受额外字段,SDK 将值转发给 Claude Code。
所有字段都是可选的。客户端不应依赖这些提示来做出安全决策。
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 以清除现有标签。
fork_session()
将会话的会话记录复制到新会话中,以便您可以将对话引向另一个方向,同时原始会话保持不变。要从对话中较早的某个点分支,请传递 up_to_message_id。同步。
参数
返回一个
ForkSessionResult,其 session_id 是新会话的 UUID。将其作为 resume 传递即可继续该分叉。分叉不包含原始会话的文件检查点,因此您无法将其回退到分叉之前捕获的检查点。
fork_session() 会抛出:
ValueError:session_id或up_to_message_id不是有效的 UUIDValueError:会话没有消息,或up_to_message_id与会话记录中的任何消息都不匹配FileNotFoundError:找不到会话
示例
以新标题分叉最近的会话,然后恢复该分叉。原始会话保留其自身的历史记录。类
ClaudeSDKClient
在多次交换中维持对话会话。 这是 TypeScript SDK 的 query() 函数内部工作方式的 Python 等价物 - 它创建一个可以继续对话的客户端对象。见与 query() 的比较。
方法
上下文管理器支持
客户端可以用作异步上下文管理器以自动管理连接:
重要: 迭代消息时,避免使用 break 提前退出,因为这可能导致 asyncio 清理问题。相反,让迭代自然完成或使用标志来跟踪何时找到了你需要的内容。
示例 - 继续对话
示例 - 使用 ClaudeSDKClient 进行流式输入
query() 也接受用户消息字典的异步可迭代对象,因此你可以在发送时组装提示或包含内容块,如图像。Claude Code 在第一个产生的消息到达时立即开始响应,无需等待可迭代对象完成,receive_response() 在结束该响应的 ResultMessage 处停止。将 Claude 应该在回答前读取的所有内容放入一条消息中,如本生成器所做的那样,并将每个 query() 调用与其自己的 receive_response() 循环配对。
示例 - 使用中断
中断后的缓冲行为:
interrupt() 发送停止信号但不清除消息缓冲区。被中断任务已产生的消息,包括其 ResultMessage,保留在流中。你必须在读取新查询的响应之前用 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窗口。 对于需要等待更长时间中断的无人值守运行,设置CLAUDE_CODE_RETRY_WATCHDOG=1:它会无限期重试瞬时容量错误,并且在 Claude Code v2.1.199 或更高版本上,将其他瞬时错误的默认值提高到300并移除此变量的上限。 -
CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS:子代理的停滞监视器。当流监视器开启时,默认值为CLAUDE_STREAM_IDLE_TIMEOUT_MS加 5 分钟,即600000,除非您提高该变量。当流监视器关闭时,默认值为600000。在 v2.1.257 之前,默认值始终为600000。 计时器在每个流事件时重置。停滞时,Claude Code 中止子代理并向父 Agent 报告停滞。对于后台子代理,它也会将任务标记为失败并附加任何部分结果。 -
CLAUDE_ENABLE_STREAM_WATCHDOG与CLAUDE_STREAM_IDLE_TIMEOUT_MS:流监视器,当标头已到达但响应体停止流式传输时中止请求。监视器对所有提供商默认启用;设置CLAUDE_ENABLE_STREAM_WATCHDOG=0以禁用它。CLAUDE_STREAM_IDLE_TIMEOUT_MS默认为300000,且不能低于该最小值。中止后 Claude Code 会如何处理取决于响应已进行到什么程度,详见自动重试。 当ANTHROPIC_BASE_URL后面的网关通过 keep-alive ping 保持响应打开、而监视器在等待该响应时,设置了include_partial_messages的主机会持续接收pingStreamEvent消息。请将这些帧视为存活信号,而不要因为静默而使会话超时。在 v2.1.257 之前,这些帧会在最后一个真实流事件后 5 分钟停止。
OutputFormat
结构化输出验证的配置。将其作为 dict 传递给 ClaudeAgentOptions 上的 output_format 字段:
SystemPromptPreset
使用 Claude Code 的预设系统提示词和可选添加内容的配置。
SystemPromptCustom
对象形式的自定义系统提示词,等同于将字符串作为 system_prompt 传递,也可以设置 snapshot。需要 claude-agent-sdk v0.2.153 或更高版本。
SystemPromptFile
从文件加载自定义系统提示词而不是作为字符串传递的配置。SDK 将其映射到 CLI --system-prompt-file 标志。当提示词很大时使用文件形式:SDK 在 CLI 子进程 argv 上传递字符串 system_prompt,这在 SDK 发送任何 API 请求之前就受到 OS 命令行长度限制的约束。在 Linux 上,单个参数长于大约 128 KB 会在进程生成时失败,出现 Argument list too long。在 Windows 上,整个命令行被限制为大约 32 KB,因此字符串形式在更低的阈值处失败。
SettingSource
控制 SDK 从哪些基于文件系统的配置源加载设置。
默认行为
当setting_sources 被省略或为 None 且 skills 未设置时,query() 加载与 Claude Code CLI 相同的文件系统设置:用户、项目和本地。设置了 skills 时,setting_sources 行描述当前默认值。端点托管策略在所有情况下都会加载;当会话使用组织凭据在符合条件的配置上进行身份验证时,会获取服务器托管设置。有关更多信息,见 settingSources 不控制什么。
为什么使用 setting_sources
禁用文件系统设置:在 Python SDK 0.1.59 及更早版本中,空列表的处理方式与省略选项相同,因此
setting_sources=[] 不会禁用文件系统设置。如果您需要空列表生效,请升级到较新版本。TypeScript SDK 不受影响。setting_sources 中包含 "project"。见 修改系统提示词 了解 CLAUDE.md 加载如何与系统提示词选项交互。
设置优先级
加载多个源时,设置按此优先级合并(从高到低):- 本地设置(
.claude/settings.local.json) - 项目设置(
.claude/settings.json) - 用户设置(
~/.claude/settings.json)
agents、allowed_tools 和 settings)覆盖用户、项目和本地文件系统设置。托管策略设置优先于编程选项。
AgentDefinition
以编程方式定义的子代理的配置。
AgentDefinition 字段名称使用 camelCase,如 disallowedTools、permissionMode 和 maxTurns。这些名称直接映射到与 TypeScript SDK 共享的线路格式。这与 ClaudeAgentOptions 不同,后者对等效的顶级字段(如 disallowed_tools 和 permission_mode)使用 Python snake_case。因为 AgentDefinition 是数据类,传递 snake_case 关键字在构造时会引发 TypeError。PermissionMode
用于控制工具执行的权限模式。
EffortLevel
用于指导思考深度的 effort 级别。
CanUseTool
工具权限回调函数的类型别名。
tool_name:被调用的工具的名称input_data:工具的输入参数context:带有附加信息的ToolPermissionContext
PermissionResult(PermissionResultAllow 或 PermissionResultDeny)。
回调是 SDK 对交互式权限提示的替代:它仅在权限评估流程解析为提示时调用。已由 allowed_tools 条目、设置中的允许规则或权限模式(如 acceptEdits 或 bypassPermissions)批准的工具调用永远不会调用它。要把关每个工具调用,请改用 PreToolUse hook。
允许规则不会预批准任何模式都不自动批准的操作;见 权限如何被评估 了解其中哪些会到达回调,以及在 dontAsk 和 auto 模式下会发生什么。
ToolPermissionContext
传递给工具权限回调的上下文信息。
PermissionResult
权限回调结果的联合类型。
PermissionResultAllow
指示应允许工具调用的结果。
PermissionResultDeny
指示应拒绝工具调用的结果。
PermissionUpdate
用于以编程方式更新权限的配置。
PermissionRuleValue
要在权限更新中添加、替换或移除的规则。
ToolsPreset
使用 Claude Code 的默认工具集的预设工具配置。
ThinkingConfig
控制扩展思考行为。三种配置的联合:
可选的
display 字段控制思考文本以 "summarized" 还是 "omitted" 形式返回。在 Claude Opus 4.7 及更高版本上,API 默认值为 "omitted",因此请设置 "summarized" 以在 ThinkingBlock 输出中接收思考内容。Claude Code 不会将您的 display 值传递给某些提供商,例如 Amazon Bedrock 和 Google Cloud 的 Agent Platform。在这些提供商上,即使您将 display 设置为 "summarized",Opus 4.7 及更高版本也会返回空的 ThinkingBlock 输出。
因为这些是 TypedDict 类,它们在运行时是普通字典。可以将它们构造为字典字面量,也可以像调用构造函数一样调用类;两者都产生 dict。使用 config["budget_tokens"] 访问字段,而不是 config.budget_tokens:
TaskBudget
API 端任务预算(以 token 为单位),与 ClaudeAgentOptions 中的 task_budget 字段一起使用。
因为这是
TypedDict,请将其作为普通字典传递,如 ClaudeAgentOptions(task_budget={"total": 50000})。
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 中。
ContextUsageResponse
来自 ClaudeSDKClient.get_context_usage() 的响应。这是 Claude Code 在交互式会话中为 /context 命令呈现的相同负载,因此除了 token 计数外,它还携带显示字段,如 color 和 gridRows,Claude Code 使用这些字段来绘制 /context 使用网格。
Claude Code 通过向 token 计数 API 发送多个请求来构建此负载。这些请求不会出现在消息流中,因此读取流的成本跟踪不会看到它们。在 Anthropic API 上,token 计数不计费。
ContextUsageCategory 条目携带 name、tokens、color 和可选的 isDeferred 标志。totalTokens 是会话当前的上下文使用量,maxTokens 是衡量该使用量所依据的窗口。该窗口是模型的上下文窗口,或在适用时较低的自动压缩窗口,rawMaxTokens 携带与 maxTokens 相同的值。apiUsage 保存最新 API 响应的使用情况,而不是会话的累计总数。Claude Code 不会设置可选的 deferredBuiltinTools、systemTools 和 systemPromptSections 键,因此即使类型声明了它们,也应预期它们不存在。
SdkPluginConfig
SDK 中加载插件的配置。
示例:
消息类型
Message
所有可能消息的联合类型。
UserMessage
用户输入消息。
SDK 从 CLI 未修改地传递
tool_use_result。对于外部 MCP 服务器上的工具,其结果包含 resource_link 块,该字典具有 resourceLinks 键,保存具有 TypeScript SDKMcpResourceLink 类型键的字典列表。Claude 将每个链接作为工具结果中的一行文本接收。要呈现服务器返回的文件,请读取 resourceLinks 而不是解析该文本。resourceLinks 键需要 Python Agent SDK 0.2.150 或更高版本和 Claude Code v2.1.257 或更高版本;该 SDK 版本附带的 CLI 满足 Claude Code 要求。
当结果没有链接时,CLI 会省略该键,在来自子代理的结果上也会省略。CLI 每个结果最多保留 50 个链接,一旦列表达到 64 KiB 的序列化 JSON,就停止添加链接。使用 tool() 在进程中定义的工具永远不会产生该键,因为 SDK 在 CLI 看到结果之前将其 resource_link 块展平为文本。
AssistantMessage
带有内容块的助手响应消息。
AssistantMessageError
助手消息的可能错误类型。
max_output_tokens。SDK 未修改地传递该值,因此将此列表之外的字符串视为处理 unknown 的方式。TypeScript SDKAssistantMessageError 类型列出了 CLI 可以发出的完整值集。
SystemMessage
带有元数据的系统消息。
SystemMessage 的形式到达。要在轮次之间跟踪会话,请设置 CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS=1,并在每条 subtype 为 session_state_changed 的消息上读取 message.data["state"]。SDKSessionStateChangedMessage 列出了它可以携带的状态。使用 receive_messages() 迭代以读取这些消息:receive_response() 会在 ResultMessage 处停止,而 session_state_changed 消息可能出现在该结果之后。
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,这意味着 Agent 循环完成但最后一个 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_*子类型上填充。terminal_reason:查询循环结束的原因,例如"completed"、"max_turns"、"api_error"、"aborted_streaming"或"aborted_tools"。值为"aborted_streaming"或"aborted_tools"意味着轮次在完成前被中止。常见原因是interrupt()和权限回调返回PermissionResultDeny且interrupt=True。在早于该字段的 CLI 版本上为None,在本地命令(如/voice或/usage)的结果上为None,这些命令绕过查询循环,或在会话严重失败时发出的合成错误结果上为None。镜像 TypeScript SDK 的SDKResultMessage.terminal_reason,其列出了完整的值集。origin:触发此轮次的用户消息的来源。在流式输入模式中,检查此项以区分您自己的提示词结果(其中origin为None或{"kind": "human"})与注入的轮次(如后台任务通知)的结果。需要 Python Agent SDK 0.2.137 或更高版本。
ResultMessage,每个都带有 kind 为 "task-notification" 的 origin。除最后一个外,其余消息的 num_turns 均为 0 且 result 为空,最后一个则承载回复所有通知的那个轮次。
usage 字典仅涵盖主 Agent 循环,不包括子代理和其他嵌套或辅助模型调用。在流式输入模式中,值是按轮次的。优先使用 model_usage 进行 token 和成本核算。usage 字典在存在时包含以下键:
model_usage 字典将模型名称映射到每个模型的使用情况。它涵盖通过查询管道进行的每个模型调用:主循环、子代理和内部调用(如压缩和 Workflow Agent)。该管道外的辅助调用(如权限分类器和 token 计数请求)从 model_usage 中排除。将 model_usage 视为估计值,而不是计费声明。
在流式输入模式中,model_usage 和 total_cost_usd 在轮次间是累积的,因此读取最新结果而不是跨结果求和。调用恢复会话时,也会计算从会话早期调用恢复的总计。有关重置,请参阅在流式输入模式中跟踪成本,有关清零结果,请参阅在会话崩溃后恢复总计。
model_usage 中的每个值都是 ModelUsage TypedDict,通过 from claude_agent_sdk.types import ModelUsage 导入。其键使用 camelCase,因为 SDK 从底层 CLI 进程未修改地传递该值,匹配 TypeScript ModelUsage 类型:
StreamEvent
流式事件,用于流式传输期间的部分消息更新。仅在 ClaudeAgentOptions 中 include_partial_messages=True 时接收。通过 from claude_agent_sdk.types import StreamEvent 导入。
RateLimitEvent
当速率限制状态更改时发出(例如,从 "allowed" 到 "allowed_warning")。使用此来在用户达到硬限制之前警告他们,或在状态为 "rejected" 时退避。
RateLimitInfo
由 RateLimitEvent 携带的速率限制状态。
ConversationResetMessage
在不结束连接的情况下替换对话时发出,例如在 /clear 之后。有关重置如何影响后续 ResultMessage 对象上的运行总计,请参阅在流式输入模式中跟踪成本。需要 Python Agent SDK 0.2.137 或更高版本。
TaskStartedMessage
当后台任务启动时发出。后台任务是在主轮次之外跟踪的任何内容:后台 Bash 命令、Monitor 监视、通过 Agent 工具生成的子代理或远程 Agent。task_type 字段告诉您是哪一个。此命名与 Task 到 Agent 工具重命名无关。
TaskUsage
后台任务的 token 和计时数据。
TaskProgressMessage
定期为运行的后台任务发出进度更新。
TaskNotificationMessage
当后台任务完成、失败或停止时发出。后台任务包括 run_in_background Bash 命令、Monitor 监视和后台子代理。
当 CLI 将长 MCP 工具调用移到后台时,该调用的工具结果仅保存占位符,该调用的真实结果在此消息中到达。在此类调用的
"completed" 通知上,CLI 添加 resource_links 键,列出工具通过引用返回的文件,具有与 UserMessage.tool_use_result 上的 resourceLinks 键相同的条目和限制。resource_links 键需要 Python Agent SDK 0.2.150 或更高版本和 Claude Code v2.1.257 或更高版本;该 SDK 版本附带的 CLI 满足 Claude Code 要求。
数据类没有 resource_links 字段。从消息继承自 SystemMessage 的 data 字典读取它:message.data.get("resource_links")。使用 tool_use_id 匹配通知与调用。当结果没有链接时,CLI 会省略该键,在不是 MCP 工具调用的任务的通知上也会省略。
内容块类型
ContentBlock
所有内容块的联合类型。
TextBlock
文本内容块。
ThinkingBlock
思考内容块(用于具有思考能力的模型)。
ToolUseBlock
工具使用请求块。
ToolResultBlock
工具执行结果块。
错误类型
下面的类型定义了您的代码可以捕获的内容。对于与这些类型引发的错误消息相关的条目,包括每个错误的原因和修复方法,请参阅故障排除。ClaudeSDKError
所有 SDK 错误的基础异常类。
query() 以错误结果结束时,例如达到轮次限制错误,SDK 会引发 ResultError。
CLINotFoundError
当 Claude Code CLI 未安装或找不到时引发。
CLIConnectionError
当连接到 Claude Code 失败时引发。
ProcessError
当 Claude Code 进程失败时引发。
ResultError
当 Claude Code 进程因运行以错误结果消息结束而退出时引发,例如达到轮次限制错误或 API 错误。ResultError 是 ProcessError 的子类,因此现有的 except ProcessError 处理程序也会捕获它。其属性包含该结果消息的字段,因此您可以根据运行失败的原因进行分支,而无需解析消息文本。需要 Python Agent SDK 0.2.140 或更高版本。
subtype 之前先检查 terminal_reason。当最终请求失败时,例如 API 错误,Claude Code 会报告 subtype 为 "success",原因在 terminal_reason 中,例如 "api_error";当您设置的限制结束运行时,例如 max_turns 或 max_budget_usd,它会报告 error_* 子类型。
CLIJSONDecodeError
当 JSON 解析失败时引发。
Hook 类型
有关使用 hook 的综合指南,包括示例和常见模式,见 Hooks 指南。HookEvent
支持的 hook 事件类型。
TypeScript SDK 支持 Python 中尚未提供的其他 hook 事件。见 hook 可用性表 了解每个 SDK 的支持情况。
HookCallback
hook 回调函数的类型定义。
input:强类型 hook 输入,具有基于hook_event_name的判别联合(见HookInput)tool_use_id:可选工具使用标识符(用于工具相关的 hook)context:带有附加信息的 hook 上下文
HookJSONOutput。
HookContext
传递给 hook 回调的上下文信息。
HookMatcher
用于将 hook 匹配到特定事件或工具的配置。
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 事件的输入数据。允许 hook 以编程方式处理权限决策。
HookJSONOutput
hook 回调返回值的联合类型。
SyncHookJSONOutput
具有控制和决策字段的同步 hook 输出。
在 Python 代码中使用
continue_(带下划线)。发送到 CLI 时会自动转换为 continue。HookSpecificOutput
事件特定的 TypedDict 输出类型的判别联合。hookEventName 字段确定哪些字段有效。有关每个 hook 事件的可用字段的完整详情,见 使用 hook 控制执行。
AsyncHookJSONOutput
延迟 hook 执行的异步 hook 输出。
在 Python 代码中使用
async_(带下划线)。发送到 CLI 时会自动转换为 async。Hook 使用示例
此示例注册两个 hook:一个阻止危险的 Bash 命令(如rm -rf /),另一个记录所有工具使用以进行审计。安全 hook 仅在 Bash 命令上运行(通过 matcher),而日志 hook 在所有工具上运行。
工具输入/输出类型
内置 Claude Code 工具的输入/输出 schema 文档。虽然 Python SDK 不会将这些作为类型导出,但它们代表了消息中工具输入和输出的结构。 下面展示的每个输出都是您从该工具的UserMessage.tool_use_result 中读取的值。键名与 Claude Code 发出的完全一致。标注了 | None 并带有”present when”或”optional”注释的键,在不适用时会被省略。
Agent
工具名称:Agent。先前的名称 Task 仍作为别名被接受,并且为了向后兼容,init SystemMessage 中的 tools 列表会将此工具报告为 Task。
输入:
"completed"):
"async_launched"):
"remote_launched"):
status 字段进行区分:"completed" 表示已完成的任务,"async_launched" 表示后台任务,"remote_launched" 表示 Claude Code 派发到云端会话的任务,其中 sessionUrl 链接到该会话,taskId 用于标识该会话。如果 Claude Code 保留了子代理的隔离 worktree,completed 变体上的 worktreePath 就是该 worktree 的位置;当 Claude Code 使用 git 创建该 worktree 时,worktreeBranch 是其分支。
在 completed 变体上,resolvedModel 指明子代理启动时使用的模型;当 availableModels 或其他覆盖生效时,它可能与请求的 model 输入不同。此字段需要 Claude Code v2.1.174 或更高版本。在 async_launched 变体上,resolvedModel 指明 Agent 转入后台时正在使用的模型,因此在转入后台之前发生的模型切换会反映在其中。两种变体上的 modelsUsed 字段按顺序列出所使用的模型,连续重复项已合并;仅当运行中途切换了模型时才会设置该字段。modelsUsed 以及转入后台时的 resolvedModel 行为需要 Claude Code v2.1.212 或更高版本。
Claude Code 根据子代理的最后一次 API 请求(而非整个运行过程)填充 usage 和 totalTokens。如果存在,usage 中 output_tokens_details 下的 thinking_tokens 表示该请求的输出 token 中属于思考 token 的数量。output_tokens_details 键需要 Python SDK v0.2.136 或更高版本,该版本捆绑了 Claude Code v2.1.228。fallback_credit 键需要 Python SDK v0.2.162 或更高版本,该版本捆绑了 Claude Code v2.1.285。
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
输入:
type 键来区分它们。
输出(type:"text"):
"image"):
"notebook"):
"pdf"):
"parts"):
"file_unchanged"):
Write
工具名称:Write
输入:
Glob
工具名称:Glob
输入:
totalMatches 和 countIsComplete 需要 Claude Code v2.1.191 或更高版本。
Grep
工具名称:Grep
输入:
output_mode。
totalFiles 需要 Claude Code v2.1.208 或更高版本。totalLines 需要 Claude Code v2.1.210 或更高版本。
NotebookEdit
工具名称:NotebookEdit
输入:
WebFetch
工具名称:WebFetch
输入:
WebSearch
工具名称:WebSearch
输入:
TodoWrite
工具名称:TodoWrite
以下工具仅在 Claude Opus 4.7、Claude Sonnet 4.6、Claude Haiku 4.5 及更早的模型上默认可用。在所有其他模型上,包括 Claude Code 无法识别的模型 ID,除非您选择加入,否则它们不可用:
TodoWriteTaskCreateTaskGetTaskUpdateTaskList
CLAUDE_CODE_ENABLE_TASKS=0 时改为提供 TodoWrite。此默认集合适用于 Claude Code v2.1.268 及更高版本,TypeScript Agent SDK 从 v0.3.268 开始捆绑此版本。请参阅模型可用性以选择启用。TaskCreate
工具名称:TaskCreate
输入:
TaskUpdate
工具名称:TaskUpdate
输入:
TaskGet
工具名称:TaskGet
输入:
TaskList
工具名称:TaskList
输入:
TaskOutput
已在 Claude Code v2.1.277 中移除。此前用于从正在运行或已完成的后台任务中检索输出,并接受BashOutput 作为别名;现在 Claude 改用 Read 读取后台任务的输出文件。
仍然引用这两个名称之一的 disallowed_tools 条目或拒绝规则会被忽略,且不会发出警告。
TaskStop
工具名称:TaskStop。先前的名称 KillShell 和 KillBash 仍作为别名被接受。
输入:
ExitPlanMode
工具名称:ExitPlanMode
输入:
ListMcpResources
工具名称:ListMcpResourcesTool
输入:
tool_use_result 包含一个 list。
输出:
ReadMcpResource
工具名称:ReadMcpResourceTool
输入:
构建持续对话界面
以下示例保持一个ClaudeSDKClient 在多个回合中保持连接,以便 Claude 记住之前的消息。输入 new 可以断开连接并重新连接以获得新的会话,或输入 exit 结束对话。
错误处理
以下示例将query() 调用包装在四种 错误类型 的处理程序中,这些是 SDK 会抛出的错误。
此示例捕获 ResultError,这需要 Python Agent SDK 0.2.140 或更高版本。
沙箱配置
SandboxSettings
沙箱行为的配置。使用此来启用命令沙箱和以编程方式配置网络限制。
沙箱取决于平台支持,在 Linux 上,需要
bubblewrap 和 socat 等工具。默认情况下,当 enabled 为 True 但沙箱无法启动时,命令在沙箱外运行,并在 stderr 上显示警告。此默认值与 TypeScript SDK 不同,后者中 failIfUnavailable 默认为 true。在沙箱设置中设置 "failIfUnavailable": True 以改为停止。SDK 会将 failIfUnavailable 与已声明的 SandboxSettings 字段一起转发给 Claude Code。然后 query() 报告一个 ResultMessage,其 subtype="error_during_execution",原因在 errors 中。因为这是一个单次 query() 调用,SDK 在生成该错误结果后会引发异常,所以请将循环包装在 try 块中以继续执行。有关错误约定,请参阅 处理结果。denyWrite 下,例如 "filesystem": {"denyWrite": ["/home/user/project/.env"]}。SDK 会将 filesystem 与已声明的 SandboxSettings 字段一起转发给 Claude Code。沙箱启动后,会阻止对您所列的每个绝对路径的写入。
示例用法
SandboxNetworkConfig
沙箱模式的网络特定配置。这些设置适用于当父 SandboxSettings 中的 enabled 为 True 时的沙箱化 Bash 命令。它们不限制 WebFetch 工具,该工具改用 权限规则。
SandboxIgnoreViolations
用于忽略特定沙箱违规的配置。
沙箱外命令的权限回退
当allowUnsandboxedCommands 启用时,模型可以通过在工具输入中设置 dangerouslyDisableSandbox: True 来请求在沙箱外运行命令。这些请求回退到现有权限系统,意味着你的 can_use_tool 处理程序将被调用,允许你实现自定义授权逻辑。
你的 excludedCommands 条目改为自动绕过沙箱,无需模型参与;sandbox.excludedCommands 涵盖何时应用条目。
以下示例记录每个沙箱外请求并拒绝它,除非你自己的授权逻辑允许它:
另见
- SDK 概述 - 一般 SDK 概念
- TypeScript SDK 参考 - TypeScript SDK 文档
- 自定义工具 - 为 Claude 定义可调用的进程内 MCP 工具
- CLI 参考 - 命令行界面
- 常见工作流 - 分步指南