跳到正文
FunCoding

搜索

搜索文档、智能体、博客、Skill 和 MCP

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
属性类型说明
namestr工具的唯一标识
descriptionstr人类可读的描述
input_schematype[T] | dict[str, Any]输入校验的 schema
handlerCallable[[T], Awaitable[dict[str, Any]]]处理工具执行的异步函数
annotationsToolAnnotations | 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
属性类型默认说明
toolslist[str] | ToolsPreset | NoneNone工具配置;用 {"type": "preset", "preset": "claude_code"} 得到 Claude Code 的默认工具
allowed_toolslist[str][]自动批准、不提示的工具。这不会把 Claude 限制在只用这些工具;如果在此列出任务跟踪工具之一,Claude Code 也会让会话选择加入;其他未列出的工具走 permission_mode 和 can_use_tool;要屏蔽工具用 disallowed_tools
system_promptstr | SystemPromptPreset | SystemPromptCustom | SystemPromptFile | NoneNone系统提示配置:传字符串作为自定义提示;{"type": "preset", "preset": "claude_code"} 使用 Claude Code 的系统提示(可带 "append");{"type": "custom", "prompt": "..."} 是也能设 "snapshot" 的自定义提示;{"type": "file", "path": "..."} 从磁盘加载大型提示
mcp_serversdict[str, McpServerConfig] | str | Path{}MCP 服务器配置或配置文件路径
strict_mcp_configboolFalse为 True 时,只使用 mcp_servers 里传入的服务器,忽略项目 .mcp.json、用户设置、插件提供的 MCP 服务器和 claude.ai 连接器;对应 CLI 的 --strict-mcp-config 标志
permission_modePermissionMode | NoneNone工具使用的权限模式
continue_conversationboolFalse继续最近的对话
resumestr | NoneNone要恢复的会话 ID
session_idstr | NoneNone使用特定的会话 ID 而不是自动生成的,必须是有效 UUID;除非同时设了 fork_session,否则不能与 continue_conversation 或 resume 组合
max_turnsint | NoneNone最大智能体轮次(工具使用往返)
max_budget_usdfloat | NoneNone客户端成本估算达到该美元值时停止查询;只计本次调用自己的花费,从恢复的会话还原的总额不计
disallowed_toolslist[str][]要拒绝的工具。裸名(如 "Bash")把该工具从 Claude 的上下文里移除;有范围的规则(如 "Bash(rm *)")让工具保持可用,并在每种权限模式(包括 bypassPermissions)下对按所写命令匹配的调用拒绝
enable_file_checkpointingboolFalse启用文件改动跟踪以便回退
modelstr | NoneNoneClaude 模型别名或完整模型名
fallback_modelstr | NoneNone主模型失败时使用的备用模型,接受逗号分隔的列表
betaslist[SdkBeta][]要启用的 beta 功能,可选项见 SdkBeta
output_formatdict[str, Any] | NoneNone结构化响应的输出格式(如 {"type": "json_schema", "schema": {...}})
permission_prompt_tool_namestr | NoneNone用于权限提示的 MCP 工具名
cwdstr | Path | NoneNone当前工作目录
cli_pathstr | Path | NoneNoneClaude Code CLI 可执行文件的自定义路径
settingsstr | NoneNone设置文件路径或内联 JSON 字符串
add_dirslist[str | Path][]Claude 可访问的额外目录。SDK 把每一项以 --add-dir 传给 Claude Code,所以配合 project 设置来源时,Claude Code 也会加载该目录的 skills、命令和子智能体
envdict[str, str]{}合并在继承的进程环境之上的环境变量;设 CLAUDE_AGENT_SDK_CLIENT_APP 可在 User-Agent 头里标识你的应用
extra_argsdict[str, str | None]{}直接传给 CLI 的额外 CLI 参数
max_buffer_sizeint | NoneNone缓冲 CLI stdout 时的最大字节数
debug_stderrAnysys.stderr已弃用:SDK 忽略该值,改用 stderr 回调获取 CLI stderr 输出
stderrCallable[[str], None] | NoneNoneCLI stderr 输出的回调函数
can_use_toolCanUseTool | NoneNone工具权限回调,只在权限流程落到提示时调用;被 allowed_tools、允许规则或 permission_mode 自动批准的调用不会调用它;允许规则不会预批准没有任何模式自动批准的动作
hooksdict[HookEvent, list[HookMatcher]] | NoneNone拦截事件的 hook 配置
userstr | NoneNone在 POSIX 平台上,Claude Code 子进程以之运行的操作系统用户账号;Claude Code 保留父进程的环境(包括 HOME)并在 cwd 里运行
include_partial_messagesboolFalse包含部分消息流事件;启用时产出 StreamEvent 消息
include_hook_eventsboolFalse把 hook 生命周期事件作为 HookEventMessage 对象放进消息流
forward_subagent_textboolFalse在消息流里转发子智能体的文本和思考块;没有该选项时,Claude Code 只发出子智能体的 tool_use 和 tool_result 块,不发文本或思考(需要 Python Agent SDK 0.2.140 及以上)
verbatim_promptsboolFalse逐字投递每个提示:SDK 把每条用户消息的 client_composed 设为 True;当提示文本含最终用户没有输入的内容时使用;要按轮次控制,保持关闭并在单条流式消息上设 "client_composed": True;该选项开启时,SDK 会覆盖你设置的任何 client_composed 值
fork_sessionboolFalse用 resume 恢复时,分叉成新的会话 ID 而不是继续原会话
resume_session_atstr | NoneNone恢复时,只加载对话到并包括带这个 UUID 的消息;与 resume 一起使用,通常还要 fork_session,用于从较早的点分支(需要 Python Agent SDK 0.2.137 及以上)
resume_drops_turnstr | NoneNoneresume_session_at 的截断所丢弃轮次的用户提示 UUID;设置后,被丢弃的范围里含有不能归属于该轮次的条目时 CLI 拒绝恢复(需要 Python Agent SDK 0.2.137 及以上和 Claude Code v2.1.223 及以上;这些 SDK 版本捆绑的 CLI 满足后者)
agentsdict[str, AgentDefinition] | NoneNone以编程方式定义的子智能体
pluginslist[SdkPluginConfig][]从本地路径加载自定义插件
sandboxSandboxSettings | NoneNone以编程方式配置沙盒行为
setting_sourceslist[SettingSource] | NoneNone(CLI 默认:所有来源)控制加载哪些文件系统设置;传 [] 禁用用户、项目和本地设置;设了 skills 而该字段未设时,只加载用户和项目来源,要保留本地设置就显式设置 setting_sources;端点托管策略总会加载;会话在符合条件的配置上用组织凭据认证时会获取服务器托管设置
skillslist[str] | Literal["all"] | NoneNone会话可用的 skills:传 "all" 启用每个发现的 skill,或传 skill 名列表;只传精确名字,SDK 在启动 Claude Code 进程前以 ValueError 拒绝畸形和通配形式的名字(该检查需要 Python Agent SDK 0.2.129 及以上);设置后,SDK 自动把 Skill 工具加进 allowed_tools,如果同时传了 tools,要在该列表里包含 "Skill"
max_thinking_tokensint | NoneNone已弃用:思考块的最大 token 数,改用 thinking
thinkingThinkingConfig | NoneNone控制扩展思考行为,优先于 max_thinking_tokens
effortEffortLevel | NoneNone思考深度的努力级别
session_storeSessionStore | NoneNone把会话记录镜像到外部后端,让另一台主机能恢复它们
session_store_flushLiteral["batched", "eager"]"batched"何时把镜像的记录条目刷新到 session_store:"batched" 每个轮次或缓冲区满时刷新一次;"eager" 在每一帧之后触发后台刷新;session_store 为 None 时忽略
load_timeout_msint60000恢复物化期间 session_store.load() 和 list_subkeys() 每次调用的超时毫秒数
task_budgetTaskBudget | NoneNoneAPI 侧 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: str

