Skip to content
FunCoding

Search

Search docs, agents, posts, Skills and MCP servers

TypeScript SDK 参考:选项与类型

Agent SDK TypeScript 的 Options 全部字段、Query 对象的方法、applyFlagSettings 与 updateSettings、WarmQuery、SpareProcess、各 SDKControl 响应类型、AgentDefinition、SettingSource、PermissionMode、CanUseTool、PermissionResult、ToolConfig、McpServerConfig、SdkPluginConfig。

本页是 TypeScript Agent SDK 参考的第二部分:query() 的配置对象 Options、返回的 Query 对象,以及与之配套的类型。函数签名见「TypeScript SDK 参考:安装与函数」。

Options

query() 函数的配置对象。

属性类型默认说明
abortControllerAbortControllernew AbortController()取消操作的控制器
additionalDirectoriesstring[][]Claude 可访问的额外目录。SDK 把每一项以 --add-dir 传给 Claude Code,所以配合 project 设置来源时,Claude Code 也会加载该目录的 skills、命令和子智能体
agentstringundefined主线程的智能体名;该智能体必须定义在 agents 选项或设置里
agentsRecord<string, AgentDefinition>undefined以编程方式定义子智能体
agentProgressSummariesbooleanfalse为 true 时,为子智能体生成一行进度摘要,并通过 task_progress 事件的 summary 字段转发;适用于前台和后台子智能体
allowDangerouslySkipPermissionsbooleanfalse启用绕过权限。使用 permissionMode: 'bypassPermissions' 时必需,不论在启动时还是之后通过 setPermissionMode() 设置
allowedToolsstring[][]自动批准、不提示的工具。这不会把 Claude 限制在只用这些工具;如果在此列出任务跟踪工具之一,Claude Code 也会让会话选择加入;其他未列出的工具走 permissionMode 和 canUseTool。要屏蔽工具用 disallowedTools
betasSdkBeta[][]启用 beta 功能
canUseToolCanUseToolundefined自定义权限函数,只在权限流程落到提示时调用;被 allowedTools、允许规则或 permissionMode 自动批准的调用不会调用它;允许规则不会预批准没有任何模式自动批准的动作
continuebooleanfalse继续最近的对话
cwdstringprocess.cwd()当前工作目录
debugbooleanfalse为 Claude Code 进程启用调试模式
debugFilestringundefined把调试日志写到指定文件路径,隐式启用调试模式
disallowedToolsstring[][]要拒绝的工具。裸名(如 "Bash")把该工具从 Claude 的上下文里移除;有范围的规则(如 "Bash(rm *)")让工具保持可用,并在每种权限模式(包括 bypassPermissions)下对按所写命令匹配的调用拒绝
effort'low' | 'medium' | 'high' | 'xhigh' | 'max'undefined控制 Claude 在回答上投入多少努力,配合自适应思考引导思考深度
enableFileCheckpointingbooleanfalse启用文件改动跟踪以便回退
envRecord<string, string | undefined>process.env环境变量。设置后它替换子进程环境而不是与 process.env 合并,所以要传 { ...process.env, YOUR_VAR: 'value' } 以保留 PATH 之类的继承变量。设 CLAUDE_AGENT_SDK_CLIENT_APP 可在 User-Agent 头里标识你的应用
executable'bun' | 'deno' | 'node'自动检测使用的 JavaScript 运行时
executableArgsstring[][]传给可执行文件的参数
extraArgsRecord<string, string | null>{}额外参数
fallbackModelstringundefined主模型失败时使用的模型,接受逗号分隔的列表
forkSessionbooleanfalse用 resume 恢复时,分叉成新的会话 ID 而不是继续原会话
forwardSubagentTextbooleanfalse把子智能体的文本和思考块转发为设了 parent_tool_use_id 的助手和用户消息,使消费方能渲染嵌套记录;没有该选项时,Claude Code 只发出子智能体的 tool_use 和 tool_result 块,不发文本或思考。Claude Code v2.1.219 及以上转发每一层嵌套深度的子智能体消息(之前只有深度为 1 的);forked skill 派生的子智能体及嵌套 forked skill 的消息需要 v2.1.275 及以上
hooksPartial<Record<HookEvent, HookCallbackMatcher[]>>{}事件的 hook 回调
includeHookEventsbooleanfalse把 hook 生命周期事件作为 SDKHookStartedMessage、SDKHookProgressMessage、SDKHookResponseMessage 放进消息流;SessionStart 和 Setup hooks 的生命周期事件总是包含,不需要该选项;有些 hook 事件(如 Notification、SessionEnd、PreCompact、PostCompact)即使有该选项也从不产生 SDKHookStartedMessage,对这些事件,运行超过一秒的命令 hook 产生输出时 Claude Code 仍会发出 SDKHookProgressMessage,仅当后台运行的 hook 结束时才发出 SDKHookResponseMessage
includePartialMessagesbooleanfalse包含部分消息事件
loadTimeoutMsnumber60000Alpha。 恢复物化期间每次 sessionStore.load() 和 sessionStore.listSubkeys() 调用的超时毫秒数;适配器在此窗口内没有完成,查询就失败而不是挂起;没设 sessionStore 时忽略
managedSettingsSettingsundefined你的宿主进程提供给被派生会话的策略层设置。在有管理员部署的托管设置的机器上,Claude Code 会忽略它们,除非管理员最高优先级的托管来源设了 parentSettingsBehavior: 'merge',并且在 policyHelper 提供托管设置时从不合并它们。合并后的值要经过只限制不放宽的过滤器。设了 CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST 的宿主有三个键直接从该载荷读取:它的模型配置(Claude Code v2.1.222 及以上)、没有托管来源设置时的 modelPricing(v2.1.246 及以上)、它的 ENABLE_TOOL_SEARCH env 条目(v2.1.247 及以上)
maxBudgetUsdnumberundefined客户端成本估算达到该美元值时停止查询;只计本次调用自己的花费,从恢复的会话还原的总额不计
maxThinkingTokensnumberundefined已弃用: 改用 thinking。思考过程的最大 token 数
maxTurnsnumberundefined最大智能体轮次(工具使用往返)
mcpServersRecord<string, McpServerConfig>{}MCP 服务器配置
modelstringCLI 的默认值Claude 模型别名或完整模型名
onElicitation(request: ElicitationRequest, options: { signal: AbortSignal }) => Promise<ElicitationResult>undefined处理 MCP elicitation 请求的回调:MCP 服务器请求用户输入且没有 hook 先处理时调用;没提供时,未处理的 elicitation 请求被自动拒绝
outputFormat{ type: 'json_schema', schema: JSONSchema }undefined定义智能体结果的输出格式(见「结构化输出」)
outputStylestringundefined不是 Options 的字段:要在内联 settings 对象或设置文件里设 outputStyle
pathToClaudeCodeExecutablestring由捆绑的原生二进制自动解析Claude Code 可执行文件的路径;只有安装时跳过了可选依赖,或你的平台不在受支持集合里才需要
permissionModePermissionModeundefined会话的权限模式;省略时会话可能以 auto 模式启动
permissionPromptToolNamestringundefined用于权限提示的 MCP 工具名
permissionPrompts'host' | 'none''host'谁回答权限提示:'host' 把它们路由到你的 canUseTool 回调或 permissionPromptToolName 工具,'none' 拒绝本会提示的调用(需要 Claude Code v2.1.259 及以上)
persistSessionbooleantrue为 false 时禁用把会话持久化到磁盘,之后无法恢复会话
planModeInstructionsstringundefinedplan 模式的自定义工作流说明:permissionMode 为 'plan' 时,这个字符串替换默认的 plan 模式工作流正文;CLI 仍用只读强制前言和 ExitPlanMode 协议页脚包裹它
pluginsSdkPluginConfig[][]从本地路径加载自定义插件
projectConfigRootstringundefinedcwd 作为其 worktree 的受信任检出的绝对路径。Claude Code 从该目录而不是 cwd 读取项目设置、.mcp.json 和项目的 .claude/ 命令、智能体、skills、工作流、例程和输出样式,并把 CLAUDE_PROJECT_DIR 设为它;hooks、apiKeyHelper 之类的辅助脚本和 stdio MCP 服务器以该目录作为工作目录启动;CLAUDE.md 文件和 .claude/rules/ 仍从 cwd 加载(需要 Claude Code v2.1.275 及以上)
promptSuggestionsbooleanfalse启用提示建议:一个轮次之后,Claude Code 发出携带预测的下一个用户提示的 prompt_suggestion 消息;对某些轮次(如账号接近或已达用量限制时)不生成建议
resumestringundefined要恢复的会话 ID
resumeDropsTurnstringundefined与 resumeSessionAt 配合:截断式恢复打算丢弃的轮次的提示 UUID。被丢弃的范围里含有不能归属于该轮次的内容(如被吸收的排队消息或任务通知)时,Claude Code 拒绝恢复,并在拒绝消息里点名 --resume-drops-turn 标志。只有 Agent SDK 和 print 模式的恢复读取这对参数(需要 Claude Code v2.1.223 及以上)
resumeSessionAtstringundefined在特定消息 UUID 处恢复会话
sandboxSandboxSettingsundefined以编程方式配置沙盒行为
sessionIdstring自动生成用特定 UUID 作为会话,而不是自动生成
sessionStoreSessionStoreundefined把会话记录镜像到外部后端,让另一台主机能恢复它们(见「会话存储」)
sessionStoreFlush'batched' | 'eager''batched'Alpha。 sessionStore 的刷新模式;没设 sessionStore 时忽略
settingsstring | Settingsundefined内联设置对象、设置文件路径或内联 JSON 字符串;填充优先级顺序里的标志设置层;可在运行时用 applyFlagSettings() 更改
settingSourcesSettingSource[]CLI 默认(所有来源)控制加载哪些文件系统设置;传 [] 禁用用户、项目和本地设置;端点托管策略总会加载;会话在符合条件的配置上用组织凭据认证时会获取服务器托管设置
skillsstring[] | 'all'undefined会话可用的 skills:传 'all' 启用每个发现的 skill,或传 skill 名列表。只传精确名字:Agent SDK v0.3.221 及以上,SDK 会在启动 Claude Code 进程前以错误拒绝畸形和通配形式的名字。设置后,SDK 自动把 Skill 工具加进 allowedTools;如果同时传了 tools,要在该列表里包含 'Skill'
spawnClaudeCodeProcess(options: SpawnOptions) => SpawnedProcessundefined派生 Claude Code 进程的自定义函数,用于在 VM、容器或远程环境里运行 Claude Code
stderr(data: string) => voidundefinedstderr 输出的回调
strictMcpConfigbooleanfalse只使用 mcpServers 里传入的服务器,忽略项目 .mcp.json、用户设置、插件提供的 MCP 服务器和 claude.ai 连接器
systemPromptstring | string[] | { type: 'custom'; prompt: string | string[]; snapshot?: boolean } | { type: 'preset'; preset: 'claude_code'; append?: string; excludeDynamicSections?: boolean; snapshot?: boolean }undefined(最小提示)系统提示配置:传字符串作为自定义提示,或传 { type: 'preset', preset: 'claude_code' } 使用 Claude Code 的系统提示。传字符串数组并在静态部分与每请求部分之间放导出的 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 常量,可缓存自定义提示的静态部分。用预设对象形式时,加 append 以附加说明扩展它,设 excludeDynamicSections: true 把每会话上下文移到第一条用户消息里,以便在多台机器之间更好地复用提示缓存。设 snapshot: false 让它在每个请求上重建提示,而不是复用会话在第一个请求上记录的提示;要在自定义提示上设 snapshot,传 { type: 'custom', prompt } 形式。{ type: 'custom' } 形式和 snapshot 字段需要 TypeScript Agent SDK v0.3.257 及以上
taskBudget{ total: number }undefinedAlpha。 API 侧的任务预算(token 数);设置后模型会被告知它剩余的 token 预算,以便把握工具使用节奏并在限额之前收尾
thinkingThinkingConfig支持的模型默认 { type: 'adaptive' }控制 Claude 的思考/推理行为
titlestringundefined会话的显示标题;通过 resume 或 continue 恢复时,恢复的会话持久化的标题优先,要给现有会话改标题用 renameSession()
toolAliasesRecord<string, string>undefined把内置工具名映射到 MCP 工具名,让 Claude 调用你的 MCP 实现而不是内置的,例如 { Bash: 'mcp__workspace__bash' }
toolConfigToolConfigundefined内置工具行为的配置
toolsstring[] | { type: 'preset'; preset: 'claude_code' }undefined工具配置:传工具名数组,或用预设得到 Claude Code 的默认工具
verbatimPromptsbooleanfalse逐字投递每个提示:SDK 以 client_composed: true 发送每条用户消息。当提示文本含最终用户没有输入的内容时使用;要按轮次控制,保持关闭并在单条流式消息上设 client_composed(需要 TypeScript Agent SDK v0.3.280 及以上和 Claude Code v2.1.248 及以上,这些 SDK 版本捆绑的 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,适用于主循环和所有子智能体。
  • 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:子智能体的停滞看门狗。流看门狗开着时,默认值是 CLAUDE_STREAM_IDLE_TIMEOUT_MS 加 5 分钟,除非你调高那个变量,否则就是 600000;流看门狗关闭时默认是 600000(v2.1.257 之前默认总是 600000)。计时器在每个流事件上重置;停滞时,Claude Code 中止该子智能体并向父级报告停滞;对后台子智能体,还会把任务标记为失败并附上任何部分结果。
  • CLAUDE_ENABLE_STREAM_WATCHDOG 与 CLAUDE_STREAM_IDLE_TIMEOUT_MS:流看门狗在响应头已到达但响应体停止流式传输时中止请求。该看门狗对所有提供商默认开启,设 CLAUDE_ENABLE_STREAM_WATCHDOG=0 禁用;CLAUDE_STREAM_IDLE_TIMEOUT_MS 默认 300000 并被钳到该最小值。看门狗等待 ANTHROPIC_BASE_URL 后面的网关用 keep-alive ping 保持打开的响应期间,设了 includePartialMessages 的宿主会持续收到 ping 流事件,所以把这些帧当作存活信号读取,而不要因静默超时会话(v2.1.257 之前,这些帧在最后一个真实流事件的 5 分钟后停止)。

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]?: K extends 'effortLevel'
      ? 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null
      : Settings[K] | null;
  }): Promise<void>;
  updateSettings(
    source: 'localSettings' | 'userSettings',
    settings: Record<string, unknown>,
  ): Promise<void>;
  initializationResult(): Promise<SDKControlInitializeResponse>;
  reinitialize(): Promise<SDKControlInitializeResponse>;
  supportedCommands(): Promise<SlashCommand[]>;
  supportedModels(): Promise<ModelInfo[]>;
  supportedAgents(): Promise<AgentInfo[]>;
  mcpServerStatus(): Promise<McpServerStatus[]>;
  getContextUsage(opts?: {
    detail?: 'summary' | 'full';
  }): Promise<SDKControlGetContextUsageResponse>;
  readFile(
    path: string,
    options?: { maxBytes?: number; encoding?: 'utf-8' | 'base64' }
  ): Promise<SDKControlReadFileResponse | null>;
  reloadPlugins(options?: {
    holdOnCacheImpact?: boolean;
  }): Promise<SDKControlReloadPluginsResponse>;
  reloadSkills(): Promise<SDKControlReloadSkillsResponse>;
  reloadOutputStyles(): Promise<SDKControlReloadOutputStylesResponse>;
  accountInfo(): Promise<AccountInfo>;
  reconnectMcpServer(serverName: string): Promise<void>;
  toggleMcpServer(serverName: string, enabled: boolean): Promise<void>;
  setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;
  readMcpResource(serverName: string, uri: string): Promise<SDKControlMcpReadResourceResponse>;
  streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;
  stopTask(taskId: string): Promise<void>;
  close(): void;
}
方法说明
interrupt()中断查询,仅在流式输入模式下可用。当 CLI 在 SDKSystemMessage.capabilities 里声明 interrupt_receipt_v1 能力时,它以列出中断到达时待处理消息的 SDKControlInterruptResponse 解析;v2.1.205 之前的 CLI 上解析为 undefined
rewindFiles(userMessageId, options?)把文件恢复到指定用户消息时的状态;传 { dryRun: true } 预览改动;需要 enableFileCheckpointing: true
setPermissionMode()更改权限模式(仅流式输入模式)
setModel()更改模型(仅流式输入模式);传 undefined 或字符串 "default" 重置为 Claude Code 的默认模型
setMaxThinkingTokens()已弃用: 改用 thinking 选项。更改最大思考 token;传 null 把思考重置为会话默认:中途的覆盖被清除,对禁用了思考的会话思考保持关闭
applyFlagSettings(settings)在运行时把设置合并进会话的标志设置层(仅流式输入模式),见下
updateSettings(source, settings)把一个允许列表内的键写入项目的本地设置文件或你的用户设置文件,使该值在之后的会话里持续,见下(需要 TypeScript SDK v0.3.257 及以上,它捆绑 Claude Code v2.1.257)
initializationResult()返回完整的初始化结果,包括支持的命令、模型、账号信息和输出样式配置
reinitialize()向运行中的 CLI 重新发送 initialize 控制请求,返回新的结果而不是缓存的首次连接结果。在传输中断(如断线后重新附着到会话)之后使用,使待处理的权限请求再次到达你的 canUseTool 回调;要让回调按请求 ID 幂等,因为响应丢失的请求会被再次分派(需要 Claude Code v2.1.195 及以上)
supportedCommands()返回可用命令;从 Agent SDK v0.3.216 起该列表反映会话中途的命令变化(见 SDKCommandsChangedMessage)
supportedModels()返回带显示信息的可用模型
supportedAgents()返回可用子智能体 AgentInfo[]
mcpServerStatus()返回已连接 MCP 服务器的状态 McpServerStatus[]
getContextUsage(opts?)返回 SDKControlGetContextUsageResponse,按类别、skill 和工具拆解会话的上下文窗口用量。默认 detail 下它与交互式会话里 /context 显示的数据相同,用不出现在消息流里的 token 计数 API 请求计算(detail 选项需要 Agent SDK v0.3.257 及以上)
readFile(path, options?)从会话的文件系统读取文件。Claude Code 相对 cwd 解析路径;传 { maxBytes } 更改读取上限(默认 1 MB,上限 10 MB),传 { encoding: 'base64' } 读取图片这类二进制文件。以 SDKControlReadFileResponse 解析,权限拒绝、文件缺失或传输错误时为 null(需要 TypeScript SDK v0.2.121 及以上)
reloadPlugins(options?)从磁盘重新加载插件,使会话中途安装或编辑的插件到达运行中的会话;以列出会话的命令、子智能体、插件和 MCP 服务器状态的 SDKControlReloadPluginsResponse 解析(需要 Agent SDK v0.2.85 及以上;holdOnCacheImpact 选项需要 v0.3.268 及以上)
reloadSkills()从磁盘重新加载 skills,使会话中途添加或编辑的 skills 对运行中的会话可用;以列出重新加载后可用 skills 的 SDKControlReloadSkillsResponse 解析(需要 Agent SDK v0.3.163 及以上)
reloadOutputStyles()从磁盘重新读取输出样式,使会话中途添加或编辑的样式文件对运行中的会话可用;以列出重新加载后可用样式名的 SDKControlReloadOutputStylesResponse 解析(需要 Agent SDK v0.3.261 及以上)
accountInfo()返回账号信息
reconnectMcpServer(serverName)按名字重连 MCP 服务器。如果该名字也匹配 .mcp.json 或 ~/.claude.json 之类设置文件里的条目,Claude Code 重连的是你经 mcpServers 或 setMcpServers() 配置的服务器,而不是设置文件里的条目(这种解析顺序需要 Claude Code v2.1.257 及以上)
toggleMcpServer(serverName, enabled)按名字启用或禁用 MCP 服务器,名字解析与 reconnectMcpServer() 相同。禁用 stdio、SSE 或 HTTP 服务器会断开它并移除其工具;对会话中途用 setMcpServers() 添加的服务器,移除工具需要 Claude Code v2.1.285 及以上
setMcpServers(servers)动态替换该会话的 MCP 服务器集合;以点名哪些服务器被添加和移除以及任何错误的 McpSetServersResult 解析
readMcpResource(serverName, uri)Alpha。 从已连接的 MCP 服务器读取一个 MCP Apps 的 ui:// 资源,使你的应用能渲染工具的小组件;以 SDKControlMcpReadResourceResponse 解析(需要 TypeScript Agent SDK v0.3.280 及以上)
streamInput(stream)向查询流式输入消息以进行多轮对话
stopTask(taskId)按 ID 停止运行中的后台任务
close()关闭查询并终止底层进程;强制结束查询并清理所有资源

