Claude Code 中文文档

create: 2026-07-08
update: 2026-07-31
author: thinkycx
title: 【译】Agent SDK TypeScript 参考
description: TypeScript Agent SDK 的完整 API 参考,涵盖所有函数、类型、接口定义。包括 query()、startup()、tool() 等核心函数,Options 配置、消息类型、Hook 类型、工具输入输出类型、权限类型和沙箱配置。
category: translation
tags: claude-code, agent-sdk, typescript, translation

Agent SDK 参考 - TypeScript

TypeScript Agent SDK 的完整 API 参考,涵盖所有函数、类型和接口。

安装

通过 npm 安装 SDK 包,无需单独安装 Claude Code CLI。

npm install @anthropic-ai/claude-agent-sdk

SDK 会将适合你平台的原生 Claude Code 二进制文件作为可选依赖(如 @anthropic-ai/claude-agent-sdk-darwin-arm64)打包在内,你无需单独安装 Claude Code。SDK 版本号与打包的 Claude Code 版本对应:SDK v0.3.191 打包 Claude Code v2.1.191,因此本页中需要特定 Claude Code 版本的功能需使用相同 patch 号或更高版本的 SDK。如果你的包管理器跳过了可选依赖,SDK 会抛出 Native CLI binary for <platform> not found 错误;此时可将 pathToClaudeCodeExecutable 指向一个单独安装的 claude 二进制文件。

编译为单文件可执行程序

使用 bun build --compile 编译为单文件时,需要额外处理才能正确引用 CLI 二进制文件。

当你使用 bun build --compile 将应用编译为单文件可执行程序时,SDK 无法在运行时解析打包的 CLI 二进制文件。require.resolve 无法在编译后的可执行文件的 $bunfs 虚拟文件系统中工作,因此 SDK 会抛出 Native CLI binary for <platform> not found

解决方法是将平台二进制文件作为文件资产嵌入,在启动时使用 extractFromBunfs() 将其提取到真实路径,然后将该路径传递给 pathToClaudeCodeExecutable

extractFromBunfs() 辅助函数需要 @anthropic-ai/claude-agent-sdk v0.3.144 或更高版本。以下示例针对 Apple Silicon 的 macOS 构建:

import binPath from "@anthropic-ai/claude-agent-sdk-darwin-arm64/claude" with { type: "file" };
import { extractFromBunfs } from "@anthropic-ai/claude-agent-sdk/extract";
import { query } from "@anthropic-ai/claude-agent-sdk";

const cliPath = extractFromBunfs(binPath);

for await (const message of query({
  prompt: "Hello",
  options: { pathToClaudeCodeExecutable: cliPath },
})) {
  console.log(message);
}

extractFromBunfs() 将嵌入的二进制文件从编译后的可执行文件的虚拟文件系统复制到用户级临时目录,并返回真实路径。在非编译可执行文件环境中,它会原样返回输入路径,因此相同的代码在开发时无需修改即可运行。

每个编译后的可执行文件只嵌入单个平台的二进制文件。将导入中的平台包与你的 --target 匹配:

  • 要进行交叉编译,安装不匹配的平台包,例如 npm install @anthropic-ai/claude-agent-sdk-linux-x64 --force
  • 在 Windows 上,二进制文件子路径为 claude.exe,例如 @anthropic-ai/claude-agent-sdk-win32-x64/claude.exe

函数

query()

与 Claude Code 交互的主要函数,创建一个异步生成器来流式接收消息。

function query({
  prompt,
  options
}: {
  prompt: string | AsyncIterable<SDKUserMessage>;
  options?: Options;
}): Query;

参数

参数 类型 描述
prompt string | AsyncIterable<SDKUserMessage> 输入提示词,可以是字符串或用于流式模式的异步迭代器
options Options 可选的配置对象(见下方 Options 类型)

返回值

返回一个 Query 对象,它继承自 AsyncGenerator<SDKMessage, void> 并附带额外方法。

startup()

预热 CLI 子进程,使后续第一次 query() 调用可以跳过进程启动和初始化开销。

通过提前生成子进程并完成初始化握手来预热 CLI。返回的 WarmQuery 句柄稍后接受提示词并将其写入已就绪的进程,这样首次 query() 调用无需在线承担子进程启动和初始化成本。

function startup(params?: {
  options?: Options;
  initializeTimeoutMs?: number;
}): Promise<WarmQuery>;

参数

参数 类型 描述
options Options 可选的配置对象,与 query()options 参数相同
initializeTimeoutMs number 等待子进程初始化的最大时间(毫秒)。默认 60000。如果初始化未在时间内完成,Promise 将以超时错误拒绝

返回值

返回 Promise<WarmQuery>,在子进程完成生成和初始化握手后解析。

示例

在应用启动时尽早调用 startup(),然后在提示词准备好时对返回的句柄调用 .query()。这将子进程启动和初始化移出了关键路径。

import { startup } from "@anthropic-ai/claude-agent-sdk";

// 提前支付启动成本
const warm = await startup({ options: { maxTurns: 3 } });

// 稍后,当提示词准备好时,这是即时的
for await (const message of warm.query("What files are here?")) {
  console.log(message);
}

tool()

创建类型安全的 MCP 工具定义,用于 SDK MCP 服务器。

function tool<Schema extends AnyZodRawShape>(
  name: string,
  description: string,
  inputSchema: Schema,
  handler: (args: InferShape<Schema>, extra: unknown) => Promise<CallToolResult>,
  extras?: { annotations?: ToolAnnotations; searchHint?: string; alwaysLoad?: boolean }
): SdkMcpToolDefinition<Schema>;

参数

参数 类型 描述
name string 工具名称
description string 工具功能描述
inputSchema Schema extends AnyZodRawShape 定义工具输入参数的 Zod schema(支持 Zod 3 和 Zod 4)
handler (args, extra) => Promise<CallToolResult> 执行工具逻辑的异步函数
extras { annotations?:ToolAnnotations; searchHint?: string; alwaysLoad?: boolean } 可选附加项。annotations 向客户端提供 MCP 行为提示。searchHint 是一句话能力描述,在工具搜索激活时显示在延迟工具列表中。alwaysLoad: true 使此工具的完整 schema 保留在初始提示词中而不被延迟加载

ToolAnnotations

@modelcontextprotocol/sdk/types.js 重新导出。所有字段均为可选提示;客户端不应将其用于安全决策。

字段 类型 默认值 描述
title string undefined 工具的人类可读标题
readOnlyHint boolean false 如果为 true,该工具不会修改其环境
destructiveHint boolean true 如果为 true,该工具可能执行破坏性更新(仅在 readOnlyHintfalse 时有意义)
idempotentHint boolean false 如果为 true,使用相同参数重复调用不会产生额外效果(仅在 readOnlyHintfalse 时有意义)
openWorldHint boolean true 如果为 true,该工具与外部实体交互(例如网络搜索)。如果为 false,工具的作用域是封闭的(例如内存工具)
import { tool } from "@anthropic-ai/claude-agent-sdk";
import { z } from "zod";

const searchTool = tool(
  "search",
  "Search the web",
  { query: z.string() },
  async ({ query }) => {
    return { content: [{ type: "text", text: `Results for: ${query}` }] };
  },
  { annotations: { readOnlyHint: true, openWorldHint: true } }
);

createSdkMcpServer()

创建一个与应用运行在同一进程中的 MCP 服务器实例。

function createSdkMcpServer(options: {
  name: string;
  version?: string;
  instructions?: string;
  tools?: Array<SdkMcpToolDefinition<any>>;
  alwaysLoad?: boolean;
}): McpSdkServerConfigWithInstance;

参数

参数 类型 描述
options.name string MCP 服务器名称
options.version string 可选的版本字符串
options.instructions string 可选的服务器说明,从 initialize 返回并作为 MCP instructions 块呈现给模型
options.tools Array<SdkMcpToolDefinition> 使用 tool() 创建的工具定义数组
options.alwaysLoad boolean 设为 true 时,此服务器的所有工具都保留在初始提示词中,不会被延迟到工具搜索之后。与 tool() 中的逐工具 alwaysLoad 组合使用

listSessions()

发现并列出历史会话及其轻量元数据,支持按项目目录过滤。

function listSessions(options?: ListSessionsOptions): Promise<SDKSessionInfo[]>;

参数

参数 类型 默认值 描述
options.dir string undefined 要列出会话的目录。省略时返回所有项目的会话
options.limit number undefined 返回的最大会话数
options.includeWorktrees boolean true dir 在 git 仓库中时,包含所有 worktree 路径的会话

返回类型:SDKSessionInfo