type 必须是 "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
字段类型说明
signalAny | None为未来的中止信号支持保留
suggestionslist[PermissionUpdate]来自 CLI 的权限更新建议。Bash 提示包含带 localSettings 目的地的建议,所以把它在 updated_permissions 里返回会把规则写到 .claude/settings.local.json 并跨会话持续
tool_use_idstr | None该提示所针对的具体工具调用的标识;交付给 can_use_tool 时总会填充
agent_idstr | None调用源自子智能体时的子智能体 ID;主智能体为 None
blocked_pathstr | None触发权限请求的文件路径(如适用),例如 Bash 命令试图访问允许目录之外的路径时
decision_reasonstr | None触发该权限请求的原因;PreToolUse hook 返回 "ask" 时从其 permissionDecisionReason 转发
titlestr | None完整的权限提示句子,如 Claude wants to read foo.txt;存在时用作主要提示文本
display_namestr | None工具动作的简短名词短语,如 Read file,适合按钮标签
descriptionstr | 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 = False

PermissionResultAllow 的 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 = None

type 是权限更新操作的类型;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
变体字段说明
adaptivetype、displayClaude 自适应地决定何时思考
enabledtype、budget_tokens、display以特定的 token 预算启用思考
disabledtype禁用思考

可选的 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 会抛 AttributeError

TaskBudget 与 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
字段类型说明
typeLiteral["local"]必须是 "local"(目前只支持本地插件)
pathstr插件目录的绝对或相对路径
plugins = [
    {"type": "local", "path": "./my-plugin"},
    {"type": "local", "path": "/absolute/path/to/plugin"},
]