applyFlagSettings()

在运行中的会话上更改设置而不必重启查询。当没有专用 setter 的设置需要在会话中途更改时使用,例如在智能体读取了不受信任的输入之后收紧 permissions。setModel() 和 setPermissionMode() 是这两个键的专用 setter;applyFlagSettings() 是接受设置键任意子集的通用形式,在这里传 model 与 setModel() 行为相同。只有一部分键在会话中途生效:

  • 在下一个轮次生效:effortLevel、ultracode、permissions、hooks、skillOverrides、fastMode、agent。切换 agent 也会在下一个轮次应用该智能体的模型覆盖和 hooks;它的系统提示在下一个轮次应用,或在复用已记录系统提示的会话里,在会话被压缩后应用。
  • 在当前轮次期间生效:model。Claude 正在处理轮次时切换 model,已在生成的响应用旧模型结束,轮次的其余部分(从 Claude Code 下一次调用模型开始)使用新模型;子智能体保持自己的模型(v2.1.212 之前,轮次中途的切换要等到下一个轮次)。
  • 会话中途无效:系统提示选项。它们在启动时只解析一次,所以即使调用成功,运行中的会话也保持原值;要更改它们,要启动新会话。

effortLevel 接受努力级别名,也接受 "ultracode",表示请求 xhigh 努力并开启 ultracode。applyFlagSettings() 声明的 effortLevel 不含该值,所以在 TypeScript 里要传 { ultracode: true, effortLevel: "xhigh" } 得到同样的结果,或单独传 ultracode 键以在会话当前努力级别上开启 ultracode。ultracode 值需要 Claude Code v2.1.203 及以上,并且只被 applyFlagSettings() 接受,设置文件里的 effortLevel 键不接受(v2.1.284 之前,单独的 ultracode 键也会把级别设为 xhigh)。这些值被写入标志设置层,合并在 query() 的内联 settings 选项于启动时设置的内容之上,这正是文档中所说的"编程选项"这一层。连续调用对顶层键做浅合并:第二次带 { permissions: {...} } 的调用会替换上一次调用的整个 permissions 对象,而不是深度合并进去。