属性 类型 描述
sessionId string 唯一会话标识符(UUID)
summary string 显示标题:自定义标题、自动生成的摘要或首条提示词
lastModified number 最后修改时间(自纪元以来的毫秒数)
fileSize number | undefined 会话文件大小(字节)。仅在本地 JSONL 存储时填充
customTitle string | undefined 用户设置的会话标题(通过 /rename
firstPrompt string | undefined 会话中首条有意义的用户提示词
gitBranch string | undefined 会话结束时的 Git 分支
cwd string | undefined 会话的工作目录
tag string | undefined 用户设置的会话标签(见 tagSession()
createdAt number | undefined 创建时间(自纪元以来的毫秒数,取自首条记录的时间戳)

示例

打印项目的 10 个最近会话。结果按 lastModified 降序排列,第一项是最新的。省略 dir 可跨所有项目搜索。

import { listSessions } from "@anthropic-ai/claude-agent-sdk";

const sessions = await listSessions({ dir: "/path/to/project", limit: 10 });

for (const session of sessions) {
  console.log(`${session.summary} (${session.sessionId})`);
}

getSessionMessages()

从历史会话转录中读取用户和助手消息。

function getSessionMessages(
  sessionId: string,
  options?: GetSessionMessagesOptions
): Promise<SessionMessage[]>;

参数

参数 类型 默认值 描述
sessionId string 必填 要读取的会话 UUID(见 listSessions()
options.dir string undefined 用于查找会话的项目目录。省略时搜索所有项目
options.limit number undefined 返回的最大消息数
options.offset number undefined 从开头跳过的消息数

返回类型:SessionMessage

属性 类型 描述
type "user" | "assistant" 消息角色
uuid string 唯一消息标识符
session_id string 此消息所属的会话
message unknown 转录中的原始消息负载
parent_tool_use_id string | null 对于子代理消息,为生成它的 Agent 工具调用的 tool_use_id。主会话消息和旧版会话为 null
parent_agent_id string | null 对于嵌套子代理的消息,为生成它的子代理的 agentId。主会话消息、顶级子代理消息和旧版会话为 null。需要 Claude Code v2.1.202 或更高版本

示例

import { listSessions, getSessionMessages } from "@anthropic-ai/claude-agent-sdk";

const [latest] = await listSessions({ dir: "/path/to/project", limit: 1 });

if (latest) {
  const messages = await getSessionMessages(latest.sessionId, {
    dir: "/path/to/project",
    limit: 20
  });

  for (const msg of messages) {
    console.log(`[${msg.type}] ${msg.uuid}`);
  }
}

getSessionInfo()

通过会话 ID 读取单个会话的元数据,无需扫描完整项目目录。

function getSessionInfo(
  sessionId: string,
  options?: GetSessionInfoOptions
): Promise<SDKSessionInfo | undefined>;

参数

参数 类型 默认值 描述
sessionId string 必填 要查找的会话 UUID
options.dir string undefined 项目目录路径。省略时搜索所有项目目录

返回 SDKSessionInfo,如果未找到会话则返回 undefined

renameSession()

通过追加自定义标题条目来重命名会话,可重复调用,以最新标题为准。

function renameSession(
  sessionId: string,
  title: string,
  options?: SessionMutationOptions
): Promise<void>;

参数

参数 类型 默认值 描述
sessionId string 必填 要重命名的会话 UUID
title string 必填 新标题。去除空白后必须非空
options.dir string undefined 项目目录路径。省略时搜索所有项目目录

tagSession()

为会话打标签,传入 null 清除标签,可重复调用,以最新标签为准。

function tagSession(
  sessionId: string,
  tag: string | null,
  options?: SessionMutationOptions
): Promise<void>;

参数

参数 类型 默认值 描述
sessionId string 必填 要打标签的会话 UUID
tag string | null 必填 标签字符串,或 null 以清除
options.dir string undefined 项目目录路径。省略时搜索所有项目目录

resolveSettings()

使用与 CLI 相同的合并引擎解析给定目录的有效配置,无需启动 Claude CLI 进程。

用于在调用 query() 之前检查它会看到什么配置。

此函数处于 alpha 阶段,其 API 可能在稳定之前发生变化。它会读取 MDM 源(包括 macOS plist 和 Windows HKLM/HKCU),以与 CLI 启动保持一致,但不会执行管理员配置的 policyHelper 子进程。permissions.defaultMode 字段从所有层级(包括项目设置)原样返回。CLI 在采纳提升权限模式之前应用的信任过滤器不会被应用。

function resolveSettings(
  options?: ResolveSettingsOptions
): Promise<ResolvedSettings>;

参数

resolveSettings() 接受一个选项对象,所有字段均为可选。

参数 类型 默认值 描述
options.cwd string process.cwd() 解析项目和本地设置所相对的目录
options.settingSources SettingSource[] 所有源 要加载的文件系统来源。传 [] 可跳过用户、项目和本地设置。端点管理的策略在所有情况下都会加载。服务端管理的设置在宿主传入 serverManagedSettings 时取自该参数,否则从 CLI 的磁盘缓存读取;快照不会从网络获取
options.managedSettings Settings undefined 由嵌入宿主提供的策略层设置。遵循与 Options 中的 managedSettings 相同的规则,但 resolveSettings() 不执行配置的 policyHelper,因此快照可能包含实际会话会丢弃的设置
options.serverManagedSettings Settings undefined 来自 /api/claude_code/settings 的服务端管理设置负载。非限制性键原样传递

返回类型:ResolvedSettings

resolveSettings() 返回一个描述合并后设置及每个键来源的对象。

属性 类型 描述
effective Settings 按优先级顺序应用所有启用源后的合并设置
provenance Partial<Record<keyof Settings, ProvenanceEntry>> 对于 effective 中的每个顶级键,指出由哪个源提供了该值
sources Array<{ source, settings, path?, policyOrigin? }> 逐源的原始设置,按从低到高优先级排序

示例

以下示例解析项目目录的设置并打印控制清理周期的来源。在没有任何设置文件设置 cleanupPeriodDays 的机器上,两行打印的值均为 undefined,这是预期输出而非错误。

import { resolveSettings } from "@anthropic-ai/claude-agent-sdk";

const { effective, provenance } = await resolveSettings({
  cwd: "/path/to/project",
  settingSources: ["user", "project", "local"],
});

console.log(`Cleanup period: ${effective.cleanupPeriodDays} days`);
console.log(`Set by: ${provenance.cleanupPeriodDays?.source}`);

类型

Options

query() 函数的配置对象,包含 60 余个属性,控制会话行为的方方面面。

属性 类型 默认值 说明
abortController AbortController new AbortController() 用于取消操作的控制器
additionalDirectories string[] [] Claude 可访问的额外目录
agent string undefined 主线程使用的 agent 名称。该 agent 必须在 agents 选项或设置中定义
agents Record<string, AgentDefinition> undefined 以编程方式定义子 agent
agentProgressSummaries boolean false 设为 true 时,为子 agent 生成一行进度摘要,并通过 task_progress 事件的 summary 字段转发。适用于前台和后台子 agent
allowDangerouslySkipPermissions boolean false 启用权限跳过。使用 permissionMode: 'bypassPermissions' 时必须设置
allowedTools string[] [] 自动批准(无需提示)的工具列表。这不会限制 Claude 只使用这些工具;未列出的工具会走 permissionModecanUseTool 流程。如需屏蔽工具请用 disallowedTools。参见 Permissions
betas SdkBeta[] [] 启用 beta 功能
canUseTool CanUseTool undefined 自定义权限函数,仅在权限流程落入提示环节时调用。被 allowedTools、allow 规则或 permissionMode 自动批准的调用不会触发它。AskUserQuestion、组织设为 ask 的连接器工具,以及标记了 requiresUserInteraction 的 MCP 工具即使匹配 allow 规则仍会触发;在 dontAsk 模式下这些调用直接拒绝。详见 CanUseTool
continue boolean false 继续最近一次对话
cwd string process.cwd() 当前工作目录
debug boolean false 为 Claude Code 进程启用调试模式
debugFile string undefined 将调试日志写入指定文件路径。隐式启用调试模式
disallowedTools string[] [] 禁止使用的工具。裸名如 "Bash" 会从 Claude 上下文中移除该工具;带范围的规则如 "Bash(rm *)" 保留工具可见性,但在所有权限模式(含 bypassPermissions)下拒绝匹配的调用。参见 Permissions
effort 'low' | 'medium' | 'high' | 'xhigh' | 'max' 模型默认值 控制 Claude 投入回答的精力程度。配合自适应思考来引导思考深度。参见 adjust the effort level
enableFileCheckpointing boolean false 启用文件变更追踪以支持回滚。参见 File checkpointing
env Record<string, string | undefined> process.env 环境变量。设置后会替换(而非合并)子进程环境,因此需用 { ...process.env, YOUR_VAR: 'value' } 保留 PATH 等继承变量。参见处理慢速或停滞的 API 响应Environment variables。设置 CLAUDE_AGENT_SDK_CLIENT_APP 可在 User-Agent header 中标识你的应用
executable 'bun' | 'deno' | 'node' 自动检测 使用的 JavaScript 运行时
executableArgs string[] [] 传递给运行时的参数
extraArgs Record<string, string | null> {} 额外参数
fallbackModel string undefined 主模型失败时使用的备用模型
forkSession boolean false 使用 resume 恢复时,fork 到新会话 ID 而非继续原会话
forwardSubagentText boolean false 将子 agent 的文本和思考块作为带 parent_tool_use_id 的 assistant/user 消息转发,便于消费方渲染嵌套对话记录。默认仅转发子 agent 的 tool_usetool_result 块。Claude Code v2.1.219 及以上转发任意嵌套深度的子 agent 消息;之前版本仅转发深度 1 的子 agent 消息
hooks Partial<Record<HookEvent, HookCallbackMatcher[]>> {} 事件的 hook 回调
includeHookEvents boolean false 在消息流中包含每个 hook 事件的生命周期事件(SDKHookStartedMessageSDKHookProgressMessageSDKHookResponseMessage)。SessionStartSetup hook 的生命周期事件始终包含,无需此选项
includePartialMessages boolean false 包含部分消息事件
loadTimeoutMs number 60000 Alpha. 恢复会话时每次 sessionStore.load()sessionStore.listSubkeys() 调用的超时毫秒数。适配器在此窗口内未完成则查询失败而非挂起。未设置 sessionStore 时忽略
managedSettings Settings undefined 宿主进程提供给会话的策略层设置。在已部署管理设置的机器上,Claude Code 会忽略这些值,除非管理员的最高优先级源设置了 parentSettingsBehavior: 'merge',且未配置 policyHelper。合并值经过限制性过滤;参见 Restrict parent settings
maxBudgetUsd number undefined 客户端成本估算达到此 USD 值时停止查询。与 total_cost_usd 使用相同估算;参见 Track cost and usage 了解精度说明
maxThinkingTokens number undefined 已弃用: 请改用 thinking。思考过程的最大 token 数
maxTurns number undefined 最大 agent 轮次(工具使用往返次数)
mcpServers Record<string, McpServerConfig> {} MCP 服务器配置
model string CLI 默认值 Claude 模型别名或完整模型名。参见可用值和供应商特定 ID
onElicitation (request: ElicitationRequest, options: { signal: AbortSignal }) => Promise<ElicitationResult> undefined 处理 MCP elicitation 请求的回调。当 MCP 服务器请求用户输入且无 hook 先行处理时调用。未提供时,未处理的 elicitation 请求自动拒绝
outputFormat { type: 'json_schema', schema: JSONSchema } undefined 定义 agent 结果的输出格式。参见 Structured outputs
outputStyle string undefined Options 字段。请在内联 settings 对象或设置文件中设置 outputStyle。参见 Activate an output style
pathToClaudeCodeExecutable string 从捆绑的原生二进制自动解析 Claude Code 可执行文件路径。仅在安装时跳过了可选依赖或平台不在支持列表时需要
permissionMode PermissionMode 'default' 会话的权限模式
permissionPromptToolName string undefined 用于权限提示的 MCP 工具名称
persistSession boolean true 设为 false 时禁用会话持久化到磁盘。会话不可再恢复
planModeInstructions string undefined 计划模式的自定义工作流说明。当 permissionMode'plan' 时,此字符串替换默认的计划模式工作流正文。CLI 仍会用只读强制前言和 ExitPlanMode 协议尾部包装它
plugins SdkPluginConfig[] [] 从本地路径加载自定义插件。参见 Plugins
promptSuggestions boolean false 启用提示建议。每轮结束后发出 prompt_suggestion 消息,包含预测的下一条用户提示
resume string undefined 要恢复的会话 ID
resumeSessionAt string undefined 从指定消息 UUID 恢复会话
sandbox SandboxSettings undefined 以编程方式配置沙箱行为。参见 Sandbox settings
sessionId string 自动生成 使用指定 UUID 作为会话 ID,而非自动生成
sessionStore SessionStore undefined 将会话记录镜像到外部后端,以便任何宿主恢复。参见 Persist sessions to external storage
sessionStoreFlush 'batched' | 'eager' 'batched' Alpha. sessionStore 的刷新模式。未设置 sessionStore 时忽略
settings string | Settings undefined 内联设置对象或设置文件路径。在优先级顺序中填充 flag-settings 层。运行时可通过 applyFlagSettings() 修改
settingSources SettingSource[] CLI 默认值(所有源) 控制加载哪些文件系统设置。传 [] 禁用 user、project 和 local 设置。端点管理策略始终加载;server-managed 设置在会话使用组织凭据认证且满足条件时获取。参见 Use Claude Code features
skills string[] | 'all' undefined 会话可用的 skill。传 'all' 启用所有已发现的 skill,或传 skill 名称列表。设置后 SDK 自动将 Skill 工具加入 allowedTools。如同时传了 tools,需在列表中包含 'Skill'。参见 Skills
spawnClaudeCodeProcess (options: SpawnOptions) => SpawnedProcess undefined 自定义 Claude Code 进程启动函数。用于在 VM、容器或远程环境中运行 Claude Code
stderr (data: string) => void undefined stderr 输出回调
strictMcpConfig boolean false 仅使用 mcpServers 中传入的服务器,忽略项目 .mcp.json、用户设置、插件提供的 MCP 服务器和 claude.ai 连接器
systemPrompt string | { type: 'preset'; preset: 'claude_code'; append?: string; excludeDynamicSections?: boolean } undefined(最小提示) 系统提示配置。传字符串为自定义提示;传 { type: 'preset', preset: 'claude_code' } 使用 Claude Code 的系统提示。使用预设对象形式时,append 可追加额外指令,设 excludeDynamicSections: true 可将每会话上下文移入第一条用户消息以提高跨机器的 prompt 缓存命中率
taskBudget { total: number } undefined Alpha. API 侧任务预算(token 数)。设置后模型会被告知剩余 token 预算,以便调整工具使用节奏并在限额前收尾
thinking ThinkingConfig 支持的模型为 { type: 'adaptive' } 控制 Claude 的思考/推理行为。参见 ThinkingConfig
title string undefined 会话的显示标题。通过 resumecontinue 恢复时,已持久化的标题优先;用 renameSession() 重命名已有会话
toolAliases Record<string, string> undefined 将内置工具名映射到 MCP 工具名,使 Claude 调用你的 MCP 实现替代内置工具。例如 { Bash: 'mcp__workspace__bash' }
toolConfig ToolConfig undefined 内置工具行为配置。参见 ToolConfig
tools string[] | { type: 'preset'; preset: 'claude_code' } undefined 工具配置。传工具名数组或使用预设获取 Claude Code 的默认工具集

处理慢速或停滞的 API 响应

CLI 子进程读取若干环境变量来控制 API 超时和停滞检测,通过 env 选项传入即可。

import { query } from "@anthropic-ai/claude-agent-sdk";

const result = query({
  prompt: "Analyze this code",
  options: {
    env: {
      ...process.env,
      API_TIMEOUT_MS: "120000",
      CLAUDE_CODE_MAX_RETRIES: "2",
      CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS: "120000",
    },
  },
});
  • API_TIMEOUT_MS:Anthropic 客户端的单请求超时(毫秒)。默认 600000。适用于主循环和所有子 agent。
  • 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 启动的子 agent 的停滞看门狗。默认 600000。每次流事件重置;停滞时中止子 agent、标记任务失败,并将错误和部分结果传递给父 agent。不适用于同步子 agent。
  • CLAUDE_ENABLE_STREAM_WATCHDOGCLAUDE_STREAM_IDLE_TIMEOUT_MS:当 header 已到达但响应体停止流式传输时中止请求。该看门狗默认对所有供应商启用;设 CLAUDE_ENABLE_STREAM_WATCHDOG=0 禁用。CLAUDE_STREAM_IDLE_TIMEOUT_MS 默认 300000 且被限制为最小值。中止后,Claude Code 最多重试一次,且仅在 Claude 尚未开始文本块或工具调用前重试;一旦 Claude 完成了文本块或工具调用,Claude Code 保留已完成的输出,追加不完整响应通知而非重试,并仍然执行已完成的工具调用。

Query 对象

query() 函数返回的接口,提供中断、回滚、模型切换等会话级操作。

interface Query extends AsyncGenerator<SDKMessage, void> {
  interrupt(): Promise<SDKControlInterruptResponse | undefined>;
  rewindFiles(
    userMessageId: string,
    options?: { dryRun?: boolean }
  ): Promise<RewindFilesResult>;
  setPermissionMode(mode: PermissionMode): Promise<void>;
  setModel(model?: string): Promise<void>;
  setMaxThinkingTokens(maxThinkingTokens: number | null): Promise<void>;
  applyFlagSettings(settings: { [K in keyof Settings]?: Settings[K] | null }): Promise<void>;
  initializationResult(): Promise<SDKControlInitializeResponse>;
  reinitialize(): Promise<SDKControlInitializeResponse>;
  supportedCommands(): Promise<SlashCommand[]>;
  supportedModels(): Promise<ModelInfo[]>;
  supportedAgents(): Promise<AgentInfo[]>;
  mcpServerStatus(): Promise<McpServerStatus[]>;
  getContextUsage(): Promise<SDKControlGetContextUsageResponse>;
  accountInfo(): Promise<AccountInfo>;
  reconnectMcpServer(serverName: string): Promise<void>;
  toggleMcpServer(serverName: string, enabled: boolean): Promise<void>;
  setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;
  streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;
  stopTask(taskId: string): Promise<void>;
  close(): void;
}

方法

方法 说明
interrupt() 中断查询。仅在流式输入模式下可用。当 CLI 在 SDKSystemMessage.capabilities 中声明 interrupt_receipt_v1 能力时,resolve 为 SDKControlInterruptResponse,列出中断后仍存活的排队消息。v2.1.205 之前的 CLI resolve 为 undefined
rewindFiles(userMessageId, options?) 将文件恢复到指定用户消息时的状态。传 { dryRun: true } 预览变更。需设置 enableFileCheckpointing: true。参见 File checkpointing
setPermissionMode() 切换权限模式(仅在流式输入模式下可用)
setModel() 切换模型(仅在流式输入模式下可用)。传 undefined 或字符串 "default" 重置为会话默认模型
setMaxThinkingTokens() 已弃用: 请改用 thinking 选项。修改最大思考 token 数。传 null 重置为会话默认值:清除中途覆盖,对已禁用思考的会话保持关闭状态
applyFlagSettings(settings) 在运行时将设置合并到会话的 flag settings 层(仅在流式输入模式下可用)。参见 applyFlagSettings()
initializationResult() 返回完整的初始化结果,包含支持的命令、模型、账户信息和输出样式配置
reinitialize() 向正在运行的 CLI 重新发送 initialize 控制请求,返回新结果而非缓存的首次连接结果。在传输中断后(如断连后重新附加到会话)使用,以便待处理的权限请求再次到达 canUseTool 回调。回调需对每个请求 ID 幂等,因为丢失响应的请求会被重新分发。需要 Claude Code v2.1.195 或更高版本
supportedCommands() 返回可用的斜杠命令。自 Agent SDK v0.3.216 起,列表反映会话中途的命令变更;参见 SDKCommandsChangedMessage
supportedModels() 返回可用模型及显示信息
supportedAgents() 返回可用的子 agent,类型为 AgentInfo[]
mcpServerStatus() 返回已连接 MCP 服务器的状态
getContextUsage() 返回 SDKControlGetContextUsageResponse,按类别、skill 和工具分解会话的上下文窗口使用情况。与交互会话中 /context 显示的数据相同
accountInfo() 返回账户信息
reconnectMcpServer(serverName) 按名称重连 MCP 服务器
toggleMcpServer(serverName, enabled) 按名称启用或禁用 MCP 服务器
setMcpServers(servers) 动态替换本会话的 MCP 服务器集合。返回新增和移除了哪些服务器以及错误。该调用保留未命名的插件提供的服务器;命名某个服务器则替换它。Promise 在新增的 stdio、HTTP 和 SSE 服务器连接成功或失败后 resolve,因此已连接服务器的工具在下一轮可用
streamInput(stream) 为多轮对话流式输入消息到查询
stopTask(taskId) 按 ID 停止正在运行的后台任务
close() 关闭查询并终止底层进程。强制结束查询并清理所有资源

applyFlagSettings()

运行时修改会话设置,无需重启查询。用于需要中途调整的设置(如读取不可信输入后收紧 permissions)。

setModel()setPermissionMode() 是专用 setter;applyFlagSettings() 是通用形式,接受 settings key 的任意子集,在此处传 model 与调用 setModel() 效果相同。

仅部分 key 在会话中途生效:

  • 下一轮生效effortLevelultracodepermissionshooksskillOverridesfastModeagent。切换 agent 还会在下一轮应用该 agent 的模型覆盖、hooks 和系统提示。
  • 当前轮生效model。如果在 Claude 处理一轮时切换 model,Claude 当前正在生成的响应在旧模型上完成,该轮剩余部分(从 Claude Code 下一次调用模型开始)使用新模型。子 agent 保持各自模型。v2.1.212 之前,中途切换会等到下一轮。
  • 会话中途无效:系统提示选项。这些在启动时一次性解析,因此即使调用成功,运行中的会话仍保持原值。如需更改,请启动新会话。

effortLevel 接受精力等级名称。它也接受 "ultracode",将会话设为 xhigh 精力并开启 ultracodeSettings 类型声明的 effortLevel 不含该值,因此在 TypeScript 中传等价的 { ultracode: true }ultracode 值需要 Claude Code v2.1.203 或更高版本,且仅被 applyFlagSettings() 接受,设置文件中的 effortLevel key 不接受。

值写入 flag-settings 层——与 query() 启动时的内联 settings 选项填充的层相同。Flag settings 位于设置优先级的顶部附近:覆盖 user、project 和 local 设置,仅 managed policy 设置可覆盖它们。这与页内优先级部分所称的编程选项是同一层级。

连续调用为顶层 key 浅合并。第二次调用 { permissions: {...} } 替换前一次调用中的整个 permissions 对象,而非深度合并。要从 flag 层清除某 key 并回退到更低优先级的源,为该 key 传 null。传 undefined 无效,因为 JSON 序列化会丢弃它。

仅在流式输入模式下可用,与 setModel()setPermissionMode() 相同的约束。

以下示例在会话中途切换活动模型,然后清除覆盖让模型回退到 user 或 project 设置中指定的值。

import { query } from "@anthropic-ai/claude-agent-sdk";

const q = query({ prompt: messageStream });

// 为会话余下部分覆盖模型
await q.applyFlagSettings({ model: "claude-opus-4-6" });

// 稍后:清除覆盖,回退到更低优先级的设置
await q.applyFlagSettings({ model: null });

注意: applyFlagSettings() 仅 TypeScript 可用。Python SDK 未暴露等价方法。

WarmQuery

startup() 返回的句柄。子进程已预先启动并初始化完毕,对此句柄调用 query() 会直接将 prompt 写入就绪进程,无启动延迟。

interface WarmQuery extends AsyncDisposable {
  query(prompt: string | AsyncIterable<SDKUserMessage>): Query;
  close(): void;
}

方法

方法 说明
query(prompt) 向预热的子进程发送 prompt 并返回 Query。每个 WarmQuery 仅可调用一次
close() 不发送 prompt 直接关闭子进程。用于丢弃不再需要的预热查询

WarmQuery 实现了 AsyncDisposable,可配合 await using 实现自动清理。

SDKControlInitializeResponse

initializationResult() 的返回类型,包含会话初始化数据。

type SDKControlInitializeResponse = {
  commands: SlashCommand[];
  agents: AgentInfo[];
  output_style: string;
  available_output_styles: string[];
  models: ModelInfo[];
  account: AccountInfo;
  fast_mode_state?: "off" | "cooldown" | "on";
  fast_mode_disabled_reason?: FastModeDisabledReason;
};

响应始终报告 fast_mode_state,当 fast mode 被阻止时,fast_mode_disabled_reason 携带原因代码,便于你解释阻止状态而无需重新推导可用性。两者均需 Claude Code v2.1.219 或更高版本。v2.1.219 之前,fast mode 不可用时响应省略 fast_mode_state 且不携带原因。原因代码及含义参见 SDKResultMessage 上的 fast_mode_disabled_reason

当客户端向已运行的会话发送 initialize 时,control-response 包装器还携带一个可选的 pending_permission_requests 数组。该字段在响应包装器本身上,而非上述 SDKControlInitializeResponse 载荷中。每个条目是完整的 control_request 消息,形状为 { type: "control_request", request_id, request },与会话运行时流式发送的权限请求相同。

这些是客户端连接前已发出且仍在等待回复的请求。SDK 代为读取该数组,并将每个条目分发到你的 canUseTool 回调——与 reinitialize() 在传输中断后触发的重新分发相同。需幂等处理重复的请求 ID,因为某个条目可能重复回调在连接断开前已收到的请求。

SDKControlInterruptResponse

中断回执:当 CLI 在 SDKSystemMessage.capabilities 中声明 interrupt_receipt_v1 能力时,interrupt() resolve 的值。需要 Claude Code v2.1.205 或更高版本。更早的 CLI 以空成功载荷回答中断,因此 interrupt() resolve 为 undefined

type SDKControlInterruptResponse = {
  still_queued: string[];
  cancelled?: string[];
};

still_queued 列出中断后存活的用户消息的 UUID:仍在队列中的消息,加上已出队准备下一轮但中止无法触及的批次。每条消息在中断后作为独立轮次运行,除非你先取消它。使用回执决定是否重发;重发已列出的消息会产生重复轮次。

解读列表时注意以下细节:

  • 仅带 UUID 入队的消息会出现。空数组不意味着不会再运行其他内容。
  • 仅列出主线程消息。发给子 agent 的消息不在范围内。
  • 列表可能包含你的客户端从未发送的 UUID,如定时任务触发器。忽略你不认识的 UUID 而非视为错误。

客户端若直接驱动 CLI 的控制协议(而非通过 interrupt()),可在 interrupt 控制请求上设置 cancel_queued: true。Claude Code v2.1.219 及以上通过 SDKSystemMessage.capabilities 中的 interrupt_cancel_queued_v1 能力声明支持;更早的 CLI 忽略该字段,让排队消息照常运行。这样的中断还会取消所有本应列在 still_queued 下的消息:回执将它们列在 cancelled 下,still_queued 为空,且它们都不会运行。

cancelled 列表与 still_queued 具有相同的注意事项。interrupt() 方法从不发送 cancel_queued,因此它 resolve 的回执不携带 cancelled

回执是中断被处理时刻的快照,在干净的中断中它在被中断轮次的 SDKResultMessage 之前到达。读取回执而非在 result 之后检查队列:循环会立即启动下一个排队轮次,因此你在 result 之后检查的队列已经改变了。

SDKControlGetContextUsageResponse

getContextUsage() 的返回类型。与交互会话中 /context 命令渲染的载荷相同,因此除 token 计数外还携带 colorgridRowspercentage/context 用于绘制使用量网格的显示字段。

type SDKControlGetContextUsageResponse = {
  categories: {
    name: string;
    tokens: number;
    color: string;
    isDeferred?: boolean;
  }[];
  totalTokens: number;
  maxTokens: number;
  rawMaxTokens: number;
  percentage: number;
  gridRows: {
    color: string;
    isFilled: boolean;
    categoryName: string;
    tokens: number;
    percentage: number;
    squareFullness: number;
  }[][];
  model: string;
  memoryFiles: {
    path: string;
    type: string;
    tokens: number;
  }[];
  mcpTools: {
    name: string;
    serverName: string;
    tokens: number;
    isLoaded?: boolean;
  }[];
  deferredBuiltinTools?: {
    name: string;
    tokens: number;
    isLoaded: boolean;
  }[];
  systemTools?: {
    name: string;
    tokens: number;
  }[];
  systemPromptSections?: {
    name: string;
    tokens: number;
  }[];
  agents: {
    agentType: string;
    source: string;
    tokens: number;
  }[];
  slashCommands?: {
    totalCommands: number;
    includedCommands: number;
    tokens: number;
  };
  skills?: {
    totalSkills: number;
    includedSkills: number;
    tokens: number;
    skillFrontmatter: {
      name: string;
      source: string;
      tokens: number;
    }[];
  };
  autoCompactThreshold?: number;
  isAutoCompactEnabled: boolean;
  messageBreakdown?: {
    toolCallTokens: number;
    toolResultTokens: number;
    attachmentTokens: number;
    assistantMessageTokens: number;
    userMessageTokens: number;
    redirectedContextTokens: number;
    unattributedTokens: number;
    toolCallsByType: {
      name: string;
      callTokens: number;
      resultTokens: number;
    }[];
    attachmentsByType: {
      name: string;
      tokens: number;
    }[];
  };
  apiUsage: {
    input_tokens: number;
    output_tokens: number;
    cache_creation_input_tokens: number;
    cache_read_input_tokens: number;
  } | null;
};

从集合字段中读取 token 归因:

  • categories 存放按类别汇总的总数。
  • mcpToolsagents 将 token 归因到各个 MCP 工具和子 agent。
  • memoryFiles 列出每个已加载的记忆文件及其开销。
  • skills.skillFrontmatter 将 skill 列表的 token 归因到每个包含的 skill。每个 skill 的计数衡量的是 Claude Code 实际发送的该 skill 列表条目,可能比 skill 完整 frontmatter 短。比较 skills.totalSkillsskills.includedSkills 可查看是否所有已发现的 skill 都进入了列表。

totalTokens 是会话当前的上下文使用量,maxTokens 是衡量使用量所对应的窗口。该窗口为模型的上下文窗口,或当适用时为更低的 auto-compaction 窗口。Claude Code 不设置可选的 deferredBuiltinToolssystemToolssystemPromptSections 诊断字段,因此即使类型声明了它们也应预期缺失。

AgentDefinition

以编程方式定义子 agent 的配置。

type AgentDefinition = {
  description: string;
  tools?: string[];
  disallowedTools?: string[];
  prompt: string;
  model?: string;
  mcpServers?: AgentMcpServerSpec[];
  skills?: string[];
  initialPrompt?: string;
  maxTurns?: number;
  background?: boolean;
  memory?: "user" | "project" | "local";
  effort?: "low" | "medium" | "high" | "xhigh" | "max" | number;
  permissionMode?: PermissionMode;
  criticalSystemReminder_EXPERIMENTAL?: string;
};
字段 必需 说明
description 描述何时使用此 agent 的自然语言说明
tools 允许的工具名数组。省略则继承子 agent 可用的所有工具。要将 Skill 预加载到 agent 上下文中,请用 skills 字段而非在此列出 'Skill'
disallowedTools 明确禁止此 agent 使用的工具名数组。也接受 MCP 服务器级模式:mcp__servermcp__server__* 移除该服务器的所有工具,mcp__* 移除任何服务器的所有 MCP 工具
prompt agent 的系统提示
model 此 agent 的模型覆盖。接受别名如 'fable''opus''sonnet''haiku''inherit',或完整模型 ID。省略或 'inherit' 则使用主模型
mcpServers 此 agent 的 MCP 服务器规范
skills 要预加载到 agent 上下文中的 skill 名称数组
initialPrompt 当此 agent 作为主线程 agent 运行时,自动作为第一条用户消息提交
maxTurns 停止前的最大 agent 轮次(API 往返次数)
background 调用时将此 agent 作为非阻塞后台任务运行
memory 此 agent 的记忆源:'user''project''local'
effort 此 agent 的推理精力等级。接受命名等级或整数
permissionMode 此 agent 内工具执行的权限模式。参见 PermissionMode
criticalSystemReminder_EXPERIMENTAL 实验性:添加到系统提示的关键提醒

AgentMcpServerSpec

指定子 agent 可用的 MCP 服务器。可以是字符串(引用父级 mcpServers 配置中的服务器名称)或内联服务器配置记录(将服务器名映射到配置)。

type AgentMcpServerSpec = string | Record<string, McpServerConfigForProcessTransport>;

其中 McpServerConfigForProcessTransportMcpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig | McpSdkServerConfig

SettingSource

控制 SDK 从哪些文件系统配置源加载设置。

type SettingSource = "user" | "project" | "local";
说明 位置
'user' 全局用户设置 ~/.claude/settings.json
'project' 共享项目设置(受版本控制) .claude/settings.json
'local' 本地项目设置,Claude Code 保存设置时自动 gitignore .claude/settings.local.json

默认行为

settingSources 省略或为 undefined 时,query() 加载与 Claude Code CLI 相同的文件系统设置:user、project 和 local。端点管理策略在所有情况下加载;server-managed 设置在会话使用组织凭据认证且满足条件时获取。参见 What settingSources does not control 了解无论此选项如何设置都会读取的输入,以及如何禁用它们。

为什么使用 settingSources

禁用文件系统设置:

import { query } from "@anthropic-ai/claude-agent-sdk";

// 不从磁盘加载 user、project 或 local 设置
const result = query({
  prompt: "Analyze this code",
  options: { settingSources: [] }
});

显式加载所有文件系统设置:

import { query } from "@anthropic-ai/claude-agent-sdk";

const result = query({
  prompt: "Analyze this code",
  options: {
    settingSources: ["user", "project", "local"] // 加载所有设置
  }
});

仅加载特定设置源:

import { query } from "@anthropic-ai/claude-agent-sdk";

// 仅加载项目设置,忽略 user 和 local
const result = query({
  prompt: "Run CI checks",
  options: {
    settingSources: ["project"] // 仅 .claude/settings.json
  }
});

测试和 CI 环境:

import { query } from "@anthropic-ai/claude-agent-sdk";

// 通过排除 local 设置确保 CI 中行为一致
const result = query({
  prompt: "Run tests",
  options: {
    settingSources: ["project"], // 仅团队共享设置
    permissionMode: "bypassPermissions",
    allowDangerouslySkipPermissions: true
  }
});

纯 SDK 应用:

import { query } from "@anthropic-ai/claude-agent-sdk";

// 完全以编程方式定义。
// 传 [] 退出文件系统设置源。
const result = query({
  prompt: "Review this PR",
  options: {
    settingSources: [],
    agents: {
      /* ... */
    },
    mcpServers: {
      /* ... */
    },
    allowedTools: ["Read", "Grep", "Glob"]
  }
});

加载 CLAUDE.md 项目指令:

import { query } from "@anthropic-ai/claude-agent-sdk";

// 加载项目设置以包含 CLAUDE.md 文件
const result = query({
  prompt: "Add a new feature following project conventions",
  options: {
    systemPrompt: {
      type: "preset",
      preset: "claude_code" // 使用 Claude Code 的系统提示
    },
    settingSources: ["project"], // 从项目目录加载 CLAUDE.md
    allowedTools: ["Read", "Write", "Edit"]
  }
});

设置优先级

当加载多个源时,设置按以下优先级合并(从高到低):

  1. Local 设置 (.claude/settings.local.json)
  2. Project 设置 (.claude/settings.json)
  3. User 设置 (~/.claude/settings.json)

编程选项如 agentsallowedToolssettings 覆盖 user、project 和 local 文件系统设置。Managed policy 设置优先于编程选项。

PermissionMode

控制会话中工具调用的权限行为。

type PermissionMode =
  | "default" // 标准权限行为
  | "acceptEdits" // 自动接受文件编辑
  | "bypassPermissions" // 跳过权限检查;显式 ask 规则仍会提示
  | "plan" // 计划模式 - 探索但不编辑
  | "dontAsk" // 不提示权限,未预先批准则拒绝
  | "auto"; // 模型分类器批准或拒绝权限提示

CanUseTool

自定义权限函数类型,用于控制工具使用。该函数是 SDK 中交互式权限提示的替代品。

该函数仅在权限评估流程 resolve 为提示时被调用。被 allowedTools 条目、settings allow 规则或权限模式(如 acceptEditsbypassPermissions)已批准的工具调用不会触发它。要拦截每个工具调用,请改用 PreToolUse hook

AskUserQuestion、标记了 requiresUserInteraction 的 MCP 工具,以及组织设为 ask 的连接器工具即使匹配 allow 规则也会到达该函数。在 dontAsk 模式下这些调用被直接拒绝,不调用它。

type CanUseTool = (
  toolName: string,
  input: Record<string, unknown>,
  options: {
    signal: AbortSignal;
    suggestions?: PermissionUpdate[];
    blockedPath?: string;
    decisionReason?: string;
    toolUseID: string;
    agentID?: string;
    requestId: string;
  }
) => Promise<PermissionResult | null>;
选项 类型 说明
signal AbortSignal 当操作应被中止时触发
suggestions PermissionUpdate[] 建议的权限更新,使用户不再为此工具被提示。Bash 提示包含目标为 localSettings 目的地的建议,将其放入 updatedPermissions 返回会将规则写入 .claude/settings.local.json 并跨会话持久化
blockedPath string 触发权限请求的文件路径(如适用)
decisionReason string 解释为何触发此权限请求
toolUseID string assistant 消息中此特定工具调用的唯一标识符
agentID string 如在子 agent 中运行,为该子 agent 的 ID
requestId string control_request 信封的 request_id。你的应用在 SDK 之外发送 control_response(如签名的 HTTP POST)时必须回显此值,以便 Claude Code 进程将回复与请求匹配

回调通常通过返回 PermissionResult 来 resolve 请求,SDK 将其作为 control_response 写回传输层。仅当你的应用已通过自有通道为此请求发送了 control_response(回显 requestId)时返回 null;SDK 则跳过向其传输层写入响应。在其他情况下返回 null 会导致工具调用无限期阻塞,因为永远不会发送 control_response,且权限提示不会超时。

requestId 选项和 null 返回值需要 Claude Code v2.1.199 或更高版本。

PermissionResult

权限检查的结果。

type PermissionResult =
  | {
      behavior: "allow";
      updatedInput?: Record<string, unknown>;
      updatedPermissions?: PermissionUpdate[];
      toolUseID?: string;
    }
  | {
      behavior: "deny";
      message: string;
      interrupt?: boolean;
      toolUseID?: string;
    };

ToolConfig

内置工具行为的配置。

type ToolConfig = {
  askUserQuestion?: {
    previewFormat?: "markdown" | "html";
  };
};
字段 类型 说明
askUserQuestion.previewFormat 'markdown' | 'html' 开启 AskUserQuestion 选项中的 preview 字段并设置其内容格式。未设置时 Claude 不生成预览

McpServerConfig

MCP 服务器配置,为联合类型。

type McpServerConfig =
  | McpStdioServerConfig
  | McpSSEServerConfig
  | McpHttpServerConfig
  | McpSdkServerConfigWithInstance;

McpStdioServerConfig

type McpStdioServerConfig = {
  type?: "stdio";
  command: string;
  args?: string[];
  env?: Record<string, string>;
};

McpSSEServerConfig

type McpSSEServerConfig = {
  type: "sse";
  url: string;
  headers?: Record<string, string>;
};

McpHttpServerConfig

type McpHttpServerConfig = {
  type: "http";
  url: string;
  headers?: Record<string, string>;
};

McpSdkServerConfigWithInstance

type McpSdkServerConfigWithInstance = {
  type: "sdk";
  name: string;
  instance: McpServer;
};

McpClaudeAIProxyServerConfig

type McpClaudeAIProxyServerConfig = {
  type: "claudeai-proxy";
  url: string;
  id: string;
};

SdkPluginConfig

SDK 中加载插件的配置。

type SdkPluginConfig = {
  type: "local";
  path: string;
  skipMcpDiscovery?: boolean;
};
字段 类型 说明
type 'local' 必须为 'local'(目前仅支持本地插件)
path string 插件目录的绝对或相对路径
skipMcpDiscovery boolean 设为 true 时,SDK 从此插件加载 skills、hooks、agents 和 commands,但不读取其 .mcp.json 或 manifest mcpServers。当你的应用自行管理该插件的 MCP 连接时使用

示例:

plugins: [
  { type: "local", path: "./my-plugin" },
  { type: "local", path: "/absolute/path/to/plugin" }
];

完整的插件创建和使用信息参见 Plugins

消息类型

SDKMessage

查询返回的所有可能消息的联合类型。

type SDKMessage =
  | SDKAssistantMessage
  | SDKUserMessage
  | SDKUserMessageReplay
  | SDKResultMessage
  | SDKSystemMessage
  | SDKPartialAssistantMessage
  | SDKCompactBoundaryMessage
  | SDKStatusMessage
  | SDKLocalCommandOutputMessage
  | SDKHookStartedMessage
  | SDKHookProgressMessage
  | SDKHookResponseMessage
  | SDKPluginInstallMessage
  | SDKToolProgressMessage
  | SDKAuthStatusMessage
  | SDKTaskNotificationMessage
  | SDKTaskStartedMessage
  | SDKTaskProgressMessage
  | SDKTaskUpdatedMessage
  | SDKBackgroundTasksChangedMessage
  | SDKThinkingTokensMessage
  | SDKSessionStateChangedMessage
  | SDKWorkerShuttingDownMessage
  | SDKCommandsChangedMessage
  | SDKNotificationMessage
  | SDKFilesPersistedEvent
  | SDKToolUseSummaryMessage
  | SDKMemoryRecallMessage
  | SDKRateLimitEvent
  | SDKElicitationCompleteMessage
  | SDKPermissionDeniedMessage
  | SDKPromptSuggestionMessage
  | SDKAPIRetryMessage
  | SDKMirrorErrorMessage
  | SDKInformationalMessage
  | SDKConversationResetMessage;

SDKAssistantMessage

助手响应消息,包含模型回复内容、错误状态和中断标志。

type SDKAssistantMessage = {
  type: "assistant";
  uuid: UUID;
  session_id: string;
  message: BetaMessage; // 来自 Anthropic SDK
  parent_tool_use_id: string | null;
  error?: SDKAssistantMessageError;
  aborted?: true;
  timestamp?: string;
};

message 字段是 Anthropic SDK 的 BetaMessage,包含 idcontentmodelstop_reasonusage 等字段。

SDKAssistantMessageError 取值为以下之一:'authentication_failed''oauth_org_not_allowed''billing_error''rate_limit''overloaded''invalid_request''model_not_found''server_error''max_output_tokens''unknown''model_not_found' 表示所选模型不存在或你的账户/部署无法访问。'overloaded' 表示 API 返回了 529(服务器满载),而 'rate_limit' 是针对配额的 429。

abortedtrue 时表示中断或终止操作在流完成前截断了助手消息:此时消息没有 stop_reason,内容可能在词中间断开。正常完成的消息上不包含此字段。需要 Agent SDK v0.3.214 或更高版本。

timestamp 是 ISO 8601 格式的时间戳,表示消息内容在生成它的进程上完成生成的时间。该值来自该机器的时钟,因此仅用于显示,不要用它排序消息。一次 API 调用可能产生多条共享 message.id 的助手消息,每条都有自己的 timestamp。如果该字段缺失,请回退到收到消息的时间。

SDKUserMessage

用户输入消息,可选择性地抑制模型响应或携带工具执行结果。

type SDKUserMessage = {
  type: "user";
  uuid?: UUID;
  session_id?: string;
  message: MessageParam; // 来自 Anthropic SDK
  parent_tool_use_id: string | null;
  isSynthetic?: boolean;
  shouldQuery?: boolean;
  tool_use_result?: unknown;
  origin?: SDKMessageOrigin;
};

shouldQuery 设为 false 可在不触发助手轮次的情况下将消息追加到对话记录。该消息会被保留并合并到下一条触发轮次的用户消息中。适用于注入上下文(如带外运行命令的输出)而无需消耗一次模型调用。

对于携带 tool_result 块的消息,tool_use_result 是工具的结构化输出对象,而非发送给模型的文本。其形状取决于匹配的 tool_use 块所指定的工具名称,因此该字段类型为 unknown;内置形状列在工具输出类型下。

对于 Agent 工具,tool_use_resultAgentOutput。在 completed 结果上,content 包含子 agent 的报告,不含 Claude Code 附加到 tool_result 文本中的 agent ID 和用量尾部信息,因此应从 tool_use_result 渲染,而非解析该文本。

SDKUserMessageReplay

重放的用户消息,带有必需的 UUID 和 isReplay 标志。

type SDKUserMessageReplay = {
  type: "user";
  uuid: UUID;
  session_id: string;
  message: MessageParam;
  parent_tool_use_id: string | null;
  isSynthetic?: boolean;
  tool_use_result?: unknown;
  origin?: SDKMessageOrigin;
  isReplay: true;
};

从会话外部注入的用户轮次(其 origin kind 为 peerchannel),无论是在活跃轮次期间送达还是在会话空闲时启动新轮次,都会作为 replay 到达流。v2.1.207 之前,会话空闲时送达的注入轮次不会在流上产生消息,只有重新读取对话记录时才能看到。

SDKResultMessage

最终结果消息,分为成功和错误两种形态,携带计费、耗时、权限拒绝等诊断信息。

type SDKResultMessage =
  | {
      type: "result";
      subtype: "success";
      uuid: UUID;
      session_id: string;
      duration_ms: number;
      duration_api_ms: number;
      is_error: boolean;
      api_error_status?: number | null;
      num_turns: number;
      result: string;
      stop_reason: string | null;
      ttft_ms?: number;
      ttft_stream_ms?: number;
      user_message_uuid?: string;
      request_sent_wall_ms?: number;
      total_cost_usd: number;
      usage: NonNullableUsage;
      modelUsage: { [modelName: string]: ModelUsage };
      permission_denials: SDKPermissionDenial[];
      structured_output?: unknown;
      deferred_tool_use?: { id: string; name: string; input: Record<string, unknown> };
      terminal_reason?: TerminalReason;
      fast_mode_state?: FastModeState;
      fast_mode_disabled_reason?: FastModeDisabledReason;
      origin?: SDKMessageOrigin;
    }
  | {
      type: "result";
      subtype:
        | "error_max_turns"
        | "error_during_execution"
        | "error_max_budget_usd"
        | "error_max_structured_output_retries";
      uuid: UUID;
      session_id: string;
      duration_ms: number;
      duration_api_ms: number;
      is_error: boolean;
      num_turns: number;
      stop_reason: string | null;
      total_cost_usd: number;
      usage: NonNullableUsage;
      modelUsage: { [modelName: string]: ModelUsage };
      permission_denials: SDKPermissionDenial[];
      errors: string[];
      terminal_reason?: TerminalReason;
      fast_mode_state?: FastModeState;
      fast_mode_disabled_reason?: FastModeDisabledReason;
      origin?: SDKMessageOrigin;
    };

结果上的若干字段在 subtype 之外提供额外诊断信息:

  • api_error_status:终止对话的 API 错误的 HTTP 状态码。当轮次未因 API 错误结束时为 absent 或 null
  • ttft_ms:首 token 时间(毫秒),在收到第一条完整助手消息时测量。仅存在于 success 形态。
  • ttft_stream_ms:收到第一个 message_start 流事件的时间(毫秒),即响应流开启时。低于 ttft_ms;两者之差是流式传输第一条消息所花的时间。仅存在于 success 形态。
  • user_message_uuid:发起此轮次的 SDKUserMessageuuid,回传以便你将结果与发送的消息匹配。需要 Claude Code v2.1.216 或更高版本。仅在 success 形态上存在,与 request_sent_wall_ms 一起出现;在 API 错误结果、子 agent 调用和定时任务等合成轮次上缺失。
  • request_sent_wall_ms:Claude Code 发出 API 请求时的 epoch 毫秒数,用于与服务端时间戳关联。仅与 user_message_uuid 一起出现。
  • terminal_reason:循环结束原因。取值为 "completed""max_turns""tool_deferred""aborted_streaming""aborted_tools""hook_stopped""stop_hook_prevented""background_requested""blocking_limit""rapid_refill_breaker""prompt_too_long""image_error""model_error""api_error""malformed_tool_use_exhausted""budget_exhausted""structured_output_retry_exhausted""tool_deferred_unavailable""turn_setup_failed" 之一。
  • fast_mode_state"on""off""cooldown" 之一。
  • fast_mode_disabled_reason快速模式当前不可用的原因。当没有阻断因素时该字段缺失,但请求仍可能以标准速度运行。在快速模式速率限制后的冷却期间,Claude Code 报告 fast_mode_state: "cooldown" 且无原因码,冷却到期后重新启用快速模式。需要 Claude Code v2.1.219 或更高版本。

使用原因码在你自己的 UI 中解释为何快速模式关闭,而无需重新推导可用性。每个码标识了阻断快速模式的具体检查:

原因码 含义
free 账户没有快速模式所需的付费订阅或用量积分
preference 组织已禁用快速模式
extra_usage_disabled 账户的用量积分已关闭
network_error 可用性检查无法访问 api.anthropic.com
unknown Claude Code 无法确定可用性
not_first_party 会话使用了 Anthropic API 以外的供应商
disabled_by_env 设置了 CLAUDE_CODE_DISABLE_FAST_MODE
model_not_allowed 快速模式 Opus 模型不在组织的 availableModels 允许列表中
sdk_opt_in_required 会话未选择启用快速模式:在 settings 选项中传入 fastMode: true 或通过 applyFlagSettings() 设置
pending 可用性检查尚未完成

相同的一对字段也出现在 SDKSystemMessageSDKControlInitializeResponse 上,因此你可以在第一轮之前读取快速模式状态。

origin 字段转发触发此结果的用户消息的 SDKMessageOrigin。当后台任务完成且 SDK 注入合成后续轮次时,产生的 SDKResultMessage 携带 origin: { kind: "task-notification" }。检查此字段以区分应答你提示的结果与后台任务后续产生的结果,从而对后者进行路由或抑制。对于在任何用户轮次之前发出的结果(如启动错误),该字段缺失。

PreToolUse hook 返回 permissionDecision: "defer" 时,结果具有 stop_reason: "tool_deferred"deferred_tool_use 携带待定工具的 idnameinput。读取此字段在你自己的 UI 中展示请求,然后使用相同的 session_id 恢复以继续。完整的往返流程参见 Defer a tool call for later

SDKSystemMessage

系统初始化消息,包含会话环境信息:模型、工具、MCP 服务器、权限模式等。

type SDKSystemMessage = {
  type: "system";
  subtype: "init";
  uuid: UUID;
  session_id: string;
  agents?: string[];
  apiKeySource: ApiKeySource;
  betas?: string[];
  claude_code_version: string;
  cwd: string;
  tools: string[];
  mcp_servers: {
    name: string;
    status: string;
  }[];
  model: string;
  permissionMode: PermissionMode;
  slash_commands: string[];
  output_style: string;
  skills: string[];
  plugins: { name: string; path: string }[];
  fast_mode_state?: FastModeState;
  fast_mode_disabled_reason?: FastModeDisabledReason;
  capabilities?: string[];
};

fast_mode_state 报告会话的快速模式状态。当有因素阻断快速模式时,fast_mode_disabled_reason 指出阻断的检查项;该字段需要 Claude Code v2.1.219 或更高版本。原因码及含义参见结果消息上的 fast_mode_disabled_reason

capabilities 数组列出此 CLI 实现的协议行为,可用于特性检测而非比较 claude_code_version 字符串。它是开放集合:忽略你不认识的值,只检查你依赖的特定 capability。该字段需要 Claude Code v2.1.205 或更高版本,在更早的 CLI 上缺失。

Capability 含义
interrupt_receipt_v1 interrupt() 返回一个 SDKControlInterruptResponse 回执,列出中断后存活的已排队消息
interrupt_cancel_queued_v1 interrupt 控制请求支持 cancel_queued: true,取消否则会在中断后存活的已排队消息,并在回执的 cancelled 字段上列出它们。参见 SDKControlInterruptResponse。需要 Claude Code v2.1.219 或更高版本

SDKPartialAssistantMessage

流式部分消息(仅在 includePartialMessages 为 true 时发出)。 parent_tool_use_id 字段始终为 null:流事件仅为主会话发出。对于子 agent 归属,使用携带 parent_tool_use_id 的完整消息,或启用 forwardSubagentText 以完整消息形式接收子 agent 文本和思考。

type SDKPartialAssistantMessage = {
  type: "stream_event";
  event: BetaRawMessageStreamEvent; // 来自 Anthropic SDK
  parent_tool_use_id: string | null;
  uuid: UUID;
  session_id: string;
  ttft_ms?: number; // 首 token 时间(毫秒),仅在 message_start 事件上存在
};

SDKCompactBoundaryMessage

指示对话压缩边界的消息。

type SDKCompactBoundaryMessage = {
  type: "system";
  subtype: "compact_boundary";
  uuid: UUID;
  session_id: string;
  compact_metadata: {
    trigger: "manual" | "auto";
    pre_tokens: number;
  };
};

SDKInformationalMessage

循环发出的通用文本横幅,携带非错误状态行、hook 反馈(如 UserPromptSubmit hook 的阻止原因)和命令输出。 按给定的 levelcontent 渲染为纯文本。

type SDKInformationalMessage = {
  type: "system";
  subtype: "informational";
  content: string;
  level: "info" | "notice" | "suggestion" | "warning";
  tool_use_id?: string;
  prevent_continuation?: boolean;
  uuid: UUID;
  session_id: string;
};

SDKWorkerShuttingDownMessage

在 worker 优雅退出时发出,使远程客户端能展示退出原因而非等待心跳超时。 reason 是宿主 CLI 设置的短格式 snake_case 字符串,如 "host_exit""remote_control_disabled"。仅在实时流式传输时处理此消息。恢复的会话会重放此消息的历史实例,此时应忽略它们。

type SDKWorkerShuttingDownMessage = {
  type: "system";
  subtype: "worker_shutting_down";
  reason: string;
  uuid: UUID;
  session_id: string;
};

SDKPluginInstallMessage

插件安装进度事件。 在设置了 CLAUDE_CODE_SYNC_PLUGIN_INSTALL 时发出,使 Agent SDK 应用可以在首轮之前追踪 marketplace 插件安装情况。startedcompleted 状态包裹整个安装过程。installedfailed 状态报告各个 marketplace 的结果并包含 name

type SDKPluginInstallMessage = {
  type: "system";
  subtype: "plugin_install";
  status: "started" | "installed" | "failed" | "completed";
  name?: string;
  error?: string;
  uuid: UUID;
  session_id: string;
};

SDKPermissionDeniedMessage

权限系统自动拒绝工具调用(无交互提示)时发出的流事件。 用它在 UI 中实时渲染拒绝信息,而非仅在后续的 is_error 工具结果中观察到。交互式询问路径通过 canUseTool 回调到达你的应用。PreToolUse hook 发出的拒绝不通过此事件报告。

此事件需要 Claude Code v2.1.136 或更高版本。

type SDKPermissionDeniedMessage = {
  type: "system";
  subtype: "permission_denied";
  tool_name: string;
  tool_use_id: string;
  agent_id?: string;
  decision_reason_type?: string;
  decision_reason?: string;
  message: string;
  uuid: UUID;
  session_id: string;
};
字段 类型 说明
tool_name string 被拒绝的工具名称
tool_use_id string 此拒绝所应答的 tool_use 块的 ID
agent_id string 当被拒绝的调用源自子 agent 时的子 agent ID。与 can_use_tool 上的字段一致,用于宿主侧路由
decision_reason_type string 做出决策的组件的判别符,如 "rule""mode""classifier""asyncAgent"
decision_reason string 来自决策组件的人类可读原因(如有)
message string tool_result 中返回给模型的拒绝消息

SDKPermissionDenial

被拒绝的工具使用信息。

type SDKPermissionDenial = {
  tool_name: string;
  tool_use_id: string;
  tool_input: Record<string, unknown>;
};

SDKMessageOrigin

用户角色消息的来源标识。origin 形式出现在 SDKUserMessage 上,并转发到对应的 SDKResultMessage,以便你判断是什么触发了给定的轮次。

type SDKMessageOrigin =
  | { kind: "human" }
  | { kind: "channel"; server: string }
  | {
      kind: "peer";
      from: string;
      name?: string;
      fromSession?: string;
      senderTaskId?: string;
      body?: string;
      verifiedPeerPid?: number;
    }
  | { kind: "task-notification" }
  | { kind: "coordinator" }
  | { kind: "auto-continuation" };
kind 含义
human 来自终端用户的直接输入。如果你的应用将用户输入作为用户消息转发,应显式设置其 origin{ kind: "human" }:Claude Code 将没有 origin 的用户消息视为未归属消息,需要人类输入提示的检查(如 ultracode 工作流关键字)不会接受它。v2.1.210 之前,Claude Code 将用户消息上缺失的 origin 视为人类输入
channel 通过 channel 到达的消息。server 是源 MCP 服务器名称
peer 来自另一个 agent 的消息:进程内的队友或跨会话对等体(如另一个本地 Claude Code 进程)。各字段语义和信任模型参见 Peer origin 字段
task-notification 后台任务完成后注入的合成轮次。参见 SDKTaskNotificationMessage
coordinator 来自 agent team 中团队协调者的消息
auto-continuation 会话在无新用户输入时继续时注入的合成轮次,如命令结果触发后续提示

Peer origin 字段

peer origin 标识发送消息的 agent:进程内队友SendMessage 发送到 main,或跨会话对等体(如另一个本地 Claude Code 进程)。 两种发送者以不同方式填充这些字段:

  • from:队友的名称,或跨会话对等体的发送者地址。该值由发送者编写;verifiedPeerPid 才是经过验证的身份。
  • senderTaskId:队友的任务 ID。跨会话对等体上缺失。
  • name:发送者的显示名称,由 Claude Code 规范化:去除 Unicode 控制、格式、代理和行/段落分隔符代码点,然后修剪结果并在 64 个代码点处以省略号截断。需要 Claude Code v2.1.205 或更高版本。
  • body:去除对等体信封后的解码消息正文,与模型看到的字节完全一致。队友消息始终存在;跨会话对等体仅在轮次恰好是由 Claude Code 构建的一个对等体信封时存在。渲染 namebody 而非重新解析消息文本。需要 Claude Code v2.1.205 或更高版本。
  • fromSession:发送者的可由宿主打开的会话 ID,由发送者的宿主设置,以便你的 UI 可以链接回发送会话。与 from 一样,它是发送者声明的:仅用作导航目标,不要将其视为发送者身份的证明。需要 Claude Code v2.1.216 或更高版本。
  • verifiedPeerPid:连接到此会话跨会话消息 socket 的进程的进程 ID,由内核验证并从连接本身读取,而非从载荷中。使用它而非 from 来标识发送者:from 可被同用户的任何进程伪造。当 Claude Code 无法验证时(如 Windows 或非 socket 入口)该字段缺失,缺失值意味着发送者未经验证。对于中继流量,它标识的是中继而非消息的作者,且进程 ID 可被回收,因此将其视为来源而非认证令牌。需要 Claude Code v2.1.216 或更高版本。

Hook 类型

完整的 hook 使用指南和常见模式参见 Hooks guide

HookEvent

可用的 hook 事件类型。

type HookEvent =
  | "PreToolUse"
  | "PostToolUse"
  | "PostToolUseFailure"
  | "PostToolBatch"
  | "Notification"
  | "UserPromptSubmit"
  | "UserPromptExpansion"
  | "SessionStart"
  | "SessionEnd"
  | "Stop"
  | "StopFailure"
  | "SubagentStart"
  | "SubagentStop"
  | "PreCompact"
  | "PostCompact"
  | "PermissionRequest"
  | "PermissionDenied"
  | "Setup"
  | "TeammateIdle"
  | "TaskCreated"
  | "TaskCompleted"
  | "Elicitation"
  | "ElicitationResult"
  | "ConfigChange"
  | "DirectoryAdded"
  | "WorktreeCreate"
  | "WorktreeRemove"
  | "InstructionsLoaded"
  | "CwdChanged"
  | "FileChanged"
  | "MessageDisplay";

HookCallback

Hook 回调函数类型。

type HookCallback = (
  input: HookInput, // 所有 hook 输入类型的联合
  toolUseID: string | undefined,
  options: { signal: AbortSignal }
) => Promise<HookJSONOutput>;

HookCallbackMatcher

带可选匹配器的 hook 配置。

interface HookCallbackMatcher {
  matcher?: string;
  hooks: HookCallback[];
  timeout?: number; // 此 matcher 中所有 hook 的超时时间(秒)
}

HookInput

所有 hook 输入类型的联合类型。

type HookInput =
  | PreToolUseHookInput
  | PostToolUseHookInput
  | PostToolUseFailureHookInput
  | PostToolBatchHookInput
  | PermissionDeniedHookInput
  | NotificationHookInput
  | UserPromptSubmitHookInput
  | UserPromptExpansionHookInput
  | SessionStartHookInput
  | SessionEndHookInput
  | StopHookInput
  | StopFailureHookInput
  | SubagentStartHookInput
  | SubagentStopHookInput
  | PreCompactHookInput
  | PostCompactHookInput
  | PermissionRequestHookInput
  | SetupHookInput
  | TeammateIdleHookInput
  | TaskCreatedHookInput
  | TaskCompletedHookInput
  | ElicitationHookInput
  | ElicitationResultHookInput
  | ConfigChangeHookInput
  | InstructionsLoadedHookInput
  | DirectoryAddedHookInput
  | WorktreeCreateHookInput
  | WorktreeRemoveHookInput
  | CwdChangedHookInput
  | FileChangedHookInput
  | MessageDisplayHookInput;

BaseHookInput

所有 hook 输入类型继承的基础接口。

type BaseHookInput = {
  session_id: string;
  transcript_path: string;
  cwd: string;
  prompt_id?: string;
  permission_mode?: string;
  effort?: { level: string };
  agent_id?: string;
  agent_type?: string;
};

prompt_id 字段是标识当前正在处理的用户提示的 UUID。它与 OpenTelemetry 事件上的 prompt.id 属性匹配,在首次用户输入之前缺失。需要 Claude Code v2.1.196 或更高版本。

PreToolUseHookInput

type PreToolUseHookInput = BaseHookInput & {
  hook_event_name: "PreToolUse";
  tool_name: string;
  tool_input: unknown;
  tool_use_id: string;
};

PostToolUseHookInput

type PostToolUseHookInput = BaseHookInput & {
  hook_event_name: "PostToolUse";
  tool_name: string;
  tool_input: unknown;
  tool_response: unknown;
  tool_use_id: string;
  duration_ms?: number;
};

PostToolUseFailureHookInput

type PostToolUseFailureHookInput = BaseHookInput & {
  hook_event_name: "PostToolUseFailure";
  tool_name: string;
  tool_input: unknown;
  tool_use_id: string;
  error: string;
  is_interrupt?: boolean;
  duration_ms?: number;
};

PostToolBatchHookInput

在一个 batch 中所有工具调用解析完毕后、下一次模型请求之前触发一次。 tool_response 携带的是模型所见的序列化 tool_result 内容;其形状与 PostToolUseHookInput 的结构化 Output 对象不同。

type PostToolBatchHookInput = BaseHookInput & {
  hook_event_name: "PostToolBatch";
  tool_calls: PostToolBatchToolCall[];
};

type PostToolBatchToolCall = {
  tool_name: string;
  tool_input: unknown;
  tool_use_id: string;
  tool_response?: unknown;
};

PermissionDeniedHookInput

type PermissionDeniedHookInput = BaseHookInput & {
  hook_event_name: "PermissionDenied";
  tool_name: string;
  tool_input: unknown;
  tool_use_id: string;
  reason: string;
};

NotificationHookInput

type NotificationHookInput = BaseHookInput & {
  hook_event_name: "Notification";
  message: string;
  title?: string;
  notification_type: string;
};

UserPromptSubmitHookInput

type UserPromptSubmitHookInput = BaseHookInput & {
  hook_event_name: "UserPromptSubmit";
  prompt: string;
  session_title?: string;
};

UserPromptExpansionHookInput

type UserPromptExpansionHookInput = BaseHookInput & {
  hook_event_name: "UserPromptExpansion";
  expansion_type: "slash_command" | "mcp_prompt";
  command_name: string;
  command_args: string;
  command_source?: string;
  prompt: string;
};

SessionStartHookInput

type SessionStartHookInput = BaseHookInput & {
  hook_event_name: "SessionStart";
  source: "startup" | "resume" | "clear" | "compact" | "fork";
  agent_type?: string;
  model?: string;
  session_title?: string;
};

SessionEndHookInput

type SessionEndHookInput = BaseHookInput & {
  hook_event_name: "SessionEnd";
  reason: ExitReason; // EXIT_REASONS 数组中的字符串
};

StopHookInput

type StopHookInput = BaseHookInput & {
  hook_event_name: "Stop";
  stop_hook_active: boolean;
  last_assistant_message?: string;
  background_tasks?: BackgroundTaskSummary[];
  session_crons?: SessionCronSummary[];
};

StopFailureHookInput

type StopFailureHookInput = BaseHookInput & {
  hook_event_name: "StopFailure";
  error: SDKAssistantMessageError;
  error_details?: string;
  last_assistant_message?: string;
};

SubagentStartHookInput

type SubagentStartHookInput = BaseHookInput & {
  hook_event_name: "SubagentStart";
  agent_id: string;
  agent_type: string;
};

SubagentStopHookInput

type SubagentStopHookInput = BaseHookInput & {
  hook_event_name: "SubagentStop";
  stop_hook_active: boolean;
  agent_id: string;
  agent_transcript_path: string;
  agent_type: string;
  last_assistant_message?: string;
  background_tasks?: BackgroundTaskSummary[];
  session_crons?: SessionCronSummary[];
};

type BackgroundTaskSummary = {
  id: string;
  type: string;
  status: string;
  description: string;
  command?: string;
  agent_type?: string;
  server?: string;
  tool?: string;
  name?: string;
};

type SessionCronSummary = {
  id: string;
  schedule: string;
  recurring: boolean;
  prompt: string;
};

PreCompactHookInput

type PreCompactHookInput = BaseHookInput & {
  hook_event_name: "PreCompact";
  trigger: "manual" | "auto";
  custom_instructions: string | null;
};

PostCompactHookInput

type PostCompactHookInput = BaseHookInput & {
  hook_event_name: "PostCompact";
  trigger: "manual" | "auto";
  compact_summary: string;
};

PermissionRequestHookInput

type PermissionRequestHookInput = BaseHookInput & {
  hook_event_name: "PermissionRequest";
  tool_name: string;
  tool_input: unknown;
  permission_suggestions?: PermissionUpdate[];
};

SetupHookInput

type SetupHookInput = BaseHookInput & {
  hook_event_name: "Setup";
  trigger: "init" | "maintenance";
};

TeammateIdleHookInput

type TeammateIdleHookInput = BaseHookInput & {
  hook_event_name: "TeammateIdle";
  teammate_name: string;
  /** @deprecated 自 v2.1.178 起。携带从会话派生的团队名称;将被移除。 */
  team_name: string;
};

TaskCreatedHookInput

type TaskCreatedHookInput = BaseHookInput & {
  hook_event_name: "TaskCreated";
  task_id: string;
  task_subject: string;
  task_description?: string;
  teammate_name?: string;
  /** @deprecated 自 v2.1.178 起。携带从会话派生的团队名称;将被移除。 */
  team_name?: string;
};

TaskCompletedHookInput

type TaskCompletedHookInput = BaseHookInput & {
  hook_event_name: "TaskCompleted";
  task_id: string;
  task_subject: string;
  task_description?: string;
  teammate_name?: string;
  /** @deprecated 自 v2.1.178 起。携带从会话派生的团队名称;将被移除。 */
  team_name?: string;
};

ElicitationHookInput

type ElicitationHookInput = BaseHookInput & {
  hook_event_name: "Elicitation";
  mcp_server_name: string;
  message: string;
  mode?: "form" | "url";
  url?: string;
  elicitation_id?: string;
  requested_schema?: Record<string, unknown>;
};

ElicitationResultHookInput

type ElicitationResultHookInput = BaseHookInput & {
  hook_event_name: "ElicitationResult";
  mcp_server_name: string;
  elicitation_id?: string;
  mode?: "form" | "url";
  action: "accept" | "decline" | "cancel";
  content?: Record<string, unknown>;
};

ConfigChangeHookInput

type ConfigChangeHookInput = BaseHookInput & {
  hook_event_name: "ConfigChange";
  source:
    | "user_settings"
    | "project_settings"
    | "local_settings"
    | "policy_settings"
    | "skills";
  file_path?: string;
};

InstructionsLoadedHookInput

type InstructionsLoadedHookInput = BaseHookInput & {
  hook_event_name: "InstructionsLoaded";
  file_path: string;
  memory_type: "User" | "Project" | "Local" | "Managed";
  load_reason:
    | "session_start"
    | "nested_traversal"
    | "path_glob_match"
    | "include"
    | "compact";
  globs?: string[];
  trigger_file_path?: string;
  parent_file_path?: string;
};

DirectoryAddedHookInput

type DirectoryAddedHookInput = BaseHookInput & {
  hook_event_name: "DirectoryAdded";
  directory: string;
  source: "slash_command" | "register_repo_root";
};

directory 是被添加目录的绝对路径。source"slash_command"(通过 /add-dir 添加)或 "register_repo_root"(通过 SDK 控制请求添加)。

WorktreeCreateHookInput

type WorktreeCreateHookInput = BaseHookInput & {
  hook_event_name: "WorktreeCreate";
  name: string;
};

WorktreeRemoveHookInput

type WorktreeRemoveHookInput = BaseHookInput & {
  hook_event_name: "WorktreeRemove";
  worktree_path: string;
};

CwdChangedHookInput

type CwdChangedHookInput = BaseHookInput & {
  hook_event_name: "CwdChanged";
  old_cwd: string;
  new_cwd: string;
};

FileChangedHookInput

type FileChangedHookInput = BaseHookInput & {
  hook_event_name: "FileChanged";
  file_path: string;
  event: "change" | "add" | "unlink";
};

MessageDisplayHookInput

type MessageDisplayHookInput = BaseHookInput & {
  hook_event_name: "MessageDisplay";
  turn_id: string;
  message_id: string;
  index: number;
  final: boolean;
  delta: string;
};

HookJSONOutput

Hook 的返回值类型,分为异步和同步两种。

type HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput;

AsyncHookJSONOutput

type AsyncHookJSONOutput = {
  async: true;
  asyncTimeout?: number;
};

SyncHookJSONOutput

type SyncHookJSONOutput = {
  continue?: boolean;
  suppressOutput?: boolean;
  stopReason?: string;
  decision?: "approve" | "block";
  systemMessage?: string;
  /**
   * 终端转义序列(如 OSC 9 / OSC 777 桌面通知),
   * 由 Claude Code 代为发出。仅允许通知/标题 OSC
   * (0, 1, 2, 9, 99, 777) 和 BEL;包含其他内容的值
   * 将被整体忽略。
   */
  terminalSequence?: string;
  reason?: string;
  hookSpecificOutput?:
    | {
        hookEventName: "PreToolUse";
        permissionDecision?: "allow" | "deny" | "ask" | "defer";
        permissionDecisionReason?: string;
        updatedInput?: Record<string, unknown>;
        additionalContext?: string;
      }
    | {
        hookEventName: "UserPromptSubmit";
        additionalContext?: string;
        sessionTitle?: string;
        /** 当 decision 为 "block" 时,从阻止消息中省略原始提示。 */
        suppressOriginalPrompt?: boolean;
      }
    | {
        hookEventName: "UserPromptExpansion";
        additionalContext?: string;
      }
    | {
        hookEventName: "SessionStart";
        additionalContext?: string;
        initialUserMessage?: string;
        sessionTitle?: string;
        watchPaths?: string[];
        /**
         * 在 SessionStart hook 完成后重新扫描 skill 和 command 目录,
         * 使 hook 安装的 skill 在同一会话中可用。
         */
        reloadSkills?: boolean;
      }
    | {
        hookEventName: "Setup";
        additionalContext?: string;
      }
    | {
        hookEventName: "SubagentStart";
        additionalContext?: string;
      }
    | {
        hookEventName: "PostToolUse";
        additionalContext?: string;
        updatedToolOutput?: unknown;
        /** @deprecated 使用 `updatedToolOutput`,它适用于所有工具。 */
        updatedMCPToolOutput?: unknown;
      }
    | {
        hookEventName: "PostToolUseFailure";
        additionalContext?: string;
      }
    | {
        hookEventName: "PostToolBatch";
        additionalContext?: string;
      }
    | {
        hookEventName: "Stop";
        additionalContext?: string;
      }
    | {
        hookEventName: "SubagentStop";
        additionalContext?: string;
      }
    | {
        hookEventName: "PermissionDenied";
        retry?: boolean;
      }
    | {
        hookEventName: "Notification";
        additionalContext?: string;
      }
    | {
        hookEventName: "PermissionRequest";
        decision:
          | {
              behavior: "allow";
              updatedInput?: Record<string, unknown>;
              updatedPermissions?: PermissionUpdate[];
            }
          | {
              behavior: "deny";
              message?: string;
              interrupt?: boolean;
            };
      }
    | {
        hookEventName: "Elicitation";
        action?: "accept" | "decline" | "cancel";
        content?: Record<string, unknown>;
      }
    | {
        hookEventName: "ElicitationResult";
        action?: "accept" | "decline" | "cancel";
        content?: Record<string, unknown>;
      }
    | {
        hookEventName: "CwdChanged";
        watchPaths?: string[];
      }
    | {
        hookEventName: "FileChanged";
        watchPaths?: string[];
      }
    | {
        hookEventName: "WorktreeCreate";
        worktreePath: string;
      }
    | {
        hookEventName: "MessageDisplay";
        /** 替代 delta 显示的文本。省略(或原样返回 delta)则显示原始内容。 */
        displayContent?: string;
      };
};

工具输入类型

ToolInputSchemas

所有工具输入类型的联合类型,从 @anthropic-ai/claude-agent-sdk 导出。 成员包括:

```typescript theme={null}
type ToolInputSchemas =
| AgentInput
| ArtifactInput
| AskUserQuestionInput
| BashInput
| CronCreateInput
| CronDeleteInput
| CronListInput
| EnterPlanModeInput
| EnterWorktreeInput
| ExitPlanModeInput
| ExitWorktreeInput
| FileEditInput
| FileReadInput
| FileWriteInput
| GlobInput
| GrepInput
| ListMcpResourcesInput
| McpInput
| MonitorInput
| NotebookEditInput
| ProjectsInput
| PushNotificationInput
| ReadMcpResourceDirInput
| ReadMcpResourceInput
| RefreshMcpToolsInput
| RemoteTriggerInput
| REPLInput
| ReportFindingsInput
| ScheduleWakeupInput
| ShowOnboardingRolePickerInput
| TaskCreateInput
| TaskGetInput
| TaskListInput
| TaskOutputInput
| TaskStopInput
| TaskUpdateInput
| TodoWriteInput
| WebFetchInput
| WebSearchInput
| WorkflowInput;

### Agent

**启动一个新的子代理来自主处理复杂的多步骤任务。**

**工具名称:** `Agent`。旧名称 `Task` 仍作为别名被接受,[`SDKSystemMessage`](#sdksystemmessage) 初始化消息中的 `tools` 数组目前仍将该工具列为 `Task` 以保持向后兼容。

> **注意:** `mode` 字段自 Claude Code v2.1.212 起已弃用并被忽略:子代理会[继承父会话的权限模式](https://code.claude.com/docs/en/agent-sdk/permissions#available-modes),子代理定义中的 [`permissionMode`](#agentdefinition) 可以覆盖它,除非父代理使用的是 `bypassPermissions`、`acceptEdits` 或 `auto` 模式。

```typescript theme={null}
type AgentInput = {
  description: string;
  prompt: string;
  subagent_type?: string;
  model?: "sonnet" | "opus" | "haiku" | "fable";
  run_in_background?: boolean;
  name?: string;
  team_name?: string; // Deprecated; ignored
  mode?: "acceptEdits" | "auto" | "bypassPermissions" | "default" | "dontAsk" | "plan"; // Deprecated; ignored. Subagents inherit the parent session's permission mode; agent-definition frontmatter may override it
  isolation?: "worktree" | "remote";
};

AskUserQuestion

在执行过程中向用户提出澄清性问题。

工具名称: AskUserQuestion

```typescript theme={null}
type AskUserQuestionInput = {
questions: Array<{
question: string;
header: string;
options: Array<{ label: string; description: string; preview?: string }>;
multiSelect: boolean;
}>;
answers?: Record;
annotations?: Record;
metadata?: { source?: string };
};

详见[处理审批和用户输入](https://code.claude.com/docs/en/agent-sdk/user-input#handle-clarifying-questions)中的使用说明。

### Bash

**执行 Bash 命令,支持可选超时和后台运行。**

**工具名称:** `Bash`

```typescript theme={null}
type BashInput = {
  command: string;
  timeout?: number; // milliseconds, max 600000; higher values are clamped to the max
  description?: string;
  run_in_background?: boolean;
  dangerouslyDisableSandbox?: boolean;
};

工作目录在命令之间保持不变;shell 状态(如导出的环境变量)则不保留。

Monitor

运行后台事件源,将每个事件实时送达 Claude 进行响应,无需轮询。

工具名称: Monitor

```typescript theme={null}
type MonitorInput = {
command?: string;
ws?: {
url: string;
protocols?: string[];
};
description: string;
timeout_ms: number;
persistent: boolean;
};

`command` 运行脚本并将 stdout 每行作为一个事件发送;`ws` 打开 WebSocket 连接并将每个文本帧作为一个事件发送。两者需且仅需提供其一。`ws` 数据源需要 Claude Code v2.1.195 或更高版本。

 `persistent` 设为 `true` 可用于会话级的长期监控(如日志跟踪)。当 Monitor 运行命令时,遵循与 Bash 相同的权限规则;WebSocket 监听则单独请求批准。参见 [Monitor 工具参考](https://code.claude.com/docs/en/tools-reference#monitor-tool)了解行为细节和提供商可用性。导出类型将 `timeout_ms` 和 `persistent` 标记为必填,因为 schema 会填入默认值(分别为 300000 和 `false`);省略它们的调用也能通过验证。

### TaskOutput

**获取正在运行或已完成的后台任务的输出。**

**工具名称:** `TaskOutput`

> **注意:** `TaskOutput` 已弃用;请改用 `Read` 读取任务的输出文件路径。自 Claude Code v2.1.83 起弃用。以下 schema 仍然有效,供 hooks 和权限处理器在遇到该工具时使用。

```typescript theme={null}
type TaskOutputInput = {
  task_id: string;
  block: boolean;
  timeout: number;
};

Edit

在文件中执行精确的字符串替换。

工具名称: Edit

```typescript theme={null}
type FileEditInput = {
file_path: string;
old_string: string;
new_string: string;
replace_all?: boolean;
};

### Read

**从本地文件系统读取文件,支持文本、图片、PDF  Jupyter notebook。**

**工具名称:** `Read`

```typescript theme={null}
type FileReadInput = {
  file_path: string;
  offset?: number;
  limit?: number;
  pages?: string;
};

使用 pages 指定 PDF 页面范围(例如 "1-5")。

Write

将文件写入本地文件系统,已有文件则覆盖。

工具名称: Write

```typescript theme={null}
type FileWriteInput = {
file_path: string;
content: string;
};

### Glob

**快速文件模式匹配,适用于任意规模的代码库。**

**工具名称:** `Glob`

```typescript theme={null}
type GlobInput = {
  pattern: string;
  path?: string;
};

Grep

基于 ripgrep 构建的强大搜索工具,支持正则表达式。

工具名称: Grep

```typescript theme={null}
type GrepInput = {
pattern: string;
path?: string;
glob?: string;
type?: string;
output_mode?: "content" | "files_with_matches" | "count";
"-i"?: boolean;
"-o"?: boolean; // print only the matched parts of each line; requires output_mode: "content"
"-n"?: boolean;
"-B"?: number;
"-A"?: number;
"-C"?: number;
context?: number;
head_limit?: number;
offset?: number;
multiline?: boolean;
};

### TaskStop

** ID 停止正在运行的后台任务或 shell。**

**工具名称:** `TaskStop`

```typescript theme={null}
type TaskStopInput = {
  task_id?: string;
  shell_id?: string; // Deprecated: use task_id
};

自 v2.1.198 起,task_id 也接受 agent-team 队友或命名后台代理的代理 ID 或名称。

NotebookEdit

编辑 Jupyter notebook 文件中的单元格。

工具名称: NotebookEdit

```typescript theme={null}
type NotebookEditInput = {
notebook_path: string;
cell_id?: string;
new_source: string;
cell_type?: "code" | "markdown";
edit_mode?: "replace" | "insert" | "delete";
};

### WebFetch

**抓取 URL 内容并用 AI 模型处理。**

**工具名称:** `WebFetch`

```typescript theme={null}
type WebFetchInput = {
  url: string;
  prompt: string;
};

WebSearch

搜索网络并返回格式化的结果。

工具名称: WebSearch

```typescript theme={null}
type WebSearchInput = {
query: string;
allowed_domains?: string[];
blocked_domains?: string[];
};

### Workflow

**运行[动态工作流](https://code.claude.com/docs/en/workflows):一个在后台编排多个子代理并返回整合结果的脚本。**

**工具名称:** `Workflow`

```typescript theme={null}
type WorkflowInput = {
  script?: string;
  name?: string;
  scriptPath?: string;
  args?: unknown; // any JSON value; the published typings render this as an object map
  resumeFromRunId?: string;
  title?: string; // ignored; the script's meta block sets the title
  description?: string; // ignored; the script's meta block sets the description
};

Workflow 工具在 Agent SDK v0.3.149 及以上版本可用。scriptnamescriptPath 至少需要提供一个。

字段 类型 描述
script string 内联工作流脚本。必须以 export const meta = { name, description } 字面量开头,后接使用 agent()parallel()pipeline()phase() 的脚本主体。meta 中可选的 phases 数组将代理分组到命名阶段中,以在进度视图中显示
name string 内置工作流或保存在 .claude/workflows/ 中的工作流名称。会被解析为脚本
scriptPath string 磁盘上工作流脚本文件的路径。优先于 scriptname。每次调用都会持久化脚本并在结果中返回路径,因此你可以编辑该文件并用相同的 scriptPath 重新调用来迭代
args unknown 作为全局 args 暴露给脚本的输入值,用于参数化的命名工作流(如研究问题或文件路径列表)。数组和对象应作为实际 JSON 值传递,而非 JSON 编码的字符串
resumeFromRunId string 要恢复的先前 Workflow 调用的运行 ID。输入未变的已完成 agent() 调用通常返回缓存结果;其余调用实时运行。参见暂停后恢复了解哪些已完成的调用会重新运行。仅限同一会话
title string 被忽略;脚本的 meta 块设置标题
description string 被忽略;脚本的 meta 块设置描述

schema 接受任何 JSON 值作为 args;导出类型将其标记为 unknown,但发布的类型定义将该字段渲染为对象映射。

TodoWrite

创建和管理用于跟踪进度的结构化任务列表。

工具名称: TodoWrite

```typescript theme={null}
type TodoWriteInput = {
todos: Array<{
content: string;
status: "pending" | "in_progress" | "completed";
activeForm: string;
}>;
};

> **注意:**  TypeScript Agent SDK 0.3.142 起,`TodoWrite` 默认禁用。请改用 `TaskCreate``TaskGet``TaskUpdate`  `TaskList`。参见[迁移到 Task 工具](https://code.claude.com/docs/en/agent-sdk/todo-tracking#migrate-to-task-tools)更新你的监控代码,或设置 `CLAUDE_CODE_ENABLE_TASKS=0` 恢复使用 `TodoWrite`。

### TaskCreate

**创建单个任务并返回其分配的 ID。**

**工具名称:** `TaskCreate`

```typescript theme={null}
type TaskCreateInput = {
  subject: string;
  description: string;
  activeForm?: string;
  metadata?: Record<string, unknown>;
};

TaskUpdate

按 ID 更新单个任务。将 status 设为 "deleted" 可删除任务。

工具名称: TaskUpdate

```typescript theme={null}
type TaskUpdateInput = {
taskId: string;
status?: "pending" | "in_progress" | "completed" | "deleted";
subject?: string;
description?: string;
activeForm?: string;
addBlocks?: string[];
addBlockedBy?: string[];
owner?: string;
metadata?: Record;
};

### TaskGet

**返回单个任务的完整详情,ID 不存在时返回 `null`**

**工具名称:** `TaskGet`

```typescript theme={null}
type TaskGetInput = {
  taskId: string;
};

TaskList

返回当前列表中所有任务的快照。

工具名称: TaskList

```typescript theme={null}
type TaskListInput = {};

### ExitPlanMode

**退出计划模式。`allowedPrompts` 字段已弃用并被忽略。**

**工具名称:** `ExitPlanMode`

```typescript theme={null}
type ExitPlanModeInput = {
  /** Deprecated: no longer used. */
  allowedPrompts?: Array<{
    tool: "Bash";
    prompt: string;
  }>;
  [k: string]: unknown;
};

Claude Code 仍然接受 allowedPrompts 以使现有调用方和转录记录通过验证。在 v2.1.205 之前,该字段用于为执行计划请求基于提示的 Bash 权限。

ListMcpResources

列出已连接 MCP 服务器上的可用资源。

工具名称: ListMcpResourcesTool

```typescript theme={null}
type ListMcpResourcesInput = {
server?: string;
};

### ReadMcpResource

** MCP 服务器读取特定资源。**

**工具名称:** `ReadMcpResourceTool`

```typescript theme={null}
type ReadMcpResourceInput = {
  server: string;
  uri: string;
};

EnterWorktree

创建并进入临时 git worktree 进行隔离工作。

工具名称: EnterWorktree

```typescript theme={null}
type EnterWorktreeInput = {
name?: string;
path?: string;
};

传入 `path` 可切换到已有的 worktree 而非创建新的。首次进入时,目标必须是当前仓库的注册 worktree,或者在多仓库工作区中是嵌套仓库的注册 worktree;在 worktree 会话中则必须位于该会话仓库的 `.claude/worktrees/` 下。`name`  `path` 互斥。

### ExitWorktree

**退出当前 git worktree 并返回原始工作目录。**

**工具名称:** `ExitWorktree`

```typescript theme={null}
type ExitWorktreeInput = {
  action: "keep" | "remove";
  discard_changes?: boolean;
};

keep 操作保留 worktree 和分支在磁盘上,remove 则删除两者。当要移除的 worktree 存在未提交文件或未合并的提交时,discard_changes 必须设为 true

EnterPlanMode

进入计划模式,Claude 在进行更改之前先研究并提出方案。

工具名称: EnterPlanMode

```typescript theme={null}
type EnterPlanModeInput = {};

### CronCreate

**将提示安排为按 5 字段 cron 表达式在本地时间执行。**

**工具名称:** `CronCreate`

```typescript theme={null}
type CronCreateInput = {
  cron: string;
  prompt: string;
  recurring?: boolean;
  durable?: boolean;
};

recurring 设为 false 表示仅在下一个匹配时间触发一次。作业默认是会话级的:启动新会话会清除它们,使用 --resume--continue 恢复时则还原未过期的作业。参见定时任务

durable 设为 true 请求将作业持久化到 .claude/scheduled_tasks.json,使其在重启后仍然存在。持久化调度并非在每个会话中都可用:不可用时,Claude Code 接受 durable: true 但创建的仍是会话级作业。读取输出中的 durable 字段可确认作业是否真正持久化。

CronDelete

CronCreate 返回的 ID 删除定时作业。

工具名称: CronDelete

```typescript theme={null}
type CronDeleteInput = {
id: string;
};

### CronList

**列出定时作业:来自 `.claude/scheduled_tasks.json` 的持久作业和当前会话的会话级作业。**

**工具名称:** `CronList`

```typescript theme={null}
type CronListInput = {};

ScheduleWakeup

安排一次性唤醒,在指定延迟后触发给定的提示。

工具名称: ScheduleWakeup

```typescript theme={null}
type ScheduleWakeupInput = {
delaySeconds?: number;
reason?: string;
prompt?: string;
stop?: boolean;
};

该工具支撑自节奏的 `/loop` 命令。运行时将 `delaySeconds` 限制在 60  3600 秒之间。除非 `stop`  true,否则 `delaySeconds``reason`  `prompt` 字段是必填的。将 `stop` 设为 `true` 会取消待处理的唤醒并结束自节奏的 `/loop``stop` 字段需要 Claude Code v2.1.202 或更高版本。参见[工具参考中的 ScheduleWakeup ](https://code.claude.com/docs/en/tools-reference)了解提供商可用性;在 Amazon Bedrock、AWS 上的 Claude Platform、Google Cloud  Agent Platform  Microsoft Foundry 上不可用。

### RemoteTrigger

**管理[Routines](https://code.claude.com/docs/en/routines),即托管在 Anthropic 管理的云基础设施上的定时和触发式 Claude Code 运行。**

**工具名称:** `RemoteTrigger`

```typescript theme={null}
type RemoteTriggerInput = {
  action: "list" | "get" | "create" | "update" | "run";
  trigger_id?: string;
  body?: {
    [k: string]: unknown;
  };
};

该工具支撑 /schedule 命令。trigger_idgetupdaterun 操作中是必填的。bodycreateupdate 中是必填的,在 run 中是可选的。

仅当会话使用启用了 Routines 的 claude.ai 账号认证时,此工具才可用。

PushNotification

向用户发送主动推送通知。

工具名称: PushNotification

```typescript theme={null}
type PushNotificationInput = {
message: string;
status: "proactive";
};

`message` 应保持在 200 字符以内,因为移动操作系统会截断更长的文本。参见[工具参考中的 PushNotification ](https://code.claude.com/docs/en/tools-reference)了解提供商可用性;推送通过 Anthropic 托管的基础设施投递,Amazon Bedrock、AWS 上的 Claude Platform、Google Cloud  Agent Platform  Microsoft Foundry 无法访问。

### REPL

**在持久化 REPL 中执行 JavaScript 代码,跨调用保持状态,支持顶层 await。**

**工具名称:** `REPL`

```typescript theme={null}
type REPLInput = {
  code: string;
  description?: string;
  timeout?: number;
};

timeout 以毫秒为单位,默认 30000,最大 600000。

类型已导出,但在 SDK 会话中该工具默认关闭,除非你在 env 选项中设置 CLAUDE_CODE_REPL=1。它还需要原生安装程序提供的基于 Bun 的 claude 可执行文件。

ReportFindings

以结构化列表报告代码审查发现,供 Claude Code 渲染而非纯文本输出。

工具名称: ReportFindings

```typescript theme={null}
type ReportFindingsInput = {
level?: "low" | "medium" | "high" | "xhigh" | "max";
findings: Array<{
file: string;
line?: number;
summary: string;
failure_scenario: string;
short_summary?: string;
category?: string;
verdict?: "CONFIRMED" | "PLAUSIBLE";
outcome?: "fixed" | "skipped" | "no_change_needed";
}>;
};

`level` 是审查运行的工作量级别。发现按严重程度从高到低排列,每次调用最多 32 条,无存活发现时数组为空。需要 Claude Code v2.1.196 或更高版本。

每条发现包含以下字段:

* `file`:发现所在文件的仓库相对路径。可选的 `line` 是其锚定的 1 索引行号。
* `summary`:缺陷的一句话陈述。`failure_scenario` 描述导致错误输出或崩溃的具体输入和状态。
* `short_summary`:可选的压缩标签,最多 60 个字符,用于紧凑显示。需要 Claude Code v2.1.212 或更高版本。
* `category`:可选的短 kebab-case 标识符,标识发现类型,如 `correctness`  `test-coverage`。需要 Claude Code v2.1.199 或更高版本。
* `verdict`:在验证阶段运行时设置;仅内联审查时不存在。
* `outcome`:仅在应用修复后重新报告时设置。

### Artifact

**将本地 `.html`  `.md` 文件发布为托管的 artifact 页面,或列出用户已发布的 artifact。**

**工具名称:** `Artifact`

```typescript theme={null}
type ArtifactInput = {
  action?: "publish" | "list";
  file_path?: string;
  favicon?: string;
  limit?: number;
  scope?: "mine" | "shared" | "all";
  title?: string;
  description?: string;
  label?: string;
  url?: string;
  force?: boolean;
};

省略 action 或传 "publish" 来发布 file_path,发布操作需要 file_pathfavicon(一或两个 emoji 用于浏览器标签)。title 在 HTML 文件没有 <title> 标签时为浏览器标签和画廊中的已发布页面命名。url 指向要就地更新的现有 artifact 而非生成新的,force 是最后手段的强制覆盖,会丢弃另一个会话的已发布版本;遇到 409 冲突时,正常做法是重新读取、合并后再发布,而非传入 force

"list" 可列举用户已发布的 artifact;仅 limitscope 可配合使用。scope 默认为 "mine",列出用户拥有的 artifact;"shared" 列出他人分享给用户的;"all" 列出两者。

类型已导出,但在 Agent SDK 会话中该工具默认关闭。发布还需要满足 artifacts 可用性表中的所有条件,使用 API 密钥认证的会话无法满足这些条件。

Projects

读写附加到会话的 claude.ai Project。

工具名称: Projects

```typescript theme={null}
type ProjectsInput = {
method:
| "project_info"
| "project_read"
| "project_search"
| "project_write"
| "project_delete";
path?: string;
content?: string;
local_path?: string;
present_to_user?: boolean;
query?: string;
n?: number;
};

根据 `method` 分发操作:

* `project_info`:返回项目元数据和文档列表。
* `project_read`:按 `path` 读取一个文档。
* `project_search`:用 `query` 查询项目的知识库。`n` 限制返回数量,默认为 5。
* `project_write`:在 `path` 创建或替换文档,来源为 `content`(内联文本)或 `local_path`(工作目录内的文件名),两者需且仅需提供其一。`present_to_user: true` 将写入的文档标记为用户需要查看的交付物。
* `project_delete`:按 `path` 删除文档。

### ReadMcpResourceDir

**列出 MCP 服务器上目录资源的直接子项。**

**工具名称:** `ReadMcpResourceDirTool`

```typescript theme={null}
type ReadMcpResourceDirInput = {
  server: string;
  uri: string;
};

仅可用于声明了目录列表支持的服务器;列举不是递归的。目录列表并非在每个会话中都启用:未启用时,调用返回空的 resources 列表,error 字段报告目录列表未启用。

RefreshMcpTools

重新查询已连接 MCP 服务器的工具列表并应用变更。

工具名称: RefreshMcpTools

```typescript theme={null}
type RefreshMcpToolsInput = {
server?: string; // refresh only this server; omit to refresh all connected servers
};

类型已导出,但 Claude Code 仅在你在 [`env` 选项](#options)中设置 `CLAUDE_CODE_ENABLE_REFRESH_MCP_TOOLS=1` 时才注册该工具,且仅在有至少一个 MCP 服务器的会话中生效。需要 Claude Code v2.1.211 或更高版本。

### ShowOnboardingRolePicker

** Cowork 引导流程中渲染可点击的角色选择器卡片行。**

**工具名称:** `ShowOnboardingRolePicker`

```typescript theme={null}
type ShowOnboardingRolePickerInput = {};

用户可以选择角色并获得匹配的插件安装。不需要参数;角色列表由客户端定义。调用会阻塞直到用户响应。

McpInput

MCP 工具参数是开放对象:每个服务器定义自己的参数,因此类型不约束字段名或值。

工具名称: 动态 MCP 工具名称,格式为 mcp__<server>__<tool>

```typescript theme={null}
type McpInput = {

};

请参考服务器自身的工具 schema 了解特定工具接受的字段。
## 工具输出类型

### `ToolOutputSchemas`

**所有工具输出类型的联合类型,从 `@anthropic-ai/claude-agent-sdk` 导出。** 每个成员对应一个工具调用的返回值结构:

```typescript theme={null}
type ToolOutputSchemas =
  | AgentOutput
  | ArtifactOutput
  | AskUserQuestionOutput
  | BashOutput
  | CronCreateOutput
  | CronDeleteOutput
  | CronListOutput
  | EnterPlanModeOutput
  | EnterWorktreeOutput
  | ExitPlanModeOutput
  | ExitWorktreeOutput
  | FileEditOutput
  | FileReadOutput
  | FileWriteOutput
  | GlobOutput
  | GrepOutput
  | ListMcpResourcesOutput
  | McpOutput
  | MonitorOutput
  | NotebookEditOutput
  | ProjectsOutput
  | PushNotificationOutput
  | ReadMcpResourceDirOutput
  | ReadMcpResourceOutput
  | RefreshMcpToolsOutput
  | RemoteTriggerOutput
  | REPLOutput
  | ReportFindingsOutput
  | ScheduleWakeupOutput
  | ShowOnboardingRolePickerOutput
  | TaskCreateOutput
  | TaskGetOutput
  | TaskListOutput
  | TaskStopOutput
  | TaskUpdateOutput
  | TodoWriteOutput
  | WebFetchOutput
  | WebSearchOutput
  | WorkflowOutput;

Agent

子 Agent 执行完成后的返回结果,通过 status 字段区分三种运行状态。 工具名称为 Agent。历史名称 Task 仍可作为别名使用,SDKSystemMessage 初始化消息中的 tools 数组目前仍以 Task 列出该工具以保持向后兼容。

```typescript theme={null}
type AgentOutput =
| {
status: "completed";
agentId: string;
agentType?: string;
content: Array<{ type: "text"; text: string; citations?: unknown[] | null }>;
resolvedModel?: string;
modelsUsed?: string[];
totalToolUseCount: number;
totalDurationMs: number;
totalTokens: number;
usage: {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens: number | null;
cache_read_input_tokens: number | null;
server_tool_use: {
web_search_requests: number;
web_fetch_requests: number;
} | null;
service_tier: string | null;
cache_creation: {
ephemeral_1h_input_tokens: number;
ephemeral_5m_input_tokens: number;
} | null;
inference_geo?: string | null;
speed?: string | null;
iterations?: unknown;
};
toolStats?: {
readCount: number;
searchCount: number;
bashCount: number;
editFileCount: number;
linesAdded: number;
linesRemoved: number;
otherToolCount: number;
frameCount?: number;
};
prompt: string;
worktreePath?: string;
worktreeBranch?: string;
}
| {
status: "async_launched";
isAsync?: true;
agentId: string;
description: string;
resolvedModel?: string;
modelsUsed?: string[];
prompt: string;
outputFile: string;
canReadOutputFile?: boolean;
}
| {
status: "remote_launched";
taskId: string;
sessionUrl: string;
description: string;
prompt: string;
outputFile: string;
};

通过 `status` 字段进行区分判断:`"completed"` 表示任务已完成、`"async_launched"` 表示后台运行的任务、`"remote_launched"` 表示 Claude Code 分派到远程云会话的任务(其中 `sessionUrl` 链接到该会话,`taskId` 标识该任务)。

 `completed` 变体中,`resolvedModel` 表示子 Agent 实际启动时使用的模型,当 [`availableModels`](https://code.claude.com/docs/en/model-config#restrict-model-selection) 或其他覆盖规则生效时,它可能与请求的 `model` 输入不同。此字段需要 Claude Code v2.1.174 或更高版本。在 `async_launched` 变体中,它表示任务转入后台时正在使用的模型。

`modelsUsed` 按使用顺序列出子 Agent 使用的所有模型。仅在运行中发生模型切换时才会出现该字段,模型被切回时会再次出现。在 `async_launched` 变体中,该列表覆盖进入后台之前使用的模型。`modelsUsed`  `resolvedModel` 的后台行为均需要 Claude Code v2.1.212 或更高版本。

 `completed` 变体中,当子 Agent 在隔离的 git worktree 中运行时会设置 `worktreePath`,当 Claude Code 创建了该 worktree  `worktreeBranch` 会标注分支名。`usage.service_tier` 携带 API 为子 Agent 请求报告的服务层级字符串。

 v2.1.207 之前,发布的类型定义更窄——缺少 `worktreePath``worktreeBranch``citations``toolStats.frameCount` 以及 `inference_geo``speed``iterations`  usage 字段,且 `service_tier` 的类型为 `"standard" | "priority" | "batch"`。类型中标记为 optional 的字段在由更早版本记录的结果中可能不存在。

### AskUserQuestion

**向用户提问并获取结构化或自由文本回答的结果。** 工具名称为 `AskUserQuestion`

```typescript theme={null}
type AskUserQuestionOutput = {
  questions: Array<{
    question: string;
    header: string;
    options: Array<{ label: string; description: string; preview?: string }>;
    multiSelect: boolean;
  }>;
  answers: Record<string, string>;
  response?: string;
  annotations?: Record<string, { preview?: string; notes?: string }>;
  afkTimeoutMs?: number;
};

返回提出的问题和用户的回答。当用户输入自由文本而非回答结构化问题时会设置 response 字段;此时 Claude 收到的是 "The user responded: ..." 而非逐题的答案列表。

Bash

Shell 命令执行结果,包含标准输出/错误输出以及 git 操作的结构化元数据。 工具名称为 Bash

```typescript theme={null}
type BashOutput = {
stdout: string;
stderr: string;
rawOutputPath?: string;
interrupted: boolean;
isImage?: boolean;
backgroundTaskId?: string;
backgroundedByUser?: boolean;
timedOutAfterMs?: number;
backgroundCwdHint?: string;
dangerouslyDisableSandbox?: boolean;
returnCodeInterpretation?: string;
noOutputExpected?: boolean;
structuredContent?: unknown[];
persistedOutputPath?: string;
persistedOutputSize?: number;
staleReadFileStateHint?: string;
ghRateLimitHint?: string;
gitOperation?: {
commit?: { sha: string; kind: "committed" | "amended" | "cherry-picked" };
push?: { branch: string };
branch?: { ref: string; action: "merged" | "rebased" };
pr?: {
number: number;
url?: string;
action: "created" | "edited" | "merged" | "commented" | "closed" | "ready" | "draft" | "auto-merge-enabled" | "auto-merge-disabled";
};
};
};

返回命令输出,stdout/stderr 分离。后台命令会包含 `backgroundTaskId`

`timedOutAfterMs` 是超时毫秒数,当命令达到超时限制并转入后台(而非一开始就在后台启动)时设置。`backgroundCwdHint` 在被后台化的命令包含目录切换内置命令(如 `cd``pushd``popd``chdir`)时设置,提示会话工作目录实际上并未改变。这两个字段均需要 Claude Code v2.1.210 或更高版本。

### Monitor

**启动后台监控任务后返回的标识信息。** 工具名称为 `Monitor`

```typescript theme={null}
type MonitorOutput = {
  taskId: string;
  timeoutMs: number;
  persistent?: boolean;
};

返回正在运行的监控器的后台任务 ID。可以使用该 ID 配合 TaskStop 提前取消监控。

Edit

文件编辑操作的结构化 diff 结果。 工具名称为 Edit

```typescript theme={null}
type FileEditOutput = {
filePath: string;
oldString: string;
newString: string;
originalFile: string | null;
structuredPatch: Array<{
oldStart: number;
oldLines: number;
newStart: number;
newLines: number;
lines: string[];
}>;
userModified: boolean;
replaceAll: boolean;
gitDiff?: {
filename: string;
status: "modified" | "added";
additions: number;
deletions: number;
changes: number;
patch: string;
repository?: string | null;
};
};

返回编辑操作的结构化 diff 信息。

### Read

**文件读取结果,根据文件类型返回不同格式,通过 `type` 字段区分六种变体。** 工具名称为 `Read`

```typescript theme={null}
type FileReadOutput =
  | {
      type: "text";
      file: {
        filePath: string;
        content: string;
        numLines: number;
        startLine: number;
        totalLines: number;
        /** 当整文件读取因超过 token 上限被自动分页时为 true(内容为部分首页) */
        truncatedByTokenCap?: boolean;
      };
    }
  | {
      type: "image";
      file: {
        base64: string;
        type: "image/jpeg" | "image/png" | "image/gif" | "image/webp";
        originalSize: number;
        dimensions?: {
          originalWidth?: number;
          originalHeight?: number;
          displayWidth?: number;
          displayHeight?: number;
        };
      };
    }
  | {
      type: "notebook";
      file: {
        filePath: string;
        cells: unknown[];
      };
    }
  | {
      type: "pdf";
      file: {
        filePath: string;
        base64: string;
        originalSize: number;
      };
    }
  | {
      type: "parts";
      file: {
        filePath: string;
        originalSize: number;
        count: number;
        outputDir: string;
      };
    }
  | {
      type: "file_unchanged";
      file: {
        filePath: string;
      };
      /** 当去重匹配的是启动时预填的条目(CLAUDE.md / 嵌套 memory)而非之前的 Read tool_result 时设置 */
      source?: "seeded";
    };

根据文件类型以适当格式返回文件内容,通过 type 字段进行判别。

Write

文件写入结果,包含结构化 diff 信息。 工具名称为 Write

```typescript theme={null}
type FileWriteOutput = {
type: "create" | "update";
filePath: string;
content: string;
structuredPatch: Array<{
oldStart: number;
oldLines: number;
newStart: number;
newLines: number;
lines: string[];
}>;
originalFile: string | null;
gitDiff?: {
filename: string;
status: "modified" | "added";
additions: number;
deletions: number;
changes: number;
patch: string;
repository?: string | null;
};
userModified?: boolean;
};

返回写入结果及结构化 diff 信息。

### Glob

**文件路径匹配结果,按修改时间排序。** 工具名称为 `Glob`

```typescript theme={null}
type GlobOutput = {
  durationMs: number;
  numFiles: number;
  filenames: string[];
  truncated: boolean;
  totalMatches?: number;
  countIsComplete?: boolean;
};

返回匹配 glob 模式的文件路径,按修改时间排序。

totalMatchescountIsComplete 需要 Claude Code v2.1.191 或更高版本。totalMatches 报告截断前的匹配文件总数。当 countIsComplete 为 false 时,totalMatches 是下界值,因为底层搜索本身截断了输出。

Grep

文本搜索结果,根据 mode 返回不同形态的数据。 工具名称为 Grep

```typescript theme={null}
type GrepOutput = {
mode?: "content" | "files_with_matches" | "count";
numFiles: number;
filenames: string[];
content?: string;
numLines?: number;
numMatches?: number;
totalFiles?: number;
totalLines?: number;
appliedLimit?: number;
appliedOffset?: number;
};

返回搜索结果。根据 `mode` 不同,形态各异:文件列表、带匹配内容、或匹配计数。在 `count` 模式中,`numFiles`  `numMatches` 是完整结果集的总数,而非分页切片的数值。在 v2.1.208 之前,`head_limit`  `offset` 截断列出的条目时也会截断这些总数。

`totalFiles` 需要 Claude Code v2.1.208 或更高版本,报告在 `files_with_matches` 模式中 `head_limit`  `offset` 分页前的结果总数。`totalLines` 需要 Claude Code v2.1.210 或更高版本,报告在 `content` 模式中分页前的总行数。

### TaskStop

**停止后台任务后的确认信息。** 工具名称为 `TaskStop`

```typescript theme={null}
type TaskStopOutput = {
  message: string;
  task_id: string;
  task_type: string;
  command?: string;
};

返回停止后台任务后的确认信息。

NotebookEdit

Jupyter Notebook 编辑结果,包含修改前后的完整文件内容。 工具名称为 NotebookEdit

```typescript theme={null}
type NotebookEditOutput = {
new_source: string;
old_source?: string;
cell_id?: string;
cell_type: "code" | "markdown";
language: string;
edit_mode: string;
error?: string;
notebook_path: string;
original_file: string;
updated_file: string;
};

返回 Notebook 编辑结果,包含原始文件和更新后的文件内容。

### WebFetch

**URL 抓取结果,包含 HTTP 状态码和处理后的内容。** 工具名称为 `WebFetch`

```typescript theme={null}
type WebFetchOutput = {
  bytes: number;
  code: number;
  codeText: string;
  result: string;
  durationMs: number;
  url: string;
  artifactRead?: {
    slug: string;
    ver?: string;
  };
};

返回抓取的内容以及 HTTP 状态和元数据。

WebSearch

网页搜索结果。 工具名称为 WebSearch

```typescript theme={null}
type WebSearchOutput = {
query: string;
results: Array<
| {
tool_use_id: string;
content: Array<{ title: string; url: string }>;
}
| string

;
durationSeconds: number;
searchCount?: number;
};

返回来自网络的搜索结果。

### Workflow

**工作流启动后的即时响应,最终结果通过任务完成事件异步到达。** 工具名称为 `Workflow`

```typescript theme={null}
type WorkflowOutput = {
  status: "async_launched" | "remote_launched";
  taskId: string;
  taskType?: "local_workflow" | "remote_agent";
  workflowName?: string;
  runId?: string;
  summary?: string;
  transcriptDir?: string;
  scriptPath?: string;
  sessionUrl?: string; // 当工作流以远程会话方式启动时设置
  warning?: string;
  error?: string;
};

工具接受调用后立即返回。最终结果以任务完成事件异步到达。在将运行视为已启动之前需检查 error 字段:语法检查失败的脚本会返回 status: "async_launched" 且设置了 error,但实际并未运行。

字段 类型 说明
status "async_launched" | "remote_launched" 工具已接受调用。"async_launched" 表示进程内运行,"remote_launched" 表示分派到远程会话而非进程内运行
taskId string 本次运行的后台任务标识符
taskType "local_workflow" | "remote_agent" 已注册后台任务的任务类型,与 status 分支对应
workflowName string 工作流脚本中的 meta.name
runId string 工作流运行标识符,可在后续调用中作为 resumeFromRunId 传入。remote_launched 运行中不存在,此时云会话 URL 即为恢复句柄
summary string 工作流功能的一行描述
transcriptDir string 执行期间子 Agent 记录写入的目录
scriptPath string 本次运行的持久化工作流脚本路径。编辑后作为 scriptPath 回传即可重新运行而无需重新发送脚本
sessionUrl string 云会话 URL,当 status"remote_launched" 时设置
warning string 非阻塞性提示,例如本地 git 状态与云会话将克隆的已推送分支存在差异
error string 脚本语法检查失败时设置。存在该字段时表示尽管状态显示为 launched,运行实际并未启动

TodoWrite

返回更新前后的任务列表快照。 工具名称为 TodoWrite

```typescript theme={null}
type TodoWriteOutput = {
oldTodos: Array<{
content: string;
status: "pending" | "in_progress" | "completed";
activeForm: string;
}>;
newTodos: Array<{
content: string;
status: "pending" | "in_progress" | "completed";
activeForm: string;
}>;
};

返回更新前和更新后的任务列表。

> **注意:**  TypeScript Agent SDK 0.3.142 起,`TodoWrite` 默认禁用。请改用 `TaskCreate``TaskGet``TaskUpdate`  `TaskList`。参见 [迁移到 Task 工具](https://code.claude.com/docs/en/agent-sdk/todo-tracking#migrate-to-task-tools) 更新你的监控代码,或设置 `CLAUDE_CODE_ENABLE_TASKS=0` 恢复为 `TodoWrite`。

### TaskCreate

**创建任务后返回分配的 ID。** 工具名称为 `TaskCreate`

```typescript theme={null}
type TaskCreateOutput = {
  task: {
    id: string;
    subject: string;
  };
};

返回创建的任务及其分配的 ID。

TaskUpdate

任务更新结果,包含哪些字段发生了变更。 工具名称为 TaskUpdate

```typescript theme={null}
type TaskUpdateOutput = {
success: boolean;
taskId: string;
updatedFields: string[];
error?: string;
statusChange?: {
from: string;
to: string;
};
};

返回更新结果,包括哪些字段发生了变更。

### TaskGet

**获取单个任务的完整记录。** 工具名称为 `TaskGet`

```typescript theme={null}
type TaskGetOutput = {
  task: {
    id: string;
    subject: string;
    description: string;
    status: "pending" | "in_progress" | "completed";
    blocks: string[];
    blockedBy: string[];
  } | null;
};

返回完整的任务记录,当 ID 未找到时返回 null

TaskList

获取当前列表中所有任务的快照。 工具名称为 TaskList

```typescript theme={null}
type TaskListOutput = {
tasks: Array<{
id: string;
subject: string;
status: "pending" | "in_progress" | "completed";
owner?: string;
blockedBy: string[];
}>;
};

返回当前列表中所有任务的快照。

### ExitPlanMode

**退出计划模式后的状态信息。** 工具名称为 `ExitPlanMode`

```typescript theme={null}
type ExitPlanModeOutput = {
  plan: string | null;
  isAgent: boolean;
  filePath?: string;
  hasTaskTool?: boolean;
  planWasEdited?: boolean;
  awaitingLeaderApproval?: boolean;
  requestId?: string;
};

返回退出计划模式后的计划状态。

ListMcpResources

列出可用 MCP 资源的数组。 工具名称为 ListMcpResourcesTool

```typescript theme={null}
type ListMcpResourcesOutput = Array<{
uri: string;
name: string;
mimeType?: string;
description?: string;
server: string;
}>;

返回可用 MCP 资源的数组。

### ReadMcpResource

**读取指定 MCP 资源的内容。** 工具名称为 `ReadMcpResourceTool`

```typescript theme={null}
type ReadMcpResourceOutput = {
  contents: Array<{
    uri: string;
    mimeType?: string;
    text?: string;
    blobSavedTo?: string;
  }>;
  error?: string;
};

返回请求的 MCP 资源内容。

EnterWorktree

进入 git worktree 后返回路径和分支信息。 工具名称为 EnterWorktree

```typescript theme={null}
type EnterWorktreeOutput = {
worktreePath: string;
worktreeBranch?: string;
message: string;
};

返回 git worktree 的相关信息。

### ExitWorktree

**退出 worktree 后返回执行的操作和详细信息。** 工具名称为 `ExitWorktree`

```typescript theme={null}
type ExitWorktreeOutput = {
  action: "keep" | "remove";
  originalCwd: string;
  worktreePath: string;
  worktreeBranch?: string;
  tmuxSessionName?: string;
  discardedFiles?: number;
  discardedCommits?: number;
  message: string;
};

返回所执行的操作以及退出的 worktree 的详细信息。

EnterPlanMode

进入计划模式的确认。 工具名称为 EnterPlanMode

```typescript theme={null}
type EnterPlanModeOutput = {
message: string;
};

返回已进入计划模式的确认信息。

### CronCreate

**创建定时任务后返回 ID 和人类可读的调度描述。** 工具名称为 `CronCreate`

```typescript theme={null}
type CronCreateOutput = {
  id: string;
  humanSchedule: string;
  recurring: boolean;
  durable?: boolean; // 为 true 时表示持久化到 .claude/scheduled_tasks.json;为 false 时仅限当前会话
};

返回任务 ID 和人类可读的调度描述。

CronDelete

删除定时任务后返回被删除任务的 ID。 工具名称为 CronDelete

```typescript theme={null}
type CronDeleteOutput = {
id: string;
};

返回被删除任务的 ID。

### CronList

**列出所有已调度的定时任务。** 工具名称为 `CronList`

```typescript theme={null}
type CronListOutput = {
  jobs: {
    id: string;
    cron: string;
    humanSchedule: string;
    prompt: string;
    recurring?: boolean;
    durable?: boolean;
  }[];
};

返回已调度的定时任务:来自 .claude/scheduled_tasks.json 的持久化任务和当前会话中的临时任务。仅限会话的任务携带 durable: false;从磁盘读取的任务省略该字段。

ScheduleWakeup

调度唤醒的结果,包含实际触发时间和是否被限制。 工具名称为 ScheduleWakeup

```typescript theme={null}
type ScheduleWakeupOutput = {
scheduledFor: number;
clampedDelaySeconds: number;
wasClamped: boolean;
stopped?: boolean;
cancelledWakeups?: number;
};

返回唤醒将触发的时间(epoch 毫秒时间戳)、实际使用的延迟,以及请求的延迟是否被限制。`stopped` 字段在使用 `stop: true` 结束循环时为 `true`,需要 Claude Code v2.1.202 或更高版本。`cancelledWakeups` 字段计算 `stop: true` 调用取消了多少个待执行的唤醒。值为 0 表示没有待执行的唤醒,且循环定时任务(`/loop` cron)不会被 `stop: true` 取消。需要 Claude Code v2.1.206 或更高版本。

### RemoteTrigger

**远程触发操作的 API 响应。** 工具名称为 `RemoteTrigger`

```typescript theme={null}
type RemoteTriggerOutput = {
  status: number;
  json: string;
  summary?: string;
};

返回触发操作的 API 响应状态和响应体。

PushNotification

推送通知的发送详情。 工具名称为 PushNotification

```typescript theme={null}
type PushNotificationOutput = {
message: string;
pushSent?: boolean;
localSent?: boolean;
disabledReason?: "config_off" | "user_present" | "no_transport";
sentAt?: string;
};

返回投递详情,包括是否发送了推送或本地通知,以及投递被跳过的原因。

### REPL

**代码执行结果,包含捕获的控制台输出和可能的图片/文档。** 工具名称为 `REPL`

```typescript theme={null}
type REPLOutput = {
  code: string;
  result: {
    [k: string]: unknown;
  };
  stdout: string;
  stderr: string;
  error?: string;
  registeredTools?: string[];
  images?: {
    base64: string;
    mediaType: string;
  }[];
  documents?: {
    base64: string;
  }[];
};

返回执行结果、捕获的控制台输出,以及内部 Read 调用产生的图片或文档。

ReportFindings

代码审查发现的报告结果。 工具名称为 ReportFindings

```typescript theme={null}
type ReportFindingsOutput = {
count: number;
level?: "low" | "medium" | "high" | "xhigh" | "max";
findings: Array<{
file: string;
line?: number;
summary: string;
failure_scenario: string;
short_summary?: string;
category?: string;
verdict?: "CONFIRMED" | "PLAUSIBLE";
outcome?: "fixed" | "skipped" | "no_change_needed";
}>;
};

返回报告的发现数量、审查运行的力度级别,以及回显的发现列表用于结果体。需要 Claude Code v2.1.196 或更高版本。回显的 `short_summary` 字段需要 Claude Code v2.1.212 或更高版本。

### Artifact

**Artifact 发布或列表操作的结果。** 工具名称为 `Artifact`

```typescript theme={null}
type ArtifactOutput =
  | {
      url: string;
      path: string;
      title?: string;
      version?: string;
      capabilities?: unknown;
      stored?: {
        contract: string;
        capabilities?: Record<string, unknown>;
      };
      warnings?: string[];
      contract?: string;
      updated?: boolean;
      liveSubscription?: string;
    }
  | {
      artifacts: Array<{
        title: string;
        url: string;
        updatedAt?: string;
        rel?: "mine" | "shared";
      }>;
      truncated?: boolean;
      scope?: "shared" | "all";
    };

发布操作返回已发布页面的 url 和发布的本地 path,当发布重新部署了已有 artifact 时 updated 为 true,warnings 携带发布时的提示信息。列表操作则返回 artifacts 行,当存在的 artifact 超过请求限制时 truncated 为 true。在 scope 非 "mine" 的列表中,每行携带 rel 标记用户是否拥有该 artifact 或是被共享的,输出的 scope 记录产生该列表的非默认 scope;两者在默认列表中均不存在。

Projects

项目操作结果,通过 method 字段区分不同的操作类型。 工具名称为 Projects

```typescript theme={null}
type ProjectsOutput =
| {
method: "project_info";
notice?: string;
name: string;
description: string;
instructions: string;
docs: Array<{ path: string; created_at: string | null }>;
files?: Array<{
path: string;
file_kind: string;
created_at: string | null;
}>;
sync_sources?: Array<{
type: string | null;
config: Record;
}>;
knowledge: {
knowledge_size: number;
max_knowledge_size: number;
};
}
| {
method: "project_read";
notice?: string;
path: string;
file_kind?: string;
content?: string;
local_file?: string;
created_at: string | null;
}
| {
method: "project_search";
notice?: string;
rag: boolean;
hits?: Array<{ name?: string; doc_uuid?: string; text?: string }>;
docs?: string[];
}
| {
method: "project_write";
notice?: string;
path: string;
doc_uuid: string;
replaced: boolean;
present_to_user?: boolean;
local_path?: string;
}
| {
method: "project_delete";
notice?: string;
path: string;
deleted: boolean;
};

通过 `method` 字段进行判别,与输入对应。`project_read` 将小文本文档内联在 `content` 中返回,较大文档则写入 `local_file` 路径;`project_search` 在项目索引可用时返回带 `rag: true`  RAG `hits`,否则回退为 `docs` 路径列表。

### ReadMcpResourceDir

**列出 MCP 目录资源的直接子项。** 工具名称为 `ReadMcpResourceDirTool`

```typescript theme={null}
type ReadMcpResourceDirOutput = {
  resources: Array<{
    uri: string;
    name: string;
    mimeType?: string;
  }>;
  error?: string;
};

返回目录资源的直接子项。子目录以 mimeType "inode/directory" 出现;当服务器无法列出目录时 error 携带人类可读的消息。

RefreshMcpTools

刷新 MCP 服务器工具列表的结果,每个服务器一个条目。 工具名称为 RefreshMcpTools

```typescript theme={null}
type RefreshMcpToolsOutput = Array<{
server: string;
status: "refreshed" | "error" | "not_connected";
toolCount?: number; // 该服务器当前可用的工具数
added?: string[]; // 本次刷新新增的工具名
removed?: string[]; // 本次刷新移除的工具名
error?: string; // 刷新失败或服务器不可用的原因
}>;

每个服务器返回一个条目:`refreshed` 表示重新查询的工具列表已应用,`error` 表示重新查询失败且保留了之前的工具集,`not_connected` 表示服务器没有活跃连接可供查询。

### ShowOnboardingRolePicker

**引导角色选择器的用户选择结果。** 工具名称为 `ShowOnboardingRolePicker`

```typescript theme={null}
type ShowOnboardingRolePickerOutput = {
  role?: string;
  dismissed?: boolean;
};

返回用户的选择:当选择了角色标签或输入了角色时设置 role,关闭选择器时 dismissed: true。空对象表示用户批准了调用但未选择角色。

McpOutput

MCP 工具调用的动态返回结果,工具名称格式为 mcp__<server>__<tool>

```typescript theme={null}
type McpOutput =
| string
| {
type: string;
k: string: unknown;
}[]
| {
k: string: unknown;
};

MCP 工具结果以字符串或内容块数组形式返回,具体取决于服务器。导出类型中末尾的普通对象分支是 schema 生成的产物:SDK 实际不会返回裸对象,因为服务器的结构化输出在返回前会被序列化为 JSON 字符串。运行时该值也可能为 `undefined`,但导出的类型并未对此建模。

## 权限类型

### `PermissionUpdate`

**权限更新操作的联合类型,涵盖添加/替换/移除规则、设置模式和目录管理。**

```typescript theme={null}
type PermissionUpdate =
  | {
      type: "addRules";
      rules: PermissionRuleValue[];
      behavior: PermissionBehavior;
      destination: PermissionUpdateDestination;
    }
  | {
      type: "replaceRules";
      rules: PermissionRuleValue[];
      behavior: PermissionBehavior;
      destination: PermissionUpdateDestination;
    }
  | {
      type: "removeRules";
      rules: PermissionRuleValue[];
      behavior: PermissionBehavior;
      destination: PermissionUpdateDestination;
    }
  | {
      type: "setMode";
      mode: PermissionMode;
      destination: PermissionUpdateDestination;
    }
  | {
      type: "addDirectories";
      directories: string[];
      destination: PermissionUpdateDestination;
    }
  | {
      type: "removeDirectories";
      directories: string[];
      destination: PermissionUpdateDestination;
    };

PermissionBehavior

```typescript theme={null}
type PermissionBehavior = "allow" | "deny" | "ask";

### `PermissionUpdateDestination`

```typescript theme={null}
type PermissionUpdateDestination =
  | "userSettings" // 全局用户设置
  | "projectSettings" // 按目录的项目设置
  | "localSettings" // 本地项目设置
  | "session" // 仅当前会话
  | "cliArg"; // CLI 参数

PermissionRuleValue

```typescript theme={null}
type PermissionRuleValue = {
toolName: string;
ruleContent?: string;
};

## 其他类型

### `ApiKeySource`

```typescript theme={null}
type ApiKeySource = "user" | "project" | "org" | "temporary" | "oauth";

在运行时,SDKSystemMessage init 消息上的 apiKeySource 字段在没有 API 密钥使用的情况下(例如通过 OAuth 令牌认证时)也可能是字符串 "none"。请防御性地处理此联合类型之外的值。

SdkBeta

可通过 betas 选项启用的 Beta 功能。 详情参见 Beta headers

```typescript theme={null}
type SdkBeta = "context-1m-2025-08-07";

> **注意:** `context-1m-2025-08-07` Beta 已于 2026  4  30 日退役。对 Claude Sonnet 4.5  Sonnet 4 传递该值不会生效,超过标准 200k token 上下文窗口的请求将返回错误。要使用 1M token 上下文窗口,请迁移至 [Claude Opus 5、Claude Sonnet 5、Claude Sonnet 4.6、Claude Opus 4.6、Claude Opus 4.7  Claude Opus 4.8](https://platform.claude.com/docs/en/about-claude/models/overview),这些模型以标准定价包含 1M 上下文,无需 Beta 头。

### `SlashCommand`

**可用斜杠命令的描述信息。**

```typescript theme={null}
type SlashCommand = {
  name: string;
  description: string;
  argumentHint: string;
  aliases?: string[];
};

ModelInfo

可用模型的详细信息,包含标识符、显示名称、能力支持等。

```typescript theme={null}
type ModelInfo = {
value: string;
resolvedModel?: string;
displayName: string;
description: string;
supportsEffort?: boolean;
supportedEffortLevels?: ("low" | "medium" | "high" | "xhigh" | "max")[];
supportsAdaptiveThinking?: boolean;
supportsFastMode?: boolean;
supportsAutoMode?: boolean;
};

| 字段 | 类型 | 描述 |
| :------------------------- | :----------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `value` | `string` | 在 API 调用中传递的模型标识符 |
| `resolvedModel` | <code>string &#124; undefined</code> | 该条目的 `value` 解析到的规范线路模型 ID。别名条目(如 `sonnet`)解析为显式模型 ID(如 `claude-sonnet-5`),这样宿主可以将存储的显式模型 ID 与覆盖它的别名条目匹配。需要 Claude Code v2.1.197 或更高版本。 |
| `displayName` | `string` | 人类可读的显示名称 |
| `description` | `string` | 模型能力的描述 |
| `supportsEffort` | <code>boolean &#124; undefined</code> | 该模型是否支持 effort 级别 |
| `supportedEffortLevels` | <code>("low" &#124; "medium" &#124; "high" &#124; "xhigh" &#124; "max")[] &#124; undefined</code> | 该模型接受的 effort 级别列表 |
| `supportsAdaptiveThinking` | <code>boolean &#124; undefined</code> | 该模型是否支持自适应思考(Claude 自行决定何时以及思考多少) |
| `supportsFastMode` | <code>boolean &#124; undefined</code> | 该模型是否支持快速模式 |
| `supportsAutoMode` | <code>boolean &#124; undefined</code> | 该模型是否支持自动模式 |

### `AgentInfo`

**可通过 Agent 工具调用的子代理的描述信息。**

```typescript theme={null}
type AgentInfo = {
  name: string;
  description: string;
  model?: string;
};
字段 类型 描述
name string 代理类型标识符(如 "Explore""general-purpose"
description string 何时使用该代理的说明
model string | undefined 该代理使用的模型别名。省略时继承父级模型

McpServerStatus

已连接 MCP 服务器的状态信息。

```typescript theme={null}
type McpServerStatus = {
name: string;
status: "connected" | "failed" | "needs-auth" | "pending" | "disabled";
serverInfo?: {
name: string;
version: string;
};
error?: string;
config?: McpServerStatusConfig;
scope?: string;
tools?: {
name: string;
description?: string;
annotations?: {
readOnly?: boolean;
destructive?: boolean;
openWorld?: boolean;
};
}[];
};

### `McpServerStatusConfig`

**`mcpServerStatus()` 返回的 MCP 服务器配置,是所有 MCP 服务器传输类型的联合。**

```typescript theme={null}
type McpServerStatusConfig =
  | McpStdioServerConfig
  | McpSSEServerConfig
  | McpHttpServerConfig
  | McpSdkServerConfig
  | McpClaudeAIProxyServerConfig;

各传输类型的详情参见 McpServerConfig

AccountInfo

已认证用户的账户信息。

```typescript theme={null}
type AccountInfo = {
email?: string;
organization?: string;
subscriptionType?: string;
tokenSource?: string;
apiKeySource?: string;
};

### `ModelUsage`

**结果消息中返回的按模型统计的使用量。`costUSD` 值为客户端估算。** 计费注意事项参见 [Track cost and usage](https://code.claude.com/docs/en/agent-sdk/cost-tracking)

```typescript theme={null}
type ModelUsage = {
  inputTokens: number;
  outputTokens: number;
  cacheReadInputTokens: number;
  cacheCreationInputTokens: number;
  webSearchRequests: number;
  costUSD: number;
  contextWindow: number;
  maxOutputTokens: number;
  canonicalModel?: string;
  provider?: string;
};

canonicalModelprovider 字段需要 Claude Code v2.1.218 或更高版本。canonicalModel 是定价查询使用的规范模型 ID,它可能与作为键的原始模型字符串不同(例如该字符串是特定提供商 ID 或别名时)。

provider 表示提供该模型服务的 API 后端名称,如 firstPartybedrockvertexfoundryanthropicAwsmantlegateway

ConfigScope

```typescript theme={null}
type ConfigScope = "local" | "user" | "project";

### `NonNullableUsage`

**[`Usage`](#usage) 的变体,所有可空字段均变为非空。**

```typescript theme={null}
type NonNullableUsage = {
  [K in keyof Usage]: NonNullable<Usage[K]>;
};

Usage

Token 使用量统计。此类型来自 @anthropic-ai/sdkBetaUsage

```typescript theme={null}
type Usage = {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens: number | null;
cache_read_input_tokens: number | null;
cache_creation: {
ephemeral_5m_input_tokens: number;
ephemeral_1h_input_tokens: number;
} | null;
server_tool_use: BetaServerToolUsage | null;
service_tier: "standard" | "priority" | "batch" | null;
speed: "standard" | "fast" | null;
inference_geo: string | null;
iterations: BetaIterationsUsage | null;
};

`BetaServerToolUsage`  `BetaIterationsUsage` 定义在 `@anthropic-ai/sdk` 中。

### `CallToolResult`

**MCP 工具结果类型(来自 `@modelcontextprotocol/sdk/types.js`)。`structuredContent` 是一个 JSON 对象,可与 `content` 一起返回,包括图像块。** 详情参见 [Return structured data](https://code.claude.com/docs/en/agent-sdk/custom-tools#return-structured-data)。

```typescript theme={null}
type CallToolResult = {
  content: Array<{
    type: "text" | "image" | "audio" | "resource" | "resource_link";
    // 其他字段因类型而异
  }>;
  structuredContent?: Record<string, unknown>;
  isError?: boolean;
};

ThinkingConfig

控制 Claude 思考/推理行为的配置。优先级高于已废弃的 maxThinkingTokens

```typescript theme={null}
type ThinkingDisplay = "summarized" | "omitted";

type ThinkingConfig =
| { type: "adaptive"; display?: ThinkingDisplay } // 模型自行决定何时以及思考多少(Opus 4.6+)
| { type: "enabled"; budgetTokens?: number; display?: ThinkingDisplay } // 固定思考 token 预算
| { type: "disabled" }; // 不使用扩展思考

可选的 `display` 字段控制思考文本以 `"summarized"`(摘要)还是 `"omitted"`(省略)形式返回。在 Claude Opus 4.7 及更高版本上,API 默认值为 `"omitted"`,因此需设置 `"summarized"` 才能在 `thinking` 块中接收思考内容。Claude Code 不会向 Amazon Bedrock  Google Cloud  Agent Platform 发送 `display`,所以在这些提供商上 Opus 4.7 及更高版本即使设置了 `display`  `"summarized"` 也会返回空的 `thinking` 块。

### `SpawnedProcess`

**自定义进程启动的接口(与 `spawnClaudeCodeProcess` 选项配合使用)。`ChildProcess` 已满足此接口。**

```typescript theme={null}
interface SpawnedProcess {
  stdin: Writable;
  stdout: Readable;
  readonly killed: boolean;
  readonly exitCode: number | null;
  kill(signal: NodeJS.Signals): boolean;
  on(
    event: "exit",
    listener: (code: number | null, signal: NodeJS.Signals | null) => void
  ): void;
  on(event: "error", listener: (error: Error) => void): void;
  once(
    event: "exit",
    listener: (code: number | null, signal: NodeJS.Signals | null) => void
  ): void;
  once(event: "error", listener: (error: Error) => void): void;
  off(
    event: "exit",
    listener: (code: number | null, signal: NodeJS.Signals | null) => void
  ): void;
  off(event: "error", listener: (error: Error) => void): void;
}

SpawnOptions

传递给自定义 spawn 函数的选项。

```typescript theme={null}
interface SpawnOptions {
command: string;
args: string[];
cwd?: string;
env: Record;
signal: AbortSignal;
}

> **注意:** `signal` 字段告诉你的 spawn 函数何时应终止进程。将其作为 `signal` 选项传递给 Node  `spawn()`,或传递给你的 VM 或容器销毁处理器。
>
> 此信号不会在 [`Options.abortController`](#options) 中止的瞬间触发。SDK 会先关闭进程的 stdin 并等待约两秒让 CLI 正常关闭,然后再中止此信号。如果需要在调用方中止的瞬间立即响应,请监听你自己的 `Options.abortController.signal`(你的 spawn 函数可从其闭包作用域中引用)。

### `McpSetServersResult`

**`setMcpServers()` 操作的结果。**

```typescript theme={null}
type McpSetServersResult = {
  added: string[];
  removed: string[];
  errors: Record<string, string>;
};

RewindFilesResult

rewindFiles() 操作的结果。

```typescript theme={null}
type RewindFilesResult = {
canRewind: boolean;
error?: string;
filesChanged?: string[];
insertions?: number;
deletions?: number;
skippedLinks?: number;
};

`skippedLinks` 计算回退操作因链接安全性而拒绝恢复或删除的已跟踪路径数量:被跟踪路径上的符号链接、硬链接或其他非常规文件,不再解析到检查点创建时所指向位置的父目录,或无法安全读取的备份。该字段需要 Claude Code v2.1.216 或更高版本。使用 `rewindFiles(userMessageId, { dryRun: true })` 的预览调用不会设置此字段。

### `SDKStatusMessage`

**状态更新消息(如压缩中)。**

```typescript theme={null}
type SDKStatusMessage = {
  type: "system";
  subtype: "status";
  status: "compacting" | null;
  permissionMode?: PermissionMode;
  uuid: UUID;
  session_id: string;
};

SDKTaskNotificationMessage

后台任务完成、失败或停止时的通知。 后台任务包括 run_in_background 的 Bash 命令、Monitor 监控和后台子代理。

```typescript theme={null}
type SDKTaskNotificationMessage = {
type: "system";
subtype: "task_notification";
task_id: string;
tool_use_id?: string;
status: "completed" | "failed" | "stopped";
output_file: string;
summary: string;
usage?: {
total_tokens: number;
tool_uses: number;
duration_ms: number;
};
uuid: UUID;
session_id: string;
};

Claude Code 会在每条发送给模型的任务通知前附加一条声明,说明没有发生人类输入,这样模型不会将通知当作用户指令或批准。要检测任务通知轮次,请检查 [`SDKUserMessage`](#sdkusermessage) 或 [`SDKResultMessage`](#sdkresultmessage) 上的 `origin.kind === "task-notification"`,而不是匹配声明文本。在 v2.1.205 之前,Claude Code 在会话空闲时到达的通知上不附加此声明。

### `SDKToolUseSummaryMessage`

**对话中工具使用情况的摘要。**

```typescript theme={null}
type SDKToolUseSummaryMessage = {
  type: "tool_use_summary";
  summary: string;
  preceding_tool_use_ids: string[];
  uuid: UUID;
  session_id: string;
};

SDKHookStartedMessage

Hook 开始执行时发出。

Claude Code 会将此消息、SDKHookProgressMessageSDKHookResponseMessage 立即传递到消息流,包括在会话启动期间 SessionStartSetup Hook 仍在运行时。Claude Code v2.1.169 至 v2.1.203 在 SessionStartSetup Hook 完成后才批量传递这些消息;v2.1.204 恢复了实时传递。

```typescript theme={null}
type SDKHookStartedMessage = {
type: "system";
subtype: "hook_started";
hook_id: string;
hook_name: string;
hook_event: string;
uuid: UUID;
session_id: string;
};

### `SDKHookProgressMessage`

**Hook 运行过程中发出,包含 stdout/stderr 输出。**

```typescript theme={null}
type SDKHookProgressMessage = {
  type: "system";
  subtype: "hook_progress";
  hook_id: string;
  hook_name: string;
  hook_event: string;
  stdout: string;
  stderr: string;
  output: string;
  uuid: UUID;
  session_id: string;
};

SDKHookResponseMessage

Hook 执行完成时发出。

```typescript theme={null}
type SDKHookResponseMessage = {
type: "system";
subtype: "hook_response";
hook_id: string;
hook_name: string;
hook_event: string;
output: string;
stdout: string;
stderr: string;
exit_code?: number;
outcome: "success" | "error" | "cancelled";
uuid: UUID;
session_id: string;
};

### `SDKToolProgressMessage`

**工具执行期间周期性发出的进度指示消息。**

```typescript theme={null}
type SDKToolProgressMessage = {
  type: "tool_progress";
  tool_use_id: string;
  tool_name: string;
  parent_tool_use_id: string | null;
  elapsed_time_seconds: number;
  task_id?: string;
  heartbeat?: boolean;
  subagent_type?: string;
  subagent_retry?: {
    agent_id: string;
    attempt: number;
    max_retries: number;
    retry_delay_ms: number;
    error_status: number | null;
    error_category: string;
  };
  uuid: UUID;
  session_id: string;
};

当主对话中有工具调用运行时,Claude Code 每 30 秒发出一条 heartbeat: truetool_progress 消息。每个心跳携带工具名称和已用秒数,便于区分长时间运行的调用与卡住的会话。Claude Code 不会为 Agent 工具发出心跳(子代理有自己的进度流),也不会为子代理内部的工具调用发出心跳。heartbeat 字段需要 Agent SDK v0.3.214 或更高版本。

在 Agent 工具的 tool_progress 消息上,subagent_type 表示正在运行的子代理类型(如 general-purpose)。subagent_retry 在子代理等待 API 错误退避时出现(如速率限制或过载),每次重试尝试生成一条消息。两个字段均需要 Agent SDK v0.3.214 或更高版本。

subagent_retry 渲染重试指示器的建议:

  • parent_tool_use_id 跟踪指示器,它对每个子代理唯一。tool_use_id 在一个助手轮次的并行子代理间共享,按它跟踪会导致一个子代理的更新清除另一个的指示器。
  • 当同一 parent_tool_use_id 的后续 tool_progress 不再包含该字段,或工具结果消息到达时,清除指示器。attempt 在持续重试时可超过 max_retries,因此不要从计数器推断清除时机。
  • error_category 视为一组封闭的标记用于选择你自己的消息文本,而非显示文本:rate_limitoverloadedauthentication_failedserver_errorunknown

SDKAuthStatusMessage

认证流程中发出的消息。

```typescript theme={null}
type SDKAuthStatusMessage = {
type: "auth_status";
isAuthenticating: boolean;
output: string[];
error?: string;
uuid: UUID;
session_id: string;
};

### `SDKTaskStartedMessage`

**后台任务开始时发出。** `task_type` 字段对后台 Bash 命令和 [Monitor](#monitor) 监控为 `"local_bash"`,对子代理为 `"local_agent"`,或 `"remote_agent"`。

```typescript theme={null}
type SDKTaskStartedMessage = {
  type: "system";
  subtype: "task_started";
  task_id: string;
  tool_use_id?: string;
  description: string;
  task_type?: string;
  uuid: UUID;
  session_id: string;
};

SDKTaskProgressMessage

子代理或后台任务运行期间周期性发出。 summary 字段仅在启用 agentProgressSummaries 时填充。

```typescript theme={null}
type SDKTaskProgressMessage = {
type: "system";
subtype: "task_progress";
task_id: string;
tool_use_id?: string;
description: string;
subagent_type?: string;
usage: {
total_tokens: number;
tool_uses: number;
duration_ms: number;
};
last_tool_name?: string;
summary?: string;
uuid: UUID;
session_id: string;
};

### `SDKTaskUpdatedMessage`

**后台任务状态变化时发出,例如从 `running` 转为 `completed`**  `patch` 合并到以 `task_id` 为键的本地任务映射中。`end_time` 字段为毫秒级 Unix 时间戳,可与 `Date.now()` 比较。

```typescript theme={null}
type SDKTaskUpdatedMessage = {
  type: "system";
  subtype: "task_updated";
  task_id: string;
  patch: {
    status?: "pending" | "running" | "completed" | "failed" | "killed";
    description?: string;
    end_time?: number;
    total_paused_ms?: number;
    error?: string;
    is_backgrounded?: boolean;
  };
  uuid: UUID;
  session_id: string;
};

SDKBackgroundTasksChangedMessage

每当活跃后台任务集合变化时发出:任务启动、完成、被终止或前台代理被切换到后台。 tasks 数组为完整的活跃任务集合。每次收到负载时用其替换已缓存的集合,而不是通过配对 task_startedtask_notification 事件来追踪——这样下次成员变化时可修正你可能遗漏的事件。

与单任务事件的顺序是未指定的,不要关联这两个流。

启动时不会发出任何消息。每当会话的 CLI 进程启动或重启时,重置为空集合,让下一次成员变化重新填充。

需要 Claude Code v2.1.203 或更高版本。

```typescript theme={null}
type SDKBackgroundTasksChangedMessage = {
type: "system";
subtype: "background_tasks_changed";
tasks: {
task_id: string;
task_type: string;
description: string;
}[];
uuid: UUID;
session_id: string;
};

### `SDKThinkingTokensMessage`

**Claude 生成思考块(包括被遮蔽的)时发出,携带已生成思考 token 的实时估算。** `estimated_tokens` 为当前思考块的累计值,`estimated_tokens_delta` 为本帧的增量。用于进度显示。顶层代理循环的最终计数为结果消息的 `usage.output_tokens`,它[不包含子代理 token](https://code.claude.com/docs/en/agent-sdk/cost-tracking#get-the-total-cost-of-a-query);整棵树的统计请使用 [`modelUsage`](#modelusage)。

需要 Claude Code v2.1.153 或更高版本。

```typescript theme={null}
type SDKThinkingTokensMessage = {
  type: "system";
  subtype: "thinking_tokens";
  estimated_tokens: number;
  estimated_tokens_delta: number;
  uuid: UUID;
  session_id: string;
};

SDKFilesPersistedEvent

文件检查点持久化到磁盘时发出。

```typescript theme={null}
type SDKFilesPersistedEvent = {
type: "system";
subtype: "files_persisted";
files: { filename: string; file_id: string }[];
failed: { filename: string; error: string }[];
processed_at: string;
uuid: UUID;
session_id: string;
};

### `SDKRateLimitEvent`

**会话遇到速率限制时发出。**

```typescript theme={null}
type SDKRateLimitEvent = {
  type: "rate_limit_event";
  rate_limit_info: {
    status: "allowed" | "allowed_warning" | "rejected";
    resetsAt?: number;
    utilization?: number;
    errorCode?: "credits_required";
    canUserPurchaseCredits?: boolean;
    hasChargeableSavedPaymentMethod?: boolean;
  };
  uuid: UUID;
  session_id: string;
};

errorCode"credits_required" 时,拒绝来自一个 claude.ai 订阅,其包含的用量已耗尽,会话在用户购买使用额度之前无法继续。canUserPurchaseCredits 表示已认证用户是否可以为该账户购买额度,hasChargeableSavedPaymentMethod 表示是否已保存付款方式。这三个字段在非 credits-required 拒绝的速率限制事件上不存在。需要 Claude Code v2.1.181 或更高版本。

SDKLocalCommandOutputMessage

本地斜杠命令(如 /voice/usage)的输出。 在转录本中以助手样式文本显示。

```typescript theme={null}
type SDKLocalCommandOutputMessage = {
type: "system";
subtype: "local_command_output";
content: string;
uuid: UUID;
session_id: string;
};

### `SDKCommandsChangedMessage`

**可用命令集合在会话中途变化时发出,例如 Claude Code 在代理进入子目录时发现了技能。** `commands` 数组为完整的更新列表,收到后应替换任何缓存的命令列表。在此消息之后调用 [`supportedCommands()`](#query-object) 返回相同的更新列表,因为该方法跟踪最新的推送;这需要 Agent SDK v0.3.216 或更高版本。在更早的 SDK 版本中,`supportedCommands()` 返回初始化时捕获的快照,永远不反映会话中途的变化。

```typescript theme={null}
type SDKCommandsChangedMessage = {
  type: "system";
  subtype: "commands_changed";
  commands: SlashCommand[];
  uuid: UUID;
  session_id: string;
};

SDKPromptSuggestionMessage

启用 promptSuggestions 时在每轮之后发出,包含预测的下一条用户提示词。

```typescript theme={null}
type SDKPromptSuggestionMessage = {
type: "prompt_suggestion";
suggestion: string;
uuid: UUID;
session_id: string;
};

### `SDKConversationResetMessage`

**会话的对话被替换但会话未结束时发出,例如 `/clear` 之后、计划模式退出时,或新对话开始时。**  `new_conversation_id` 下挂载一个空转录本,并丢弃任何缓存的会话标题。

```typescript theme={null}
type SDKConversationResetMessage = {
  type: "conversation_reset";
  new_conversation_id: UUID;
  uuid: UUID;
  session_id: string;
};

SDK 的发布类型声明在 Claude Code v2.1.203 及更高版本中声明了 SDKConversationResetMessage。在 v2.1.203 之前,SDKMessage 引用了该类型但未声明它,因此在禁用 skipLibCheck 时对 type === "conversation_reset" 的类型收窄会类型检查失败。

AbortError

中止操作的自定义错误类。

```typescript theme={null}
class AbortError extends Error {}

## 沙箱配置

### `SandboxSettings`

**沙箱行为的配置。用于以编程方式启用命令沙箱化并配置网络限制。**

```typescript theme={null}
type SandboxSettings = {
  enabled?: boolean;
  failIfUnavailable?: boolean;
  autoAllowBashIfSandboxed?: boolean;
  excludedCommands?: string[];
  allowUnsandboxedCommands?: boolean;
  network?: SandboxNetworkConfig;
  filesystem?: SandboxFilesystemConfig;
  ignoreViolations?: Record<string, string[]>;
  enableWeakerNestedSandbox?: boolean;
  ripgrep?: { command: string; args?: string[] };
};
属性 类型 默认值 描述
enabled boolean false 启用命令执行的沙箱模式
failIfUnavailable boolean true enabledtrue 但沙箱无法启动时在启动阶段停止。设为 false 则回退到非沙箱执行并在 stderr 输出警告
autoAllowBashIfSandboxed boolean true 沙箱启用时自动批准 bash 命令
excludedCommands string[] [] 始终绕过沙箱限制的命令(如 ['docker'])。这些命令自动以非沙箱方式运行,无需模型参与
allowUnsandboxedCommands boolean true 允许模型请求在沙箱外运行命令。为 true 时,模型可在工具输入中设置 dangerouslyDisableSandbox,这会回退到权限系统
network SandboxNetworkConfig undefined 网络相关的沙箱配置
filesystem SandboxFilesystemConfig undefined 文件系统相关的沙箱配置,用于读写限制
ignoreViolations Record<string, string[]> undefined 违规类别到要忽略的模式的映射(如 { file: ['/tmp/*'], network: ['localhost'] }
enableWeakerNestedSandbox boolean false 启用较弱的嵌套沙箱以提高兼容性
ripgrep { command: string; args?: string[] } undefined 沙箱环境的自定义 ripgrep 二进制配置

注意: 沙箱依赖平台支持,在 Linux 上还依赖 bubblewrapsocat 等工具。当 enabledtrue 而沙箱无法启动时,query() 报告一个 subtype: "error_during_execution"result 消息,原因在 errors 中。对于单消息 query() 调用,SDK 在产生该错误结果后抛出异常,因此需将循环包裹在 try 块中以跳过继续。错误约定参见 Handle the result

要以非沙箱方式运行,设置 failIfUnavailable: false

使用示例

```typescript theme={null}
import { query } from "@anthropic-ai/claude-agent-sdk";

try {
for await (const message of query({
prompt: "Build and test my project",
options: {
sandbox: {
enabled: true,
autoAllowBashIfSandboxed: true,
network: {
allowLocalBinding: true
}
}
}
})) {
if ("result" in message) console.log(message.result);
}
} catch (error) {
// 单次 query() 在产生错误结果后抛出异常,
// 例如沙箱无法启动时(failIfUnavailable 默认为 true)。
console.log(Session ended with an error: ${error});
}

> **警告:Unix 套接字安全:** `allowUnixSockets` 选项可能授予对强大系统服务的访问权限。例如,允许 `/var/run/docker.sock` 实际上通过 Docker API 授予了完整的主机系统访问权限,绕过了沙箱隔离。仅允许严格必要的 Unix 套接字,并理解每个套接字的安全影响。

### `SandboxNetworkConfig`

**沙箱模式的网络配置。这些设置在父级 [`SandboxSettings`](#sandboxsettings) 中 `enabled` 为 `true` 时应用于沙箱化的 Bash 命令。** 它们不限制 WebFetch 工具,后者使用[权限规则](https://code.claude.com/docs/en/permissions#webfetch)。

```typescript theme={null}
type SandboxNetworkConfig = {
  allowedDomains?: string[];
  deniedDomains?: string[];
  strictAllowlist?: boolean;
  allowManagedDomainsOnly?: boolean;
  allowLocalBinding?: boolean;
  allowUnixSockets?: string[];
  allowAllUnixSockets?: boolean;
  httpProxyPort?: number;
  socksProxyPort?: number;
};
属性 类型 默认值 描述
allowedDomains string[] [] 沙箱化进程可以访问的域名
deniedDomains string[] [] 沙箱化进程不能访问的域名。优先级高于 allowedDomains
strictAllowlist boolean false 拒绝沙箱化命令访问不在 allowedDomains 中的主机,而非提示用户。仅对沙箱化命令生效;进程内工具(如 WebFetch)不受其限制。仅从用户、管理或 CLI --settings 设置中生效;项目设置被忽略。需要 Claude Code v2.1.219 或更高版本
allowManagedDomainsOnly boolean false 仅限管理设置。在管理设置中设置时,仅接受来自管理设置的 allowedDomains 条目,忽略用户、项目或本地设置中的条目。通过 SDK 选项设置时无效
allowLocalBinding boolean false 允许进程绑定到本地端口(如用于开发服务器)
allowUnixSockets string[] [] 进程可以访问的 Unix 套接字路径(如 Docker 套接字)
allowAllUnixSockets boolean false 允许访问所有 Unix 套接字
httpProxyPort number undefined 网络请求的 HTTP 代理端口
socksProxyPort number undefined 网络请求的 SOCKS 代理端口

注意: 内置沙箱代理基于请求的主机名来执行 allowedDomains,不会终止或检查 TLS 流量,因此域前置等技术可能绕过它。详情参见 Sandboxing security limitations,配置 TLS 终止代理参见 Secure deployment

SandboxFilesystemConfig

沙箱模式的文件系统配置。

```typescript theme={null}
type SandboxFilesystemConfig = {
allowWrite?: string[];
denyWrite?: string[];
denyRead?: string[];
};

| 属性 | 类型 | 默认值 | 描述 |
| :----------- | :--------- | :------ | :------------------------------------------ |
| `allowWrite` | `string[]` | `[]` | 允许写入访问的文件路径模式 |
| `denyWrite` | `string[]` | `[]` | 拒绝写入访问的文件路径模式 |
| `denyRead` | `string[]` | `[]` | 拒绝读取访问的文件路径模式 |

### 非沙箱命令的权限回退

** `allowUnsandboxedCommands` 启用时模型可通过在工具输入中设置 `dangerouslyDisableSandbox: true` 来请求在沙箱外运行命令** 这些请求会回退到现有的权限系统即你的 `canUseTool` 处理器会被调用允许你实现自定义授权逻辑下面的示例中,`isCommandAuthorized` 代表你定义的授权检查

> **`excludedCommands`  `allowUnsandboxedCommands` 的区别**
>
> * `excludedCommands`:一个静态的命令列表始终自动绕过沙箱 `['docker']`)。模型对此无控制权
> * `allowUnsandboxedCommands`:让模型在运行时通过在工具输入中设置 `dangerouslyDisableSandbox: true` 来决定是否请求非沙箱执行

```typescript theme={null}
import { query } from "@anthropic-ai/claude-agent-sdk";

for await (const message of query({
  prompt: "Deploy my application",
  options: {
    sandbox: {
      enabled: true,
      allowUnsandboxedCommands: true // 模型可请求非沙箱执行
    },
    permissionMode: "default",
    canUseTool: async (tool, input) => {
      // 检查模型是否请求绕过沙箱
      if (tool === "Bash" && input.dangerouslyDisableSandbox) {
        // 模型请求在沙箱外运行此命令
        console.log(`Unsandboxed command requested: ${input.command}`);

        if (isCommandAuthorized(input.command)) {
          return { behavior: "allow" as const, updatedInput: input };
        }
        return {
          behavior: "deny" as const,
          message: "Command not authorized for unsandboxed execution"
        };
      }
      return { behavior: "allow" as const, updatedInput: input };
    }
  }
})) {
  if ("result" in message) console.log(message.result);
}

此模式使你能够:

  • 审计模型请求: 记录模型请求非沙箱执行的时刻
  • 实现允许列表: 仅允许特定命令以非沙箱方式运行
  • 添加审批工作流: 对特权操作要求显式授权

警告:dangerouslyDisableSandbox: true 运行的命令具有完整的系统访问权限。确保你的 canUseTool 处理器仔细验证这些请求。

如果 permissionMode 设为 bypassPermissionsallowUnsandboxedCommands 已启用,模型可以在没有审批提示的情况下自主在沙箱外执行命令(显式的 ask 规则仍会强制提示)。此组合实际上允许模型静默地逃离沙箱隔离。

另请参阅