Python SDK 参考:选项与类型
Agent SDK Python 的 ClaudeAgentOptions 全部字段、Transport、SdkMcpTool、系统提示类型、SettingSource、AgentDefinition、PermissionMode、EffortLevel、CanUseTool 与权限结果类型、ThinkingConfig、MCP 配置与状态类型、ContextUsageResponse、SdkPluginConfig。
本页是 Python Agent SDK 参考的第二部分:配置类 ClaudeAgentOptions 和各种类型。安装、函数和 ClaudeSDKClient 见「Python SDK 参考:安装、函数与 ClaudeSDKClient」。
@dataclass 与 TypedDict:这个 SDK 用两种类型。用 @dataclass 装饰的类(如 ResultMessage、AgentDefinition、TextBlock)在运行时是对象实例,支持属性访问:msg.result。用 TypedDict 定义的类(如 ThinkingConfigEnabled、McpStdioServerConfig、SyncHookJSONOutput)在运行时是普通字典,要用键访问:config["budget_tokens"],而不是 config.budget_tokens。ClassName(field=value) 的调用语法对两者都能用,但对 TypedDict 它返回的是字典。
SdkMcpTool
用 @tool 装饰器创建的 SDK MCP 工具的定义。
@dataclass
class SdkMcpTool(Generic[T]):
name: str
description: str
input_schema: type[T] | dict[str, Any]
handler: Callable[[T], Awaitable[dict[str, Any]]]
annotations: ToolAnnotations | None = None| 属性 | 类型 | 说明 |
|---|---|---|
name | str | 工具的唯一标识 |
description | str | 人类可读的描述 |
input_schema | type[T] | dict[str, Any] | 输入校验的 schema |
handler | Callable[[T], Awaitable[dict[str, Any]]] | 处理工具执行的异步函数 |
annotations | ToolAnnotations | None | 可选的工具注解(如 readOnlyHint、destructiveHint、openWorldHint、maxResultSizeChars) |
Transport
自定义传输实现的抽象基类。用它通过自定义通道(例如远程连接而不是本地子进程)与 Claude 进程通信。这是低层的内部 API,接口可能在未来版本里变化,自定义实现必须随接口变化更新。
from abc import ABC, abstractmethod
from collections.abc import AsyncIterator
from typing import Any
class Transport(ABC):
@abstractmethod
async def connect(self) -> None: ...
@abstractmethod
async def write(self, data: str) -> None: ...
@abstractmethod
def read_messages(self) -> AsyncIterator[dict[str, Any]]: ...
@abstractmethod
async def close(self) -> None: ...
@abstractmethod
def is_ready(self) -> bool: ...
@abstractmethod
async def end_input(self) -> None: ...| 方法 | 说明 |
|---|---|
connect() | 连接传输并为通信做准备 |
write(data) | 向传输写入原始数据(JSON 加换行) |
read_messages() | 产出已解析 JSON 消息的异步迭代器 |
close() | 关闭连接并清理资源 |
is_ready() | 传输能发送和接收时返回 True |
end_input() | 关闭输入流(例如对子进程传输关闭 stdin) |
导入:from claude_agent_sdk import Transport
ClaudeAgentOptions
Claude Code 查询的配置 dataclass。
@dataclass
class ClaudeAgentOptions:
tools: list[str] | ToolsPreset | None = None
allowed_tools: list[str] = field(default_factory=list)
system_prompt: str | SystemPromptPreset | SystemPromptCustom | SystemPromptFile | None = None
mcp_servers: dict[str, McpServerConfig] | str | Path = field(default_factory=dict)
strict_mcp_config: bool = False
permission_mode: PermissionMode | None = None
continue_conversation: bool = False
resume: str | None = None
session_id: str | None = None
max_turns: int | None = None
max_budget_usd: float | None = None
disallowed_tools: list[str] = field(default_factory=list)
model: str | None = None
fallback_model: str | None = None
betas: list[SdkBeta] = field(default_factory=list)
output_format: dict[str, Any] | None = None
permission_prompt_tool_name: str | None = None
cwd: str | Path | None = None
cli_path: str | Path | None = None
settings: str | None = None
add_dirs: list[str | Path] = field(default_factory=list)
env: dict[str, str] = field(default_factory=dict)
extra_args: dict[str, str | None] = field(default_factory=dict)
max_buffer_size: int | None = None
debug_stderr: Any = sys.stderr # 已弃用
stderr: Callable[[str], None] | None = None
can_use_tool: CanUseTool | None = None
hooks: dict[HookEvent, list[HookMatcher]] | None = None
user: str | None = None
include_partial_messages: bool = False
include_hook_events: bool = False
forward_subagent_text: bool = False
verbatim_prompts: bool = False
fork_session: bool = False
resume_session_at: str | None = None
resume_drops_turn: str | None = None
agents: dict[str, AgentDefinition] | None = None
setting_sources: list[SettingSource] | None = None
skills: list[str] | Literal["all"] | None = None
sandbox: SandboxSettings | None = None
plugins: list[SdkPluginConfig] = field(default_factory=list)
max_thinking_tokens: int | None = None # 已弃用:改用 thinking
thinking: ThinkingConfig | None = None
effort: EffortLevel | None = None
enable_file_checkpointing: bool = False
session_store: SessionStore | None = None
session_store_flush: SessionStoreFlushMode = "batched"
load_timeout_ms: int = 60_000
task_budget: TaskBudget | None = None| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
tools | list[str] | ToolsPreset | None | None | 工具配置;用 {"type": "preset", "preset": "claude_code"} 得到 Claude Code 的默认工具 |
allowed_tools | list[str] | [] | 自动批准、不提示的工具。这不会把 Claude 限制在只用这些工具;如果在此列出任务跟踪工具之一,Claude Code 也会让会话选择加入;其他未列出的工具走 permission_mode 和 can_use_tool;要屏蔽工具用 disallowed_tools |
system_prompt | str | SystemPromptPreset | SystemPromptCustom | SystemPromptFile | None | None | 系统提示配置:传字符串作为自定义提示;{"type": "preset", "preset": "claude_code"} 使用 Claude Code 的系统提示(可带 "append");{"type": "custom", "prompt": "..."} 是也能设 "snapshot" 的自定义提示;{"type": "file", "path": "..."} 从磁盘加载大型提示 |
mcp_servers | dict[str, McpServerConfig] | str | Path | {} | MCP 服务器配置或配置文件路径 |
strict_mcp_config | bool | False | 为 True 时,只使用 mcp_servers 里传入的服务器,忽略项目 .mcp.json、用户设置、插件提供的 MCP 服务器和 claude.ai 连接器;对应 CLI 的 --strict-mcp-config 标志 |
permission_mode | PermissionMode | None | None | 工具使用的权限模式 |
continue_conversation | bool | False | 继续最近的对话 |
resume | str | None | None | 要恢复的会话 ID |
session_id | str | None | None | 使用特定的会话 ID 而不是自动生成的,必须是有效 UUID;除非同时设了 fork_session,否则不能与 continue_conversation 或 resume 组合 |
max_turns | int | None | None | 最大智能体轮次(工具使用往返) |
max_budget_usd | float | None | None | 客户端成本估算达到该美元值时停止查询;只计本次调用自己的花费,从恢复的会话还原的总额不计 |
disallowed_tools | list[str] | [] | 要拒绝的工具。裸名(如 "Bash")把该工具从 Claude 的上下文里移除;有范围的规则(如 "Bash(rm *)")让工具保持可用,并在每种权限模式(包括 bypassPermissions)下对按所写命令匹配的调用拒绝 |
enable_file_checkpointing | bool | False | 启用文件改动跟踪以便回退 |
model | str | None | None | Claude 模型别名或完整模型名 |
fallback_model | str | None | None | 主模型失败时使用的备用模型,接受逗号分隔的列表 |
betas | list[SdkBeta] | [] | 要启用的 beta 功能,可选项见 SdkBeta |
output_format | dict[str, Any] | None | None | 结构化响应的输出格式(如 {"type": "json_schema", "schema": {...}}) |
permission_prompt_tool_name | str | None | None | 用于权限提示的 MCP 工具名 |
cwd | str | Path | None | None | 当前工作目录 |
cli_path | str | Path | None | None | Claude Code CLI 可执行文件的自定义路径 |
settings | str | None | None | 设置文件路径或内联 JSON 字符串 |
add_dirs | list[str | Path] | [] | Claude 可访问的额外目录。SDK 把每一项以 --add-dir 传给 Claude Code,所以配合 project 设置来源时,Claude Code 也会加载该目录的 skills、命令和子智能体 |
env | dict[str, str] | {} | 合并在继承的进程环境之上的环境变量;设 CLAUDE_AGENT_SDK_CLIENT_APP 可在 User-Agent 头里标识你的应用 |
extra_args | dict[str, str | None] | {} | 直接传给 CLI 的额外 CLI 参数 |
max_buffer_size | int | None | None | 缓冲 CLI stdout 时的最大字节数 |
debug_stderr | Any | sys.stderr | 已弃用:SDK 忽略该值,改用 stderr 回调获取 CLI stderr 输出 |
stderr | Callable[[str], None] | None | None | CLI stderr 输出的回调函数 |
can_use_tool | CanUseTool | None | None | 工具权限回调,只在权限流程落到提示时调用;被 allowed_tools、允许规则或 permission_mode 自动批准的调用不会调用它;允许规则不会预批准没有任何模式自动批准的动作 |
hooks | dict[HookEvent, list[HookMatcher]] | None | None | 拦截事件的 hook 配置 |
user | str | None | None | 在 POSIX 平台上,Claude Code 子进程以之运行的操作系统用户账号;Claude Code 保留父进程的环境(包括 HOME)并在 cwd 里运行 |
include_partial_messages | bool | False | 包含部分消息流事件;启用时产出 StreamEvent 消息 |
include_hook_events | bool | False | 把 hook 生命周期事件作为 HookEventMessage 对象放进消息流 |
forward_subagent_text | bool | False | 在消息流里转发子智能体的文本和思考块;没有该选项时,Claude Code 只发出子智能体的 tool_use 和 tool_result 块,不发文本或思考(需要 Python Agent SDK 0.2.140 及以上) |
verbatim_prompts | bool | False | 逐字投递每个提示:SDK 把每条用户消息的 client_composed 设为 True;当提示文本含最终用户没有输入的内容时使用;要按轮次控制,保持关闭并在单条流式消息上设 "client_composed": True;该选项开启时,SDK 会覆盖你设置的任何 client_composed 值 |
fork_session | bool | False | 用 resume 恢复时,分叉成新的会话 ID 而不是继续原会话 |
resume_session_at | str | None | None | 恢复时,只加载对话到并包括带这个 UUID 的消息;与 resume 一起使用,通常还要 fork_session,用于从较早的点分支(需要 Python Agent SDK 0.2.137 及以上) |
resume_drops_turn | str | None | None | resume_session_at 的截断所丢弃轮次的用户提示 UUID;设置后,被丢弃的范围里含有不能归属于该轮次的条目时 CLI 拒绝恢复(需要 Python Agent SDK 0.2.137 及以上和 Claude Code v2.1.223 及以上;这些 SDK 版本捆绑的 CLI 满足后者) |
agents | dict[str, AgentDefinition] | None | None | 以编程方式定义的子智能体 |
plugins | list[SdkPluginConfig] | [] | 从本地路径加载自定义插件 |
sandbox | SandboxSettings | None | None | 以编程方式配置沙盒行为 |
setting_sources | list[SettingSource] | None | None(CLI 默认:所有来源) | 控制加载哪些文件系统设置;传 [] 禁用用户、项目和本地设置;设了 skills 而该字段未设时,只加载用户和项目来源,要保留本地设置就显式设置 setting_sources;端点托管策略总会加载;会话在符合条件的配置上用组织凭据认证时会获取服务器托管设置 |
skills | list[str] | Literal["all"] | None | None | 会话可用的 skills:传 "all" 启用每个发现的 skill,或传 skill 名列表;只传精确名字,SDK 在启动 Claude Code 进程前以 ValueError 拒绝畸形和通配形式的名字(该检查需要 Python Agent SDK 0.2.129 及以上);设置后,SDK 自动把 Skill 工具加进 allowed_tools,如果同时传了 tools,要在该列表里包含 "Skill" |
max_thinking_tokens | int | None | None | 已弃用:思考块的最大 token 数,改用 thinking |
thinking | ThinkingConfig | None | None | 控制扩展思考行为,优先于 max_thinking_tokens |
effort | EffortLevel | None | None | 思考深度的努力级别 |
session_store | SessionStore | None | None | 把会话记录镜像到外部后端,让另一台主机能恢复它们 |
session_store_flush | Literal["batched", "eager"] | "batched" | 何时把镜像的记录条目刷新到 session_store:"batched" 每个轮次或缓冲区满时刷新一次;"eager" 在每一帧之后触发后台刷新;session_store 为 None 时忽略 |
load_timeout_ms | int | 60000 | 恢复物化期间 session_store.load() 和 list_subkeys() 每次调用的超时毫秒数 |
task_budget | TaskBudget | None | None | API 侧 token 预算,作为 output_config.task_budget 随 task-budgets-2026-03-13 beta 头发送;传 {"total": <int>} |
处理慢或停滞的 API 响应
CLI 子进程读取若干控制 API 超时和停滞检测的环境变量,通过 ClaudeAgentOptions.env 传入:
from claude_agent_sdk import ClaudeAgentOptions
options = ClaudeAgentOptions(
env={
"API_TIMEOUT_MS": "120000",
"CLAUDE_CODE_MAX_RETRIES": "2",
"CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS": "120000",
},
)这些变量(API_TIMEOUT_MS、CLAUDE_CODE_MAX_RETRIES、CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS、CLAUDE_ENABLE_STREAM_WATCHDOG 与 CLAUDE_STREAM_IDLE_TIMEOUT_MS)的含义、默认值和上限,与 TypeScript SDK 参考「选项与类型」页的同名小节完全相同。Python 里有一处差别:看门狗等待 ANTHROPIC_BASE_URL 后面的网关用 keep-alive ping 保持打开的响应期间,设了 include_partial_messages 的宿主会持续收到 ping 的 StreamEvent 消息,要把这些帧当作存活信号,而不要因静默超时会话(v2.1.257 之前,这些帧在最后一个真实流事件的 5 分钟后停止)。
OutputFormat
结构化输出校验的配置,作为 dict 传给 ClaudeAgentOptions 的 output_format 字段:
# output_format 的预期字典形状
{
"type": "json_schema",
"schema": {...}, # 你的 JSON Schema 定义
}| 字段 | 必填 | 说明 |
|---|---|---|
type | 是 | 做 JSON Schema 校验时必须是 "json_schema" |
schema | 是 | 输出校验的 JSON Schema 定义 |
系统提示类型
SystemPromptPreset
使用 Claude Code 预设系统提示并可附加内容的配置。
class SystemPromptPreset(TypedDict):
type: Literal["preset"]
preset: Literal["claude_code"]
append: NotRequired[str]
exclude_dynamic_sections: NotRequired[bool]
snapshot: NotRequired[bool]| 字段 | 必填 | 说明 |
|---|---|---|
type | 是 | 使用预设系统提示时必须是 "preset" |
preset | 是 | 使用 Claude Code 的系统提示时必须是 "claude_code" |
append | 否 | 附加到预设系统提示后的额外说明 |
exclude_dynamic_sections | 否 | 把每用户的上下文(如自动记忆位置)从系统提示移到第一条用户消息里,改善跨用户和机器的提示缓存复用 |
snapshot | 否 | 设为 False 让它在每个请求上重建系统提示,而不是复用会话在第一个请求上记录的提示(需要 claude-agent-sdk v0.2.153 及以上) |
SystemPromptCustom
对象形式的自定义系统提示,等价于把字符串作为 system_prompt 传入,但还能设 snapshot(需要 claude-agent-sdk v0.2.153 及以上)。
class SystemPromptCustom(TypedDict):
type: Literal["custom"]
prompt: str
snapshot: NotRequired[bool]type 必须是 "custom";prompt 是系统提示文本,作为命令行参数传给 CLI,所以命令行长度限制适用;snapshot 与 SystemPromptPreset.snapshot 相同,应用于 prompt。
SystemPromptFile
从文件而不是字符串加载自定义系统提示的配置,SDK 把它映射到 CLI 的 --system-prompt-file 标志。提示很大时用文件形式:SDK 把字符串形式的 system_prompt 放在 CLI 子进程的 argv 上,这受操作系统命令行长度限制约束,且发生在 SDK 发出任何 API 请求之前。在 Linux 上,单个超过约 128 KB 的参数会在进程派生时以 Argument list too long 失败;在 Windows 上,整个命令行被限制在约 32 KB。
class SystemPromptFile(TypedDict):
type: Literal["file"]
path: strtype 必须是 "file"(从磁盘加载提示);path 是含系统提示的文件路径。
SettingSource
控制 SDK 从哪些基于文件系统的配置来源加载设置。
SettingSource = Literal["user", "project", "local"]| 值 | 说明 | 位置 |
|---|---|---|
"user" | 全局用户设置 | ~/.claude/settings.json |
"project" | 共享的项目设置(受版本控制) | .claude/settings.json |
"local" | 本地项目设置,Claude Code 往里保存设置时会被 gitignore | .claude/settings.local.json |
默认行为:setting_sources 省略或为 None 且没设 skills 时,query() 加载与 Claude Code CLI 相同的文件系统设置:用户、项目和本地;设了 skills 时,默认值见 setting_sources 一行的描述。端点托管策略总会加载;会话在符合条件的配置上用组织凭据认证时会获取服务器托管设置。
禁用文件系统设置:
# 不从磁盘加载用户、项目或本地设置
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="Analyze this code",
options=ClaudeAgentOptions(
setting_sources=[]
),
):
print(message)
asyncio.run(main())在 Python SDK 0.1.59 及更早版本里,空列表与省略该选项被同样对待,所以 setting_sources=[] 不会禁用文件系统设置;需要空列表生效就升级到较新的版本(TypeScript SDK 不受影响)。
只加载特定的设置来源:
# 只加载项目设置,忽略用户和本地设置
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="Run CI checks",
options=ClaudeAgentOptions(
setting_sources=["project"] # 只有 .claude/settings.json
),
):
print(message)
asyncio.run(main())仅用 SDK 的应用:
# 以编程方式定义一切。
# 传 [] 选择不使用文件系统设置来源。
import asyncio
from claude_agent_sdk import AgentDefinition, ClaudeAgentOptions, query
async def main():
async for message in query(
prompt="Review this PR",
options=ClaudeAgentOptions(
setting_sources=[],
agents={
"code-reviewer": AgentDefinition(
description="Reviews code changes",
prompt="You are a code reviewer. Report issues in the diff.",
),
},
allowed_tools=["Read", "Grep", "Glob"],
),
):
print(message)
asyncio.run(main())要加载 CLAUDE.md 项目说明,要在 setting_sources 里包含 "project"。设置优先级:加载多个来源时,设置按下面的优先级合并(从高到低):本地设置、项目设置、用户设置;agents、allowed_tools 和 settings 这类编程选项覆盖文件系统设置;托管策略设置优先于编程选项。
AgentDefinition
以编程方式定义的子智能体的配置。
@dataclass
class AgentDefinition:
description: str
prompt: str
tools: list[str] | None = None
disallowedTools: list[str] | None = None
model: str | None = None
skills: list[str] | None = None
memory: Literal["user", "project", "local"] | None = None
mcpServers: list[str | dict[str, Any]] | None = None
initialPrompt: str | None = None
maxTurns: int | None = None
background: bool | None = None
effort: EffortLevel | int | None = None
permissionMode: PermissionMode | None = None| 字段 | 必填 | 说明 |
|---|---|---|
description | 是 | 何时使用该智能体的自然语言描述 |
prompt | 是 | 智能体的系统提示 |
tools | 否 | 允许的工具名数组;省略时继承子智能体可用的每个工具 |
disallowedTools | 否 | 要从智能体工具集里移除的工具名数组;也接受 MCP 服务器级模式:mcp__server 或 mcp__server__* 移除该服务器的每个工具,mcp__* 移除任何服务器的每个 MCP 工具 |
model | 否 | 该智能体的模型覆盖;接受 "sonnet"、"opus"、"haiku"、"inherit" 等别名或完整模型 ID;省略时 Claude Code 按子智能体的模型顺序选择 |
skills | 否 | 启动时预加载进智能体上下文的 skill 名列表;未列出的 skills 仍可通过 Skill 工具调用 |
memory | 否 | 该智能体的记忆来源:"user"、"project" 或 "local" |
mcpServers | 否 | 该智能体可用的 MCP 服务器,每项是服务器名或内联的 {name: config} 字典 |
initialPrompt | 否 | 该智能体作为主线程智能体运行时,自动作为第一个用户轮次提交 |
maxTurns | 否 | 智能体停止前最大的智能体轮次数 |
background | 否 | 被调用时作为非阻塞的后台任务运行该智能体 |
effort | 否 | 该智能体的推理努力级别,接受命名级别或整数(见 EffortLevel) |
permissionMode | 否 | 该智能体内工具执行的权限模式,何时适用由子智能体继承规则决定 |
注意:AgentDefinition 的字段名用 camelCase,如 disallowedTools、permissionMode 和 maxTurns。这些名字直接对应与 TypeScript SDK 共享的线上格式。这不同于 ClaudeAgentOptions,它对等价的顶层字段用 Python 的 snake_case,如 disallowed_tools 和 permission_mode。因为 AgentDefinition 是 dataclass,传 snake_case 关键字会在构造时抛 TypeError。
PermissionMode 与 EffortLevel
控制工具执行的权限模式:
PermissionMode = Literal[
"default", # 标准权限行为
"acceptEdits", # 自动接受文件编辑
"plan", # 规划模式——只探索不编辑
"dontAsk", # 拒绝任何未预批准的,而不是提示
"bypassPermissions", # 绕过权限检查;显式的 ask 规则仍会提示(小心使用)
"auto", # 由模型分类器审查 shell 命令和网络请求等动作
]引导思考深度的努力级别:
EffortLevel = Literal[
"low", # 最少思考,响应最快
"medium", # 适度思考
"high", # 深度推理
"xhigh", # 扩展推理;在不支持的模型上回落到 "high"
"max", # 最大努力
]权限回调类型
CanUseTool
工具权限回调函数的类型别名。
CanUseTool = Callable[
[str, dict[str, Any], ToolPermissionContext], Awaitable[PermissionResult]
]回调接收:tool_name(被调用工具的名字)、input_data(工具的输入参数)、context(带附加信息的 ToolPermissionContext),返回 PermissionResult(PermissionResultAllow 或 PermissionResultDeny)。该回调是 SDK 对交互式权限提示的替代:只在权限评估流程解析为提示时才调用。已经被 allowed_tools 条目、设置允许规则或权限模式(如 acceptEdits 或 bypassPermissions)批准的工具调用从不调用它;要把关每个工具调用,用 PreToolUse hook。允许规则不会预批准没有任何模式自动批准的动作。
ToolPermissionContext
传给工具权限回调的上下文信息。
@dataclass
class ToolPermissionContext:
signal: Any | None = None # 未来:中止信号支持
suggestions: list[PermissionUpdate] = field(default_factory=list)
tool_use_id: str | None = None
agent_id: str | None = None
blocked_path: str | None = None
decision_reason: str | None = None
title: str | None = None
display_name: str | None = None
description: str | None = None| 字段 | 类型 | 说明 |
|---|---|---|
signal | Any | None | 为未来的中止信号支持保留 |
suggestions | list[PermissionUpdate] | 来自 CLI 的权限更新建议。Bash 提示包含带 localSettings 目的地的建议,所以把它在 updated_permissions 里返回会把规则写到 .claude/settings.local.json 并跨会话持续 |
tool_use_id | str | None | 该提示所针对的具体工具调用的标识;交付给 can_use_tool 时总会填充 |
agent_id | str | None | 调用源自子智能体时的子智能体 ID;主智能体为 None |
blocked_path | str | None | 触发权限请求的文件路径(如适用),例如 Bash 命令试图访问允许目录之外的路径时 |
decision_reason | str | None | 触发该权限请求的原因;PreToolUse hook 返回 "ask" 时从其 permissionDecisionReason 转发 |
title | str | None | 完整的权限提示句子,如 Claude wants to read foo.txt;存在时用作主要提示文本 |
display_name | str | None | 工具动作的简短名词短语,如 Read file,适合按钮标签 |
description | str | None | 权限界面的人类可读副标题 |
PermissionResult、PermissionResultAllow、PermissionResultDeny
PermissionResult = PermissionResultAllow | PermissionResultDeny
@dataclass
class PermissionResultAllow:
behavior: Literal["allow"] = "allow"
updated_input: dict[str, Any] | None = None
updated_permissions: list[PermissionUpdate] | None = None
@dataclass
class PermissionResultDeny:
behavior: Literal["deny"] = "deny"
message: str = ""
interrupt: bool = FalsePermissionResultAllow 的 behavior 必须是 "allow";updated_input 是用来代替原始输入的修改后输入;updated_permissions 是要应用的权限更新。PermissionResultDeny 的 behavior 必须是 "deny";message 是解释工具为何被拒绝的消息;interrupt 表示是否中断当前执行。
PermissionUpdate 与 PermissionRuleValue
以编程方式更新权限的配置。
@dataclass
class PermissionUpdate:
type: Literal[
"addRules",
"replaceRules",
"removeRules",
"setMode",
"addDirectories",
"removeDirectories",
]
rules: list[PermissionRuleValue] | None = None
behavior: Literal["allow", "deny", "ask"] | None = None
mode: PermissionMode | None = None
directories: list[str] | None = None
destination: (
Literal["userSettings", "projectSettings", "localSettings", "session"] | None
) = None
@dataclass
class PermissionRuleValue:
tool_name: str
rule_content: str | None = Nonetype 是权限更新操作的类型;rules 是 add/replace/remove 操作的规则;behavior 是基于规则的操作的行为;mode 是 setMode 操作的模式;directories 是添加/移除目录操作的目录;destination 是在哪里应用权限更新。PermissionRuleValue 是在权限更新里要添加、替换或移除的规则。
ToolsPreset
使用 Claude Code 默认工具集的预设工具配置。
class ToolsPreset(TypedDict):
type: Literal["preset"]
preset: Literal["claude_code"]ThinkingConfig
控制扩展思考行为,是三种配置的联合:
ThinkingDisplay = Literal["summarized", "omitted"]
class ThinkingConfigAdaptive(TypedDict):
type: Literal["adaptive"]
display: NotRequired[ThinkingDisplay]
class ThinkingConfigEnabled(TypedDict):
type: Literal["enabled"]
budget_tokens: int
display: NotRequired[ThinkingDisplay]
class ThinkingConfigDisabled(TypedDict):
type: Literal["disabled"]
ThinkingConfig = ThinkingConfigAdaptive | ThinkingConfigEnabled | ThinkingConfigDisabled| 变体 | 字段 | 说明 |
|---|---|---|
adaptive | type、display | Claude 自适应地决定何时思考 |
enabled | type、budget_tokens、display | 以特定的 token 预算启用思考 |
disabled | type | 禁用思考 |
可选的 display 字段控制思考文本是以 "summarized" 还是 "omitted" 返回。在 Claude Opus 4.7 及以后,API 默认是 "omitted",所以要设 "summarized" 才能在 ThinkingBlock 输出里收到思考内容。Claude Code 不向 Amazon Bedrock 或 Google Cloud Agent Platform 发送 display,所以在这些提供商上,Opus 4.7 及以后即使你把 display 设为 "summarized" 也返回空的 ThinkingBlock。因为这些是 TypedDict 类,它们在运行时是普通字典:要么构造为字典字面量,要么像构造函数那样调用类,两者都产生 dict;用 config["budget_tokens"] 访问字段,而不是 config.budget_tokens:
from claude_agent_sdk import ClaudeAgentOptions, ThinkingConfigEnabled
# 选项 1:字典字面量(推荐,无需导入)
options = ClaudeAgentOptions(thinking={"type": "enabled", "budget_tokens": 20000})
# 选项 2:构造函数风格(返回普通字典)
config = ThinkingConfigEnabled(type="enabled", budget_tokens=20000)
print(config["budget_tokens"]) # 20000
# config.budget_tokens 会抛 AttributeErrorTaskBudget 与 SdkBeta
API 侧的 token 任务预算,与 ClaudeAgentOptions 的 task_budget 字段一起使用;它是 TypedDict,所以作为普通字典传入,如 ClaudeAgentOptions(task_budget={"total": 50000}):
class TaskBudget(TypedDict):
total: int # 任务的 token 总预算SDK beta 功能的 Literal 类型,与 betas 字段一起使用:
SdkBeta = Literal["context-1m-2025-08-07"]注意:context-1m-2025-08-07 beta 已于 2026 年 4 月 30 日退役。对 Claude Sonnet 4.5 或 Sonnet 4 传入该头没有效果,超过标准 200k token 上下文窗口的请求会返回错误;要用 1M token 的上下文窗口,迁移到按标准价格包含 1M 上下文、不需要 beta 头的较新模型(官方列出了具体模型型号,见官方原文)。
MCP 配置与状态类型
McpSdkServerConfig 与 McpServerConfig
用 create_sdk_mcp_server() 创建的 SDK MCP 服务器的配置,以及 MCP 服务器配置的联合类型:
class McpSdkServerConfig(TypedDict):
type: Literal["sdk"]
name: str
instance: Any # MCP Server 实例
McpServerConfig = (
McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig | McpSdkServerConfig
)
class McpStdioServerConfig(TypedDict):
type: NotRequired[Literal["stdio"]] # 为向后兼容而可选
command: str
args: NotRequired[list[str]]
env: NotRequired[dict[str, str]]
class McpSSEServerConfig(TypedDict):
type: Literal["sse"]
url: str
headers: NotRequired[dict[str, str]]
class McpHttpServerConfig(TypedDict):
type: Literal["http"]
url: str
headers: NotRequired[dict[str, str]]McpServerStatusConfig、McpStatusResponse、McpServerStatus
get_mcp_status() 报告的 MCP 服务器配置,是所有 McpServerConfig 传输变体加上一个仅用于输出的 claudeai-proxy 变体(经 claude.ai 代理的服务器)的联合。McpSdkServerConfigStatus 是 McpSdkServerConfig 的可序列化形式,只有 type("sdk")和 name(str)字段,进程内的 instance 被省略;McpClaudeAIProxyServerConfig 有 type("claudeai-proxy")、url(str)和 id(str)字段。
McpServerStatusConfig = (
McpStdioServerConfig
| McpSSEServerConfig
| McpHttpServerConfig
| McpSdkServerConfigStatus
| McpClaudeAIProxyServerConfig
)
class McpStatusResponse(TypedDict):
mcpServers: list[McpServerStatus]
class McpServerStatus(TypedDict):
name: str
status: McpServerConnectionStatus # "connected" | "failed" | "needs-auth" | "pending" | "disabled"
serverInfo: NotRequired[McpServerInfo]
error: NotRequired[str]
config: NotRequired[McpServerStatusConfig]
scope: NotRequired[str]
tools: NotRequired[list[McpToolInfo]]McpStatusResponse 是 ClaudeSDKClient.get_mcp_status() 的响应,把服务器状态列表包在 mcpServers 键下。McpServerStatus 的字段:name 是服务器名;status 是 "connected"、"failed"、"needs-auth"、"pending" 或 "disabled" 之一;serverInfo(可选)是服务器名和版本({"name": str, "version": str});error(可选)是服务器连接失败时的错误消息;config(可选)是服务器配置,形状与 McpServerConfig 相同(stdio、SSE、HTTP 或 SDK),外加经 claude.ai 连接的服务器的 claudeai-proxy 变体;scope(可选)是配置范围;tools(可选)是该服务器提供的工具,每个带 name、description 和 annotations 字段。
ContextUsageResponse
ClaudeSDKClient.get_context_usage() 的响应。它是 Claude Code 在交互式会话里为 /context 命令渲染的同一个载荷,所以除了 token 计数,它还携带 color 和 gridRows 这类 Claude Code 用来绘制 /context 用量网格的显示字段。Claude Code 通过向 token 计数 API 发送几个请求来构建这个载荷;这些请求不出现在消息流里,所以读取消息流的成本跟踪看不到它们(在 Anthropic API 上,token 计数不计费)。
class ContextUsageResponse(TypedDict):
categories: list[ContextUsageCategory]
totalTokens: int
maxTokens: int
rawMaxTokens: int
percentage: float
model: str
isAutoCompactEnabled: bool
memoryFiles: list[dict[str, Any]]
mcpTools: list[dict[str, Any]]
agents: list[dict[str, Any]]
gridRows: list[list[dict[str, Any]]]
autoCompactThreshold: NotRequired[int]
deferredBuiltinTools: NotRequired[list[dict[str, Any]]]
systemTools: NotRequired[list[dict[str, Any]]]
systemPromptSections: NotRequired[list[dict[str, Any]]]
slashCommands: NotRequired[dict[str, Any]]
skills: NotRequired[dict[str, Any]] # 带 frontmatter 拆分的 skill 用量
messageBreakdown: NotRequired[dict[str, Any]] # 按类型的消息 token
apiUsage: NotRequired[dict[str, Any] | None]每个 ContextUsageCategory 条目携带 name、tokens、color 和可选的 isDeferred 标志。totalTokens 是会话当前的上下文用量,maxTokens 是衡量该用量的窗口(模型的上下文窗口,或适用时更低的自动压缩窗口),rawMaxTokens 携带与 maxTokens 相同的值;apiUsage 持有最近一次 API 响应的用量,不是会话的累计总数。Claude Code 把可选的 deferredBuiltinTools、systemTools 和 systemPromptSections 诊断字段留空,所以尽管类型声明了它们,也要预期它们不存在。
SdkPluginConfig
在 SDK 里加载插件的配置。
class SdkPluginConfig(TypedDict):
type: Literal["local"]
path: str| 字段 | 类型 | 说明 |
|---|---|---|
type | Literal["local"] | 必须是 "local"(目前只支持本地插件) |
path | str | 插件目录的绝对或相对路径 |
plugins = [
{"type": "local", "path": "./my-plugin"},
{"type": "local", "path": "/absolute/path/to/plugin"},
]