要清除用 applyFlagSettings() 设置的键,对该键传 null。多数键随后先回退到 query() 的 settings 选项在启动时设置的值,再回退到较低优先级来源;清除后的 model 重置为 Claude Code 的默认模型,即使设置文件设了 model;传 undefined 无效,因为 JSON 序列化会丢掉它。除 model 外有三个键是重置会话状态而不是回退:effortLevel: null 让会话回到模型的默认努力级别,而不是 query() 的 effort 选项或设置文件里的 effortLevel;agent: null 从下一个轮次起让主线程不带智能体运行,而不是还原 query() 的 agent 选项或设置文件里的 agent(如果被清除的智能体曾应用自己的模型,会话回到它在启动时解析出的模型);ultracode: null 像 false 一样关闭 ultracode,而不是还原设置文件里的 ultracode 值,会话保持当前努力级别,所以要在同一次调用里传 effortLevel 来更改它。仅在流式输入模式下可用,与 setModel() 和 setPermissionMode() 的限制相同。下面的例子在会话中途切换当前模型,之后清除覆盖,使模型重置为 Claude Code 的默认模型:

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

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

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

// 之后:清除覆盖;模型重置为 Claude Code 的默认值
await q.applyFlagSettings({ model: null });

applyFlagSettings() 只存在于 TypeScript,Python SDK 没有等价方法。

updateSettings()

把一个允许列表内的键写入磁盘上的设置文件,使该值在之后加载该来源的会话里持续。每个来源接受一个键,值为字符串:

  • "localSettings":接受 outputStyle 并合并进项目的本地设置文件 .claude/settings.local.json,新样式在会话的下一个请求上生效。
  • "userSettings":接受 effortLevel,并把它保存为会话当前模型的默认努力级别,写在用户设置文件的 modelSettings 下。传 max 不写入任何东西,因为 max 只限会话。运行中的会话两种情况下都保持当前努力级别,所以还想更改它时要调用 applyFlagSettings()。该来源需要 TypeScript SDK v0.3.277 及以上(捆绑 Claude Code v2.1.277)。

请求携带任何其他键、会话运行在远程传输上、或会话的 settingSources 排除了你点名的来源时,调用会被拒绝;不支持删除键。

WarmQuery

startup() 返回的句柄。子进程已经派生并初始化,所以对该句柄调用 query() 把提示直接写入已就绪的进程,没有启动延迟。

interface WarmQuery extends AsyncDisposable {
  query(prompt: string | AsyncIterable<SDKUserMessage>): Query;
  close(): void;
}
方法说明
query(prompt)向预热的子进程发送提示并返回 Query;每个 WarmQuery 只能调用一次
close()不发送提示就关闭子进程;用来丢弃不再需要的预热查询

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

SpareProcess

Alpha。 prewarm() 返回的句柄:一个已启动但尚未绑定会话、可被认领一次的 Claude Code 进程(需要 TypeScript Agent SDK v0.3.282 及以上)。

interface SpareProcess extends AsyncDisposable {
  claim(params: {
    prompt: string | AsyncIterable<SDKUserMessage>;
    options: ClaimOptions;
  }): Query;
  readonly claimed: Promise<{ cwd: string; sessionId: string; parkedMs?: number; sdkMcpSettled: boolean }>;
  readonly exited: Promise<void>;
  close(): void;
}
成员说明
claim({ prompt, options })把备用进程绑定到 options.cwd 里的会话并发送它的第一条消息;像 query() 一样同步返回 Query;只能调用一次
claimedClaude Code 接受认领后,以会话的工作目录和 ID 解析;Claude Code 拒绝认领、进程先退出或被关闭时拒绝;当会话在没有你所要求的 model 或 maxThinkingTokens 的情况下运行时,以 option_not_applied 开头的消息拒绝
exited进程退出时落定,不论是否被认领;在认领前就退出的备用进程要替换
close()终止进程;认领前这会丢弃备用进程并拒绝 claimed

options.cwd 必需。认领还可以设置 additionalDirectories、model、permissionMode、maxThinkingTokens、settings 里的标志设置覆盖层、appendSystemPrompt、title、agents,以及 env 里的每会话令牌。Claude Code 可能拒绝认领,例如对不存在的文件夹,或其项目设置设了 env、agent 或 model 的文件夹。当 claimed 以 option_not_applied 开头的消息拒绝时,会话在没有你要求的 model 或 maxThinkingTokens 的情况下运行;其他任何拒绝之后,你的提示都没有运行,所以改用 query() 开始会话。

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;
  hooks_applied?: boolean;
};

hooks_applied 报告 Claude Code 是否注册了 initialize 请求携带的 hooks(SDK 在会话开始时发送一次该请求,每次 reinitialize() 调用时再发送一次;该字段需要 Agent SDK v0.3.238 及以上)。请求没带 hooks 时 Claude Code 省略该字段;请求带了 hooks 时,值取决于该请求是不是会话的第一次 initialize,以及对重复的那次,取决于它如何到达会话:true——Claude Code 注册了 hooks(会话的第一次 initialize 返回此值;经 CLI 的 stdin 发送的重复 initialize 也返回 true,此时新请求里的 hooks 替换先前注册的);false——Claude Code 忽略了 hooks(发给远程会话的重复 initialize 返回此值,所以加入会话的第二个客户端无法替换第一个客户端注册的 hooks)。Agent SDK v0.3.238 之前,响应从不带该字段,Claude Code 在每次重复的 initialize 上都忽略 hooks。

响应总是报告 fast_mode_state,并且在有东西阻止快速模式时,fast_mode_disabled_reason 会随之携带原因代码,让你能解释被阻止的状态而不是重新推导可用性;这两个行为需要 Claude Code v2.1.219 及以上(之前,快速模式不可用时响应省略 fast_mode_state 且从不带原因)。成功的 initialize 的控制响应包装还携带 pending_permission_requests 数组,该字段在响应包装本身上,不在上面的 SDKControlInitializeResponse 载荷里;每个条目是完整的 control_request 消息,形状与会话在运行期间为权限请求流式发出的相同,即 { type: "control_request", request_id, request }。该数组列出这个 Claude Code 进程已发出但尚未解决的权限请求;SDK 替你读取它并把每个条目分派给你的 canUseTool 回调,与 reinitialize() 在传输中断之后触发的重新投递相同;要按重复的请求 ID 幂等处理,因为条目可能重复回调在连接断开前已收到的请求。成功的 initialize 响应里该数组总是存在,进程没有未解决的权限请求时为空(需要 Claude Code v2.1.268 及以上;更早的版本可能省略该字段,所以如果你自己解析线协议,要把缺失的字段视为较旧的 CLI,而不是什么都没有待处理的证据)。

SDKControlInterruptResponse

中断回执:在 SDKSystemMessage.capabilities 里声明了 interrupt_receipt_v1 能力的 CLI 上,interrupt() 以它解析(需要 Claude Code v2.1.205 及以上;更早的 CLI 以空的成功载荷应答中断,所以 interrupt() 解析为 undefined)。

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

still_queued 列出中断到达时待处理的用户消息的 UUID:仍在队列里的消息,加上 Claude Code 已从队列里取出用于下一个轮次的任何消息。会话的第一个轮次开始之后,除非你先取消它们,Claude Code 在中断之后处理所列消息,并可能把几条合并成一个轮次;如果在第一个轮次开始前中断,Claude Code 在该轮次一开始就中止它,该轮次里所列的消息得不到响应。用回执决定是否重发任何东西:你没取消的所列消息不论是否得到响应都会进入对话,所以重发它会把它两次投递给 Claude。解读这个列表要注意:只有带 UUID 入队的消息才会出现,空数组不表示没有别的东西会运行;只列出主线程消息,发给子智能体的消息不在范围内;列表可能包含你的客户端从未发送的 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,所以它解析出的回执不带 cancelled。回执是中断被处理那一刻的快照,在干净的中断上它先于被中断轮次的 SDKResultMessage 到达:要读回执,而不是在那个结果之后检查队列,因为循环会立即开始下一个排队的轮次,所以结果之后你检查的队列已经变了。

SDKControlGetContextUsageResponse

getContextUsage() 的返回类型。默认 detail 下,它是 Claude Code 在交互式会话里为 /context 命令渲染的同一个载荷,所以除了 token 计数,它还携带 color 和 gridRows 这类 Claude Code 用来绘制 /context 用量网格的显示字段。该方法可选的 detail 参数选择 Claude Code 怎么统计每个类别(需要 Agent SDK v0.3.257 及以上):'full'(默认)——Claude Code 用 token 计数 API 请求统计每个类别,这些请求不出现在消息流里,所以读取消息流的成本跟踪看不到它们(在 Anthropic API 上 token 计数不计费);'summary'——传 { detail: 'summary' } 从最后一个响应的用量和本地估算得到答案,不发出 token 计数请求,各类别的数字是近似的。把 /context 作为提示发送而不是调用该方法时,Claude Code 把 SDKContextUsage 载荷附加到交付结果的助手消息的 context_usage 字段上(该字段需要 Agent SDK v0.3.232 及以上)。

type SDKControlGetContextUsageResponse = {
  categories: {
    name: string;
    tokens: number;
    color: string;
    isDeferred?: boolean;
    kind: "used" | "free" | "buffer" | "deferred";
  }[];
  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 持有每个类别的总数,每个条目的 kind 用与 SDKContextUsageCategory 相同的值给该行分类,要按它而不是显示用的 name 分类(该字段需要 Agent SDK v0.3.268 及以上);mcpTools 和 agents 把 token 归属到单个 MCP 工具和子智能体;memoryFiles 列出每个已加载的记忆文件及其成本;skills.skillFrontmatter 把 skill 列表的 token 归属到每个包含的 skill,每个 skill 的计数衡量的是 Claude Code 实际发送的该 skill 的列表条目,它可能比 skill 的完整 frontmatter 短,比较 skills.totalSkills 与 skills.includedSkills 就能知道是否每个发现的 skill 都进入了列表。totalTokens 是会话当前的上下文用量,maxTokens 是衡量该用量的窗口,也就是模型的上下文窗口,或适用时更低的自动压缩窗口;rawMaxTokens 与 maxTokens 取同一个值,percentage 是 totalTokens 占该窗口的四舍五入百分比;apiUsage 持有最近一次 API 响应的用量,不是会话的累计总数。Claude Code 把可选的 deferredBuiltinTools、systemTools 和 systemPromptSections 诊断字段留空,所以尽管类型声明了它们,也要预期它们不存在。

SDKControlReadFileResponse

readFile() 的返回类型。

type SDKControlReadFileResponse = {
  contents: string;
  absPath: string;
  truncated?: boolean;
  encoding?: 'base64';
};

contents 持有文件文本,或在你请求 encoding: 'base64' 时持有 base64 数据(此时响应的 encoding 字段设为 'base64');absPath 是解析后的绝对路径;文件比 maxBytes 上限长且内容在该限制处被截断时设 truncated。readFile() 能读什么:它服务的文件集合比 Read 工具窄:会话工作目录(如 cwd 和 additionalDirectories)之一里的常规文件,以及会话的一些 Claude Code 自己的文件(如工具结果)。Read 的拒绝和询问规则仍会阻止匹配的路径,宽泛的 Read 允许规则也不会把文件系统的其余部分对 readFile() 开放;其他任何东西,调用都以 null 解析。

SDKControlReloadPluginsResponse

reloadPlugins() 的返回类型。

type SDKControlReloadPluginsResponse = {
  commands: SlashCommand[];
  agents: AgentInfo[];
  plugins: {
    name: string;
    path: string;
    source?: string;
    version?: string;
  }[];
  mcpServers: McpServerStatus[];
  error_count: number;
  held?: boolean;
  cache_impact?: {
    mcp_servers_added: string[];
    mcp_servers_removed: string[];
    lsp_tool_change: ("adds" | "may-add" | "removes" | "may-remove") | null;
  };
};

集合字段描述调用之后的会话:commands、agents 和 mcpServers 是会话的命令、子智能体和 MCP 服务器状态,形状与 supportedCommands()、supportedAgents()、mcpServerStatus() 返回的相同(supportedAgents() 继续返回初始化时捕获的列表,所以要读这里的 agents 来得到重新加载后的集合);plugins 是每个已加载插件及其 name 和安装 path,version 重复插件清单声明的内容,由插件作者控制,所以在信任之前要验证它,清单没声明时省略;error_count 是加载插件的错误数。给 reloadPlugins() 传 { holdOnCacheImpact: true } 可以挂起会使对话的提示缓存失效的重新加载而不是应用它,Claude Code 会运行交互式 /reload-plugins 命令在警告缓存成本之前做的检查(该选项需要 Agent SDK v0.3.268 及以上;你用 pathToClaudeCodeExecutable 指向的、早于 v2.1.268 的 Claude Code 可执行文件会忽略该选项并应用重新加载)。传了该选项时,读 held 了解发生了什么:true——重新加载没有应用,集合字段描述的是会话仍然的样子,cache_impact 说明应用它会改变什么,要仍然应用就不带该选项再次调用 reloadPlugins();false——检查没有发现缓存影响,重新加载已应用;缺失——你没传该选项,或 Claude Code 可执行文件早于 v2.1.268 并应用了重新加载。cache_impact 仅与 held: true 同时出现:mcp_servers_added 和 mcp_servers_removed 点名该重新加载会注册或丢弃的插件 MCP 服务器,以带范围的 plugin:<plugin>:<server> 名字给出,这些名字由插件作者决定,所以显示之前要验证;lsp_tool_change 说明应用它是否会添加或移除 LSP 工具,两者都不会时为 null,带 may- 的形式表示检查没能完全看到待处理的插件集合。

SDKControlReloadSkillsResponse 与 SDKControlReloadOutputStylesResponse

type SDKControlReloadSkillsResponse = {
  skills: SlashCommand[];
};

type SDKControlReloadOutputStylesResponse = {
  available_output_styles: string[];
};

reloadSkills() 的返回里,skills 列出重新加载后可用的 skills,形状与 supportedCommands() 返回的 SlashCommand 相同;reloadOutputStyles() 的返回里,available_output_styles 列出重新加载后可用的内置和自定义输出样式名。

SDKControlMcpReadResourceResponse

readMcpResource() 的返回类型,携带 MCP 服务器 resources/read 的结果(需要 TypeScript Agent SDK v0.3.280 及以上)。

type SDKControlMcpReadResourceResponse = {
  contents: {
    uri: string;
    mimeType?: string;
    text?: string;
    blob?: string;
    _meta?: Record<string, unknown>;
  }[];
};

给 readMcpResource() 传 mcpServerStatus() 报告的服务器名和一个 ui:// URI(如某个工具在其 _meta 里声明的 ui.resourceUri)。对任何其他 URI 方案、对你的应用自己托管的 SDK MCP 服务器、以及对未连接的服务器,调用都会被拒绝;当 init 消息的 capabilities 包含 mcp_read_resource_v1 时可用。每个 contents 条目是服务器发来的一个内容项,去掉了 com.anthropic/ 前缀下的任何 _meta 键(该前缀为 Claude Code 保留);blob 对二进制项持有 base64 数据,_meta 是该项自己的 _meta,MCP Apps 服务器把资源的 ui.csp 和 ui.permissions 放在那里。这些内容是不受信任的第三方 HTML,所以要在沙盒里渲染。

AgentDefinition

以编程方式定义的子智能体的配置。

type AgentDefinition = {
  description: string;
  tools?: string[];
  disallowedTools?: string[];
  prompt: string;
  model?: string;
  mcpServers?: AgentMcpServerSpec[];
  skills?: string[];
  initialPrompt?: string;
  maxTurns?: number;
  background?: boolean;
  omitClaudeMd?: boolean;
  memory?: "user" | "project" | "local";
  effort?: "low" | "medium" | "high" | "xhigh" | "max" | number;
  permissionMode?: PermissionMode;
  criticalSystemReminder_EXPERIMENTAL?: string;
};
字段必填说明
description是何时使用该智能体的自然语言描述
tools否允许的工具名数组;省略时继承子智能体可用的每个工具。要把 Skills 预加载进智能体的上下文,用 skills 字段,而不是在这里列 'Skill'
disallowedTools否为该智能体显式拒绝的工具名数组;也接受 MCP 服务器级模式:mcp__server 或 mcp__server__* 移除该服务器的每个工具,mcp__* 移除任何服务器的每个 MCP 工具
prompt是智能体的系统提示
model否该智能体的模型覆盖;接受 'fable'、'opus'、'sonnet'、'haiku'、'inherit' 等别名或完整模型 ID;'inherit' 使用主模型;省略时 Claude Code 按子智能体的模型顺序选择
mcpServers否该智能体的 MCP 服务器规格
skills否预加载进智能体上下文的 skill 名数组
initialPrompt否该智能体作为主线程智能体运行时,自动作为第一个用户轮次提交
maxTurns否停止前最大的智能体轮次(API 往返)数
background否被调用时作为非阻塞的后台任务运行该智能体
omitClaudeMd否该智能体作为子智能体运行时,不带用户、项目和本地 CLAUDE.md 文件(托管策略文件仍加载);用于从 Agent 工具提示里获得所需一切的智能体;该智能体作为主线程智能体运行时忽略(需要 TypeScript Agent SDK v0.3.271 及以上)
memory否该智能体的记忆来源:'user'、'project' 或 'local'
effort否该智能体的推理努力级别,接受命名级别或整数
permissionMode否该智能体内工具执行的权限模式,何时适用由子智能体继承规则决定
criticalSystemReminder_EXPERIMENTAL否实验性:加进系统提示的关键提醒

AgentMcpServerSpec

指定子智能体可用的 MCP 服务器:可以是服务器名(字符串,引用父级 mcpServers 配置里的服务器),或把服务器名映射到配置的内联服务器配置记录。

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

其中 McpServerConfigForProcessTransport 是 McpStdioServerConfig | 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

默认行为:省略或为 undefined 的 settingSources 让 query() 加载与 Claude Code CLI 相同的文件系统设置:用户、项目和本地。无论该选项如何都会被读取的输入以及如何禁用它们,见「settingSources 不控制什么」。

禁用文件系统设置:

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

// 不从磁盘加载用户、项目或本地设置
const result = query({
  prompt: "Analyze this code",
  options: { settingSources: [] }
});

只加载特定的设置来源:

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

// 只加载项目设置,忽略用户和本地设置
const result = query({
  prompt: "Run CI checks",
  options: {
    settingSources: ["project"] // 只有 .claude/settings.json
  }
});

要加载 CLAUDE.md 项目说明,要在 settingSources 里包含 "project"(CLAUDE.md 加载如何与系统提示选项交互,见「修改系统提示」)。

设置优先级:加载多个来源时,设置按下面的优先级合并(从高到低):本地设置(.claude/settings.local.json)、项目设置(.claude/settings.json)、用户设置(~/.claude/settings.json)。agents、allowedTools 和 settings 这类编程选项覆盖用户、项目和本地文件系统设置;托管策略设置优先于编程选项。

PermissionMode

type PermissionMode =
  | "default" // 标准权限行为
  | "acceptEdits" // 自动接受文件编辑
  | "bypassPermissions" // 绕过权限检查;显式的 ask 规则仍会提示
  | "plan" // 规划模式——只探索不编辑
  | "dontAsk" // 不提示权限,未预批准就拒绝
  | "auto"; // 由模型分类器审查 shell 命令和网络请求等动作

CanUseTool

控制工具使用的自定义权限函数类型。该函数是 SDK 对交互式权限提示的替代:只在权限评估流程解析为提示时才调用。已经被 allowedTools 条目、设置允许规则或权限模式(如 acceptEdits 或 bypassPermissions)批准的工具调用从不调用它;要把关每个工具调用,用 PreToolUse hook。允许规则不会预批准没有任何模式自动批准的动作;哪些会到达回调以及在 dontAsk 和 auto 模式下发生什么,见「权限如何评估」。

type CanUseTool = (
  toolName: string,
  input: Record<string, unknown>,
  options: {
    signal: AbortSignal;
    suggestions?: PermissionUpdate[];
    blockedPath?: string;
    mcpServer?: { name: string; source: string };
    decisionReason?: string;
    defaultToNo?: boolean;
    suppressAlwaysAllowRule?: boolean;
    toolUseID: string;
    agentID?: string;
    requestId: string;
  }
) => Promise<PermissionResult | null>;
选项类型说明
signalAbortSignal操作应被中止时发出信号
suggestionsPermissionUpdate[]建议的权限更新,使用户不会为该工具再被提示。Bash 提示包含带 localSettings 目的地的建议,所以把它在 updatedPermissions 里返回会把规则写到 .claude/settings.local.json 并跨会话持续
blockedPathstring触发权限请求的文件路径(如适用)
mcpServer{ name: string; source: string }对 mcp__* 工具,提供它的 MCP 服务器及该服务器的定义来自哪里,字段同 McpServerProvenance;其他工具不存在(需要 Agent SDK v0.3.274 及以上)
decisionReasonstring解释为什么触发了这个权限请求
defaultToNoboolean为 true 时,一次误按键绝不能批准该请求:让你的提示停在它的拒绝选项上、不要预选批准、也不要提供一键批准的快捷方式(需要 Agent SDK v0.3.268 及以上)
suppressAlwaysAllowRuleboolean为 true 时,不要为该请求提供持久的"始终允许"选择,因为它会写入的规则授予的比该请求自己的动作更多(需要 Agent SDK v0.3.268 及以上)
toolUseIDstring该助手消息内这个具体工具调用的唯一标识
agentIDstring在子智能体内运行时,该子智能体的 ID
requestIdstringcontrol_request 信封的 request_id;你的应用在 SDK 之外发送的 control_response(如签名的 HTTP POST)必须回传该值,让 Claude Code 进程能把回复与请求匹配

回调通常通过返回 PermissionResult 来解决请求,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;

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

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

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

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

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

SdkPluginConfig

在 SDK 里加载插件的配置。

type SdkPluginConfig = {
  type: "local";
  path: string;
  skipMcpDiscovery?: boolean;
};
字段类型说明
type'local'必须是 'local'(目前只支持本地插件)
pathstring插件目录的绝对或相对路径
skipMcpDiscoveryboolean为 true 时,SDK 从该插件加载 skills、hooks、智能体和命令,但不读它的 .mcp.json 或清单里的 mcpServers;当你的应用拥有该插件的 MCP 连接时设置
plugins: [
  { type: "local", path: "./my-plugin" },
  { type: "local", path: "/absolute/path/to/plugin" }
];

创建和使用插件的完整信息见「插件」。