SpyBara
Go Premium

Documentation 2026-05-04 22:58 UTC to 2026-05-05 23:00 UTC

20 files changed +1,759 −140. View all changes and history on the product overview
2026
Tue 19 06:34 Mon 18 23:59 Sun 17 01:01 Fri 15 22:58 Thu 14 17:02 Wed 13 23:01 Tue 12 22:57 Mon 11 23:00 Sun 10 23:03 Sat 9 04:57 Fri 8 22:00 Thu 7 22:59 Tue 5 23:00 Mon 4 22:58

agent-sdk/agent-loop.md +395 −0 created

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# 代理循环如何工作

6 

7> 了解消息生命周期、工具执行、上下文窗口和支持 SDK 代理的架构。

8 

9Agent SDK 让你能够在自己的应用程序中嵌入 Claude Code 的自主代理循环。SDK 是一个独立的包,让你能够以编程方式控制工具、权限、成本限制和输出。你不需要安装 Claude Code CLI 就能使用它。

10 

11启动代理时,SDK 运行与 [Claude Code 相同的执行循环](/zh-CN/how-claude-code-works#the-agentic-loop):Claude 评估你的提示,调用工具采取行动,接收结果,然后重复直到任务完成。本页解释循环内部发生的情况,以便你能够有效地构建、调试和优化代理。

12 

13## 循环概览

14 

15每个代理会话都遵循相同的周期:

16 

17<img src="https://mintcdn.com/claude-code/gvy2DIUELtNA8qD3/images/agent-loop-diagram.svg?fit=max&auto=format&n=gvy2DIUELtNA8qD3&q=85&s=192e1bd6c8a2950a16e5ee0b94e27e26" alt="代理循环:提示输入,Claude 评估,分支到工具调用或最终答案" width="680" height="150" data-path="images/agent-loop-diagram.svg" />

18 

191. **接收提示。** Claude 接收你的提示,以及系统提示、工具定义和对话历史。SDK 产生一个 [`SystemMessage`](#message-types),子类型为 `"init"`,包含会话元数据。

202. **评估并响应。** Claude 评估当前状态并确定如何继续。它可能用文本响应、请求一个或多个工具调用,或两者都有。SDK 产生一个 [`AssistantMessage`](#message-types),包含文本和任何工具调用请求。

213. **执行工具。** SDK 运行每个请求的工具并收集结果。每组工具结果反馈给 Claude 以做出下一个决定。你可以使用 [hooks](/zh-CN/agent-sdk/hooks) 在工具运行前拦截、修改或阻止工具调用。

224. **重复。** 步骤 2 和 3 作为一个循环重复。每个完整循环是一个轮次。Claude 继续调用工具并处理结果,直到产生没有工具调用的响应。

235. **返回结果。** SDK 产生最终的 [`AssistantMessage`](#message-types),包含文本响应(无工具调用),然后是 [`ResultMessage`](#message-types),包含最终文本、令牌使用、成本和会话 ID。

24 

25一个快速问题("这里有什么文件?")可能需要一两个轮次调用 `Glob` 并响应结果。一个复杂任务("重构认证模块并更新测试")可以跨多个轮次链接数十个工具调用,读取文件、编辑代码和运行测试,Claude 根据每个结果调整其方法。

26 

27## 轮次和消息

28 

29轮次是循环内的一个往返:Claude 产生包含工具调用的输出,SDK 执行这些工具,结果自动反馈给 Claude。这发生在不将控制权交回给你的代码的情况下。轮次继续进行,直到 Claude 产生没有工具调用的输出,此时循环结束并交付最终结果。

30 

31考虑对于提示"修复 auth.ts 中的失败测试"的完整会话可能是什么样子。

32 

33首先,SDK 将你的提示发送给 Claude 并产生一个 [`SystemMessage`](#message-types),包含会话元数据。然后循环开始:

34 

351. **轮次 1:** Claude 调用 `Bash` 运行 `npm test`。SDK 产生一个 [`AssistantMessage`](#message-types),包含工具调用,执行命令,然后产生一个 [`UserMessage`](#message-types),包含输出(三个失败)。

362. **轮次 2:** Claude 在 `auth.ts` 和 `auth.test.ts` 上调用 `Read`。SDK 返回文件内容并产生一个 `AssistantMessage`。

373. **轮次 3:** Claude 调用 `Edit` 修复 `auth.ts`,然后调用 `Bash` 重新运行 `npm test`。所有三个测试都通过。SDK 产生一个 `AssistantMessage`。

384. **最后轮次:** Claude 产生仅包含文本的响应,没有工具调用:"修复了认证错误,所有三个测试现在都通过了。" SDK 产生最终的 `AssistantMessage`,包含此文本,然后是 [`ResultMessage`](#message-types),包含相同的文本加上成本和使用情况。

39 

40那是四个轮次:三个有工具调用,一个最终仅包含文本的响应。

41 

42你可以使用 `max_turns` / `maxTurns` 限制循环,它仅计算工具使用轮次。例如,上面循环中的 `max_turns=2` 会在编辑步骤之前停止。你也可以使用 `max_budget_usd` / `maxBudgetUsd` 根据支出阈值限制轮次。

43 

44没有限制的情况下,循环运行直到 Claude 自己完成,这对于范围明确的任务很好,但对于开放式提示("改进这个代码库")可能运行很长时间。为生产代理设置预算是一个很好的默认值。有关选项参考,请参阅下面的 [轮次和预算](#turns-and-budget)。

45 

46## 消息类型

47 

48当循环运行时,SDK 产生一个消息流。每条消息都有一个类型,告诉你它来自循环的哪个阶段。五个核心类型是:

49 

50* **`SystemMessage`:** 会话生命周期事件。`subtype` 字段区分它们:`"init"` 是第一条消息(会话元数据),`"compact_boundary"` 在 [压缩](#automatic-compaction) 后触发。在 TypeScript 中,压缩边界是其自己的 [`SDKCompactBoundaryMessage`](/zh-CN/agent-sdk/typescript#sdkcompactboundarymessage) 类型,而不是 `SDKSystemMessage` 的子类型。

51* **`AssistantMessage`:** 在每个 Claude 响应后发出,包括最终仅包含文本的响应。包含该轮次的文本内容块和工具调用块。

52* **`UserMessage`:** 在每个工具执行后发出,包含发送回 Claude 的工具结果内容。也为你在循环中间流式传输的任何用户输入发出。

53* **`StreamEvent`:** 仅在启用部分消息时发出。包含原始 API 流事件(文本增量、工具输入块)。请参阅 [流式响应](/zh-CN/agent-sdk/streaming-output)。

54* **`ResultMessage`:** 标记代理循环的结束。包含最终文本结果、令牌使用、成本和会话 ID。检查 `subtype` 字段以确定任务是否成功或达到限制。少数尾随系统事件(如 `prompt_suggestion`)可能在其后到达,因此迭代流直到完成,而不是在结果处中断。请参阅 [处理结果](#handle-the-result)。

55 

56这五种类型涵盖了两个 SDK 中完整的代理循环生命周期。TypeScript SDK 还产生额外的可观测性事件(hook 事件、工具进度、速率限制、任务通知),提供额外的细节,但不是驱动循环所必需的。有关完整列表,请参阅 [Python 消息类型参考](/zh-CN/agent-sdk/python#message-types) 和 [TypeScript 消息类型参考](/zh-CN/agent-sdk/typescript#message-types)。

57 

58### 处理消息

59 

60你处理哪些消息取决于你正在构建什么:

61 

62* **仅最终结果:** 处理 `ResultMessage` 以获取输出、成本以及任务是否成功或达到限制。

63* **进度更新:** 处理 `AssistantMessage` 以查看 Claude 每个轮次在做什么,包括它调用了哪些工具。

64* **实时流式传输:** 启用部分消息(Python 中的 `include_partial_messages`,TypeScript 中的 `includePartialMessages`)以实时获取 `StreamEvent` 消息。请参阅 [实时流式响应](/zh-CN/agent-sdk/streaming-output)。

65 

66检查消息类型的方式取决于 SDK:

67 

68* **Python:** 使用从 `claude_agent_sdk` 导入的类的 `isinstance()` 检查消息类型(例如,`isinstance(message, ResultMessage)`)。

69* **TypeScript:** 检查 `type` 字符串字段(例如,`message.type === "result"`)。`AssistantMessage` 和 `UserMessage` 在 `.message` 字段中包装原始 API 消息,因此内容块位于 `message.message.content`,而不是 `message.content`。

70 

71<Accordion title="示例:检查消息类型并处理结果">

72 <CodeGroup>

73 ```python Python theme={null}

74 from claude_agent_sdk import query, AssistantMessage, ResultMessage

75 

76 async for message in query(prompt="Summarize this project"):

77 if isinstance(message, AssistantMessage):

78 print(f"Turn completed: {len(message.content)} content blocks")

79 if isinstance(message, ResultMessage):

80 if message.subtype == "success":

81 print(message.result)

82 else:

83 print(f"Stopped: {message.subtype}")

84 ```

85 

86 ```typescript TypeScript theme={null}

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

88 

89 for await (const message of query({ prompt: "Summarize this project" })) {

90 if (message.type === "assistant") {

91 console.log(`Turn completed: ${message.message.content.length} content blocks`);

92 }

93 if (message.type === "result") {

94 if (message.subtype === "success") {

95 console.log(message.result);

96 } else {

97 console.log(`Stopped: ${message.subtype}`);

98 }

99 }

100 }

101 ```

102 </CodeGroup>

103</Accordion>

104 

105## 工具执行

106 

107工具赋予你的代理采取行动的能力。没有工具,Claude 只能用文本响应。有了工具,Claude 可以读取文件、运行命令、搜索代码并与外部服务交互。

108 

109### 内置工具

110 

111SDK 包含与 Claude Code 相同的工具:

112 

113| 类别 | 工具 | 它们做什么 |

114| :------- | :-------------------------------------------- | :--------------------- |

115| **文件操作** | `Read`、`Edit`、`Write` | 读取、修改和创建文件 |

116| **搜索** | `Glob`、`Grep` | 按模式查找文件,使用正则表达式搜索内容 |

117| **执行** | `Bash` | 运行 shell 命令、脚本、git 操作 |

118| **Web** | `WebSearch`、`WebFetch` | 搜索网络、获取和解析页面 |

119| **发现** | `ToolSearch` | 动态查找和按需加载工具,而不是预加载所有工具 |

120| **编排** | `Agent`、`Skill`、`AskUserQuestion`、`TodoWrite` | 生成子代理、调用技能、询问用户、跟踪任务 |

121 

122除了内置工具,你还可以:

123 

124* **使用 [MCP 服务器](/zh-CN/agent-sdk/mcp) 连接外部服务**(数据库、浏览器、API)

125* **使用 [自定义工具处理程序](/zh-CN/agent-sdk/custom-tools) 定义自定义工具**

126* **通过 [设置源](/zh-CN/agent-sdk/claude-code-features) 加载项目技能**以实现可重用工作流

127 

128### 工具权限

129 

130Claude 根据任务确定调用哪些工具,但你控制这些调用是否被允许执行。你可以自动批准特定工具、完全阻止其他工具,或要求对所有工具进行批准。三个选项一起工作以确定什么运行:

131 

132* **`allowed_tools` / `allowedTools`** 自动批准列出的工具。具有 `["Read", "Glob", "Grep"]` 在其允许工具列表中的只读代理运行这些工具而不提示。未列出的工具仍然可用但需要权限。

133* **`disallowed_tools` / `disallowedTools`** 阻止列出的工具,无论其他设置如何。有关在工具运行前检查规则的顺序,请参阅 [权限](/zh-CN/agent-sdk/permissions)。

134* **`permission_mode` / `permissionMode`** 控制对不被允许或拒绝规则覆盖的工具发生什么。有关可用模式,请参阅 [权限模式](#permission-mode)。

135 

136你也可以使用 `"Bash(npm *)"` 之类的规则来限制单个工具,以仅允许特定命令。有关完整规则语法,请参阅 [权限](/zh-CN/agent-sdk/permissions)。

137 

138当工具被拒绝时,Claude 接收拒绝消息作为工具结果,通常尝试不同的方法或报告它无法继续。

139 

140### 并行工具执行

141 

142当 Claude 在单个轮次中请求多个工具调用时,两个 SDK 都可以根据工具并发或顺序运行它们。只读工具(如 `Read`、`Glob`、`Grep` 和标记为只读的 MCP 工具)可以并发运行。修改状态的工具(如 `Edit`、`Write` 和 `Bash`)顺序运行以避免冲突。

143 

144自定义工具默认为顺序执行。要为自定义工具启用并行执行,请在其注释中设置 `readOnlyHint`。[TypeScript](/zh-CN/agent-sdk/typescript#tool) 和 [Python](/zh-CN/agent-sdk/python#tool) SDK 都使用来自 MCP SDK 的此字段名。

145 

146## 控制循环如何运行

147 

148你可以限制循环进行多少轮次、成本多少、Claude 推理的深度,以及工具是否需要在运行前获得批准。所有这些都是 [`ClaudeAgentOptions`](/zh-CN/agent-sdk/python#claudeagentoptions)(Python)/ [`Options`](/zh-CN/agent-sdk/typescript#options)(TypeScript)上的字段。

149 

150### 轮次和预算

151 

152| 选项 | 它控制什么 | 默认值 |

153| :-------------------------------------- | :--------- | :-- |

154| 最大轮次(`max_turns` / `maxTurns`) | 最大工具使用往返次数 | 无限制 |

155| 最大预算(`max_budget_usd` / `maxBudgetUsd`) | 停止前的最大成本 | 无限制 |

156 

157当达到任一限制时,SDK 返回一个 `ResultMessage`,包含相应的错误子类型(`error_max_turns` 或 `error_max_budget_usd`)。有关如何检查这些子类型,请参阅 [处理结果](#handle-the-result),有关语法,请参阅 [`ClaudeAgentOptions`](/zh-CN/agent-sdk/python#claudeagentoptions) / [`Options`](/zh-CN/agent-sdk/typescript#options)。

158 

159### 努力级别

160 

161`effort` 选项控制 Claude 应用多少推理。较低的努力级别每个轮次使用更少的令牌并降低成本。并非所有模型都支持努力参数。有关哪些模型支持它,请参阅 [Effort](https://platform.claude.com/docs/en/build-with-claude/effort)。

162 

163| 级别 | 行为 | 适合 |

164| :--------- | :-------- | :--------------------- |

165| `"low"` | 最小推理,快速响应 | 文件查找、列出目录 |

166| `"medium"` | 平衡推理 | 常规编辑、标准任务 |

167| `"high"` | 彻底分析 | 重构、调试 |

168| `"xhigh"` | 扩展推理深度 | 编码和代理任务;在 Opus 4.7 上推荐 |

169| `"max"` | 最大推理深度 | 需要深度分析的多步骤问题 |

170 

171如果你不设置 `effort`,Python SDK 会将参数保留未设置,并遵从模型的默认行为。TypeScript SDK 默认为 `"high"`。

172 

173<Note>

174 `effort` 在每个响应内交换延迟和令牌成本以获得推理深度。[扩展思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) 是一个单独的功能,在输出中产生可见的思维链块。它们是独立的:你可以设置 `effort: "low"` 并启用扩展思考,或 `effort: "max"` 而不启用它。

175</Note>

176 

177对于执行简单、范围明确的任务(如列出文件或运行单个 grep)的代理,使用较低的努力来降低成本和延迟。在顶级 `query()` 选项中为整个会话设置 `effort`,或在 [`AgentDefinition`](/zh-CN/agent-sdk/subagents#agentdefinition-configuration) 上使用 `effort` 字段为每个子代理设置以覆盖会话级别。

178 

179### 权限模式

180 

181权限模式选项(Python 中的 `permission_mode`,TypeScript 中的 `permissionMode`)控制代理是否在使用工具前请求批准:

182 

183| 模式 | 行为 |

184| :--------------------- | :----------------------------------------------------------------------------------------------- |

185| `"default"` | 不被允许规则覆盖的工具触发你的批准回调;没有回调意味着拒绝 |

186| `"acceptEdits"` | 自动批准文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等);其他 Bash 命令遵循默认规则 |

187| `"plan"` | 只读工具运行;Claude 探索并产生计划而不编辑你的源文件 |

188| `"dontAsk"` | 从不提示。由 [权限规则](/zh-CN/settings#permission-settings) 预批准的工具运行,其他一切被拒绝 |

189| `"auto"`(仅 TypeScript) | 使用模型分类器批准或拒绝每个工具调用。有关可用性和行为,请参阅 [自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) |

190| `"bypassPermissions"` | 运行所有允许的工具而不询问。在 Unix 上以 root 身份运行时无法使用。仅在隔离环境中使用,其中代理的操作无法影响你关心的系统 |

191 

192对于交互式应用程序,使用 `"default"` 和工具批准回调来显示批准提示。对于开发机器上的自主代理,`"acceptEdits"` 自动批准文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等),同时仍然在允许规则后面限制其他 `Bash` 命令。为 CI、容器或其他隔离环境保留 `"bypassPermissions"`。有关完整详情,请参阅 [权限](/zh-CN/agent-sdk/permissions)。

193 

194### 模型

195 

196如果你不设置 `model`,SDK 使用 Claude Code 的默认值,这取决于你的身份验证方法和订阅。显式设置它(例如,`model="claude-sonnet-4-6"`)以固定特定模型或使用较小的模型以获得更快、更便宜的代理。有关可用 ID,请参阅 [models](https://platform.claude.com/docs/en/about-claude/models)。

197 

198## 上下文窗口

199 

200上下文窗口是会话期间可用于 Claude 的信息总量。它在会话内的轮次之间不重置。一切都累积:系统提示、工具定义、对话历史、工具输入和工具输出。在轮次之间保持相同的内容(系统提示、工具定义、CLAUDE.md)自动 [提示缓存](https://platform.claude.com/docs/en/build-with-claude/prompt-caching),这减少了重复前缀的成本和延迟。

201 

202### 什么消耗上下文

203 

204以下是每个组件如何影响 SDK 中上下文的方式:

205 

206| 源 | 何时加载 | 影响 |

207| :--------------- | :---------------------------------------------------------------- | :-------------------------------------------------------------------------- |

208| **系统提示** | 每个请求 | 小的固定成本,始终存在 |

209| **CLAUDE.md 文件** | 会话开始,通过 [`settingSources`](/zh-CN/agent-sdk/claude-code-features) | 每个请求中的完整内容(但提示缓存,所以仅第一个请求支付全部成本) |

210| **工具定义** | 每个请求 | 每个工具添加其架构;使用 [MCP 工具搜索](/zh-CN/agent-sdk/mcp#mcp-tool-search) 按需加载工具而不是一次全部 |

211| **对话历史** | 在轮次中累积 | 随着每个轮次增长:提示、响应、工具输入、工具输出 |

212| **技能描述** | 会话开始,通过设置源 | 简短摘要;完整内容仅在调用时加载 |

213 

214大型工具输出消耗大量上下文。读取大文件或运行具有详细输出的命令可以在单个轮次中使用数千个令牌。上下文在轮次中累积,因此具有许多工具调用的较长会话比短会话构建更多上下文。

215 

216### 自动压缩

217 

218当上下文窗口接近其限制时,SDK 自动压缩对话:它总结较旧的历史以释放空间,保持你最近的交换和关键决定完整。当这发生时,SDK 在流中发出一条消息,其 `type: "system"` 和 `subtype: "compact_boundary"`(在 Python 中这是一个 `SystemMessage`;在 TypeScript 中它是一个单独的 `SDKCompactBoundaryMessage` 类型)。

219 

220压缩用摘要替换较旧的消息,因此对话早期的特定指令可能不会被保留。持久规则属于 CLAUDE.md(通过 [`settingSources`](/zh-CN/agent-sdk/claude-code-features) 加载),而不是初始提示,因为 CLAUDE.md 内容在每个请求上重新注入。

221 

222你可以通过多种方式自定义压缩行为:

223 

224* **CLAUDE.md 中的总结指令:** 压缩器像任何其他上下文一样读取你的 CLAUDE.md,所以你可以包含一个部分告诉它在总结时保留什么。部分标题是自由形式的(不是魔法字符串);压缩器根据意图匹配。

225* **`PreCompact` hook:** 在压缩发生前运行自定义逻辑,例如存档完整成绩单。hook 接收一个 `trigger` 字段(`manual` 或 `auto`)。请参阅 [hooks](/zh-CN/agent-sdk/hooks)。

226* **手动压缩:** 发送 `/compact` 作为提示字符串以按需触发压缩。(以这种方式发送的斜杠命令是 SDK 输入,而不是仅限 CLI 的快捷方式。请参阅 [SDK 中的斜杠命令](/zh-CN/agent-sdk/slash-commands)。)

227 

228<Accordion title="示例:CLAUDE.md 中的总结指令">

229 向你的项目的 CLAUDE.md 添加一个部分,告诉压缩器保留什么。标题名称不特殊;使用任何清晰的标签。

230 

231 ```markdown CLAUDE.md theme={null}

232 # Summary instructions

233 

234 When summarizing this conversation, always preserve:

235 - The current task objective and acceptance criteria

236 - File paths that have been read or modified

237 - Test results and error messages

238 - Decisions made and the reasoning behind them

239 ```

240</Accordion>

241 

242### 保持上下文高效

243 

244对于长时间运行的代理的几个策略:

245 

246* **为子任务使用子代理。** 每个子代理以新鲜对话开始(没有先前的消息历史,尽管它确实加载自己的系统提示和项目级上下文,如 CLAUDE.md)。它看不到父级的轮次,只有其最终响应作为工具结果返回给父级。主代理的上下文增长该摘要,而不是完整的子任务成绩单。有关详情,请参阅 [子代理继承什么](/zh-CN/agent-sdk/subagents#what-subagents-inherit)。

247* **对工具有选择性。** 每个工具定义占用上下文空间。在 [`AgentDefinition`](/zh-CN/agent-sdk/subagents#agentdefinition-configuration) 上使用 `tools` 字段将子代理限制在它们需要的最小集合,并使用 [MCP 工具搜索](/zh-CN/agent-sdk/mcp#mcp-tool-search) 按需加载工具而不是预加载所有工具。

248* **监视 MCP 服务器成本。** 每个 MCP 服务器将其所有工具架构添加到每个请求。具有许多工具的几个服务器可以在代理执行任何工作之前消耗大量上下文。`ToolSearch` 工具可以通过按需加载工具而不是预加载所有工具来帮助。有关配置,请参阅 [MCP 工具搜索](/zh-CN/agent-sdk/mcp#mcp-tool-search)。

249* **对常规任务使用较低的努力。** 为仅需要读取文件或列出目录的代理设置 [努力](#effort-level) 为 `"low"`。这减少了令牌使用和成本。

250 

251有关每个功能上下文成本的详细分解,请参阅 [理解上下文成本](/zh-CN/features-overview#understand-context-costs)。

252 

253## 会话和连续性

254 

255与 SDK 的每次交互都创建或继续一个会话。从 `ResultMessage.session_id`(在两个 SDK 中都可用)捕获会话 ID 以稍后恢复。TypeScript SDK 也将其作为初始化 `SystemMessage` 上的直接字段公开;在 Python 中它嵌套在 `SystemMessage.data` 中。

256 

257当你恢复时,来自先前轮次的完整上下文被恢复:读取的文件、执行的分析和采取的操作。你也可以分叉一个会话以分支到不同的方法而不修改原始方法。

258 

259有关恢复、继续和分叉模式的完整指南,请参阅 [会话管理](/zh-CN/agent-sdk/sessions)。

260 

261<Note>

262 在 Python 中,`ClaudeSDKClient` 跨多个调用自动处理会话 ID。有关详情,请参阅 [Python SDK 参考](/zh-CN/agent-sdk/python#choosing-between-query-and-claudesdkclient)。

263</Note>

264 

265## 处理结果

266 

267当循环结束时,`ResultMessage` 告诉你发生了什么并给你输出。`subtype` 字段(在两个 SDK 中都可用)是检查终止状态的主要方式。

268 

269| 结果子类型 | 发生了什么 | `result` 字段可用? |

270| :------------------------------------ | :----------------------- | :------------: |

271| `success` | Claude 正常完成了任务 | 是 |

272| `error_max_turns` | 在完成前达到 `maxTurns` 限制 | 否 |

273| `error_max_budget_usd` | 在完成前达到 `maxBudgetUsd` 限制 | 否 |

274| `error_during_execution` | 错误中断了循环(例如,API 失败或取消的请求) | 否 |

275| `error_max_structured_output_retries` | 结构化输出验证在配置的重试限制后失败 | 否 |

276 

277`result` 字段(最终文本输出)仅在 `success` 变体上存在,因此在读取它之前始终检查子类型。所有结果子类型都包含 `total_cost_usd`、`usage`、`num_turns` 和 `session_id`,因此你可以跟踪成本并在错误后恢复。在 Python 中,`total_cost_usd` 和 `usage` 被类型化为可选的,在某些错误路径上可能是 `None`,因此在格式化它们之前进行保护。有关解释 `usage` 字段的详情,请参阅 [跟踪成本和使用](/zh-CN/agent-sdk/cost-tracking)。

278 

279结果还包括一个 `stop_reason` 字段(TypeScript 中的 `string | null`,Python 中的 `str | None`),指示模型为什么在其最后轮次停止生成。常见值是 `end_turn`(模型正常完成)、`max_tokens`(达到输出令牌限制)和 `refusal`(模型拒绝了请求)。在错误结果子类型上,`stop_reason` 携带循环结束前最后一个助手响应的值。要检测拒绝,检查 `stop_reason === "refusal"`(TypeScript)或 `stop_reason == "refusal"`(Python)。有关完整类型,请参阅 [`SDKResultMessage`](/zh-CN/agent-sdk/typescript#sdkresultmessage)(TypeScript)或 [`ResultMessage`](/zh-CN/agent-sdk/python#resultmessage)(Python)。

280 

281## Hooks

282 

283[Hooks](/zh-CN/agent-sdk/hooks) 是在循环中特定点触发的回调:在工具运行前、返回后、代理完成时等。一些常用的 hooks 是:

284 

285| Hook | 何时触发 | 常见用途 |

286| :------------------------------- | :--------- | :---------- |

287| `PreToolUse` | 在工具执行前 | 验证输入、阻止危险命令 |

288| `PostToolUse` | 在工具返回后 | 审计输出、触发副作用 |

289| `UserPromptSubmit` | 当发送提示时 | 将额外上下文注入提示 |

290| `Stop` | 当代理完成时 | 验证结果、保存会话状态 |

291| `SubagentStart` / `SubagentStop` | 当子代理生成或完成时 | 跟踪和聚合并行任务结果 |

292| `PreCompact` | 在上下文压缩前 | 在总结前存档完整成绩单 |

293 

294Hooks 在你的应用程序进程中运行,而不是在代理的上下文窗口内,因此它们不消耗上下文。Hooks 也可以短路循环:拒绝工具调用的 `PreToolUse` hook 防止它执行,Claude 接收拒绝消息。

295 

296两个 SDK 都支持上述所有事件。TypeScript SDK 包括 Python 尚不支持的额外事件。有关完整事件列表、每个 SDK 的可用性和完整回调 API,请参阅 [使用 hooks 控制执行](/zh-CN/agent-sdk/hooks)。

297 

298## 将其全部放在一起

299 

300此示例将本页的关键概念组合到修复失败测试的单个代理中。它使用允许的工具(自动批准,以便代理自主运行)、项目设置和轮次和推理努力的安全限制来配置代理。当循环运行时,它捕获会话 ID 以进行潜在恢复、处理最终结果并打印总成本。

301 

302<CodeGroup>

303 ```python Python theme={null}

304 import asyncio

305 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage

306 

307 

308 async def run_agent():

309 session_id = None

310 

311 async for message in query(

312 prompt="Find and fix the bug causing test failures in the auth module",

313 options=ClaudeAgentOptions(

314 allowed_tools=[

315 "Read",

316 "Edit",

317 "Bash",

318 "Glob",

319 "Grep",

320 ], # Listing tools here auto-approves them (no prompting)

321 setting_sources=[

322 "project"

323 ], # Load CLAUDE.md, skills, hooks from current directory

324 max_turns=30, # Prevent runaway sessions

325 effort="high", # Thorough reasoning for complex debugging

326 ),

327 ):

328 # Handle the final result

329 if isinstance(message, ResultMessage):

330 session_id = message.session_id # Save for potential resumption

331 

332 if message.subtype == "success":

333 print(f"Done: {message.result}")

334 elif message.subtype == "error_max_turns":

335 # Agent ran out of turns. Resume with a higher limit.

336 print(f"Hit turn limit. Resume session {session_id} to continue.")

337 elif message.subtype == "error_max_budget_usd":

338 print("Hit budget limit.")

339 else:

340 print(f"Stopped: {message.subtype}")

341 if message.total_cost_usd is not None:

342 print(f"Cost: ${message.total_cost_usd:.4f}")

343 

344 

345 asyncio.run(run_agent())

346 ```

347 

348 ```typescript TypeScript theme={null}

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

350 

351 let sessionId: string | undefined;

352 

353 for await (const message of query({

354 prompt: "Find and fix the bug causing test failures in the auth module",

355 options: {

356 allowedTools: ["Read", "Edit", "Bash", "Glob", "Grep"], // Listing tools here auto-approves them (no prompting)

357 settingSources: ["project"], // Load CLAUDE.md, skills, hooks from current directory

358 maxTurns: 30, // Prevent runaway sessions

359 effort: "high" // Thorough reasoning for complex debugging

360 }

361 })) {

362 // Save the session ID to resume later if needed

363 if (message.type === "system" && message.subtype === "init") {

364 sessionId = message.session_id;

365 }

366 

367 // Handle the final result

368 if (message.type === "result") {

369 if (message.subtype === "success") {

370 console.log(`Done: ${message.result}`);

371 } else if (message.subtype === "error_max_turns") {

372 // Agent ran out of turns. Resume with a higher limit.

373 console.log(`Hit turn limit. Resume session ${sessionId} to continue.`);

374 } else if (message.subtype === "error_max_budget_usd") {

375 console.log("Hit budget limit.");

376 } else {

377 console.log(`Stopped: ${message.subtype}`);

378 }

379 console.log(`Cost: $${message.total_cost_usd.toFixed(4)}`);

380 }

381 }

382 ```

383</CodeGroup>

384 

385## 后续步骤

386 

387现在你理解了循环,以下是根据你正在构建的内容去往的地方:

388 

389* **还没有运行代理?** 从 [快速入门](/zh-CN/agent-sdk/quickstart) 开始,获取 SDK 安装并查看完整示例端到端运行。

390* **准备好连接到你的项目?** [加载 CLAUDE.md、技能和文件系统 hooks](/zh-CN/agent-sdk/claude-code-features),以便代理自动遵循你的项目约定。

391* **构建交互式 UI?** 启用 [流式传输](/zh-CN/agent-sdk/streaming-output) 以在循环运行时显示实时文本和工具调用。

392* **需要对代理能做什么进行更严格的控制?** 使用 [权限](/zh-CN/agent-sdk/permissions) 锁定工具访问,并使用 [hooks](/zh-CN/agent-sdk/hooks) 在工具执行前审计、阻止或转换工具调用。

393* **运行长期或昂贵的任务?** 将隔离的工作卸载到 [子代理](/zh-CN/agent-sdk/subagents) 以保持你的主上下文精简。

394 

395有关代理循环的更广泛概念图(不是 SDK 特定的),请参阅 [Claude Code 如何工作](/zh-CN/how-claude-code-works)。

agent-sdk/hooks.md +11 −11

Details

236您的回调返回一个具有两类字段的对象:236您的回调返回一个具有两类字段的对象:

237 237 

238* **顶级字段**控制对话:`systemMessage` 将消息注入到对话中,对模型可见,`continue`(Python 中的 `continue_`)确定代理在此 hook 后是否继续运行。238* **顶级字段**控制对话:`systemMessage` 将消息注入到对话中,对模型可见,`continue`(Python 中的 `continue_`)确定代理在此 hook 后是否继续运行。

239* **`hookSpecificOutput`** 控制当前操作。内部的字段取决于 hook 事件类型。对于 `PreToolUse` hooks,这是您设置 `permissionDecision`(`"allow"`、`"deny"` 或 `"ask"`)、`permissionDecisionReason` 和 `updatedInput` 的地方。在 TypeScript SDK 中,`permissionDecision` 也接受 `"defer"` 以结束查询并[稍后恢复](/zh-CN/hooks#defer-a-tool-call-for-later);此值在 Python SDK 中不可用。对于 `PostToolUse` hooks,您可以设置 `additionalContext` 以将信息附加到工具结果。239* **`hookSpecificOutput`** 控制当前操作。内部的字段取决于 hook 事件类型。对于 `PreToolUse` hooks,这是您设置 `permissionDecision`(`"allow"`、`"deny"` 或 `"ask"`)、`permissionDecisionReason` 和 `updatedInput` 的地方。在 TypeScript SDK 中,`permissionDecision` 也接受 `"defer"` 以结束查询并[稍后恢复](/zh-CN/hooks#defer-a-tool-call-for-later);此值在 Python SDK 中不可用。对于 `PostToolUse` hooks,您可以设置 `additionalContext` 以将信息附加到工具结果,或设置 `updatedToolOutput` 以在 Claude 看到之前完全替换工具的输出。

240 240 

241返回 `{}` 以允许操作而不进行更改。SDK 回调 hooks 使用与 [Claude Code shell 命令 hooks](/zh-CN/hooks#json-output) 相同的 JSON 输出格式,其中记录了每个字段和事件特定的选项。对于 SDK 类型定义,请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#sync-hook-json-output) 和 [Python](/zh-CN/agent-sdk/python#sync-hook-json-output) SDK 参考。241返回 `{}` 以允许操作而不进行更改。SDK 回调 hooks 使用与 [Claude Code shell 命令 hooks](/zh-CN/hooks#json-output) 相同的 JSON 输出格式,其中记录了每个字段和事件特定的选项。对于 SDK 类型定义,请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#sync-hook-json-output) 和 [Python](/zh-CN/agent-sdk/python#sync-hook-json-output) SDK 参考。

242 242 


417 ```417 ```

418</CodeGroup>418</CodeGroup>

419 419 

420### 链接多个 hooks420### 注册多个 hooks

421 421 

422Hooks 按它们在数组中出现的顺序执行。保持每个 hook 专注于单一责任,并为复杂逻辑链接多个 hooks:422当事件触发时,所有匹配的 hooks 并行运行。对于权限决策,最严格的结果获胜:单个 `deny` 会阻止工具调用,无论其他 hooks 返回什么。由于完成顺序是不确定的,请编写每个 hook 以独立行动,而不是依赖另一个 hook 已运行。

423 

424下面的示例为每个工具调用注册三个独立检查:

423 425 

424<CodeGroup>426<CodeGroup>

425 ```python Python theme={null}427 ```python Python theme={null}

426 options = ClaudeAgentOptions(428 options = ClaudeAgentOptions(

427 hooks={429 hooks={

428 "PreToolUse": [430 "PreToolUse": [

429 HookMatcher(hooks=[rate_limiter]), # 首先:检查速率限制431 HookMatcher(hooks=[authorization_check]),

430 HookMatcher(hooks=[authorization_check]), # 其次:验证权限432 HookMatcher(hooks=[input_validator]),

431 HookMatcher(hooks=[input_sanitizer]), # 第三:清理输入433 HookMatcher(hooks=[audit_logger]),

432 HookMatcher(hooks=[audit_logger]), # 最后:记录操作

433 ]434 ]

434 }435 }

435 )436 )


439 const options = {440 const options = {

440 hooks: {441 hooks: {

441 PreToolUse: [442 PreToolUse: [

442 { hooks: [rateLimiter] }, // 首先:检查速率限制443 { hooks: [authorizationCheck] },

443 { hooks: [authorizationCheck] }, // 其次:验证权限444 { hooks: [inputValidator] },

444 { hooks: [inputSanitizer] }, // 第三:清理输入445 { hooks: [auditLogger] }

445 { hooks: [auditLogger] } // 最后:记录操作

446 ]446 ]

447 }447 }

448 };448 };

agent-sdk/migration-guide.md +289 −0 created

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# 迁移到 Claude Agent SDK

6 

7> 将 Claude Code TypeScript 和 Python SDK 迁移到 Claude Agent SDK 的指南

8 

9## 概述

10 

11Claude Code SDK 已重命名为 **Claude Agent SDK**,其文档已重新组织。这一变化反映了该 SDK 在构建超越编码任务的 AI 代理方面的更广泛功能。

12 

13## 变更内容

14 

15| 方面 | 旧版本 | 新版本 |

16| :-------------- | :-------------------------- | :------------------------------- |

17| **包名称 (TS/JS)** | `@anthropic-ai/claude-code` | `@anthropic-ai/claude-agent-sdk` |

18| **Python 包** | `claude-code-sdk` | `claude-agent-sdk` |

19| **文档位置** | Claude Code 文档 | API 指南 → Agent SDK 部分 |

20 

21<Note>

22 **文档变更:** Agent SDK 文档已从 Claude Code 文档移至 API 指南下的专门 [Agent SDK](/zh-CN/agent-sdk/overview) 部分。Claude Code 文档现在专注于 CLI 工具和自动化功能。

23</Note>

24 

25## 迁移步骤

26 

27### 对于 TypeScript/JavaScript 项目

28 

29**1. 卸载旧包:**

30 

31```bash theme={null}

32npm uninstall @anthropic-ai/claude-code

33```

34 

35**2. 安装新包:**

36 

37```bash theme={null}

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

39```

40 

41**3. 更新导入:**

42 

43将所有导入从 `@anthropic-ai/claude-code` 更改为 `@anthropic-ai/claude-agent-sdk`:

44 

45```typescript theme={null}

46// 之前

47import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-code";

48 

49// 之后

50import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";

51```

52 

53**4. 更新 package.json 依赖项:**

54 

55如果您在 `package.json` 中列出了该包,请更新它:

56 

57之前:

58 

59```json theme={null}

60{

61 "dependencies": {

62 "@anthropic-ai/claude-code": "^0.0.42"

63 }

64}

65```

66 

67之后:

68 

69```json theme={null}

70{

71 "dependencies": {

72 "@anthropic-ai/claude-agent-sdk": "^0.2.0"

73 }

74}

75```

76 

77就这样!无需进行其他代码更改。

78 

79### 对于 Python 项目

80 

81**1. 卸载旧包:**

82 

83```bash theme={null}

84pip uninstall claude-code-sdk

85```

86 

87**2. 安装新包:**

88 

89```bash theme={null}

90pip install claude-agent-sdk

91```

92 

93**3. 更新导入:**

94 

95将所有导入从 `claude_code_sdk` 更改为 `claude_agent_sdk`:

96 

97```python theme={null}

98# 之前

99from claude_code_sdk import query, ClaudeCodeOptions

100 

101# 之后

102from claude_agent_sdk import query, ClaudeAgentOptions

103```

104 

105**4. 更新类型名称:**

106 

107将 `ClaudeCodeOptions` 更改为 `ClaudeAgentOptions`:

108 

109```python theme={null}

110# 之前

111from claude_code_sdk import query, ClaudeCodeOptions

112 

113options = ClaudeCodeOptions(model="claude-opus-4-7")

114 

115# 之后

116from claude_agent_sdk import query, ClaudeAgentOptions

117 

118options = ClaudeAgentOptions(model="claude-opus-4-7")

119```

120 

121**5. 查看 [破坏性变更](#breaking-changes)**

122 

123进行完成迁移所需的任何代码更改。

124 

125## 破坏性变更

126 

127<Warning>

128 为了改进隔离和显式配置,Claude Agent SDK v0.1.0 为从 Claude Code SDK 迁移的用户引入了破坏性变更。在迁移前请仔细查看本部分。

129</Warning>

130 

131### Python:ClaudeCodeOptions 重命名为 ClaudeAgentOptions

132 

133**变更内容:** Python SDK 类型 `ClaudeCodeOptions` 已重命名为 `ClaudeAgentOptions`。

134 

135**迁移:**

136 

137```python theme={null}

138# 之前 (claude-code-sdk)

139from claude_code_sdk import query, ClaudeCodeOptions

140 

141options = ClaudeCodeOptions(model="claude-opus-4-7", permission_mode="acceptEdits")

142 

143# 之后 (claude-agent-sdk)

144from claude_agent_sdk import query, ClaudeAgentOptions

145 

146options = ClaudeAgentOptions(model="claude-opus-4-7", permission_mode="acceptEdits")

147```

148 

149**为什么变更:** 类型名称现在与"Claude Agent SDK"品牌相匹配,并在 SDK 的命名约定中提供一致性。

150 

151### 系统提示不再是默认值

152 

153**变更内容:** SDK 不再默认使用 Claude Code 的系统提示。

154 

155**迁移:**

156 

157<CodeGroup>

158 ```typescript TypeScript theme={null}

159 // 之前 (v0.0.x) - 默认使用 Claude Code 的系统提示

160 const result = query({ prompt: "Hello" });

161 

162 // 之后 (v0.1.0) - 默认使用最小系统提示

163 // 要获得旧行为,请显式请求 Claude Code 的预设:

164 const result = query({

165 prompt: "Hello",

166 options: {

167 systemPrompt: { type: "preset", preset: "claude_code" }

168 }

169 });

170 

171 // 或使用自定义系统提示:

172 const result = query({

173 prompt: "Hello",

174 options: {

175 systemPrompt: "You are a helpful coding assistant"

176 }

177 });

178 ```

179 

180 ```python Python theme={null}

181 # 之前 (v0.0.x) - 默认使用 Claude Code 的系统提示

182 async for message in query(prompt="Hello"):

183 print(message)

184 

185 # 之后 (v0.1.0) - 默认使用最小系统提示

186 # 要获得旧行为,请显式请求 Claude Code 的预设:

187 from claude_agent_sdk import query, ClaudeAgentOptions

188 

189 async for message in query(

190 prompt="Hello",

191 options=ClaudeAgentOptions(

192 system_prompt={"type": "preset", "preset": "claude_code"} # 使用预设

193 ),

194 ):

195 print(message)

196 

197 # 或使用自定义系统提示:

198 async for message in query(

199 prompt="Hello",

200 options=ClaudeAgentOptions(system_prompt="You are a helpful coding assistant"),

201 ):

202 print(message)

203 ```

204</CodeGroup>

205 

206**为什么变更:** 为 SDK 应用程序提供更好的控制和隔离。您现在可以构建具有自定义行为的代理,而无需继承 Claude Code 的 CLI 焦点指令。

207 

208### 设置源默认值

209 

210此默认值在 v0.1.0 中曾短暂更改,然后被还原,因此无需迁移操作。

211 

212**当前行为:** 在 `query()` 上省略 `settingSources` 会加载用户、项目和本地文件系统设置,与 CLI 匹配。这包括 `~/.claude/settings.json`、`.claude/settings.json`、`.claude/settings.local.json`、CLAUDE.md 文件和自定义命令。

213 

214要从文件系统设置中隔离运行,请传递空数组:

215 

216<CodeGroup>

217 ```typescript TypeScript theme={null}

218 const result = query({

219 prompt: "Hello",

220 options: {

221 settingSources: [] // 未加载文件系统设置

222 }

223 });

224 

225 // 或仅加载特定源:

226 const result = query({

227 prompt: "Hello",

228 options: {

229 settingSources: ["project"] // 仅项目设置

230 }

231 });

232 ```

233 

234 ```python Python theme={null}

235 from claude_agent_sdk import query, ClaudeAgentOptions

236 

237 async for message in query(

238 prompt="Hello",

239 options=ClaudeAgentOptions(setting_sources=[]), # 未加载文件系统设置

240 ):

241 print(message)

242 

243 # 或仅加载特定源:

244 async for message in query(

245 prompt="Hello",

246 options=ClaudeAgentOptions(

247 setting_sources=["project"] # 仅项目设置

248 ),

249 ):

250 print(message)

251 ```

252</CodeGroup>

253 

254隔离对于 CI/CD 管道、已部署的应用程序、测试环境和多租户系统特别重要,其中本地自定义不应泄露。

255 

256<Note>

257 SDK v0.1.0 曾短暂默认为不加载任何设置;这在后续版本中被还原。Python SDK 0.1.59 及更早版本将空列表视为与省略选项相同,因此在依赖 `setting_sources=[]` 之前请升级。有关即使 `settingSources` 为 `[]` 时仍会读取的输入,请参阅 [settingSources 不控制的内容](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control)。

258</Note>

259 

260## 为什么重命名?

261 

262Claude Code SDK 最初是为编码任务设计的,但它已发展成为构建所有类型 AI 代理的强大框架。新名称"Claude Agent SDK"更好地反映了其功能:

263 

264* 构建业务代理(法律助手、财务顾问、客户支持)

265* 创建专门的编码代理(SRE 机器人、安全审查员、代码审查代理)

266* 为任何领域开发自定义代理,具有工具使用、MCP 集成等功能

267 

268## 获取帮助

269 

270如果您在迁移过程中遇到任何问题:

271 

272**对于 TypeScript/JavaScript:**

273 

2741. 检查所有导入是否已更新为使用 `@anthropic-ai/claude-agent-sdk`

2752. 验证您的 package.json 具有新的包名称

2763. 运行 `npm install` 以确保依赖项已更新

277 

278**对于 Python:**

279 

2801. 检查所有导入是否已更新为使用 `claude_agent_sdk`

2812. 验证您的 requirements.txt 或 pyproject.toml 具有新的包名称

2823. 运行 `pip install claude-agent-sdk` 以确保包已安装

283 

284## 后续步骤

285 

286* 探索 [Agent SDK 概述](/zh-CN/agent-sdk/overview) 以了解可用功能

287* 查看 [TypeScript SDK 参考](/zh-CN/agent-sdk/typescript) 以获取详细的 API 文档

288* 查看 [Python SDK 参考](/zh-CN/agent-sdk/python) 以获取 Python 特定文档

289* 了解 [自定义工具](/zh-CN/agent-sdk/custom-tools) 和 [MCP 集成](/zh-CN/agent-sdk/mcp)

agent-sdk/permissions.md +242 −0 created

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# 配置权限

6 

7> 使用权限模式、hooks 和声明式允许/拒绝规则来控制您的代理如何使用工具。

8 

9Claude Agent SDK 提供权限控制来管理 Claude 如何使用工具。使用权限模式和规则来定义自动允许的内容,以及使用 [`canUseTool` 回调](/zh-CN/agent-sdk/user-input) 在运行时处理其他所有情况。

10 

11<Note>

12 本页面涵盖权限模式和规则。要构建交互式批准流程,其中用户在运行时批准或拒绝工具请求,请参阅 [处理批准和用户输入](/zh-CN/agent-sdk/user-input)。

13</Note>

14 

15## 权限如何被评估

16 

17当 Claude 请求一个工具时,SDK 按以下顺序检查权限:

18 

19<Steps>

20 <Step title="Hooks">

21 首先运行 [hooks](/zh-CN/agent-sdk/hooks)。一个 hook 可以直接拒绝调用或将其传递下去。返回 `allow` 的 hook 不会跳过下面的拒绝和询问规则;无论 hook 结果如何,这些规则都会被评估。

22 </Step>

23 

24 <Step title="拒绝规则">

25 检查 `deny` 规则(来自 `disallowed_tools` 和 [settings.json](/zh-CN/settings#permission-settings))。如果拒绝规则匹配,工具被阻止,即使在 `bypassPermissions` 模式下也是如此。

26 </Step>

27 

28 <Step title="权限模式">

29 应用活跃的 [权限模式](#permission-modes)。`bypassPermissions` 批准到达此步骤的所有内容。`acceptEdits` 批准文件操作。其他模式会继续进行。

30 </Step>

31 

32 <Step title="允许规则">

33 检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。

34 </Step>

35 

36 <Step title="canUseTool 回调">

37 如果上述任何步骤都未解决,调用您的 [`canUseTool` 回调](/zh-CN/agent-sdk/user-input) 以获得决定。在 `dontAsk` 模式下,此步骤被跳过,工具被拒绝。

38 </Step>

39</Steps>

40 

41<img src="https://mintcdn.com/claude-code/FEspvVUyRuaWjm0s/images/agent-sdk/permissions-flow.svg?fit=max&auto=format&n=FEspvVUyRuaWjm0s&q=85&s=a1759b0cf4541281a9fdd8f5348228e8" alt="权限评估流程图" width="920" height="260" data-path="images/agent-sdk/permissions-flow.svg" />

42 

43本页面重点关注 **允许和拒绝规则** 以及 **权限模式**。对于其他步骤:

44 

45* **Hooks:** 运行自定义代码以允许、拒绝或修改工具请求。请参阅 [使用 hooks 控制执行](/zh-CN/agent-sdk/hooks)。

46* **canUseTool 回调:** 在运行时提示用户批准。请参阅 [处理批准和用户输入](/zh-CN/agent-sdk/user-input)。

47 

48## 允许和拒绝规则

49 

50`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)向上面评估流程中的允许和拒绝规则列表添加条目。它们控制工具调用是否被批准,而不是工具是否对 Claude 可用。

51 

52| 选项 | 效果 |

53| :------------------------------- | :---------------------------------------------------------- |

54| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准。此处未列出的工具仍然存在并继续进行权限模式和 `canUseTool`。 |

55| `disallowed_tools=["Bash"]` | `Bash` 始终被拒绝。拒绝规则首先被检查,并在每个权限模式中都有效,包括 `bypassPermissions`。 |

56 

57对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对。列出的工具被批准;其他任何内容都被直接拒绝,而不是提示:

58 

59```typescript theme={null}

60const options = {

61 allowedTools: ["Read", "Glob", "Grep"],

62 permissionMode: "dontAsk"

63};

64```

65 

66<Warning>

67 **`allowed_tools` 不约束 `bypassPermissions`。** `allowed_tools` 仅预批准您列出的工具。未列出的工具不与任何允许规则匹配,并继续进行权限模式,其中 `bypassPermissions` 批准它们。设置 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起仍然批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果您需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。

68</Warning>

69 

70您也可以在 `.claude/settings.json` 中声明式地配置允许、拒绝和询问规则。当启用 `project` 设置源时,这些规则被读取,默认 `query()` 选项就是这样。如果您显式设置 `setting_sources`(TypeScript:`settingSources`),请包含 `"project"` 以使其应用。请参阅 [权限设置](/zh-CN/settings#permission-settings) 了解规则语法。

71 

72## 权限模式

73 

74权限模式提供对 Claude 如何使用工具的全局控制。您可以在调用 `query()` 时设置权限模式,或在流式会话期间动态更改它。

75 

76### 可用模式

77 

78SDK 支持这些权限模式:

79 

80| 模式 | 描述 | 工具行为 |

81| :------------------- | :------- | :--------------------------------------------------------------------------------------------- |

82| `default` | 标准权限行为 | 无自动批准;不匹配的工具触发您的 `canUseTool` 回调 |

83| `dontAsk` | 拒绝而不是提示 | 任何未被 `allowed_tools` 或规则预批准的内容都被拒绝;`canUseTool` 永远不会被调用 |

84| `acceptEdits` | 自动接受文件编辑 | 文件编辑和 [文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)被自动批准 |

85| `bypassPermissions` | 绕过所有权限检查 | 所有工具运行而无需权限提示(谨慎使用) |

86| `plan` | 规划模式 | 只读工具运行;Claude 分析和规划而不编辑您的源文件 |

87| `auto`(仅 TypeScript) | 模型分类批准 | 模型分类器批准或拒绝每个工具调用。请参阅 [Auto 模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 了解可用性 |

88 

89<Warning>

90 **子代理继承:** 当父代理使用 `bypassPermissions`、`acceptEdits` 或 `auto` 时,所有子代理继承该模式,并且不能按子代理覆盖。子代理可能有不同的系统提示和行为约束较少,比您的主代理,所以继承 `bypassPermissions` 授予它们完整的、自主的系统访问权限,无需任何批准提示。

91</Warning>

92 

93### 设置权限模式

94 

95您可以在启动查询时设置权限模式一次,或在会话活跃时动态更改它。

96 

97<Tabs>

98 <Tab title="在查询时">

99 在创建查询时传递 `permission_mode`(Python)或 `permissionMode`(TypeScript)。此模式应用于整个会话,除非动态更改。

100 

101 <CodeGroup>

102 ```python Python theme={null}

103 import asyncio

104 from claude_agent_sdk import query, ClaudeAgentOptions

105 

106 

107 async def main():

108 async for message in query(

109 prompt="Help me refactor this code",

110 options=ClaudeAgentOptions(

111 permission_mode="default", # 在此处设置模式

112 ),

113 ):

114 if hasattr(message, "result"):

115 print(message.result)

116 

117 

118 asyncio.run(main())

119 ```

120 

121 ```typescript TypeScript theme={null}

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

123 

124 async function main() {

125 for await (const message of query({

126 prompt: "Help me refactor this code",

127 options: {

128 permissionMode: "default" // 在此处设置模式

129 }

130 })) {

131 if ("result" in message) {

132 console.log(message.result);

133 }

134 }

135 }

136 

137 main();

138 ```

139 </CodeGroup>

140 </Tab>

141 

142 <Tab title="在流式传输期间">

143 调用 `set_permission_mode()`(Python)或 `setPermissionMode()`(TypeScript)以在会话中期更改模式。新模式立即对所有后续工具请求生效。这让您可以从限制性开始,随着信任建立而放松权限,例如在审查 Claude 的初始方法后切换到 `acceptEdits`。

144 

145 <CodeGroup>

146 ```python Python theme={null}

147 import asyncio

148 from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions

149 

150 

151 async def main():

152 async with ClaudeSDKClient(

153 options=ClaudeAgentOptions(

154 permission_mode="default", # 以默认模式开始

155 )

156 ) as client:

157 await client.query("Help me refactor this code")

158 

159 # 在会话中期动态更改模式

160 await client.set_permission_mode("acceptEdits")

161 

162 # 使用新权限模式处理消息

163 async for message in client.receive_response():

164 if hasattr(message, "result"):

165 print(message.result)

166 

167 

168 asyncio.run(main())

169 ```

170 

171 ```typescript TypeScript theme={null}

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

173 

174 async function main() {

175 const q = query({

176 prompt: "Help me refactor this code",

177 options: {

178 permissionMode: "default" // 以默认模式开始

179 }

180 });

181 

182 // 在会话中期动态更改模式

183 await q.setPermissionMode("acceptEdits");

184 

185 // 使用新权限模式处理消息

186 for await (const message of q) {

187 if ("result" in message) {

188 console.log(message.result);

189 }

190 }

191 }

192 

193 main();

194 ```

195 </CodeGroup>

196 </Tab>

197</Tabs>

198 

199### 模式详情

200 

201#### 接受编辑模式(`acceptEdits`)

202 

203自动批准文件操作,以便 Claude 可以编辑代码而无需提示。其他工具(如不是文件系统操作的 Bash 命令)仍然需要正常权限。

204 

205**自动批准的操作:**

206 

207* 文件编辑(Edit、Write 工具)

208* 文件系统命令:`mkdir`、`touch`、`rm`、`rmdir`、`mv`、`cp`、`sed`

209 

210两者都仅适用于工作目录或 `additionalDirectories` 内的路径。该范围外的路径和对受保护路径的写入仍然会提示。

211 

212**使用时机:** 您信任 Claude 的编辑并希望更快的迭代,例如在原型设计期间或在隔离目录中工作时。

213 

214#### 不询问模式(`dontAsk`)

215 

216将任何权限提示转换为拒绝。由 `allowed_tools`、`settings.json` 允许规则或作为 hook 运行的工具正常运行。其他所有内容都被拒绝,无需调用 `canUseTool`。

217 

218**使用时机:** 您想要为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是默默依赖 `canUseTool` 不存在。

219 

220#### 绕过权限模式(`bypassPermissions`)

221 

222自动批准所有工具使用而无需提示。Hooks 仍然执行,如果需要可以阻止操作。

223 

224<Warning>

225 谨慎使用。Claude 在此模式下具有完整的系统访问权限。仅在您信任所有可能操作的受控环境中使用。

226 

227 `allowed_tools` 不约束此模式。每个工具都被批准,而不仅仅是您列出的工具。拒绝规则(`disallowed_tools`)、显式 `ask` 规则和 hooks 在模式检查之前被评估,仍然可以阻止工具。

228</Warning>

229 

230#### 规划模式(`plan`)

231 

232将 Claude 限制为只读工具。Claude 可以读取文件并运行只读 shell 命令来探索代码库,但不编辑您的源文件。Claude 可能使用 `AskUserQuestion` 在最终确定计划之前澄清需求。请参阅 [处理批准和用户输入](/zh-CN/agent-sdk/user-input#handle-clarifying-questions) 以处理这些提示。

233 

234**使用时机:** 您想要 Claude 提议更改而不执行它们,例如在代码审查期间或当您需要在进行更改之前批准更改时。

235 

236## 相关资源

237 

238对于权限评估流程中的其他步骤:

239 

240* [处理批准和用户输入](/zh-CN/agent-sdk/user-input):交互式批准提示和澄清问题

241* [Hooks 指南](/zh-CN/agent-sdk/hooks):在代理生命周期中的关键点运行自定义代码

242* [权限规则](/zh-CN/settings#permission-settings):`settings.json` 中的声明式允许/拒绝规则

Details

113#### 参数113#### 参数

114 114 

115| 参数 | 类型 | 描述 |115| 参数 | 类型 | 描述 |

116| :------------- | :----------------------------------------------- | :---------------------- |116| :------------- | :---------------------------------------------- | :---------------------- |

117| `name` | `str` | 工具的唯一标识符 |117| `name` | `str` | 工具的唯一标识符 |

118| `description` | `str` | 工具功能的人类可读描述 |118| `description` | `str` | 工具功能的人类可读描述 |

119| `input_schema` | `type \| dict[str, Any]` | 定义工具输入参数的模式(见下文) |119| `input_schema` | `type \| dict[str, Any]` | 定义工具输入参数的模式(见下文) |

120| `annotations` | [`ToolAnnotations`](#tool-annotations)` \| None` | 可选的 MCP 工具注解,为客户端提供行为提示 |120| `annotations` | [`ToolAnnotations`](#toolannotations)` \| None` | 可选的 MCP 工具注解,为客户端提供行为提示 |

121 121 

122#### 输入模式选项122#### 输入模式选项

123 123 


250#### 参数250#### 参数

251 251 

252| 参数 | 类型 | 默认值 | 描述 |252| 参数 | 类型 | 默认值 | 描述 |

253| :------------------ | :------------ | :----- | :-------------------------------------------- |253| :------------------ | :------------ | :----- | :--------------------------------------------- |

254| `directory` | `str \| None` | `None` | 列出会话的目录。省略时,返回所有项目中的会话 |254| `directory` | `str \| None` | `None` | 列出会话的目录。省略时,返回所有项目中的会话 |

255| `limit` | `int \| None` | `None` | 返回的最大会话数 |255| `limit` | `int \| None` | `None` | 返回的最大会话数 |

256| `include_worktrees` | `bool` | `True` | 当 `directory` 在 git 仓库内时,包括所有 worktree 路径中的会话 |256| `include_worktrees` | `bool` | `True` | 当 `directory` 在 git 仓库内时,包括所有 worktrees 路径中的会话 |

257 257 

258#### 返回类型:`SDKSessionInfo`258#### 返回类型:`SDKSessionInfo`

259 259 


267| `first_prompt` | `str \| None` | 会话中的第一个有意义的用户提示 |267| `first_prompt` | `str \| None` | 会话中的第一个有意义的用户提示 |

268| `git_branch` | `str \| None` | 会话结束时的 Git 分支 |268| `git_branch` | `str \| None` | 会话结束时的 Git 分支 |

269| `cwd` | `str \| None` | 会话的工作目录 |269| `cwd` | `str \| None` | 会话的工作目录 |

270| `tag` | `str \| None` | 用户设置的会话标签(见 [`tag_session()`](#tag-session)) |270| `tag` | `str \| None` | 用户设置的会话标签(见 [`tag_session()`](#tag_session)) |

271| `created_at` | `int \| None` | 会话创建时间(自纪元以来的毫秒数) |271| `created_at` | `int \| None` | 会话创建时间(自纪元以来的毫秒数) |

272 272 

273#### 示例273#### 示例


343| `session_id` | `str` | 必需 | 要查找的会话的 UUID |343| `session_id` | `str` | 必需 | 要查找的会话的 UUID |

344| `directory` | `str \| None` | `None` | 项目目录路径。省略时,搜索所有项目目录 |344| `directory` | `str \| None` | `None` | 项目目录路径。省略时,搜索所有项目目录 |

345 345 

346返回 [`SDKSessionInfo`](#return-type-sdk-session-info),如果找不到会话则返回 `None`。346返回 [`SDKSessionInfo`](#return-type-sdksessioninfo),如果找不到会话则返回 `None`。

347 347 

348#### 示例348#### 示例

349 349 


381 381 

382#### 示例382#### 示例

383 383 

384重命名最近的会话,使其更容易找到。新标题在后续读取时出现在 [`SDKSessionInfo.custom_title`](#return-type-sdk-session-info) 中。384重命名最近的会话,使其更容易找到。新标题在后续读取时出现在 [`SDKSessionInfo.custom_title`](#return-type-sdksessioninfo) 中。

385 385 

386```python theme={null}386```python theme={null}

387from claude_agent_sdk import list_sessions, rename_session387from claude_agent_sdk import list_sessions, rename_session


476| `set_permission_mode(mode)` | 更改当前会话的权限模式 |476| `set_permission_mode(mode)` | 更改当前会话的权限模式 |

477| `set_model(model)` | 更改当前会话的模型。传递 `None` 以重置为默认值 |477| `set_model(model)` | 更改当前会话的模型。传递 `None` 以重置为默认值 |

478| `rewind_files(user_message_id)` | 将文件恢复到指定用户消息时的状态。需要 `enable_file_checkpointing=True`。见 [文件检查点](/zh-CN/agent-sdk/file-checkpointing) |478| `rewind_files(user_message_id)` | 将文件恢复到指定用户消息时的状态。需要 `enable_file_checkpointing=True`。见 [文件检查点](/zh-CN/agent-sdk/file-checkpointing) |

479| `get_mcp_status()` | 获取所有配置的 MCP 服务器的状态。返回 [`McpStatusResponse`](#mcp-status-response) |479| `get_mcp_status()` | 获取所有配置的 MCP 服务器的状态。返回 [`McpStatusResponse`](#mcpstatusresponse) |

480| `reconnect_mcp_server(server_name)` | 重试连接到失败或断开连接的 MCP 服务器 |480| `reconnect_mcp_server(server_name)` | 重试连接到失败或断开连接的 MCP 服务器 |

481| `toggle_mcp_server(server_name, enabled)` | 在会话中启用或禁用 MCP 服务器。禁用会移除其工具 |481| `toggle_mcp_server(server_name, enabled)` | 在会话中启用或禁用 MCP 服务器。禁用会移除其工具 |

482| `stop_task(task_id)` | 停止运行的后台任务。一个状态为 `"stopped"` 的 [`TaskNotificationMessage`](#task-notification-message) 随后在消息流中出现 |482| `stop_task(task_id)` | 停止运行的后台任务。一个状态为 `"stopped"` 的 [`TaskNotificationMessage`](#tasknotificationmessage) 随后在消息流中出现 |

483| `get_server_info()` | 获取服务器信息,包括会话 ID 和功能 |483| `get_server_info()` | 获取服务器信息,包括会话 ID 和功能 |

484| `disconnect()` | 从 Claude 断开连接 |484| `disconnect()` | 从 Claude 断开连接 |

485 485 


791 effort: Literal["low", "medium", "high", "max"] | None = None791 effort: Literal["low", "medium", "high", "max"] | None = None

792 enable_file_checkpointing: bool = False792 enable_file_checkpointing: bool = False

793 session_store: SessionStore | None = None793 session_store: SessionStore | None = None

794 session_store_flush: SessionStoreFlushMode = "batched"

794```795```

795 796 

796| 属性 | 类型 | 默认值 | 描述 |797| 属性 | 类型 | 默认值 | 描述 |

797| :---------------------------- | :---------------------------------------------------------------------------------------- | :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |798| :---------------------------- | :--------------------------------------------------------------------------------------- | :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

798| `tools` | `list[str] \| ToolsPreset \| None` | `None` | 工具配置。使用 `{"type": "preset", "preset": "claude_code"}` 获取 Claude Code 的默认工具 |799| `tools` | `list[str] \| ToolsPreset \| None` | `None` | 工具配置。使用 `{"type": "preset", "preset": "claude_code"}` 获取 Claude Code 的默认工具 |

799| `allowed_tools` | `list[str]` | `[]` | 无需提示即可自动批准的工具。这不会限制 Claude 仅使用这些工具;未列出的工具会通过 `permission_mode` 和 `can_use_tool` 处理。使用 `disallowed_tools` 阻止工具。见 [权限](/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |800| `allowed_tools` | `list[str]` | `[]` | 无需提示即可自动批准的工具。这不会限制 Claude 仅使用这些工具;未列出的工具会通过 `permission_mode` 和 `can_use_tool` 处理。使用 `disallowed_tools` 阻止工具。见 [权限](/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |

800| `system_prompt` | `str \| SystemPromptPreset \| None` | `None` | 系统提示配置。传递字符串以获取自定义提示,或使用 `{"type": "preset", "preset": "claude_code"}` 获取 Claude Code 的系统提示。添加 `"append"` 以扩展预设 |801| `system_prompt` | `str \| SystemPromptPreset \| None` | `None` | 系统提示配置。传递字符串以获取自定义提示,或使用 `{"type": "preset", "preset": "claude_code"}` 获取 Claude Code 的系统提示。添加 `"append"` 以扩展预设 |


808| `enable_file_checkpointing` | `bool` | `False` | 启用文件更改跟踪以进行回滚。见 [文件检查点](/zh-CN/agent-sdk/file-checkpointing) |809| `enable_file_checkpointing` | `bool` | `False` | 启用文件更改跟踪以进行回滚。见 [文件检查点](/zh-CN/agent-sdk/file-checkpointing) |

809| `model` | `str \| None` | `None` | 要使用的 Claude 模型 |810| `model` | `str \| None` | `None` | 要使用的 Claude 模型 |

810| `fallback_model` | `str \| None` | `None` | 主模型失败时使用的备用模型 |811| `fallback_model` | `str \| None` | `None` | 主模型失败时使用的备用模型 |

811| `betas` | `list[SdkBeta]` | `[]` | 要启用的测试功能。见 [`SdkBeta`](#sdk-beta) 了解可用选项 |812| `betas` | `list[SdkBeta]` | `[]` | 要启用的测试功能。见 [`SdkBeta`](#sdkbeta) 了解可用选项 |

812| `output_format` | `dict[str, Any] \| None` | `None` | 结构化响应的输出格式(例如 `{"type": "json_schema", "schema": {...}}`)。见 [结构化输出](/zh-CN/agent-sdk/structured-outputs) 了解详情 |813| `output_format` | `dict[str, Any] \| None` | `None` | 结构化响应的输出格式(例如 `{"type": "json_schema", "schema": {...}}`)。见 [结构化输出](/zh-CN/agent-sdk/structured-outputs) 了解详情 |

813| `permission_prompt_tool_name` | `str \| None` | `None` | 权限提示的 MCP 工具名称 |814| `permission_prompt_tool_name` | `str \| None` | `None` | 权限提示的 MCP 工具名称 |

814| `cwd` | `str \| Path \| None` | `None` | 当前工作目录 |815| `cwd` | `str \| Path \| None` | `None` | 当前工作目录 |


820| `max_buffer_size` | `int \| None` | `None` | 缓冲 CLI stdout 时的最大字节数 |821| `max_buffer_size` | `int \| None` | `None` | 缓冲 CLI stdout 时的最大字节数 |

821| `debug_stderr` | `Any` | `sys.stderr` | *已弃用* - 用于调试输出的类文件对象。改用 `stderr` 回调 |822| `debug_stderr` | `Any` | `sys.stderr` | *已弃用* - 用于调试输出的类文件对象。改用 `stderr` 回调 |

822| `stderr` | `Callable[[str], None] \| None` | `None` | CLI 中 stderr 输出的回调函数 |823| `stderr` | `Callable[[str], None] \| None` | `None` | CLI 中 stderr 输出的回调函数 |

823| `can_use_tool` | [`CanUseTool`](#can-use-tool) ` \| None` | `None` | 工具权限回调函数。见 [权限类型](#can-use-tool) 了解详情 |824| `can_use_tool` | [`CanUseTool`](#canusetool) ` \| None` | `None` | 工具权限回调函数。见 [权限类型](#canusetool) 了解详情 |

824| `hooks` | `dict[HookEvent, list[HookMatcher]] \| None` | `None` | 用于拦截事件的 hooks 配置 |825| `hooks` | `dict[HookEvent, list[HookMatcher]] \| None` | `None` | 用于拦截事件的 hooks 配置 |

825| `user` | `str \| None` | `None` | 用户标识符 |826| `user` | `str \| None` | `None` | 用户标识符 |

826| `include_partial_messages` | `bool` | `False` | 包括部分消息流式事件。启用时,会产生 [`StreamEvent`](#stream-event) 消息 |827| `include_partial_messages` | `bool` | `False` | 包括部分消息流式事件。启用时,会产生 [`StreamEvent`](#streamevent) 消息 |

827| `fork_session` | `bool` | `False` | 使用 `resume` 恢复时,分叉到新会话 ID 而不是继续原始会话 |828| `fork_session` | `bool` | `False` | 使用 `resume` 恢复时,分叉到新会话 ID 而不是继续原始会话 |

828| `agents` | `dict[str, AgentDefinition] \| None` | `None` | 以编程方式定义的子代理 |829| `agents` | `dict[str, AgentDefinition] \| None` | `None` | 以编程方式定义的子代理 |

829| `plugins` | `list[SdkPluginConfig]` | `[]` | 从本地路径加载自定义插件。见 [Plugins](/zh-CN/agent-sdk/plugins) 了解详情 |830| `plugins` | `list[SdkPluginConfig]` | `[]` | 从本地路径加载自定义插件。见 [Plugins](/zh-CN/agent-sdk/plugins) 了解详情 |

830| `sandbox` | [`SandboxSettings`](#sandbox-settings) ` \| None` | `None` | 以编程方式配置沙箱行为。见 [沙箱设置](#sandbox-settings) 了解详情 |831| `sandbox` | [`SandboxSettings`](#sandboxsettings) ` \| None` | `None` | 以编程方式配置沙箱行为。见 [沙箱设置](#sandboxsettings) 了解详情 |

831| `setting_sources` | `list[SettingSource] \| None` | `None`(CLI 默认值:所有源) | 控制加载哪些文件系统设置。传递 `[]` 以禁用用户、项目和本地设置。无论如何都会加载托管策略设置。见 [使用 Claude Code 功能](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control) |832| `setting_sources` | `list[SettingSource] \| None` | `None`(CLI 默认值:所有源) | 控制加载哪些文件系统设置。传递 `[]` 以禁用用户、项目和本地设置。无论如何都会加载托管策略设置。见 [使用 Claude Code 功能](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control) |

832| `max_thinking_tokens` | `int \| None` | `None` | *已弃用* - 思考块的最大令牌数。改用 `thinking` |833| `max_thinking_tokens` | `int \| None` | `None` | *已弃用* - 思考块的最大令牌数。改用 `thinking` |

833| `thinking` | [`ThinkingConfig`](#thinking-config) ` \| None` | `None` | 控制扩展思考行为。优先于 `max_thinking_tokens` |834| `thinking` | [`ThinkingConfig`](#thinkingconfig) ` \| None` | `None` | 控制扩展思考行为。优先于 `max_thinking_tokens` |

834| `effort` | `Literal["low", "medium", "high", "max"] \| None` | `None` | 思考深度的努力级别 |835| `effort` | `Literal["low", "medium", "high", "max"] \| None` | `None` | 思考深度的努力级别 |

835| `session_store` | [`SessionStore`](/zh-CN/agent-sdk/session-storage#the-session-store-interface) ` \| None` | `None` | 将会话记录镜像到外部后端,以便任何主机都可以恢复它们。见 [将会话持久化到外部存储](/zh-CN/agent-sdk/session-storage) |836| `session_store` | [`SessionStore`](/zh-CN/agent-sdk/session-storage#the-sessionstore-interface) ` \| None` | `None` | 将会话记录镜像到外部后端,以便任何主机都可以恢复它们。见 [将会话持久化到外部存储](/zh-CN/agent-sdk/session-storage) |

837| `session_store_flush` | `Literal["batched", "eager"]` | `"batched"` | 何时将镜像的记录条目刷新到 `session_store`。`"batched"` 每轮刷新一次或当缓冲区填满时;`"eager"` 在每帧后触发后台刷新。当 `session_store` 为 `None` 时忽略 |

836 838 

837### `OutputFormat`839### `OutputFormat`

838 840 


1031| `maxTurns` | 否 | 代理停止前的最大代理轮次数 |1033| `maxTurns` | 否 | 代理停止前的最大代理轮次数 |

1032| `background` | 否 | 调用时将此代理作为非阻塞后台任务运行 |1034| `background` | 否 | 调用时将此代理作为非阻塞后台任务运行 |

1033| `effort` | 否 | 此代理的推理努力级别。接受命名级别或整数 |1035| `effort` | 否 | 此代理的推理努力级别。接受命名级别或整数 |

1034| `permissionMode` | 否 | 此代理内工具执行的权限模式。见 [`PermissionMode`](#permission-mode) |1036| `permissionMode` | 否 | 此代理内工具执行的权限模式。见 [`PermissionMode`](#permissionmode) |

1035 1037 

1036<Note>1038<Note>

1037 `AgentDefinition` 字段名称使用 camelCase,如 `disallowedTools`、`permissionMode` 和 `maxTurns`。这些名称直接映射到与 TypeScript SDK 共享的线路格式。这与 `ClaudeAgentOptions` 不同,后者对等效的顶级字段(如 `disallowed_tools` 和 `permission_mode`)使用 Python snake\_case。因为 `AgentDefinition` 是数据类,传递 snake\_case 关键字在构造时会引发 `TypeError`。1039 `AgentDefinition` 字段名称使用 camelCase,如 `disallowedTools`、`permissionMode` 和 `maxTurns`。这些名称直接映射到与 TypeScript SDK 共享的线路格式。这与 `ClaudeAgentOptions` 不同,后者对等效的顶级字段(如 `disallowed_tools` 和 `permission_mode`)使用 Python snake\_case。因为 `AgentDefinition` 是数据类,传递 snake\_case 关键字在构造时会引发 `TypeError`。


1045PermissionMode = Literal[1047PermissionMode = Literal[

1046 "default", # Standard permission behavior1048 "default", # Standard permission behavior

1047 "acceptEdits", # Auto-accept file edits1049 "acceptEdits", # Auto-accept file edits

1048 "plan", # Planning mode - no execution1050 "plan", # Planning mode - read-only tools only

1049 "dontAsk", # Deny anything not pre-approved instead of prompting1051 "dontAsk", # Deny anything not pre-approved instead of prompting

1050 "bypassPermissions", # Bypass all permission checks (use with caution)1052 "bypassPermissions", # Bypass all permission checks (use with caution)

1051]1053]


1081```1083```

1082 1084 

1083| 字段 | 类型 | 描述 |1085| 字段 | 类型 | 描述 |

1084| :------------ | :----------------------- | :------------- |1086| :------------ | :----------------------- | :---------------------------------------------------------------------------------------------------------------------------- |

1085| `signal` | `Any \| None` | 保留供将来中止信号支持 |1087| `signal` | `Any \| None` | 保留供将来中止信号支持 |

1086| `suggestions` | `list[PermissionUpdate]` | 来自 CLI 的权限更新建议 |1088| `suggestions` | `list[PermissionUpdate]` | 来自 CLI 的权限更新建议。Bash 提示包括带有 `localSettings` 目标的建议,因此在 `updated_permissions` 中返回它会将规则写入 `.claude/settings.local.json` 并在会话间持久化。 |

1087 1089 

1088### `PermissionResult`1090### `PermissionResult`

1089 1091 


1289 1291 

1290### `McpServerStatusConfig`1292### `McpServerStatusConfig`

1291 1293 

1292由 [`get_mcp_status()`](#methods) 报告的 MCP 服务器的配置。这是所有 [`McpServerConfig`](#mcp-server-config) 传输变体加上用于通过 claude.ai 代理的服务器的仅输出 `claudeai-proxy` 变体的联合。1294由 [`get_mcp_status()`](#methods) 报告的 MCP 服务器的配置。这是所有 [`McpServerConfig`](#mcpserverconfig) 传输变体加上用于通过 claude.ai 代理的服务器的仅输出 `claudeai-proxy` 变体的联合。

1293 1295 

1294```python theme={null}1296```python theme={null}

1295McpServerStatusConfig = (1297McpServerStatusConfig = (


1301)1303)

1302```1304```

1303 1305 

1304`McpSdkServerConfigStatus` 是 [`McpSdkServerConfig`](#mcp-sdk-server-config) 的可序列化形式,仅包含 `type`(`"sdk"`)和 `name`(`str`)字段;进程内 `instance` 被省略。`McpClaudeAIProxyServerConfig` 具有 `type`(`"claudeai-proxy"`)、`url`(`str`)和 `id`(`str`)字段。1306`McpSdkServerConfigStatus` 是 [`McpSdkServerConfig`](#mcpsdkserverconfig) 的可序列化形式,仅包含 `type`(`"sdk"`)和 `name`(`str`)字段;进程内 `instance` 被省略。`McpClaudeAIProxyServerConfig` 具有 `type`(`"claudeai-proxy"`)、`url`(`str`)和 `id`(`str`)字段。

1305 1307 

1306### `McpStatusResponse`1308### `McpStatusResponse`

1307 1309 


1314 1316 

1315### `McpServerStatus`1317### `McpServerStatus`

1316 1318 

1317连接的 MCP 服务器的状态,包含在 [`McpStatusResponse`](#mcp-status-response) 中。1319连接的 MCP 服务器的状态,包含在 [`McpStatusResponse`](#mcpstatusresponse) 中。

1318 1320 

1319```python theme={null}1321```python theme={null}

1320class McpServerStatus(TypedDict):1322class McpServerStatus(TypedDict):


1328```1330```

1329 1331 

1330| 字段 | 类型 | 描述 |1332| 字段 | 类型 | 描述 |

1331| :----------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- |1333| :----------- | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------ |

1332| `name` | `str` | 服务器名称 |1334| `name` | `str` | 服务器名称 |

1333| `status` | `str` | `"connected"`、`"failed"`、`"needs-auth"`、`"pending"` 或 `"disabled"` 之一 |1335| `status` | `str` | `"connected"`、`"failed"`、`"needs-auth"`、`"pending"` 或 `"disabled"` 之一 |

1334| `serverInfo` | `dict`(可选) | 服务器名称和版本(`{"name": str, "version": str}`) |1336| `serverInfo` | `dict`(可选) | 服务器名称和版本(`{"name": str, "version": str}`) |

1335| `error` | `str`(可选) | 服务器连接失败时的错误消息 |1337| `error` | `str`(可选) | 服务器连接失败时的错误消息 |

1336| `config` | [`McpServerStatusConfig`](#mcp-server-status-config)(可选) | 服务器配置。与 [`McpServerConfig`](#mcp-server-config) 形状相同(stdio、SSE、HTTP 或 SDK),加上通过 claude.ai 连接的服务器的 `claudeai-proxy` 变体 |1338| `config` | [`McpServerStatusConfig`](#mcpserverstatusconfig)(可选) | 服务器配置。与 [`McpServerConfig`](#mcpserverconfig) 形状相同(stdio、SSE、HTTP 或 SDK),加上通过 claude.ai 连接的服务器的 `claudeai-proxy` 变体 |

1337| `scope` | `str`(可选) | 配置范围 |1339| `scope` | `str`(可选) | 配置范围 |

1338| `tools` | `list`(可选) | 此服务器提供的工具,每个都有 `name`、`description` 和 `annotations` 字段 |1340| `tools` | `list`(可选) | 此服务器提供的工具,每个都有 `name`、`description` 和 `annotations` 字段 |

1339 1341 


1416```1418```

1417 1419 

1418| 字段 | 类型 | 描述 |1420| 字段 | 类型 | 描述 |

1419| :------------------- | :------------------------------------------------------------- | :----------------------------------------------------------- |1421| :------------------- | :----------------------------------------------------------- | :---------------------------------------------------------- |

1420| `content` | `list[ContentBlock]` | 响应中的内容块列表 |1422| `content` | `list[ContentBlock]` | 响应中的内容块列表 |

1421| `model` | `str` | 生成响应的模型 |1423| `model` | `str` | 生成响应的模型 |

1422| `parent_tool_use_id` | `str \| None` | 如果这是嵌套响应,则为工具使用 ID |1424| `parent_tool_use_id` | `str \| None` | 如果这是嵌套响应,则为工具使用 ID |

1423| `error` | [`AssistantMessageError`](#assistant-message-error) ` \| None` | 如果响应遇到错误,则为错误类型 |1425| `error` | [`AssistantMessageError`](#assistantmessageerror) ` \| None` | 如果响应遇到错误,则为错误类型 |

1424| `usage` | `dict[str, Any] \| None` | 每条消息的令牌使用情况(与 [`ResultMessage.usage`](#result-message) 相同的键) |1426| `usage` | `dict[str, Any] \| None` | 每条消息的令牌使用情况(与 [`ResultMessage.usage`](#resultmessage) 相同的键) |

1425| `message_id` | `str \| None` | API 消息 ID。来自一个轮次的多条消息共享相同的 ID |1427| `message_id` | `str \| None` | API 消息 ID。来自一个轮次的多条消息共享相同的 ID |

1426 1428 

1427### `AssistantMessageError`1429### `AssistantMessageError`


1481| `cache_creation_input_tokens` | `int` | 用于创建新缓存条目的令牌。 |1483| `cache_creation_input_tokens` | `int` | 用于创建新缓存条目的令牌。 |

1482| `cache_read_input_tokens` | `int` | 从现有缓存条目读取的令牌。 |1484| `cache_read_input_tokens` | `int` | 从现有缓存条目读取的令牌。 |

1483 1485 

1484`model_usage` 字典将模型名称映射到每个模型的使用情况。内部字典键使用 camelCase,因为该值从底层 CLI 进程未修改地传递,匹配 TypeScript [`ModelUsage`](/zh-CN/agent-sdk/typescript#model-usage) 类型:1486`model_usage` 字典将模型名称映射到每个模型的使用情况。内部字典键使用 camelCase,因为该值从底层 CLI 进程未修改地传递,匹配 TypeScript [`ModelUsage`](/zh-CN/agent-sdk/typescript#modelusage) 类型:

1485 1487 

1486| 键 | 类型 | 描述 |1488| 键 | 类型 | 描述 |

1487| -------------------------- | ------- | ------------------------------------------------------------------------ |1489| -------------------------- | ------- | ------------------------------------------------------------------------ |


1527```1529```

1528 1530 

1529| 字段 | 类型 | 描述 |1531| 字段 | 类型 | 描述 |

1530| :---------------- | :---------------------------------- | :------- |1532| :---------------- | :-------------------------------- | :------- |

1531| `rate_limit_info` | [`RateLimitInfo`](#rate-limit-info) | 当前速率限制状态 |1533| `rate_limit_info` | [`RateLimitInfo`](#ratelimitinfo) | 当前速率限制状态 |

1532| `uuid` | `str` | 唯一事件标识符 |1534| `uuid` | `str` | 唯一事件标识符 |

1533| `session_id` | `str` | 会话标识符 |1535| `session_id` | `str` | 会话标识符 |

1534 1536 

1535### `RateLimitInfo`1537### `RateLimitInfo`

1536 1538 

1537由 [`RateLimitEvent`](#rate-limit-event) 携带的速率限制状态。1539由 [`RateLimitEvent`](#ratelimitevent) 携带的速率限制状态。

1538 1540 

1539```python theme={null}1541```python theme={null}

1540RateLimitStatus = Literal["allowed", "allowed_warning", "rejected"]1542RateLimitStatus = Literal["allowed", "allowed_warning", "rejected"]


1812 1814 

1813参数:1815参数:

1814 1816 

1815* `input`:强类型 hook 输入,具有基于 `hook_event_name` 的判别联合(见 [`HookInput`](#hook-input))1817* `input`:强类型 hook 输入,具有基于 `hook_event_name` 的判别联合(见 [`HookInput`](#hookinput))

1816* `tool_use_id`:可选工具使用标识符(用于工具相关的 hooks)1818* `tool_use_id`:可选工具使用标识符(用于工具相关的 hooks)

1817* `context`:带有附加信息的 hook 上下文1819* `context`:带有附加信息的 hook 上下文

1818 1820 

1819返回可能包含以下内容的 [`HookJSONOutput`](#hook-json-output):1821返回可能包含以下内容的 [`HookJSONOutput`](#hookjsonoutput):

1820 1822 

1821* `decision`:`"block"` 以阻止操作1823* `decision`:`"block"` 以阻止操作

1822* `systemMessage`:要添加到记录的系统消息1824* `systemMessage`:要添加到记录的系统消息


3109```3111```

3110 3112 

3111| 属性 | 类型 | 默认值 | 描述 |3113| 属性 | 类型 | 默认值 | 描述 |

3112| :-------------------------- | :------------------------------------------------------ | :------ | :------------------------------------------------------------------------------------------------------------------------------- |3114| :-------------------------- | :---------------------------------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------- |

3113| `enabled` | `bool` | `False` | 为命令执行启用沙箱模式 |3115| `enabled` | `bool` | `False` | 为命令执行启用沙箱模式 |

3114| `autoAllowBashIfSandboxed` | `bool` | `True` | 启用沙箱时自动批准 bash 命令 |3116| `autoAllowBashIfSandboxed` | `bool` | `True` | 启用沙箱时自动批准 bash 命令 |

3115| `excludedCommands` | `list[str]` | `[]` | 始终绕过沙箱限制的命令(例如 `["docker"]`)。这些自动运行沙箱外,无需模型参与 |3117| `excludedCommands` | `list[str]` | `[]` | 始终绕过沙箱限制的命令(例如 `["docker"]`)。这些自动运行沙箱外,无需模型参与 |

3116| `allowUnsandboxedCommands` | `bool` | `True` | 允许模型请求在沙箱外运行命令。当为 `True` 时,模型可以在工具输入中设置 `dangerouslyDisableSandbox`,这会回退到 [权限系统](#permissions-fallback-for-unsandboxed-commands) |3118| `allowUnsandboxedCommands` | `bool` | `True` | 允许模型请求在沙箱外运行命令。当为 `True` 时,模型可以在工具输入中设置 `dangerouslyDisableSandbox`,这会回退到 [权限系统](#permissions-fallback-for-unsandboxed-commands) |

3117| `network` | [`SandboxNetworkConfig`](#sandbox-network-config) | `None` | 网络特定的沙箱配置 |3119| `network` | [`SandboxNetworkConfig`](#sandboxnetworkconfig) | `None` | 网络特定的沙箱配置 |

3118| `ignoreViolations` | [`SandboxIgnoreViolations`](#sandbox-ignore-violations) | `None` | 配置要忽略的沙箱违规 |3120| `ignoreViolations` | [`SandboxIgnoreViolations`](#sandboxignoreviolations) | `None` | 配置要忽略的沙箱违规 |

3119| `enableWeakerNestedSandbox` | `bool` | `False` | 启用较弱的嵌套沙箱以实现兼容性 |3121| `enableWeakerNestedSandbox` | `bool` | `False` | 启用较弱的嵌套沙箱以实现兼容性 |

3120 3122 

3121#### 示例用法3123#### 示例用法

agent-sdk/streaming-output.md +396 −0 created

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# 实时流式传输响应

6 

7> 当文本和工具调用流入时,从 Agent SDK 获取实时响应

8 

9默认情况下,Agent SDK 在 Claude 完成生成每个响应后会产生完整的 `AssistantMessage` 对象。要在文本和工具调用生成时接收增量更新,请通过在选项中将 `include_partial_messages`(Python)或 `includePartialMessages`(TypeScript)设置为 `true` 来启用部分消息流式传输。

10 

11<Tip>

12 本页面涵盖输出流式传输(实时接收令牌)。有关输入模式(如何发送消息),请参阅[向代理发送消息](/zh-CN/agent-sdk/streaming-vs-single-mode)。您也可以[通过 CLI 使用 Agent SDK 流式传输响应](/zh-CN/headless)。

13</Tip>

14 

15## 启用流式输出

16 

17要启用流式传输,请在选项中将 `include_partial_messages`(Python)或 `includePartialMessages`(TypeScript)设置为 `true`。这会导致 SDK 产生包含原始 API 事件的 `StreamEvent` 消息,这些事件在到达时产生,除了通常的 `AssistantMessage` 和 `ResultMessage` 之外。

18 

19您的代码需要:

20 

211. 检查每条消息的类型以区分 `StreamEvent` 和其他消息类型

222. 对于 `StreamEvent`,提取 `event` 字段并检查其 `type`

233. 查找 `content_block_delta` 事件,其中 `delta.type` 是 `text_delta`,这些事件包含实际的文本块

24 

25下面的示例启用流式传输并在文本块到达时打印它们。注意嵌套的类型检查:首先是 `StreamEvent`,然后是 `content_block_delta`,最后是 `text_delta`:

26 

27<CodeGroup>

28 ```python Python theme={null}

29 from claude_agent_sdk import query, ClaudeAgentOptions

30 from claude_agent_sdk.types import StreamEvent

31 import asyncio

32 

33 

34 async def stream_response():

35 options = ClaudeAgentOptions(

36 include_partial_messages=True,

37 allowed_tools=["Bash", "Read"],

38 )

39 

40 async for message in query(prompt="List the files in my project", options=options):

41 if isinstance(message, StreamEvent):

42 event = message.event

43 if event.get("type") == "content_block_delta":

44 delta = event.get("delta", {})

45 if delta.get("type") == "text_delta":

46 print(delta.get("text", ""), end="", flush=True)

47 

48 

49 asyncio.run(stream_response())

50 ```

51 

52 ```typescript TypeScript theme={null}

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

54 

55 for await (const message of query({

56 prompt: "List the files in my project",

57 options: {

58 includePartialMessages: true,

59 allowedTools: ["Bash", "Read"]

60 }

61 })) {

62 if (message.type === "stream_event") {

63 const event = message.event;

64 if (event.type === "content_block_delta") {

65 if (event.delta.type === "text_delta") {

66 process.stdout.write(event.delta.text);

67 }

68 }

69 }

70 }

71 ```

72</CodeGroup>

73 

74## StreamEvent 参考

75 

76启用部分消息后,您会收到包装在对象中的原始 Claude API 流式事件。该类型在每个 SDK 中有不同的名称:

77 

78* **Python**: `StreamEvent`(从 `claude_agent_sdk.types` 导入)

79* **TypeScript**: `SDKPartialAssistantMessage`,其中 `type: 'stream_event'`

80 

81两者都包含原始 Claude API 事件,而不是累积的文本。您需要自己提取和累积文本增量。以下是每种类型的结构:

82 

83<CodeGroup>

84 ```python Python theme={null}

85 @dataclass

86 class StreamEvent:

87 uuid: str # 此事件的唯一标识符

88 session_id: str # 会话标识符

89 event: dict[str, Any] # 原始 Claude API 流事件

90 parent_tool_use_id: str | None # 如果来自子代理,则为父工具 ID

91 ```

92 

93 ```typescript TypeScript theme={null}

94 type SDKPartialAssistantMessage = {

95 type: "stream_event";

96 event: BetaRawMessageStreamEvent; // 来自 Anthropic SDK

97 parent_tool_use_id: string | null;

98 uuid: UUID;

99 session_id: string;

100 };

101 ```

102</CodeGroup>

103 

104`event` 字段包含来自 [Claude API](https://platform.claude.com/docs/en/build-with-claude/streaming#event-types) 的原始流事件。常见的事件类型包括:

105 

106| 事件类型 | 描述 |

107| :-------------------- | :----------------- |

108| `message_start` | 新消息的开始 |

109| `content_block_start` | 新内容块的开始(文本或工具使用) |

110| `content_block_delta` | 内容的增量更新 |

111| `content_block_stop` | 内容块的结束 |

112| `message_delta` | 消息级别的更新(停止原因、使用情况) |

113| `message_stop` | 消息的结束 |

114 

115## 消息流

116 

117启用部分消息后,您会按以下顺序接收消息:

118 

119```text theme={null}

120StreamEvent (message_start)

121StreamEvent (content_block_start) - 文本块

122StreamEvent (content_block_delta) - 文本块...

123StreamEvent (content_block_stop)

124StreamEvent (content_block_start) - tool_use 块

125StreamEvent (content_block_delta) - 工具输入块...

126StreamEvent (content_block_stop)

127StreamEvent (message_delta)

128StreamEvent (message_stop)

129AssistantMessage - 包含所有内容的完整消息

130... 工具执行 ...

131... 下一轮的更多流事件 ...

132ResultMessage - 最终结果

133```

134 

135未启用部分消息(Python 中的 `include_partial_messages`,TypeScript 中的 `includePartialMessages`)时,您会收到除 `StreamEvent` 之外的所有消息类型。常见类型包括 `SystemMessage`(会话初始化)、`AssistantMessage`(完整响应)、`ResultMessage`(最终结果)和指示何时压缩对话历史的紧凑边界消息(TypeScript 中的 `SDKCompactBoundaryMessage`;Python 中的 `SystemMessage`,子类型为 `"compact_boundary"`)。

136 

137## 流式传输文本响应

138 

139要在生成文本时显示它,请查找 `content_block_delta` 事件,其中 `delta.type` 是 `text_delta`。这些包含增量文本块。下面的示例在每个块到达时打印它:

140 

141<CodeGroup>

142 ```python Python theme={null}

143 from claude_agent_sdk import query, ClaudeAgentOptions

144 from claude_agent_sdk.types import StreamEvent

145 import asyncio

146 

147 

148 async def stream_text():

149 options = ClaudeAgentOptions(include_partial_messages=True)

150 

151 async for message in query(prompt="Explain how databases work", options=options):

152 if isinstance(message, StreamEvent):

153 event = message.event

154 if event.get("type") == "content_block_delta":

155 delta = event.get("delta", {})

156 if delta.get("type") == "text_delta":

157 # 在每个文本块到达时打印它

158 print(delta.get("text", ""), end="", flush=True)

159 

160 print() # 最后的换行符

161 

162 

163 asyncio.run(stream_text())

164 ```

165 

166 ```typescript TypeScript theme={null}

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

168 

169 for await (const message of query({

170 prompt: "Explain how databases work",

171 options: { includePartialMessages: true }

172 })) {

173 if (message.type === "stream_event") {

174 const event = message.event;

175 if (event.type === "content_block_delta" && event.delta.type === "text_delta") {

176 process.stdout.write(event.delta.text);

177 }

178 }

179 }

180 

181 console.log(); // 最后的换行符

182 ```

183</CodeGroup>

184 

185## 流式传输工具调用

186 

187工具调用也会增量流式传输。您可以跟踪工具何时开始、在生成时接收其输入,以及查看它们何时完成。下面的示例跟踪当前被调用的工具并在流式传输时累积 JSON 输入。它使用三种事件类型:

188 

189* `content_block_start`:工具开始

190* `content_block_delta`,带有 `input_json_delta`:输入块到达

191* `content_block_stop`:工具调用完成

192 

193<CodeGroup>

194 ```python Python theme={null}

195 from claude_agent_sdk import query, ClaudeAgentOptions

196 from claude_agent_sdk.types import StreamEvent

197 import asyncio

198 

199 

200 async def stream_tool_calls():

201 options = ClaudeAgentOptions(

202 include_partial_messages=True,

203 allowed_tools=["Read", "Bash"],

204 )

205 

206 # 跟踪当前工具并累积其输入 JSON

207 current_tool = None

208 tool_input = ""

209 

210 async for message in query(prompt="Read the README.md file", options=options):

211 if isinstance(message, StreamEvent):

212 event = message.event

213 event_type = event.get("type")

214 

215 if event_type == "content_block_start":

216 # 新工具调用开始

217 content_block = event.get("content_block", {})

218 if content_block.get("type") == "tool_use":

219 current_tool = content_block.get("name")

220 tool_input = ""

221 print(f"Starting tool: {current_tool}")

222 

223 elif event_type == "content_block_delta":

224 delta = event.get("delta", {})

225 if delta.get("type") == "input_json_delta":

226 # 在流式传输时累积 JSON 输入

227 chunk = delta.get("partial_json", "")

228 tool_input += chunk

229 print(f" Input chunk: {chunk}")

230 

231 elif event_type == "content_block_stop":

232 # 工具调用完成 - 显示最终输入

233 if current_tool:

234 print(f"Tool {current_tool} called with: {tool_input}")

235 current_tool = None

236 

237 

238 asyncio.run(stream_tool_calls())

239 ```

240 

241 ```typescript TypeScript theme={null}

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

243 

244 // 跟踪当前工具并累积其输入 JSON

245 let currentTool: string | null = null;

246 let toolInput = "";

247 

248 for await (const message of query({

249 prompt: "Read the README.md file",

250 options: {

251 includePartialMessages: true,

252 allowedTools: ["Read", "Bash"]

253 }

254 })) {

255 if (message.type === "stream_event") {

256 const event = message.event;

257 

258 if (event.type === "content_block_start") {

259 // 新工具调用开始

260 if (event.content_block.type === "tool_use") {

261 currentTool = event.content_block.name;

262 toolInput = "";

263 console.log(`Starting tool: ${currentTool}`);

264 }

265 } else if (event.type === "content_block_delta") {

266 if (event.delta.type === "input_json_delta") {

267 // 在流式传输时累积 JSON 输入

268 const chunk = event.delta.partial_json;

269 toolInput += chunk;

270 console.log(` Input chunk: ${chunk}`);

271 }

272 } else if (event.type === "content_block_stop") {

273 // 工具调用完成 - 显示最终输入

274 if (currentTool) {

275 console.log(`Tool ${currentTool} called with: ${toolInput}`);

276 currentTool = null;

277 }

278 }

279 }

280 }

281 ```

282</CodeGroup>

283 

284## 构建流式 UI

285 

286此示例将文本和工具流式传输结合到一个有凝聚力的 UI 中。它跟踪代理当前是否正在执行工具(使用 `in_tool` 标志)以显示状态指示器,如 `[Using Read...]`,同时工具运行。当不在工具中时文本正常流式传输,工具完成会触发"完成"消息。此模式对于需要在多步骤代理任务期间显示进度的聊天界面很有用。

287 

288<CodeGroup>

289 ```python Python theme={null}

290 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage

291 from claude_agent_sdk.types import StreamEvent

292 import asyncio

293 import sys

294 

295 

296 async def streaming_ui():

297 options = ClaudeAgentOptions(

298 include_partial_messages=True,

299 allowed_tools=["Read", "Bash", "Grep"],

300 )

301 

302 # 跟踪我们当前是否在工具调用中

303 in_tool = False

304 

305 async for message in query(

306 prompt="Find all TODO comments in the codebase", options=options

307 ):

308 if isinstance(message, StreamEvent):

309 event = message.event

310 event_type = event.get("type")

311 

312 if event_type == "content_block_start":

313 content_block = event.get("content_block", {})

314 if content_block.get("type") == "tool_use":

315 # 工具调用开始 - 显示状态指示器

316 tool_name = content_block.get("name")

317 print(f"\n[Using {tool_name}...]", end="", flush=True)

318 in_tool = True

319 

320 elif event_type == "content_block_delta":

321 delta = event.get("delta", {})

322 # 仅在不执行工具时流式传输文本

323 if delta.get("type") == "text_delta" and not in_tool:

324 sys.stdout.write(delta.get("text", ""))

325 sys.stdout.flush()

326 

327 elif event_type == "content_block_stop":

328 if in_tool:

329 # 工具调用完成

330 print(" done", flush=True)

331 in_tool = False

332 

333 elif isinstance(message, ResultMessage):

334 # 代理完成所有工作

335 print(f"\n\n--- Complete ---")

336 

337 

338 asyncio.run(streaming_ui())

339 ```

340 

341 ```typescript TypeScript theme={null}

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

343 

344 // 跟踪我们当前是否在工具调用中

345 let inTool = false;

346 

347 for await (const message of query({

348 prompt: "Find all TODO comments in the codebase",

349 options: {

350 includePartialMessages: true,

351 allowedTools: ["Read", "Bash", "Grep"]

352 }

353 })) {

354 if (message.type === "stream_event") {

355 const event = message.event;

356 

357 if (event.type === "content_block_start") {

358 if (event.content_block.type === "tool_use") {

359 // 工具调用开始 - 显示状态指示器

360 process.stdout.write(`\n[Using ${event.content_block.name}...]`);

361 inTool = true;

362 }

363 } else if (event.type === "content_block_delta") {

364 // 仅在不执行工具时流式传输文本

365 if (event.delta.type === "text_delta" && !inTool) {

366 process.stdout.write(event.delta.text);

367 }

368 } else if (event.type === "content_block_stop") {

369 if (inTool) {

370 // 工具调用完成

371 console.log(" done");

372 inTool = false;

373 }

374 }

375 } else if (message.type === "result") {

376 // 代理完成所有工作

377 console.log("\n\n--- Complete ---");

378 }

379 }

380 ```

381</CodeGroup>

382 

383## 已知限制

384 

385某些 SDK 功能与流式传输不兼容:

386 

387* **扩展思考**:当您显式设置 `max_thinking_tokens`(Python)或 `maxThinkingTokens`(TypeScript)时,不会发出 `StreamEvent` 消息。您只会在每个轮次后收到完整消息。请注意,思考在 SDK 中默认禁用,因此流式传输有效,除非您启用它。

388* **结构化输出**:JSON 结果仅出现在最终 `ResultMessage.structured_output` 中,而不是作为流式增量。有关详细信息,请参阅[结构化输出](/zh-CN/agent-sdk/structured-outputs)。

389 

390## 后续步骤

391 

392现在您可以实时流式传输文本和工具调用,请探索这些相关主题:

393 

394* [交互式与一次性查询](/zh-CN/agent-sdk/streaming-vs-single-mode):为您的用例选择输入模式

395* [结构化输出](/zh-CN/agent-sdk/structured-outputs):从代理获取类型化的 JSON 响应

396* [权限](/zh-CN/agent-sdk/permissions):控制代理可以使用哪些工具

agent-sdk/todo-tracking.md +189 −0 created

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# 待办事项列表

6 

7> 使用 Claude Agent SDK 跟踪和显示待办事项,实现有组织的任务管理

8 

9待办事项跟踪提供了一种结构化的方式来管理任务并向用户显示进度。Claude Agent SDK 包含内置的待办事项功能,可帮助组织复杂的工作流程并让用户了解任务进度。

10 

11### 待办事项生命周期

12 

13待办事项遵循可预测的生命周期:

14 

151. **创建**为 `pending` 状态,当任务被识别时

162. **激活**为 `in_progress` 状态,当工作开始时

173. **完成**当任务成功完成时

184. **移除**当组中的所有任务都完成时

19 

20### 何时使用待办事项

21 

22SDK 会自动为以下情况创建待办事项:

23 

24* **复杂的多步骤任务**需要 3 个或更多不同的操作

25* **用户提供的任务列表**当提到多个项目时

26* **非平凡的操作**受益于进度跟踪

27* **明确的请求**当用户要求组织待办事项时

28 

29## 示例

30 

31### 监控待办事项变化

32 

33<CodeGroup>

34 ```typescript TypeScript theme={null}

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

36 

37 for await (const message of query({

38 prompt: "Optimize my React app performance and track progress with todos",

39 options: { maxTurns: 15 }

40 })) {

41 // Todo updates are reflected in the message stream

42 if (message.type === "assistant") {

43 for (const block of message.message.content) {

44 if (block.type === "tool_use" && block.name === "TodoWrite") {

45 const todos = block.input.todos;

46 

47 console.log("Todo Status Update:");

48 todos.forEach((todo, index) => {

49 const status =

50 todo.status === "completed" ? "✅" : todo.status === "in_progress" ? "🔧" : "❌";

51 console.log(`${index + 1}. ${status} ${todo.content}`);

52 });

53 }

54 }

55 }

56 }

57 ```

58 

59 ```python Python theme={null}

60 from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ToolUseBlock

61 

62 async for message in query(

63 prompt="Optimize my React app performance and track progress with todos",

64 options=ClaudeAgentOptions(max_turns=15),

65 ):

66 # Todo updates are reflected in the message stream

67 if isinstance(message, AssistantMessage):

68 for block in message.content:

69 if isinstance(block, ToolUseBlock) and block.name == "TodoWrite":

70 todos = block.input["todos"]

71 

72 print("Todo Status Update:")

73 for i, todo in enumerate(todos):

74 status = (

75 "✅"

76 if todo["status"] == "completed"

77 else "🔧"

78 if todo["status"] == "in_progress"

79 else "❌"

80 )

81 print(f"{i + 1}. {status} {todo['content']}")

82 ```

83</CodeGroup>

84 

85### 实时进度显示

86 

87<CodeGroup>

88 ```typescript TypeScript theme={null}

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

90 

91 class TodoTracker {

92 private todos: any[] = [];

93 

94 displayProgress() {

95 if (this.todos.length === 0) return;

96 

97 const completed = this.todos.filter((t) => t.status === "completed").length;

98 const inProgress = this.todos.filter((t) => t.status === "in_progress").length;

99 const total = this.todos.length;

100 

101 console.log(`\nProgress: ${completed}/${total} completed`);

102 console.log(`Currently working on: ${inProgress} task(s)\n`);

103 

104 this.todos.forEach((todo, index) => {

105 const icon =

106 todo.status === "completed" ? "✅" : todo.status === "in_progress" ? "🔧" : "❌";

107 const text = todo.status === "in_progress" ? todo.activeForm : todo.content;

108 console.log(`${index + 1}. ${icon} ${text}`);

109 });

110 }

111 

112 async trackQuery(prompt: string) {

113 for await (const message of query({

114 prompt,

115 options: { maxTurns: 20 }

116 })) {

117 if (message.type === "assistant") {

118 for (const block of message.message.content) {

119 if (block.type === "tool_use" && block.name === "TodoWrite") {

120 this.todos = block.input.todos;

121 this.displayProgress();

122 }

123 }

124 }

125 }

126 }

127 }

128 

129 // Usage

130 const tracker = new TodoTracker();

131 await tracker.trackQuery("Build a complete authentication system with todos");

132 ```

133 

134 ```python Python theme={null}

135 from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ToolUseBlock

136 from typing import List, Dict

137 

138 

139 class TodoTracker:

140 def __init__(self):

141 self.todos: List[Dict] = []

142 

143 def display_progress(self):

144 if not self.todos:

145 return

146 

147 completed = len([t for t in self.todos if t["status"] == "completed"])

148 in_progress = len([t for t in self.todos if t["status"] == "in_progress"])

149 total = len(self.todos)

150 

151 print(f"\nProgress: {completed}/{total} completed")

152 print(f"Currently working on: {in_progress} task(s)\n")

153 

154 for i, todo in enumerate(self.todos):

155 icon = (

156 "✅"

157 if todo["status"] == "completed"

158 else "🔧"

159 if todo["status"] == "in_progress"

160 else "❌"

161 )

162 text = (

163 todo["activeForm"]

164 if todo["status"] == "in_progress"

165 else todo["content"]

166 )

167 print(f"{i + 1}. {icon} {text}")

168 

169 async def track_query(self, prompt: str):

170 async for message in query(prompt=prompt, options=ClaudeAgentOptions(max_turns=20)):

171 if isinstance(message, AssistantMessage):

172 for block in message.content:

173 if isinstance(block, ToolUseBlock) and block.name == "TodoWrite":

174 self.todos = block.input["todos"]

175 self.display_progress()

176 

177 

178 # Usage

179 tracker = TodoTracker()

180 await tracker.track_query("Build a complete authentication system with todos")

181 ```

182</CodeGroup>

183 

184## 相关文档

185 

186* [TypeScript SDK 参考](/zh-CN/agent-sdk/typescript)

187* [Python SDK 参考](/zh-CN/agent-sdk/python)

188* [流式模式与单一模式](/zh-CN/agent-sdk/streaming-vs-single-mode)

189* [自定义工具](/zh-CN/agent-sdk/custom-tools)

Details

41#### 参数41#### 参数

42 42 

43| 参数 | 类型 | 描述 |43| 参数 | 类型 | 描述 |

44| :-------- | :---------------------------------------------------------------- | :-------------------------- |44| :-------- | :--------------------------------------------------------------- | :-------------------------- |

45| `prompt` | `string \| AsyncIterable<`[`SDKUserMessage`](#sdkuser-message)`>` | 输入提示,可以是字符串或异步可迭代对象(用于流式模式) |45| `prompt` | `string \| AsyncIterable<`[`SDKUserMessage`](#sdkusermessage)`>` | 输入提示,可以是字符串或异步可迭代对象(用于流式模式) |

46| `options` | [`Options`](#options) | 可选配置对象(请参阅下面的 Options 类型) |46| `options` | [`Options`](#options) | 可选配置对象(请参阅下面的 Options 类型) |

47 47 

48#### 返回值48#### 返回值

49 49 

50返回一个 [`Query`](#query-object) 对象,该对象扩展 `AsyncGenerator<`[`SDKMessage`](#sdk-message)`, void>`,并具有其他方法。50返回一个 [`Query`](#query-object) 对象,该对象扩展 `AsyncGenerator<`[`SDKMessage`](#sdkmessage)`, void>`,并具有其他方法。

51 51 

52### `startup()`52### `startup()`

53 53 

54通过生成 CLI 子进程并在提示可用之前完成初始化握手来预热 CLI 子进程。返回的 [`WarmQuery`](#warm-query) 句柄稍后接受提示并将其写入已准备好的进程,因此第一个 `query()` 调用解析时无需支付子进程生成和初始化成本。54通过生成 CLI 子进程并在提示可用之前完成初始化握手来预热 CLI 子进程。返回的 [`WarmQuery`](#warmquery) 句柄稍后接受提示并将其写入已准备好的进程,因此第一个 `query()` 调用解析时无需支付子进程生成和初始化成本。

55 55 

56```typescript theme={null}56```typescript theme={null}

57function startup(params?: {57function startup(params?: {


69 69 

70#### 返回值70#### 返回值

71 71 

72返回一个 `Promise<`[`WarmQuery`](#warm-query)`>`,在子进程生成并完成其初始化握手后解析。72返回一个 `Promise<`[`WarmQuery`](#warmquery)`>`,在子进程生成并完成其初始化握手后解析。

73 73 

74#### 示例74#### 示例

75 75 


104#### 参数104#### 参数

105 105 

106| 参数 | 类型 | 描述 |106| 参数 | 类型 | 描述 |

107| :------------ | :------------------------------------------------------------------ | :--------------------------------- |107| :------------ | :---------------------------------------------------------------- | :--------------------------------- |

108| `name` | `string` | 工具的名称 |108| `name` | `string` | 工具的名称 |

109| `description` | `string` | 工具功能的描述 |109| `description` | `string` | 工具功能的描述 |

110| `inputSchema` | `Schema extends AnyZodRawShape` | 定义工具输入参数的 Zod 架构(支持 Zod 3 和 Zod 4) |110| `inputSchema` | `Schema extends AnyZodRawShape` | 定义工具输入参数的 Zod 架构(支持 Zod 3 和 Zod 4) |

111| `handler` | `(args, extra) => Promise<`[`CallToolResult`](#call-tool-result)`>` | 执行工具逻辑的异步函数 |111| `handler` | `(args, extra) => Promise<`[`CallToolResult`](#calltoolresult)`>` | 执行工具逻辑的异步函数 |

112| `extras` | `{ annotations?: `[`ToolAnnotations`](#tool-annotations)` }` | 可选的 MCP 工具注释,为客户端提供行为提示 |112| `extras` | `{ annotations?: `[`ToolAnnotations`](#toolannotations)` }` | 可选的 MCP 工具注释,为客户端提供行为提示 |

113 113 

114#### `ToolAnnotations`114#### `ToolAnnotations`

115 115 


177#### 返回类型:`SDKSessionInfo`177#### 返回类型:`SDKSessionInfo`

178 178 

179| 属性 | 类型 | 描述 |179| 属性 | 类型 | 描述 |

180| :------------- | :-------------------- | :-------------------------------------------- |180| :------------- | :-------------------- | :------------------------------------------- |

181| `sessionId` | `string` | 唯一会话标识符 (UUID) |181| `sessionId` | `string` | 唯一会话标识符 (UUID) |

182| `summary` | `string` | 显示标题:自定义标题、自动生成的摘要或第一个提示 |182| `summary` | `string` | 显示标题:自定义标题、自动生成的摘要或第一个提示 |

183| `lastModified` | `number` | 上次修改时间(自纪元以来的毫秒数) |183| `lastModified` | `number` | 上次修改时间(自纪元以来的毫秒数) |


186| `firstPrompt` | `string \| undefined` | 会话中的第一个有意义的用户提示 |186| `firstPrompt` | `string \| undefined` | 会话中的第一个有意义的用户提示 |

187| `gitBranch` | `string \| undefined` | 会话结束时的 git 分支 |187| `gitBranch` | `string \| undefined` | 会话结束时的 git 分支 |

188| `cwd` | `string \| undefined` | 会话的工作目录 |188| `cwd` | `string \| undefined` | 会话的工作目录 |

189| `tag` | `string \| undefined` | 用户设置的会话标签(请参阅 [`tagSession()`](#tag-session)) |189| `tag` | `string \| undefined` | 用户设置的会话标签(请参阅 [`tagSession()`](#tagsession)) |

190| `createdAt` | `number \| undefined` | 创建时间(自纪元以来的毫秒数),来自第一个条目的时间戳 |190| `createdAt` | `number \| undefined` | 创建时间(自纪元以来的毫秒数),来自第一个条目的时间戳 |

191 191 

192#### 示例192#### 示例


270| `sessionId` | `string` | 必需 | 要查找的会话 UUID |270| `sessionId` | `string` | 必需 | 要查找的会话 UUID |

271| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |271| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |

272 272 

273返回 [`SDKSessionInfo`](#return-type-sdk-session-info),如果找不到会话,则返回 `undefined`。273返回 [`SDKSessionInfo`](#return-type-sdksessioninfo),如果找不到会话,则返回 `undefined`。

274 274 

275### `renameSession()`275### `renameSession()`

276 276 


323| `abortController` | `AbortController` | `new AbortController()` | 用于取消操作的控制器 |323| `abortController` | `AbortController` | `new AbortController()` | 用于取消操作的控制器 |

324| `additionalDirectories` | `string[]` | `[]` | Claude 可以访问的其他目录 |324| `additionalDirectories` | `string[]` | `[]` | Claude 可以访问的其他目录 |

325| `agent` | `string` | `undefined` | 主线程的代理名称。代理必须在 `agents` 选项或设置中定义 |325| `agent` | `string` | `undefined` | 主线程的代理名称。代理必须在 `agents` 选项或设置中定义 |

326| `agents` | `Record<string, [`AgentDefinition`](#agent-definition)>` | `undefined` | 以编程方式定义子代理 |326| `agents` | `Record<string, [`AgentDefinition`](#agentdefinition)>` | `undefined` | 以编程方式定义子代理 |

327| `allowDangerouslySkipPermissions` | `boolean` | `false` | 启用绕过权限。使用 `permissionMode: 'bypassPermissions'` 时需要 |327| `allowDangerouslySkipPermissions` | `boolean` | `false` | 启用绕过权限。使用 `permissionMode: 'bypassPermissions'` 时需要 |

328| `allowedTools` | `string[]` | `[]` | 无需提示即可自动批准的工具。这不会将 Claude 限制为仅这些工具;未列出的工具会通过 `permissionMode` 和 `canUseTool` 进行处理。使用 `disallowedTools` 阻止工具。请参阅[权限](/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |328| `allowedTools` | `string[]` | `[]` | 无需提示即可自动批准的工具。这不会将 Claude 限制为仅这些工具;未列出的工具会通过 `permissionMode` 和 `canUseTool` 进行处理。使用 `disallowedTools` 阻止工具。请参阅[权限](/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |

329| `betas` | [`SdkBeta`](#sdk-beta)`[]` | `[]` | 启用测试功能 |329| `betas` | [`SdkBeta`](#sdkbeta)`[]` | `[]` | 启用测试功能 |

330| `canUseTool` | [`CanUseTool`](#can-use-tool) | `undefined` | 工具使用的自定义权限函数 |330| `canUseTool` | [`CanUseTool`](#canusetool) | `undefined` | 工具使用的自定义权限函数 |

331| `continue` | `boolean` | `false` | 继续最近的对话 |331| `continue` | `boolean` | `false` | 继续最近的对话 |

332| `cwd` | `string` | `process.cwd()` | 当前工作目录 |332| `cwd` | `string` | `process.cwd()` | 当前工作目录 |

333| `debug` | `boolean` | `false` | 为 Claude Code 进程启用调试模式 |333| `debug` | `boolean` | `false` | 为 Claude Code 进程启用调试模式 |


341| `extraArgs` | `Record<string, string \| null>` | `{}` | 其他参数 |341| `extraArgs` | `Record<string, string \| null>` | `{}` | 其他参数 |

342| `fallbackModel` | `string` | `undefined` | 主模型失败时使用的模型 |342| `fallbackModel` | `string` | `undefined` | 主模型失败时使用的模型 |

343| `forkSession` | `boolean` | `false` | 使用 `resume` 恢复时,分叉到新会话 ID 而不是继续原始会话 |343| `forkSession` | `boolean` | `false` | 使用 `resume` 恢复时,分叉到新会话 ID 而不是继续原始会话 |

344| `hooks` | `Partial<Record<`[`HookEvent`](#hook-event)`, `[`HookCallbackMatcher`](#hook-callback-matcher)`[]>>` | `{}` | 事件的 Hook 回调 |344| `hooks` | `Partial<Record<`[`HookEvent`](#hookevent)`, `[`HookCallbackMatcher`](#hookcallbackmatcher)`[]>>` | `{}` | 事件的 Hook 回调 |

345| `includePartialMessages` | `boolean` | `false` | 包括部分消息事件 |345| `includePartialMessages` | `boolean` | `false` | 包括部分消息事件 |

346| `maxBudgetUsd` | `number` | `undefined` | 当客户端成本估计达到此 USD 值时停止查询。与 `total_cost_usd` 的相同估计进行比较;请参阅[跟踪成本和使用情况](/zh-CN/agent-sdk/cost-tracking)了解准确性注意事项 |346| `maxBudgetUsd` | `number` | `undefined` | 当客户端成本估计达到此 USD 值时停止查询。与 `total_cost_usd` 的相同估计进行比较;请参阅[跟踪成本和使用情况](/zh-CN/agent-sdk/cost-tracking)了解准确性注意事项 |

347| `maxThinkingTokens` | `number` | `undefined` | *已弃用:* 改用 `thinking`。思考过程的最大令牌数 |347| `maxThinkingTokens` | `number` | `undefined` | *已弃用:* 改用 `thinking`。思考过程的最大令牌数 |

348| `maxTurns` | `number` | `undefined` | 最大代理轮次(工具使用往返) |348| `maxTurns` | `number` | `undefined` | 最大代理轮次(工具使用往返) |

349| `mcpServers` | `Record<string, [`McpServerConfig`](#mcp-server-config)>` | `{}` | MCP 服务器配置 |349| `mcpServers` | `Record<string, [`McpServerConfig`](#mcpserverconfig)>` | `{}` | MCP 服务器配置 |

350| `model` | `string` | CLI 的默认值 | 要使用的 Claude 模型 |350| `model` | `string` | CLI 的默认值 | 要使用的 Claude 模型 |

351| `outputFormat` | `{ type: 'json_schema', schema: JSONSchema }` | `undefined` | 为代理结果定义输出格式。请参阅[结构化输出](/zh-CN/agent-sdk/structured-outputs)了解详情 |351| `outputFormat` | `{ type: 'json_schema', schema: JSONSchema }` | `undefined` | 为代理结果定义输出格式。请参阅[结构化输出](/zh-CN/agent-sdk/structured-outputs)了解详情 |

352| `pathToClaudeCodeExecutable` | `string` | 从捆绑的本地二进制文件自动解析 | Claude Code 可执行文件的路径。仅在安装期间跳过可选依赖项或您的平台不在支持的集合中时需要 |352| `pathToClaudeCodeExecutable` | `string` | 从捆绑的本地二进制文件自动解析 | Claude Code 可执行文件的路径。仅在安装期间跳过可选依赖项或您的平台不在支持的集合中时需要 |

353| `permissionMode` | [`PermissionMode`](#permission-mode) | `'default'` | 会话的权限模式 |353| `permissionMode` | [`PermissionMode`](#permissionmode) | `'default'` | 会话的权限模式 |

354| `permissionPromptToolName` | `string` | `undefined` | 权限提示的 MCP 工具名称 |354| `permissionPromptToolName` | `string` | `undefined` | 权限提示的 MCP 工具名称 |

355| `persistSession` | `boolean` | `true` | 当为 `false` 时,禁用会话持久化到磁盘。会话之后无法恢复 |355| `persistSession` | `boolean` | `true` | 当为 `false` 时,禁用会话持久化到磁盘。会话之后无法恢复 |

356| `plugins` | [`SdkPluginConfig`](#sdk-plugin-config)`[]` | `[]` | 从本地路径加载自定义插件。请参阅[插件](/zh-CN/agent-sdk/plugins)了解详情 |356| `plugins` | [`SdkPluginConfig`](#sdkpluginconfig)`[]` | `[]` | 从本地路径加载自定义插件。请参阅[插件](/zh-CN/agent-sdk/plugins)了解详情 |

357| `promptSuggestions` | `boolean` | `false` | 启用提示建议。在每个轮次后发出 `prompt_suggestion` 消息,包含预测的下一个用户提示 |357| `promptSuggestions` | `boolean` | `false` | 启用提示建议。在每个轮次后发出 `prompt_suggestion` 消息,包含预测的下一个用户提示 |

358| `resume` | `string` | `undefined` | 要恢复的会话 ID |358| `resume` | `string` | `undefined` | 要恢复的会话 ID |

359| `resumeSessionAt` | `string` | `undefined` | 在特定消息 UUID 处恢复会话 |359| `resumeSessionAt` | `string` | `undefined` | 在特定消息 UUID 处恢复会话 |

360| `sandbox` | [`SandboxSettings`](#sandbox-settings) | `undefined` | 以编程方式配置沙箱行为。请参阅[沙箱设置](#sandbox-settings)了解详情 |360| `sandbox` | [`SandboxSettings`](#sandboxsettings) | `undefined` | 以编程方式配置沙箱行为。请参阅[沙箱设置](#sandboxsettings)了解详情 |

361| `sessionId` | `string` | 自动生成 | 为会话使用特定的 UUID 而不是自动生成一个 |361| `sessionId` | `string` | 自动生成 | 为会话使用特定的 UUID 而不是自动生成一个 |

362| `sessionStore` | [`SessionStore`](/zh-CN/agent-sdk/session-storage#the-session-store-interface) | `undefined` | 将会话记录镜像到外部后端,以便任何主机都可以恢复它们。请参阅[将会话持久化到外部存储](/zh-CN/agent-sdk/session-storage) |362| `sessionStore` | [`SessionStore`](/zh-CN/agent-sdk/session-storage#the-sessionstore-interface) | `undefined` | 将会话记录镜像到外部后端,以便任何主机都可以恢复它们。请参阅[将会话持久化到外部存储](/zh-CN/agent-sdk/session-storage) |

363| `settingSources` | [`SettingSource`](#setting-source)`[]` | CLI 默认值(所有源) | 控制加载哪些文件系统设置。传递 `[]` 以禁用用户、项目和本地设置。无论如何都会加载托管策略设置。请参阅[使用 Claude Code 功能](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control) |363| `settingSources` | [`SettingSource`](#settingsource)`[]` | CLI 默认值(所有源) | 控制加载哪些文件系统设置。传递 `[]` 以禁用用户、项目和本地设置。无论如何都会加载托管策略设置。请参阅[使用 Claude Code 功能](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control) |

364| `spawnClaudeCodeProcess` | `(options: SpawnOptions) => SpawnedProcess` | `undefined` | 用于生成 Claude Code 进程的自定义函数。用于在 VM、容器或远程环境中运行 Claude Code |364| `spawnClaudeCodeProcess` | `(options: SpawnOptions) => SpawnedProcess` | `undefined` | 用于生成 Claude Code 进程的自定义函数。用于在 VM、容器或远程环境中运行 Claude Code |

365| `stderr` | `(data: string) => void` | `undefined` | stderr 输出的回调 |365| `stderr` | `(data: string) => void` | `undefined` | stderr 输出的回调 |

366| `strictMcpConfig` | `boolean` | `false` | 强制执行严格的 MCP 验证 |366| `strictMcpConfig` | `boolean` | `false` | 强制执行严格的 MCP 验证 |

367| `systemPrompt` | `string \| { type: 'preset'; preset: 'claude_code'; append?: string; excludeDynamicSections?: boolean }` | `undefined`(最小提示) | 系统提示配置。传递字符串以获取自定义提示,或 `{ type: 'preset', preset: 'claude_code' }` 以使用 Claude Code 的系统提示。使用预设对象形式时,添加 `append` 以使用其他说明扩展它,并设置 `excludeDynamicSections: true` 以将每个会话上下文移到第一条用户消息中,以便[更好地跨机器重用提示缓存](/zh-CN/agent-sdk/modifying-system-prompts#improve-prompt-caching-across-users-and-machines) |367| `systemPrompt` | `string \| { type: 'preset'; preset: 'claude_code'; append?: string; excludeDynamicSections?: boolean }` | `undefined`(最小提示) | 系统提示配置。传递字符串以获取自定义提示,或 `{ type: 'preset', preset: 'claude_code' }` 以使用 Claude Code 的系统提示。使用预设对象形式时,添加 `append` 以使用其他说明扩展它,并设置 `excludeDynamicSections: true` 以将每个会话上下文移到第一条用户消息中,以便[更好地跨机器重用提示缓存](/zh-CN/agent-sdk/modifying-system-prompts#improve-prompt-caching-across-users-and-machines) |

368| `thinking` | [`ThinkingConfig`](#thinking-config) | 支持的模型为 `{ type: 'adaptive' }` | 控制 Claude 的思考/推理行为。请参阅 [`ThinkingConfig`](#thinking-config) 了解选项 |368| `thinking` | [`ThinkingConfig`](#thinkingconfig) | 支持的模型为 `{ type: 'adaptive' }` | 控制 Claude 的思考/推理行为。请参阅 [`ThinkingConfig`](#thinkingconfig) 了解选项 |

369| `toolConfig` | [`ToolConfig`](#tool-config) | `undefined` | 内置工具行为的配置。请参阅 [`ToolConfig`](#tool-config) 了解详情 |369| `toolConfig` | [`ToolConfig`](#toolconfig) | `undefined` | 内置工具行为的配置。请参阅 [`ToolConfig`](#toolconfig) 了解详情 |

370| `tools` | `string[] \| { type: 'preset'; preset: 'claude_code' }` | `undefined` | 工具配置。传递工具名称数组或使用预设获取 Claude Code 的默认工具 |370| `tools` | `string[] \| { type: 'preset'; preset: 'claude_code' }` | `undefined` | 工具配置。传递工具名称数组或使用预设获取 Claude Code 的默认工具 |

371 371 

372### `Query` 对象372### `Query` 对象


410| `initializationResult()` | 返回完整的初始化结果,包括支持的命令、模型、帐户信息和输出样式配置 |410| `initializationResult()` | 返回完整的初始化结果,包括支持的命令、模型、帐户信息和输出样式配置 |

411| `supportedCommands()` | 返回可用的 slash commands |411| `supportedCommands()` | 返回可用的 slash commands |

412| `supportedModels()` | 返回具有显示信息的可用模型 |412| `supportedModels()` | 返回具有显示信息的可用模型 |

413| `supportedAgents()` | 返回可用的子代理作为 [`AgentInfo`](#agent-info)`[]` |413| `supportedAgents()` | 返回可用的子代理作为 [`AgentInfo`](#agentinfo)`[]` |

414| `mcpServerStatus()` | 返回连接的 MCP 服务器的状态 |414| `mcpServerStatus()` | 返回连接的 MCP 服务器的状态 |

415| `accountInfo()` | 返回帐户信息 |415| `accountInfo()` | 返回帐户信息 |

416| `reconnectMcpServer(serverName)` | 按名称重新连接 MCP 服务器 |416| `reconnectMcpServer(serverName)` | 按名称重新连接 MCP 服务器 |


493| `background` | 否 | 调用时将此代理作为非阻塞后台任务运行 |493| `background` | 否 | 调用时将此代理作为非阻塞后台任务运行 |

494| `memory` | 否 | 此代理的内存源:`'user'`、`'project'` 或 `'local'` |494| `memory` | 否 | 此代理的内存源:`'user'`、`'project'` 或 `'local'` |

495| `effort` | 否 | 此代理的推理努力级别。接受命名级别或整数 |495| `effort` | 否 | 此代理的推理努力级别。接受命名级别或整数 |

496| `permissionMode` | 否 | 此代理内工具执行的权限模式。请参阅 [`PermissionMode`](#permission-mode) |496| `permissionMode` | 否 | 此代理内工具执行的权限模式。请参阅 [`PermissionMode`](#permissionmode) |

497| `criticalSystemReminder_EXPERIMENTAL` | 否 | 实验性:添加到系统提示的关键提醒 |497| `criticalSystemReminder_EXPERIMENTAL` | 否 | 实验性:添加到系统提示的关键提醒 |

498 498 

499### `AgentMcpServerSpec`499### `AgentMcpServerSpec`


626 | "default" // 标准权限行为626 | "default" // 标准权限行为

627 | "acceptEdits" // 自动接受文件编辑627 | "acceptEdits" // 自动接受文件编辑

628 | "bypassPermissions" // 绕过所有权限检查628 | "bypassPermissions" // 绕过所有权限检查

629 | "plan" // 规划模式 - 无执行629 | "plan" // 规划模式 - 仅读取工具

630 | "dontAsk" // 不提示权限,如果未预先批准则拒绝630 | "dontAsk" // 不提示权限,如果未预先批准则拒绝

631 | "auto"; // 使用模型分类器批准或拒绝每个工具调用631 | "auto"; // 使用模型分类器批准或拒绝每个工具调用

632```632```


651```651```

652 652 

653| 选项 | 类型 | 描述 |653| 选项 | 类型 | 描述 |

654| :--------------- | :------------------------------------------- | :--------------------- |654| :--------------- | :------------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

655| `signal` | `AbortSignal` | 如果应中止操作,则发出信号 |655| `signal` | `AbortSignal` | 如果应中止操作,则发出信号 |

656| `suggestions` | [`PermissionUpdate`](#permission-update)`[]` | 建议的权限更新,以便用户不会再次被提示此工具 |656| `suggestions` | [`PermissionUpdate`](#permissionupdate)`[]` | 建议的权限更新,以便用户不会再次被提示此工具。Bash 提示包括一个建议,其中包含 `localSettings` [目标](#permissionupdatedestination),因此在 `updatedPermissions` 中返回它会将规则写入 `.claude/settings.local.json` 并在会话中持久化。 |

657| `blockedPath` | `string` | 触发权限请求的文件路径(如果适用) |657| `blockedPath` | `string` | 触发权限请求的文件路径(如果适用) |

658| `decisionReason` | `string` | 解释为什么触发此权限请求 |658| `decisionReason` | `string` | 解释为什么触发此权限请求 |

659| `toolUseID` | `string` | 此特定工具调用在助手消息中的唯一标识符 |659| `toolUseID` | `string` | 此特定工具调用在助手消息中的唯一标识符 |


2379 | McpClaudeAIProxyServerConfig;2379 | McpClaudeAIProxyServerConfig;

2380```2380```

2381 2381 

2382请参阅 [`McpServerConfig`](#mcp-server-config)了解每种传输类型的详情。2382请参阅 [`McpServerConfig`](#mcpserverconfig)了解每种传输类型的详情。

2383 2383 

2384### `AccountInfo`2384### `AccountInfo`

2385 2385 


2825```2825```

2826 2826 

2827| 属性 | 类型 | 默认值 | 描述 |2827| 属性 | 类型 | 默认值 | 描述 |

2828| :-------------------------- | :------------------------------------------------------ | :---------- | :------------------------------------------------------------------------------------------------------------------------------ |2828| :-------------------------- | :---------------------------------------------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------ |

2829| `enabled` | `boolean` | `false` | 为命令执行启用沙箱模式 |2829| `enabled` | `boolean` | `false` | 为命令执行启用沙箱模式 |

2830| `autoAllowBashIfSandboxed` | `boolean` | `true` | 启用沙箱时自动批准 bash 命令 |2830| `autoAllowBashIfSandboxed` | `boolean` | `true` | 启用沙箱时自动批准 bash 命令 |

2831| `excludedCommands` | `string[]` | `[]` | 始终绕过沙箱限制的命令(例如,`['docker']`)。这些自动运行在沙箱外,无需模型参与 |2831| `excludedCommands` | `string[]` | `[]` | 始终绕过沙箱限制的命令(例如,`['docker']`)。这些自动运行在沙箱外,无需模型参与 |

2832| `allowUnsandboxedCommands` | `boolean` | `true` | 允许模型请求在沙箱外运行命令。当为 `true` 时,模型可以在工具输入中设置 `dangerouslyDisableSandbox`,这会回退到[权限系统](#permissions-fallback-for-unsandboxed-commands) |2832| `allowUnsandboxedCommands` | `boolean` | `true` | 允许模型请求在沙箱外运行命令。当为 `true` 时,模型可以在工具输入中设置 `dangerouslyDisableSandbox`,这会回退到[权限系统](#permissions-fallback-for-unsandboxed-commands) |

2833| `network` | [`SandboxNetworkConfig`](#sandbox-network-config) | `undefined` | 网络特定的沙箱配置 |2833| `network` | [`SandboxNetworkConfig`](#sandboxnetworkconfig) | `undefined` | 网络特定的沙箱配置 |

2834| `filesystem` | [`SandboxFilesystemConfig`](#sandbox-filesystem-config) | `undefined` | 用于读/写限制的文件系统特定沙箱配置 |2834| `filesystem` | [`SandboxFilesystemConfig`](#sandboxfilesystemconfig) | `undefined` | 用于读/写限制的文件系统特定沙箱配置 |

2835| `ignoreViolations` | `Record<string, string[]>` | `undefined` | 违规类别到要忽略的模式的映射(例如,`{ file: ['/tmp/*'], network: ['localhost'] }`) |2835| `ignoreViolations` | `Record<string, string[]>` | `undefined` | 违规类别到要忽略的模式的映射(例如,`{ file: ['/tmp/*'], network: ['localhost'] }`) |

2836| `enableWeakerNestedSandbox` | `boolean` | `false` | 为兼容性启用较弱的嵌套沙箱 |2836| `enableWeakerNestedSandbox` | `boolean` | `false` | 为兼容性启用较弱的嵌套沙箱 |

2837| `ripgrep` | `{ command: string; args?: string[] }` | `undefined` | 沙箱环境中的自定义 ripgrep 二进制配置 |2837| `ripgrep` | `{ command: string; args?: string[] }` | `undefined` | 沙箱环境中的自定义 ripgrep 二进制配置 |

data-usage.md +1 −1

Details

67 67 

68下面的图表显示了 Claude Code 在安装和正常操作期间如何连接到外部服务。实线表示必需的连接,而虚线表示可选或用户启动的数据流。68下面的图表显示了 Claude Code 在安装和正常操作期间如何连接到外部服务。实线表示必需的连接,而虚线表示可选或用户启动的数据流。

69 69 

70<img src="https://mintcdn.com/claude-code/YcBW2H7CArGcduPb/images/claude-code-data-flow.svg?fit=max&auto=format&n=YcBW2H7CArGcduPb&q=85&s=b600a89f84fc86f9ff7be00a466c0635" alt="显示 Claude Code 外部连接的图表:安装/更新连接到分发服务器,用户请求连接到 Anthropic 服务,包括 Console 身份验证、public-api,以及可选的 Statsig、Sentry 和错误报告" width="720" height="520" data-path="images/claude-code-data-flow.svg" />70<img src="https://mintcdn.com/claude-code/RcOyXc06Ja8cuvMZ/images/claude-code-data-flow.svg?fit=max&auto=format&n=RcOyXc06Ja8cuvMZ&q=85&s=b5be40abf333defe984993af89546c19" alt="显示 Claude Code 外部连接的图表:安装/更新连接到分发服务器,用户请求连接到 Anthropic 服务,包括 Console 身份验证、public-api,以及可选的 Statsig、Sentry 和错误报告" width="720" height="520" data-path="images/claude-code-data-flow.svg" />

71 71 

72Claude Code 在本地运行。为了与 LLM 交互,Claude Code 通过网络发送数据。此数据包括所有用户提示和模型输出,通过 TLS 1.2+ 在传输中加密。Claude Code 与大多数流行的 VPN 和 LLM 代理兼容。72Claude Code 在本地运行。为了与 LLM 交互,Claude Code 通过网络发送数据。此数据包括所有用户提示和模型输出,通过 TLS 1.2+ 在传输中加密。Claude Code 与大多数流行的 VPN 和 LLM 代理兼容。

73 73 

desktop.md +7 −5

Details

282 282 

283### 使用会话并行工作283### 使用会话并行工作

284 284 

285点击侧边栏中的 **+ New session**,或在 macOS 上按 **Cmd+N** 或在 Windows 上按 **Ctrl+N**,来并行处理多个任务。按 **Ctrl+Tab** 和 **Ctrl+Shift+Tab** 来循环侧边栏中的会话。对于 Git 存储库,每个会话使用 [Git worktrees](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 获得自己的项目隔离副本,因此一个会话中的更改不会影响其他会话,直到你提交它们。285点击侧边栏中的 **+ New session**,或在 macOS 上按 **Cmd+N** 或在 Windows 上按 **Ctrl+N**,来并行处理多个任务。按 **Ctrl+Tab** 和 **Ctrl+Shift+Tab** 来循环侧边栏中的会话。对于 Git 存储库,每个会话使用 [Git worktrees](/zh-CN/worktrees) 获得自己的项目隔离副本,因此一个会话中的更改不会影响其他会话,直到你提交它们。

286 286 

287Worktrees 默认存储在 `<project-root>/.claude/worktrees/` 中。你可以在设置 → Claude Code 中的"Worktree location"下将其更改为自定义目录。你也可以设置一个分支前缀,该前缀会添加到每个 worktree 分支名称前面,这对于保持 Claude 创建的分支有组织很有用。要在完成后删除 worktree,请将鼠标悬停在侧边栏中的会话上并点击存档图标。要在 PR 合并或关闭时让会话自动存档,在设置 → Claude Code 中打开**PR 合并或关闭后自动存档**。自动存档仅适用于已完成运行的本地会话。287要同时查看两个会话,在 macOS 上按住 **Cmd** 或在 Windows 上按住 **Ctrl** 并点击侧边栏中的会话。会话在第二个窗格中打开,与你已经打开的窗格并排。当分割处于活跃状态时,点击另一个侧边栏会话会替换具有焦点的窗格。在 macOS 上按 **Cmd+\\** 或在 Windows 上按 **Ctrl+\\** 来关闭焦点窗格并返回到单个会话。

288 288 

289要在新 worktrees 中包含 gitignored 文件(如 `.env`),在你的项目根目录中创建一个[`.worktreeinclude` 文件](/zh-CN/common-workflows#copy-gitignored-files-to-worktrees)。289Worktrees 默认存储在 `<project-root>/.claude/worktrees/` 中。你可以在设置 → Claude Code 中的"Worktree location"下将其更改为自定义目录。你也可以设置一个分支前缀,该前缀会添加到每个 worktree 分支名称前面,这对于保持 Claude 创建的分支有组织很有用。要在完成后删除 worktree,请将鼠标悬停在侧边栏中的会话上并点击存档图标。要在 PR 合并或关闭时让会话自动存档,在设置 → Claude Code 中打开 **Auto-archive after PR merge or close**。自动存档仅适用于已完成运行的本地会话。

290 

291要在新 worktrees 中包含 gitignored 文件(如 `.env`),在你的项目根目录中创建一个 [`.worktreeinclude` 文件](/zh-CN/worktrees#copy-gitignored-files-into-worktrees)。

290 292 

291<Note>293<Note>

292 会话隔离需要 [Git](https://git-scm.com/downloads)。大多数 Mac 默认包含 Git。在终端中运行 `git --version` 来检查。在 Windows 上,Git 是 Code 选项卡工作所必需的:[下载 Git for Windows](https://git-scm.com/downloads/win),安装它,然后重启应用。如果你遇到 Git 错误,请在 [Cowork 选项卡](https://claude.com/product/cowork) 中询问 Claude 来帮助排除你的设置。294 会话隔离需要 [Git](https://git-scm.com/downloads)。大多数 Mac 默认包含 Git。在终端中运行 `git --version` 来检查。在 Windows 上,Git 是 Code 选项卡工作所必需的:[下载 Git for Windows](https://git-scm.com/downloads/win),安装它,然后重启应用。如果你遇到 Git 错误,请在 [Cowork 选项卡](https://claude.com/product/cowork) 中询问 Claude 来帮助排除你的设置。


312 314 

313远程会话也支持多个存储库。选择云环境后,点击存储库 pill 旁的 **+** 按钮向会话添加其他存储库。每个存储库都有自己的分支选择器。这对于跨越多个代码库的任务很有用,例如更新共享库及其使用者。315远程会话也支持多个存储库。选择云环境后,点击存储库 pill 旁的 **+** 按钮向会话添加其他存储库。每个存储库都有自己的分支选择器。这对于跨越多个代码库的任务很有用,例如更新共享库及其使用者。

314 316 

315有关远程会话如何工作的更多信息,请参阅[Web 上的 Claude Code](/zh-CN/claude-code-on-the-web)。317有关远程会话如何工作的更多信息,请参阅 [Web 上的 Claude Code](/zh-CN/claude-code-on-the-web)。

316 318 

317### 在另一个表面继续319### 在另一个表面继续

318 320 


516 518 

517要在任何平台上为本地会话和开发服务器设置环境变量,在提示框中打开环境下拉菜单,将鼠标悬停在 **Local** 上,然后点击齿轮图标来打开本地环境编辑器。你在此处保存的变量在你的机器上加密存储,并适用于你启动的每个本地会话和预览服务器。你也可以将变量添加到你的 `~/.claude/settings.json` 文件中的 `env` 键,尽管这些仅到达 Claude 会话而不是开发服务器。有关支持的变量的完整列表,请参阅[环境变量](/zh-CN/env-vars)。519要在任何平台上为本地会话和开发服务器设置环境变量,在提示框中打开环境下拉菜单,将鼠标悬停在 **Local** 上,然后点击齿轮图标来打开本地环境编辑器。你在此处保存的变量在你的机器上加密存储,并适用于你启动的每个本地会话和预览服务器。你也可以将变量添加到你的 `~/.claude/settings.json` 文件中的 `env` 键,尽管这些仅到达 Claude 会话而不是开发服务器。有关支持的变量的完整列表,请参阅[环境变量](/zh-CN/env-vars)。

518 520 

519[扩展思考](/zh-CN/common-workflows#use-extended-thinking-thinking-mode)默认启用,这改进了复杂推理任务的性能,但使用额外的令牌。要完全禁用思考,在本地环境编辑器中将 `MAX_THINKING_TOKENS` 设置为 `0`。在具有[自适应推理](/zh-CN/model-config#adjust-effort-level)的模型上,任何其他 `MAX_THINKING_TOKENS` 值都被忽略,因为自适应推理控制思考深度。在 Opus 4.6 和 Sonnet 4.6 上,设置 `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` 为 `1` 来使用固定思考预算;Opus 4.7 始终使用自适应推理,没有固定预算模式。521[扩展思考](/zh-CN/model-config#extended-thinking)默认启用,这改进了复杂推理任务的性能,但使用额外的令牌。要完全禁用思考,在本地环境编辑器中将 `MAX_THINKING_TOKENS` 设置为 `0`。在具有[自适应推理](/zh-CN/model-config#adjust-effort-level)的模型上,任何其他 `MAX_THINKING_TOKENS` 值都被忽略,因为自适应推理控制思考深度。在 Opus 4.6 和 Sonnet 4.6 上,设置 `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` 为 `1` 来使用固定思考预算;Opus 4.7 始终使用自适应推理,没有固定预算模式。

520 522 

521### 远程会话523### 远程会话

522 524 

Details

12 有关核心代理循环如何工作的信息,请参阅 [Claude Code 如何工作](/zh-CN/how-claude-code-works)。12 有关核心代理循环如何工作的信息,请参阅 [Claude Code 如何工作](/zh-CN/how-claude-code-works)。

13</Note>13</Note>

14 14 

15**初次使用 Claude Code?** 从 [CLAUDE.md](/zh-CN/memory) 开始了解项目约定。根据需要添加其他扩展。15**初次使用 Claude Code?** 从 [CLAUDE.md](/zh-CN/memory) 开始了解项目约定,然后根据需要添加其他扩展[当特定触发器出现时](#build-your-setup-over-time)。

16 16 

17## 概述17## 概述

18 18 


23* **[MCP](/zh-CN/mcp)** 将 Claude 连接到外部服务和工具23* **[MCP](/zh-CN/mcp)** 将 Claude 连接到外部服务和工具

24* **[Subagents](/zh-CN/sub-agents)** 在隔离的上下文中运行自己的循环,返回摘要24* **[Subagents](/zh-CN/sub-agents)** 在隔离的上下文中运行自己的循环,返回摘要

25* **[Agent teams](/zh-CN/agent-teams)** 协调多个独立会话,具有共享任务和点对点消息传递25* **[Agent teams](/zh-CN/agent-teams)** 协调多个独立会话,具有共享任务和点对点消息传递

26* **[Hooks](/zh-CN/hooks)** 完全在循环外作为确定性脚本运行26* **[Hooks](/zh-CN/hooks-guide)** 在生命周期事件上触发,可以运行脚本、HTTP 请求、提示或 subagent

27* **[Plugins](/zh-CN/plugins)** 和 **[marketplaces](/zh-CN/plugin-marketplaces)** 打包和分发这些功能27* **[Plugins](/zh-CN/plugins)** 和 **[marketplaces](/zh-CN/plugin-marketplaces)** 打包和分发这些功能

28 28 

29[Skills](/zh-CN/skills) 是最灵活的扩展。Skill 是一个包含知识、工作流或说明的 markdown 文件。您可以使用 `/deploy` 之类的命令调用 skills,或者 Claude 可以在相关时自动加载它们。Skills 可以在您当前的对话中运行,也可以通过 subagents 在隔离的上下文中运行。29[Skills](/zh-CN/skills) 是最灵活的扩展。Skill 是一个包含知识、工作流或说明的 markdown 文件。您可以使用 `/deploy` 之类的命令调用 skills,或者 Claude 可以在相关时自动加载它们。Skills 可以在您当前的对话中运行,也可以通过 subagents 在隔离的上下文中运行。


33功能范围从 Claude 每个会话都能看到的始终开启的上下文,到您或 Claude 可以调用的按需功能,再到在特定事件上运行的后台自动化。下表显示了可用的功能以及何时使用每个功能。33功能范围从 Claude 每个会话都能看到的始终开启的上下文,到您或 Claude 可以调用的按需功能,再到在特定事件上运行的后台自动化。下表显示了可用的功能以及何时使用每个功能。

34 34 

35| 功能 | 作用 | 何时使用 | 示例 |35| 功能 | 作用 | 何时使用 | 示例 |

36| ------------------------------------- | ---------------------- | --------------------- | --------------------------------------- |36| ------------------------------------- | ----------------------------- | --------------------- | --------------------------------------- |

37| **CLAUDE.md** | 每次对话加载的持久上下文 | 项目约定、"始终执行 X" 规则 | "使用 pnpm,而不是 npm。提交前运行测试。" |37| **CLAUDE.md** | 每次对话加载的持久上下文 | 项目约定、"始终执行 X" 规则 | "使用 pnpm,而不是 npm。提交前运行测试。" |

38| **Skill** | Claude 可以使用的说明、知识和工作流 | 可重用内容、参考文档、可重复的任务 | `/deploy` 运行您的部署清单;包含端点模式的 API 文档 skill |38| **Skill** | Claude 可以使用的说明、知识和工作流 | 可重用内容、参考文档、可重复的任务 | `/deploy` 运行您的部署清单;包含端点模式的 API 文档 skill |

39| **Subagent** | 返回摘要结果的隔离执行上下文 | 上下文隔离、并行任务、专门的工作者 | 读取许多文件但仅返回关键发现的研究任务 |39| **Subagent** | 返回摘要结果的隔离执行上下文 | 上下文隔离、并行任务、专门的工作者 | 读取许多文件但仅返回关键发现的研究任务 |

40| **[Agent teams](/zh-CN/agent-teams)** | 协调多个独立的 Claude Code 会话 | 并行研究、新功能开发、使用竞争假设进行调试 | 生成审查者同时检查安全性、性能和测试 |40| **[Agent teams](/zh-CN/agent-teams)** | 协调多个独立的 Claude Code 会话 | 并行研究、新功能开发、使用竞争假设进行调试 | 生成审查者同时检查安全性、性能和测试 |

41| **MCP** | 连接到外部服务 | 外部数据或操作 | 查询您的数据库、发布到 Slack、控制浏览器 |41| **MCP** | 连接到外部服务 | 外部数据或操作 | 查询您的数据库、发布到 Slack、控制浏览器 |

42| **Hook** | 在事件上运行的确定性脚本 | 可预测的自动化,不涉及 LLM | 每次文件编辑后运行 ESLint |42| **Hook** | 由事件触发的脚本、HTTP 请求、提示或 subagent | 必须在每个匹配事件上运行的自动化 | 每次文件编辑后运行 ESLint |

43 43 

44**[Plugins](/zh-CN/plugins)** 是打包层。Plugin 将 skills、hooks、subagents 和 MCP servers 捆绑到单个可安装单元中。Plugin skills 是命名空间的(如 `/my-plugin:review`),因此多个 plugins 可以共存。当您想在多个存储库中重用相同的设置或通过 **[marketplace](/zh-CN/plugin-marketplaces)** 分发给他人时,使用 plugins。44**[Plugins](/zh-CN/plugins)** 是打包层。Plugin 将 skills、hooks、subagents 和 MCP servers 捆绑到单个可安装单元中。Plugin skills 是命名空间的(如 `/my-plugin:review`),因此多个 plugins 可以共存。当您想在多个存储库中重用相同的设置或通过 **[marketplace](/zh-CN/plugin-marketplaces)** 分发给他人时,使用 plugins。

45 45 

46### 随时间推移构建您的设置

47 

48您不需要提前配置所有内容。每个功能都有一个可识别的触发器,大多数团队大致按以下顺序添加它们:

49 

50| 触发器 | 添加 |

51| :-------------------------- | :----------------------------------- |

52| Claude 两次出错约定或命令 | 将其添加到 [CLAUDE.md](/zh-CN/memory) |

53| 您一直在输入相同的提示来启动任务 | 将其保存为用户可调用的 [skill](/zh-CN/skills) |

54| 您第三次将相同的剧本或多步骤过程粘贴到聊天中 | 将其捕获为 [skill](/zh-CN/skills) |

55| 您一直在从 Claude 看不到的浏览器标签页复制数据 | 将该系统连接为 [MCP server](/zh-CN/mcp) |

56| 一个辅助任务用您不会再次引用的输出淹没您的对话 | 通过 [subagent](/zh-CN/sub-agents) 路由它 |

57| 您希望每次都发生某事而无需询问 | 编写 [hook](/zh-CN/hooks-guide) |

58| 第二个存储库需要相同的设置 | 将其打包为 [plugin](/zh-CN/plugins) |

59 

60相同的触发器告诉您何时更新您已有的内容。重复的错误或反复出现的审查评论是 CLAUDE.md 编辑,而不是聊天中的一次性更正。您一直手动调整的工作流是需要另一次修订的 skill。

61 

46### 比较相似的功能62### 比较相似的功能

47 63 

48某些功能可能看起来相似。以下是如何区分它们。64某些功能可能看起来相似。以下是如何区分它们。


55 * **Subagents** 是与您的主对话分开运行的隔离工作者71 * **Subagents** 是与您的主对话分开运行的隔离工作者

56 72 

57 | 方面 | Skill | Subagent |73 | 方面 | Skill | Subagent |

58 | -------- | ------------- | --------------------- |74 | ------------------------------------ | ------------- | --------------------- |

59 | **它是什么** | 可重用的说明、知识或工作流 | 具有自己上下文的隔离工作者 |75 | **它是什么** | 可重用的说明、知识或工作流 | 具有自己上下文的隔离工作者 |

60 | **关键优势** | 在上下文之间共享内容 | 上下文隔离。工作单独进行,仅返回摘要 |76 | **关键优势** | 在上下文之间共享内容 | 上下文隔离。工作单独进行,仅返回摘要 |

77 | **[上下文窗口](/zh-CN/context-window)影响** | 添加到您的主窗口 | 使用具有自己输入和输出令牌的单独窗口 |

61 | **最适合** | 参考材料、可调用的工作流 | 读取许多文件的任务、并行工作、专门的工作者 |78 | **最适合** | 参考材料、可调用的工作流 | 读取许多文件的任务、并行工作、专门的工作者 |

62 79 

63 **Skills 可以是参考或操作。** 参考 skills 提供 Claude 在整个会话中使用的知识(如您的 API 风格指南)。操作 skills 告诉 Claude 执行特定操作(如运行您的部署工作流的 `/deploy`)。80 **Skills 可以是参考或操作。** 参考 skills 提供 Claude 在整个会话中使用的知识(如您的 API 风格指南)。操作 skills 告诉 Claude 执行特定操作(如运行您的部署工作流的 `/deploy`)。


142 159 

143 示例:MCP 服务器将 Claude 连接到您的数据库。Skill 教导 Claude 您的数据模型、常见查询模式以及用于不同任务的表。160 示例:MCP 服务器将 Claude 连接到您的数据库。Skill 教导 Claude 您的数据模型、常见查询模式以及用于不同任务的表。

144 </Tab>161 </Tab>

162 

163 <Tab title="Hook vs Skill">

164 Hook 在生命周期事件上触发;skill 被加载到上下文中供 Claude 应用。

165 

166 | 方面 | Hook | Skill |

167 | --------- | ------------------------------------------------------------------- | ---------------------------------- |

168 | **运行** | Shell 命令、HTTP 请求、LLM 提示或 subagent | Claude 读取和遵循的说明 |

169 | **由以下触发** | [生命周期事件](/zh-CN/hooks#hook-events),如 `PostToolUse` 或 `SessionStart` | 您输入 `/<name>`,或 Claude 将描述与您的任务相匹配 |

170 | **确定性** | 总是在其事件上触发;触发器是有保证的 | Claude 解释说明;结果可能会有所不同 |

171 | **上下文成本** | 零,除非 hook 返回输出 | 描述在每个会话加载;使用时加载完整内容 |

172 | **最适合** | 每次都以相同方式运行且不需要 Claude 思考的操作 | 需要推理的工作流、参考材料、多步骤任务 |

173 

174 **当操作必须每次都以相同方式发生且不需要 Claude 思考时,使用 hook**。例如:保存时格式化、拒绝 `rm -rf /`、在会话结束时发布 Slack 消息。

175 

176 **当 Claude 应该决定如何应用步骤或内容是知识而不是脚本时,使用 skill**。例如:`/release` 清单、您的 API 风格指南、调试剧本。

177 

178 **将护栏放在 hooks 中。** CLAUDE.md 或 skill 中的"永远不要编辑 `.env`"之类的说明是请求,而不是保证。阻止编辑的 `PreToolUse` hook 是强制执行。如果规则必须每次都成立,将其作为 hook 而不是提示说明。

179 

180 **Hook 输出进入上下文。** 运行您的 linter 的 `PostToolUse` hook 将结果作为 Claude 读取的文本反馈;`/fix-lint` skill 告诉 Claude 如何解决它们。

181 </Tab>

145</Tabs>182</Tabs>

146 183 

147### 了解功能如何分层184### 了解功能如何分层


151* **CLAUDE.md 文件** 是累加的:所有级别同时向 Claude 的上下文贡献内容。来自您的工作目录及以上的文件在启动时加载;子目录在您在其中工作时加载。当说明冲突时,Claude 使用判断来协调它们,更具体的说明通常优先。有关详细信息,请参阅 [CLAUDE.md 文件如何加载](/zh-CN/memory#how-claudemd-files-load)。188* **CLAUDE.md 文件** 是累加的:所有级别同时向 Claude 的上下文贡献内容。来自您的工作目录及以上的文件在启动时加载;子目录在您在其中工作时加载。当说明冲突时,Claude 使用判断来协调它们,更具体的说明通常优先。有关详细信息,请参阅 [CLAUDE.md 文件如何加载](/zh-CN/memory#how-claudemd-files-load)。

152* **Skills 和 subagents** 按名称覆盖:当相同的名称存在于多个级别时,一个定义根据优先级获胜(对于 skills 为托管 > 用户 > 项目;对于 subagents 为托管 > CLI 标志 > 项目 > 用户 > plugin)。Plugin skills 是 [命名空间的](/zh-CN/plugins#add-skills-to-your-plugin) 以避免冲突。有关详细信息,请参阅 [skill 发现](/zh-CN/skills#where-skills-live) 和 [subagent 范围](/zh-CN/sub-agents#choose-the-subagent-scope)。189* **Skills 和 subagents** 按名称覆盖:当相同的名称存在于多个级别时,一个定义根据优先级获胜(对于 skills 为托管 > 用户 > 项目;对于 subagents 为托管 > CLI 标志 > 项目 > 用户 > plugin)。Plugin skills 是 [命名空间的](/zh-CN/plugins#add-skills-to-your-plugin) 以避免冲突。有关详细信息,请参阅 [skill 发现](/zh-CN/skills#where-skills-live) 和 [subagent 范围](/zh-CN/sub-agents#choose-the-subagent-scope)。

153* **MCP 服务器** 按名称覆盖:本地 > 项目 > 用户。有关详细信息,请参阅 [MCP 范围](/zh-CN/mcp#scope-hierarchy-and-precedence)。190* **MCP 服务器** 按名称覆盖:本地 > 项目 > 用户。有关详细信息,请参阅 [MCP 范围](/zh-CN/mcp#scope-hierarchy-and-precedence)。

154* **Hooks** 合并:所有注册的 hooks 为其匹配的事件触发,无论来源如何。有关详细信息,请参阅 [hooks](/zh-CN/hooks)。191* **Hooks** 合并:所有注册的 hooks 为其匹配的事件触发,无论来源如何。有关详细信息,请参阅 [hooks](/zh-CN/hooks-guide)。

155 192 

156### 组合功能193### 组合功能

157 194 


168 205 

169## 了解上下文成本206## 了解上下文成本

170 207 

171您添加的每个功能都会消耗 Claude 的一些上下文。太多可能会填满您的上下文窗口,但它也可能增加噪音,使 Claude 效率降低;skills 可能无法正确触发,或 Claude 可能会失去对您的约定的跟踪。了解这些权衡有助于您构建有效的设置。208您添加的每个功能都会消耗 Claude 的一些上下文。太多可能会填满您的上下文窗口,但它也可能增加噪音,使 Claude 效率降低;skills 可能无法正确触发,或 Claude 可能会失去对您的约定的跟踪。了解这些权衡有助于您构建有效的设置。有关这些功能如何在运行会话中组合的交互式视图,请参阅 [探索上下文窗口](/zh-CN/context-window)。

172 209 

173### 按功能的上下文成本210### 按功能的上下文成本

174 211 


178| ------------- | ---------- | ------------------ | ----------------- |215| ------------- | ---------- | ------------------ | ----------------- |

179| **CLAUDE.md** | 会话开始 | 完整内容 | 每个请求 |216| **CLAUDE.md** | 会话开始 | 完整内容 | 每个请求 |

180| **Skills** | 会话开始 + 使用时 | 启动时的描述,使用时的完整内容 | 低(每个请求的描述)\* |217| **Skills** | 会话开始 + 使用时 | 启动时的描述,使用时的完整内容 | 低(每个请求的描述)\* |

181| **MCP 服务器** | 会话开始 | 所有工具定义和 JSON 架构 | 每个请求 |218| **MCP 服务器** | 会话开始 | 工具名称;完整架构按需 | 低,直到使用工具 |

182| **Subagents** | 生成时 | 具有指定 skills 的新鲜上下文 | 与主会话隔离 |219| **Subagents** | 生成时 | 具有指定 skills 的新鲜上下文 | 与主会话隔离 |

183| **Hooks** | 触发时 | 无(外部运行) | 零,除非 hook 返回额外上下文 |220| **Hooks** | 触发时 | 无(外部运行) | 零,除非 hook 返回额外上下文 |

184 221 


188 225 

189每个功能在会话的不同点加载。下面的选项卡解释了每个功能何时加载以及什么进入上下文。226每个功能在会话的不同点加载。下面的选项卡解释了每个功能何时加载以及什么进入上下文。

190 227 

191<img src="https://mintcdn.com/claude-code/6yTCYq1p37ZB8-CQ/images/context-loading.svg?fit=max&auto=format&n=6yTCYq1p37ZB8-CQ&q=85&s=5a58ce953a35a2412892015e2ad6cb67" alt="上下文加载:CLAUDE.md 和 MCP 在会话开始时加载并保留在每个请求中。Skills 在启动时加载描述,在调用时加载完整内容。Subagents 获得隔离的上下文。Hooks 外部运行。" width="720" height="410" data-path="images/context-loading.svg" />228<img src="https://mintcdn.com/claude-code/6yTCYq1p37ZB8-CQ/images/context-loading.svg?fit=max&auto=format&n=6yTCYq1p37ZB8-CQ&q=85&s=5a58ce953a35a2412892015e2ad6cb67" alt="上下文加载:CLAUDE.md 在会话开始时加载并保留在每个请求中。MCP 工具名称在启动时加载,完整架构延迟到使用。Skills 在启动时加载描述,在调用时加载完整内容。Subagents 获得隔离的上下文。Hooks 外部运行。" width="720" height="410" data-path="images/context-loading.svg" />

192 229 

193<Tabs>230<Tabs>

194 <Tab title="CLAUDE.md">231 <Tab title="CLAUDE.md">


202 </Tab>239 </Tab>

203 240 

204 <Tab title="Skills">241 <Tab title="Skills">

205 Skills 是 Claude 工具包中的额外功能。它们可以是参考材料(如 API 风格指南)或可调用的工作流,您可以使用 `/<name>` 触发(如 `/deploy`)。Claude Code 附带 [捆绑的 skills](/zh-CN/skills#bundled-skills),如 `/simplify`、`/batch` 和 `/debug`,可以开箱即用。您也可以创建自己的。Claude 在适当时使用 skills,或者您可以直接调用一个。242 Skills 是 Claude 工具包中的额外功能。它们可以是参考材料(如 API 风格指南)或可调用的工作流,您可以使用 `/<name>` 触发(如 `/deploy`)。Claude Code 包括 [捆绑的 skills](/zh-CN/commands),如 `/simplify`、`/batch` 和 `/debug`,可以开箱即用。您也可以创建自己的。Claude 在适当时使用 skills,或者您可以直接调用一个。

206 243 

207 **何时:** 取决于 skill 的配置。默认情况下,描述在会话开始时加载,完整内容在使用时加载。对于仅用户 skills(`disable-model-invocation: true`),在您调用它们之前不加载任何内容。244 **何时:** 取决于 skill 的配置。默认情况下,描述在会话开始时加载,完整内容在使用时加载。对于仅用户 skills(`disable-model-invocation: true`),在您调用它们之前不加载任何内容。

208 245 


220 <Tab title="MCP 服务器">257 <Tab title="MCP 服务器">

221 **何时:** 会话开始。258 **何时:** 会话开始。

222 259 

223 **加载内容:** 来自连接的服务器的所有工具定义和 JSON 架构。260 **加载内容:** 来自连接的服务器的工具名称。完整的 JSON 架构保持延迟,直到 Claude 需要特定工具。

224 261 

225 **上下文成本:** [工具搜索](/zh-CN/mcp#scale-with-mcp-tool-search)(默认启用)将 MCP 工具加载到上下文的 10%,并延迟其余部分直到需要。262 **上下文成本:** [工具搜索](/zh-CN/mcp#scale-with-mcp-tool-search)默认启用,因此空闲 MCP 工具消耗最少的上下文。

226 263 

227 **可靠性说明:** MCP 连接可能在会话中途无声地失败。如果服务器断开连接,其工具会无警告地消失。Claude 可能尝试使用不再存在的工具。如果您注意到 Claude 无法使用它之前可以访问的 MCP 工具,请使用 `/mcp` 检查连接。264 **可靠性说明:** MCP 连接可能在会话中途无声地失败。如果服务器断开连接,其工具会无警告地消失。Claude 可能尝试使用不再存在的工具。如果您注意到 Claude 无法使用它之前可以访问的 MCP 工具,请使用 `/mcp` 检查连接。

228 265 


245 </Tab>282 </Tab>

246 283 

247 <Tab title="Hooks">284 <Tab title="Hooks">

248 **何时:** 触发时。Hooks 在特定的生命周期事件上触发,如工具执行、会话边界、提示提交、权限请求和压缩。有关完整列表,请参阅 [Hooks](/zh-CN/hooks)。285 **何时:** 触发时。Hooks 在特定的生命周期事件上触发,如工具执行、会话边界、提示提交、权限请求和压缩。有关完整列表,请参阅 [Hooks](/zh-CN/hooks-guide)。

249 286 

250 **加载内容:** 默认情况下无。Hooks 作为外部脚本运行。287 **加载内容:** 默认情况下无。Hooks 在主对话外执行。

251 288 

252 **上下文成本:** 零,除非 hook 返回作为消息添加到您的对话中的输出。289 **上下文成本:** 零,除非 hook 返回作为消息添加到您的对话中的输出。

253 290 

hooks.md +6 −6

Details

974| `decision` | `"block"` 防止提示被处理并从上下文中删除。省略以允许提示继续 |974| `decision` | `"block"` 防止提示被处理并从上下文中删除。省略以允许提示继续 |

975| `reason` | 当 `decision` 为 `"block"` 时向用户显示。不添加到上下文 |975| `reason` | 当 `decision` 为 `"block"` 时向用户显示。不添加到上下文 |

976| `additionalContext` | 添加到 Claude 上下文的字符串,与提交的提示一起。请参阅[为 Claude 添加上下文](#add-context-for-claude) |976| `additionalContext` | 添加到 Claude 上下文的字符串,与提交的提示一起。请参阅[为 Claude 添加上下文](#add-context-for-claude) |

977| `sessionTitle` | 设置会话标题,与 `/rename` 相同的效果。使用此根据提示内容自动命名会话 |977| `sessionTitle` | 设置会话标题。使用此根据提示内容自动命名会话 |

978 978 

979```json theme={null}979```json theme={null}

980{980{


1356`PostToolUse` hooks 可以在工具执行后向 Claude 提供反馈。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您的 hook 脚本可以返回这些事件特定字段:1356`PostToolUse` hooks 可以在工具执行后向 Claude 提供反馈。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您的 hook 脚本可以返回这些事件特定字段:

1357 1357 

1358| 字段 | 描述 |1358| 字段 | 描述 |

1359| :--------------------- | :---------------------------------------------------------------------- |1359| :--------------------- | :------------------------------------------------------------------------- |

1360| `decision` | `"block"` 用 `reason` 提示 Claude。省略以允许操作继续 |1360| `decision` | `"block"` 用 `reason` 提示 Claude。Claude 仍然看到原始输出;要替换它,使用 `updatedToolOutput` |

1361| `reason` | 当 `decision` 为 `"block"` 时向 Claude 显示的解释 |1361| `reason` | 当 `decision` 为 `"block"` 时向 Claude 显示的解释 |

1362| `additionalContext` | 添加到 Claude 上下文的字符串,与工具结果一起。请参阅[为 Claude 添加上下文](#add-context-for-claude) |1362| `additionalContext` | 添加到 Claude 上下文的字符串,与工具结果一起。请参阅[为 Claude 添加上下文](#add-context-for-claude) |

1363| `updatedToolOutput` | 用提供的值替换工具的输出,然后将其发送给 Claude。该值必须与工具的输出形状匹配 |1363| `updatedToolOutput` | 用提供的值替换工具的输出,然后将其发送给 Claude。该值必须与工具的输出形状匹配 |


2406```2406```

2407 2407 

2408| 字段 | 描述 |2408| 字段 | 描述 |

2409| :------- | :------------------------- |2409| :------- | :-------------------------------- |

2410| `ok` | `true` 允许操作,`false` 阻止它 |2410| `ok` | `true` 允许,`false` 阻止。请参阅下面的每个事件行为 |

2411| `reason` | 当 `ok` 为 `false` 时必需。阻止的解释 |2411| `reason` | 当 `ok` 为 `false` 时必需。决定的解释 |

2412 2412 

2413`ok: false` 时发生的情况取决于事件:2413`ok: false` 时发生的情况取决于事件:

2414 2414 

permissions.md +4 −4

Details

36| :------------------ | :------------------------------------------------------------------------------- |36| :------------------ | :------------------------------------------------------------------------------- |

37| `default` | 标准行为:在首次使用每个工具时提示权限 |37| `default` | 标准行为:在首次使用每个工具时提示权限 |

38| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等) |38| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等) |

39| `plan` | Plan Mode:Claude 可以分析但不能修改文件或执行命令 |39| `plan` | Plan Mode:Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件 |

40| `auto` | 自动批准工具调用,并进行后台安全检查以验证操作与您的请求一致。目前处于研究预览阶段 |40| `auto` | 自动批准工具调用,并进行后台安全检查以验证操作与您的请求一致。目前处于研究预览阶段 |

41| `dontAsk` | 自动拒绝工具,除非通过 `/permissions` 或 `permissions.allow` 规则预先批准 |41| `dontAsk` | 自动拒绝工具,除非通过 `/permissions` 或 `permissions.allow` 规则预先批准 |

42| `bypassPermissions` | 跳过所有权限提示。根目录和主目录删除操作(如 `rm -rf /`)仍会作为断路器提示 |42| `bypassPermissions` | 跳过所有权限提示。根目录和主目录删除操作(如 `rm -rf /`)仍会作为断路器提示 |


296 296 

297* 权限 deny 规则阻止 Claude 甚至尝试访问受限资源297* 权限 deny 规则阻止 Claude 甚至尝试访问受限资源

298* 沙箱限制防止 Bash 命令到达定义边界之外的资源,即使提示注入绕过 Claude 的决策制定298* 沙箱限制防止 Bash 命令到达定义边界之外的资源,即使提示注入绕过 Claude 的决策制定

299* 沙箱中的文件系统限制使用 Read 和 Edit deny 规则,而不是单独的沙箱配置299* 沙箱中的文件系统限制结合 [`sandbox.filesystem`](/zh-CN/sandboxing) 设置与 Read 和 Edit deny 规则;两者都合并到最终的沙箱边界中

300* 网络限制结合 WebFetch 权限规则与沙箱的 `allowedDomains` 和 `deniedDomains` 列表300* 网络限制结合 WebFetch 权限规则与沙箱的 `allowedDomains` 和 `deniedDomains` 列表

301 301 

302当沙箱启用 `autoAllowBashIfSandboxed: true`(这是默认值)时,沙箱化的 Bash 命令无需提示即可运行,即使您的权限包括 `ask: Bash(*)`。沙箱边界替代了每个命令的提示。显式 deny 规则仍然适用,针对 `/`、您的主目录或其他关键系统路径的 `rm` 或 `rmdir` 命令仍然会触发提示。请参见[沙箱模式](/zh-CN/sandboxing#sandbox-modes)以更改此行为。302当沙箱启用 `autoAllowBashIfSandboxed: true`(这是默认值)时,沙箱化的 Bash 命令无需提示即可运行,即使您的权限包括 `ask: Bash(*)`。沙箱边界替代了每个命令的提示。显式 deny 规则仍然适用,针对 `/`、您的主目录或其他关键系统路径的 `rm` 或 `rmdir` 命令仍然会触发提示。请参见[沙箱模式](/zh-CN/sandboxing#sandbox-modes)以更改此行为。


316| `allowManagedMcpServersOnly` | 当为 `true` 时,仅尊重来自托管设置的 `allowedMcpServers`。`deniedMcpServers` 仍然从所有来源合并。请参见[托管 MCP 配置](/zh-CN/mcp#managed-mcp-configuration) |316| `allowManagedMcpServersOnly` | 当为 `true` 时,仅尊重来自托管设置的 `allowedMcpServers`。`deniedMcpServers` 仍然从所有来源合并。请参见[托管 MCP 配置](/zh-CN/mcp#managed-mcp-configuration) |

317| `allowManagedPermissionRulesOnly` | 当为 `true` 时,防止用户和项目设置定义 `allow`、`ask` 或 `deny` 权限规则。仅应用托管设置中的规则 |317| `allowManagedPermissionRulesOnly` | 当为 `true` 时,防止用户和项目设置定义 `allow`、`ask` 或 `deny` 权限规则。仅应用托管设置中的规则 |

318| `blockedMarketplaces` | 市场来源的黑名单。在下载前检查被阻止的来源,因此它们永远不会接触文件系统。请参见[托管市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) |318| `blockedMarketplaces` | 市场来源的黑名单。在下载前检查被阻止的来源,因此它们永远不会接触文件系统。请参见[托管市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) |

319| `channelsEnabled` | 允许 Team 和 Enterprise 用户使用[频道](/zh-CN/channels)。未设置或 `false` 会阻止频道消息传递,无论用户传递什么给 `--channels` |319| `channelsEnabled` | 允许为组织启用[频道](/zh-CN/channels)。请参见[企业控制](/zh-CN/channels#enterprise-controls)了解每个计划的默认设置 |

320| `forceRemoteSettingsRefresh` | 当为 `true` 时,阻止 CLI 启动直到远程托管设置被新鲜获取,如果获取失败则退出。请参见[故障关闭强制执行](/zh-CN/server-managed-settings#enforce-fail-closed-startup) |320| `forceRemoteSettingsRefresh` | 当为 `true` 时,阻止 CLI 启动直到远程托管设置被新鲜获取,如果获取失败则退出。请参见[故障关闭强制执行](/zh-CN/server-managed-settings#enforce-fail-closed-startup) |

321| `pluginTrustMessage` | 自定义消息,附加到安装前显示的插件信任警告 |321| `pluginTrustMessage` | 自定义消息,附加到安装前显示的插件信任警告 |

322| `sandbox.filesystem.allowManagedReadPathsOnly` | 当为 `true` 时,仅尊重来自托管设置的 `filesystem.allowRead` 路径。`denyRead` 仍然从所有来源合并 |322| `sandbox.filesystem.allowManagedReadPathsOnly` | 当为 `true` 时,仅尊重来自托管设置的 `filesystem.allowRead` 路径。`denyRead` 仍然从所有来源合并 |


327`disableBypassPermissionsMode` 通常放在托管设置中以强制执行组织策略,但它可以从任何范围工作。用户可以在自己的设置中设置它以将自己锁定在绕过模式之外。327`disableBypassPermissionsMode` 通常放在托管设置中以强制执行组织策略,但它可以从任何范围工作。用户可以在自己的设置中设置它以将自己锁定在绕过模式之外。

328 328 

329<Note>329<Note>

330 对[远程控制](/zh-CN/remote-control)和[网络会话](/zh-CN/claude-code-on-the-web)的访问不由托管设置密钥控制。在 Team 和 Enterprise 计划上,管理员在[Claude Code 管理设置](https://claude.ai/admin-settings/claude-code)中启用或禁用这些功能。330 在 Team 和 Enterprise 计划上,管理员在[Claude Code 管理设置](https://claude.ai/admin-settings/claude-code)中启用或禁用[远程控制](/zh-CN/remote-control)和[网络会话](/zh-CN/claude-code-on-the-web)。远程控制还可以通过 [`disableRemoteControl`](/zh-CN/settings#available-settings) 托管设置按设备禁用。网络会话没有按设备托管设置密钥。

331</Note>331</Note>

332 332 

333## 设置优先级333## 设置优先级

platforms.md +6 −3

Details

13根据您喜欢的工作方式和项目所在位置选择平台。13根据您喜欢的工作方式和项目所在位置选择平台。

14 14 

15| 平台 | 最适合 | 您获得的功能 |15| 平台 | 最适合 | 您获得的功能 |

16| :----------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------- |16| :----------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------- |

17| [CLI](/zh-CN/quickstart) | 终端工作流、脚本编写、远程服务器 | 完整功能集、[Agent SDK](/zh-CN/headless)、第三方提供商 |17| [CLI](/zh-CN/quickstart) | 终端工作流、脚本编写、远程服务器 | 完整功能集、[Agent SDK](/zh-CN/headless)、[计算机使用](/zh-CN/computer-use)在 macOS 上(Pro 和 Max)、第三方提供商 |

18| [Desktop](/zh-CN/desktop) | 视觉审查、并行会话、托管设置 | Diff 查看器、应用预览、Pro 和 Max 上的[计算机使用](/zh-CN/desktop#let-claude-use-your-computer)和 [Dispatch](/zh-CN/desktop#sessions-from-dispatch) |18| [Desktop](/zh-CN/desktop) | 视觉审查、并行会话、托管设置 | Diff 查看器、应用预览、Pro 和 Max 上的[计算机使用](/zh-CN/desktop#let-claude-use-your-computer)和 [Dispatch](/zh-CN/desktop#sessions-from-dispatch) |

19| [VS Code](/zh-CN/vs-code) | 在 VS Code 内工作而无需切换到终端 | 内联 diff、集成终端、文件上下文 |19| [VS Code](/zh-CN/vs-code) | 在 VS Code 内工作而无需切换到终端 | 内联 diff、集成终端、文件上下文 |

20| [JetBrains](/zh-CN/jetbrains) | 在 IntelliJ、PyCharm、WebStorm 或其他 JetBrains IDE 内工作 | Diff 查看器、选择共享、终端会话 |20| [JetBrains](/zh-CN/jetbrains) | 在 IntelliJ、PyCharm、WebStorm 或其他 JetBrains IDE 内工作 | Diff 查看器、选择共享、终端会话 |

21| [Web](/zh-CN/claude-code-on-the-web) | 不需要太多操作的长时间运行任务,或应该在您离线时继续的工作 | Anthropic 托管云、断开连接后继续运行 |21| [Web](/zh-CN/claude-code-on-the-web) | 不需要太多操作的长时间运行任务,或应该在您离线时继续的工作 | Anthropic 托管云、断开连接后继续运行 |

22| Mobile | 在远离计算机时启动和监控任务 | 来自 iOS 和 Android 版 Claude 应用的云会话、用于本地会话的 [Remote Control](/zh-CN/remote-control)、Pro 和 Max 上的 [Dispatch](/zh-CN/desktop#sessions-from-dispatch) 到 Desktop |

22 23 

23CLI 是终端原生工作的最完整界面:脚本编写、第三方提供商和 Agent SDK 仅限 CLI。Desktop 和 IDE 扩展为了视觉审查和更紧密的编辑器集成而放弃了一些仅限 CLI 的功能。Web 在 Anthropic 的云中运行,因此任务在您断开连接后继续进行。24CLI 是终端原生工作的最完整界面:脚本编写和 Agent SDK 仅限 CLI。第三方提供商也可在 [VS Code](/zh-CN/vs-code#use-third-party-providers) 中使用。企业 [Desktop](/zh-CN/desktop) 部署支持 Vertex AI 和网关提供商;对于 Bedrock 或 Foundry,请使用 CLI 或 VS Code 而不是 Desktop。Desktop 和 IDE 扩展为了视觉审查和更紧密的编辑器集成而放弃了一些仅限 CLI 的功能。Web 在 Anthropic 的云中运行,因此任务在您断开连接后继续进行。Mobile 是这些相同云会话的瘦客户端,或通过 Remote Control 进入本地会话,并可以使用 Dispatch 向 Desktop 发送任务。

24 25 

25您可以在同一项目上混合使用多个界面。配置、项目内存和 MCP 服务器在本地界面之间共享。26您可以在同一项目上混合使用多个界面。配置、项目内存和 MCP 服务器在本地界面之间共享。

26 27 


61* [VS Code](/zh-CN/vs-code):编辑器内的 Claude Code 扩展62* [VS Code](/zh-CN/vs-code):编辑器内的 Claude Code 扩展

62* [JetBrains](/zh-CN/jetbrains):IntelliJ、PyCharm 和其他 JetBrains IDE 的扩展63* [JetBrains](/zh-CN/jetbrains):IntelliJ、PyCharm 和其他 JetBrains IDE 的扩展

63* [Web 上的 Claude Code](/zh-CN/claude-code-on-the-web):断开连接时继续运行的云会话64* [Web 上的 Claude Code](/zh-CN/claude-code-on-the-web):断开连接时继续运行的云会话

65* Mobile:用于在远离计算机时启动和监控任务的 [iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) 和 [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude) 版 Claude 应用

64 66 

65### 集成67### 集成

66 68 

67* [Chrome](/zh-CN/chrome):使用您登录的会话自动化浏览器任务69* [Chrome](/zh-CN/chrome):使用您登录的会话自动化浏览器任务

70* [计算机使用](/zh-CN/computer-use):让 Claude 在 macOS 上打开应用和控制您的屏幕

68* [GitHub Actions](/zh-CN/github-actions):在 CI 管道中运行 Claude71* [GitHub Actions](/zh-CN/github-actions):在 CI 管道中运行 Claude

69* [GitLab CI/CD](/zh-CN/gitlab-ci-cd):GitLab 的相同功能72* [GitLab CI/CD](/zh-CN/gitlab-ci-cd):GitLab 的相同功能

70* [Code Review](/zh-CN/code-review):每个拉取请求上的自动审查73* [Code Review](/zh-CN/code-review):每个拉取请求上的自动审查

Details

23 23 

24## 演练:创建本地 marketplace24## 演练:创建本地 marketplace

25 25 

26此示例创建一个包含一个 plugin 的 marketplace:一个用于代码审查的 `/quality-review` skill。你将创建目录结构、添加 skill、创建 plugin manifest 和 marketplace 目录,然后安装并测试它。26此示例创建一个包含一个 plugin 的 marketplace:一个用于代码审查的 `quality-review` skill。你将创建目录结构、添加 skill、创建 plugin manifest 和 marketplace 目录,然后安装并测试它。

27 27 

28<Steps>28<Steps>

29 <Step title="创建目录结构">29 <Step title="创建目录结构">


35 </Step>35 </Step>

36 36 

37 <Step title="创建 skill">37 <Step title="创建 skill">

38 创建一个 `SKILL.md` 文件,定义 `/quality-review` skill 的功能。38 创建一个 `SKILL.md` 文件,定义 `quality-review` skill 的功能。

39 39 

40 ```markdown my-marketplace/plugins/quality-review-plugin/skills/quality-review/SKILL.md theme={null}40 ```markdown my-marketplace/plugins/quality-review-plugin/skills/quality-review/SKILL.md theme={null}

41 ---41 ---


59 ```json my-marketplace/plugins/quality-review-plugin/.claude-plugin/plugin.json theme={null}59 ```json my-marketplace/plugins/quality-review-plugin/.claude-plugin/plugin.json theme={null}

60 {60 {

61 "name": "quality-review-plugin",61 "name": "quality-review-plugin",

62 "description": "Adds a /quality-review skill for quick code reviews",62 "description": "Adds a quality-review skill for quick code reviews",

63 "version": "1.0.0"63 "version": "1.0.0"

64 }64 }

65 ```65 ```


82 {82 {

83 "name": "quality-review-plugin",83 "name": "quality-review-plugin",

84 "source": "./plugins/quality-review-plugin",84 "source": "./plugins/quality-review-plugin",

85 "description": "Adds a /quality-review skill for quick code reviews"85 "description": "Adds a quality-review skill for quick code reviews"

86 }86 }

87 ]87 ]

88 }88 }


99 </Step>99 </Step>

100 100 

101 <Step title="尝试一下">101 <Step title="尝试一下">

102 在编辑器中选择一些代码并运行你的新 skill。102 在编辑器中选择一些代码并运行你的新 skill。Plugin skills 使用 plugin 名称进行命名空间划分。

103 103 

104 ```shell theme={null}104 ```shell theme={null}

105 /quality-review105 /quality-review-plugin:quality-review

106 ```106 ```

107 </Step>107 </Step>

108</Steps>108</Steps>


693* 对于 `hostPattern` 源:marketplace 主机与正则表达式模式匹配693* 对于 `hostPattern` 源:marketplace 主机与正则表达式模式匹配

694* 对于 `pathPattern` 源:marketplace 的文件系统路径与正则表达式模式匹配694* 对于 `pathPattern` 源:marketplace 的文件系统路径与正则表达式模式匹配

695 695 

696精确匹配不规范化 URL:尾部斜杠、`.git` 后缀或 `ssh://` 与 `https://` 形式被视为不同的值。如果你的组织的 marketplace 可以通过多个 URL 形式克隆,优先使用 `hostPattern` 条目而不是字面 URL,以便所有形式都匹配。

697 

696因为 `strictKnownMarketplaces` 在[托管设置](/zh-CN/settings#settings-files)中设置,个别用户和项目配置无法覆盖这些限制。698因为 `strictKnownMarketplaces` 在[托管设置](/zh-CN/settings#settings-files)中设置,个别用户和项目配置无法覆盖这些限制。

697 699 

698有关完整的配置详细信息,包括所有支持的源类型和与 `extraKnownMarketplaces` 的比较,请参阅 [strictKnownMarketplaces 参考](/zh-CN/settings#strictknownmarketplaces)。700有关完整的配置详细信息,包括所有支持的源类型和与 `extraKnownMarketplaces` 的比较,请参阅 [strictKnownMarketplaces 参考](/zh-CN/settings#strictknownmarketplaces)。

Details

262**可用的 LSP plugins:**262**可用的 LSP plugins:**

263 263 

264| Plugin | 语言服务器 | 安装命令 |264| Plugin | 语言服务器 | 安装命令 |

265| :--------------- | :------------------------- | :------------------------------------------------------------------------------ |265| :------------------ | :------------------------- | :------------------------------------------------------------------------------ |

266| `pyright-lsp` | Pyright (Python) | `pip install pyright` 或 `npm install -g pyright` |266| `pyright-lsp` | Pyright (Python) | `pip install pyright` 或 `npm install -g pyright` |

267| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |267| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |

268| `rust-lsp` | rust-analyzer | [参阅 rust-analyzer 安装](https://rust-analyzer.github.io/manual.html#installation) |268| `rust-analyzer-lsp` | rust-analyzer | [参阅 rust-analyzer 安装](https://rust-analyzer.github.io/manual.html#installation) |

269 269 

270首先安装语言服务器,然后从市场安装 plugin。270首先安装语言服务器,然后从市场安装 plugin。

271 271 


531 531 

532Claude Code 提供两个变量用于引用 plugin 路径。两者都在 skill 内容、agent 内容、hook 命令、monitor 命令以及 MCP 或 LSP server 配置中出现的任何地方进行内联替换。两者也都作为环境变量导出到 hook 进程和 MCP 或 LSP server 子进程。532Claude Code 提供两个变量用于引用 plugin 路径。两者都在 skill 内容、agent 内容、hook 命令、monitor 命令以及 MCP 或 LSP server 配置中出现的任何地方进行内联替换。两者也都作为环境变量导出到 hook 进程和 MCP 或 LSP server 子进程。

533 533 

534**`${CLAUDE_PLUGIN_ROOT}`**:plugin 安装目录的绝对路径。使用此路径引用与 plugin 捆绑的脚本、二进制文件和配置文件。当 plugin 更新时,此路径会更改,因此您在此处写入的文件不会在更新后保留。534**`${CLAUDE_PLUGIN_ROOT}`**:plugin 安装目录的绝对路径。使用此路径引用与 plugin 捆绑的脚本、二进制文件和配置文件。当 plugin 更新时,此路径会更改。前一个版本的目录在更新后约七天内保留在磁盘上以进行清理,但应将其视为临时的,不要在此处写入状态。

535 

536当 plugin 在会话中期更新时,hook 命令、monitors、MCP servers 和 LSP servers 继续使用前一个版本的路径。运行 `/reload-plugins` 以将 hooks、MCP servers 和 LSP servers 切换到新路径;monitors 需要会话重启。

535 537 

536**`${CLAUDE_PLUGIN_DATA}`**:用于 plugin 状态的持久目录,在更新后保留。使用此目录用于已安装的依赖项,如 `node_modules` 或 Python 虚拟环境、生成的代码、缓存以及任何应在 plugin 版本之间保留的其他文件。首次引用此变量时,目录会自动创建。538**`${CLAUDE_PLUGIN_DATA}`**:用于 plugin 状态的持久目录,在更新后保留。使用此目录用于已安装的依赖项,如 `node_modules` 或 Python 虚拟环境、生成的代码、缓存以及任何应在 plugin 版本之间保留的其他文件。首次引用此变量时,目录会自动创建。

537 539 


677 `.claude-plugin/` 目录包含 `plugin.json` 文件。所有其他目录(commands/、agents/、skills/、output-styles/、themes/、monitors/、hooks/)必须在 plugin 根目录,而不是在 `.claude-plugin/` 内。679 `.claude-plugin/` 目录包含 `plugin.json` 文件。所有其他目录(commands/、agents/、skills/、output-styles/、themes/、monitors/、hooks/)必须在 plugin 根目录,而不是在 `.claude-plugin/` 内。

678</Warning>680</Warning>

679 681 

682plugin 根目录中的 `CLAUDE.md` 文件不会作为项目上下文加载。Plugins 通过 skills、agents 和 hooks 而不是 CLAUDE.md 来贡献上下文。要提供加载到 Claude 上下文中的说明,请将其放在 [skill](#skills) 中。

683 

680### 文件位置参考684### 文件位置参考

681 685 

682| 组件 | 默认位置 | 目的 |686| 组件 | 默认位置 | 目的 |

security.md +1 −1

Details

27* **沙箱化 bash 工具**:使用文件系统和网络隔离的 [Sandbox](/zh-CN/sandboxing) bash 命令,减少权限提示同时保持安全性。使用 `/sandbox` 启用以定义 Claude Code 可以自主工作的边界27* **沙箱化 bash 工具**:使用文件系统和网络隔离的 [Sandbox](/zh-CN/sandboxing) bash 命令,减少权限提示同时保持安全性。使用 `/sandbox` 启用以定义 Claude Code 可以自主工作的边界

28* **写入访问限制**:Claude Code 只能写入启动它的文件夹及其子文件夹——它不能在没有明确权限的情况下修改父目录中的文件。虽然 Claude Code 可以读取工作目录外的文件(对于访问系统库和依赖项很有用),但写入操作严格限制在项目范围内,创建了清晰的安全边界28* **写入访问限制**:Claude Code 只能写入启动它的文件夹及其子文件夹——它不能在没有明确权限的情况下修改父目录中的文件。虽然 Claude Code 可以读取工作目录外的文件(对于访问系统库和依赖项很有用),但写入操作严格限制在项目范围内,创建了清晰的安全边界

29* **提示疲劳缓解**:支持按用户、按代码库或按组织的白名单常用安全命令29* **提示疲劳缓解**:支持按用户、按代码库或按组织的白名单常用安全命令

30* **Accept Edits 模式**:批量接受多个编辑,同时为具有副作用的命令保持权限提示30* **Accept Edits 模式**:自动批准文件编辑和一组固定的文件系统 Bash 命令,如 `mkdir`、`touch`、`rm`、`mv`、`cp` 和 `sed`,用于工作目录中的路径。其他 Bash 命令和超出范围的路径仍然会提示

31 31 

32### 用户责任32### 用户责任

33 33 

settings.md +26 −3

Details

71| **Plugins** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` |71| **Plugins** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` |

72| **CLAUDE.md** | `~/.claude/CLAUDE.md` | `CLAUDE.md` 或 `.claude/CLAUDE.md` | `CLAUDE.local.md` |72| **CLAUDE.md** | `~/.claude/CLAUDE.md` | `CLAUDE.md` 或 `.claude/CLAUDE.md` | `CLAUDE.local.md` |

73 73 

74在 Windows 上,显示为 `~/.claude` 的路径解析为 `%USERPROFILE%\.claude`。

75 

74***76***

75 77 

76## 设置文件78## 设置文件


166| `apiKeyHelper` | 自定义脚本,在 `/bin/sh` 中执行,以生成身份验证值。此值将作为 `X-Api-Key` 和 `Authorization: Bearer` 标头发送用于模型请求 | `/bin/generate_temp_api_key.sh` |168| `apiKeyHelper` | 自定义脚本,在 `/bin/sh` 中执行,以生成身份验证值。此值将作为 `X-Api-Key` 和 `Authorization: Bearer` 标头发送用于模型请求 | `/bin/generate_temp_api_key.sh` |

167| `attribution` | 自定义 git 提交和拉取请求的归属。请参阅[归属设置](#attribution-settings) | `{"commit": "🤖 Generated with Claude Code", "pr": ""}` |169| `attribution` | 自定义 git 提交和拉取请求的归属。请参阅[归属设置](#attribution-settings) | `{"commit": "🤖 Generated with Claude Code", "pr": ""}` |

168| `autoMemoryDirectory` | [自动内存](/zh-CN/memory#storage-location)存储的自定义目录。接受绝对路径或 `~/` 前缀的路径。从策略和用户设置以及 `--settings` 标志接受。不从项目或本地设置接受,因为克隆的存储库可能提供任一文件以将内存写入重定向到敏感位置 | `"~/my-memory-dir"` |170| `autoMemoryDirectory` | [自动内存](/zh-CN/memory#storage-location)存储的自定义目录。接受绝对路径或 `~/` 前缀的路径。从策略和用户设置以及 `--settings` 标志接受。不从项目或本地设置接受,因为克隆的存储库可能提供任一文件以将内存写入重定向到敏感位置 | `"~/my-memory-dir"` |

171| `autoMemoryEnabled` | 启用[自动内存](/zh-CN/memory#enable-or-disable-auto-memory)。当为 `false` 时,Claude 不从自动内存目录读取或写入。默认:`true`。您也可以在会话期间使用 `/memory` 切换此选项 | `false` |

169| `autoMode` | 自定义[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分类器阻止和允许的内容。包含 `environment`、`allow` 和 `soft_deny` 散文规则数组。在数组中包含字面字符串 `"$defaults"` 以在该位置继承内置规则。请参阅[配置自动模式](/zh-CN/auto-mode-config)。不从共享项目设置读取 | `{"soft_deny": ["$defaults", "Never run terraform apply"]}` |172| `autoMode` | 自定义[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分类器阻止和允许的内容。包含 `environment`、`allow` 和 `soft_deny` 散文规则数组。在数组中包含字面字符串 `"$defaults"` 以在该位置继承内置规则。请参阅[配置自动模式](/zh-CN/auto-mode-config)。不从共享项目设置读取 | `{"soft_deny": ["$defaults", "Never run terraform apply"]}` |

170| `autoScrollEnabled` | 在[全屏渲染](/zh-CN/fullscreen)中,跟随新输出到对话的底部。默认:`true`。在 `/config` 中显示为**自动滚动**。权限提示仍在此关闭时滚动到视图中 | `false` |173| `autoScrollEnabled` | 在[全屏渲染](/zh-CN/fullscreen)中,跟随新输出到对话的底部。默认:`true`。在 `/config` 中显示为**自动滚动**。权限提示仍在此关闭时滚动到视图中 | `false` |

171| `autoUpdatesChannel` | 遵循更新的发布渠道。使用 `"stable"` 获取通常约一周前的版本并跳过有主要回归的版本,或使用 `"latest"`(默认)获取最新版本 | `"stable"` |174| `autoUpdatesChannel` | 遵循更新的发布渠道。使用 `"stable"` 获取通常约一周前的版本并跳过有主要回归的版本,或使用 `"latest"`(默认)获取最新版本 | `"stable"` |


174| `awsAuthRefresh` | 修改 `.aws` 目录的自定义脚本(请参阅[高级凭证配置](/zh-CN/amazon-bedrock#advanced-credential-configuration)) | `aws sso login --profile myprofile` |177| `awsAuthRefresh` | 修改 `.aws` 目录的自定义脚本(请参阅[高级凭证配置](/zh-CN/amazon-bedrock#advanced-credential-configuration)) | `aws sso login --profile myprofile` |

175| `awsCredentialExport` | 输出包含 AWS 凭证的 JSON 的自定义脚本(请参阅[高级凭证配置](/zh-CN/amazon-bedrock#advanced-credential-configuration)) | `/bin/generate_aws_grant.sh` |178| `awsCredentialExport` | 输出包含 AWS 凭证的 JSON 的自定义脚本(请参阅[高级凭证配置](/zh-CN/amazon-bedrock#advanced-credential-configuration)) | `/bin/generate_aws_grant.sh` |

176| `blockedMarketplaces` | (仅 Managed 设置)市场源的阻止列表。在市场添加和插件安装、更新、刷新和自动更新时强制执行,因此在设置策略之前添加的市场无法用于获取插件。被阻止的源在下载前被检查,因此它们永远不会接触文件系统。请参阅 [Managed 市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) | `[{ "source": "github", "repo": "untrusted/plugins" }]` |179| `blockedMarketplaces` | (仅 Managed 设置)市场源的阻止列表。在市场添加和插件安装、更新、刷新和自动更新时强制执行,因此在设置策略之前添加的市场无法用于获取插件。被阻止的源在下载前被检查,因此它们永远不会接触文件系统。请参阅 [Managed 市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) | `[{ "source": "github", "repo": "untrusted/plugins" }]` |

177| `channelsEnabled` | (仅 Managed 设置)为 Team 和 Enterprise 用户允许 [channels](/zh-CN/channels)。未设置或 `false` 会阻止频道消息传递,无论用户传递什么给 `--channels` | `true` |180| `channelsEnabled` | (仅 Managed 设置)为组织允许 [channels](/zh-CN/channels)。在 claude.ai Team 和 Enterprise 计划上,当此项未设置或为 `false` 时,channels 被阻止。对于使用 API 密钥身份验证的 [Anthropic Console](/zh-CN/authentication#claude-console-authentication) 账户,channels 默认被允许,除非您的组织部署 managed 设置,在这种情况下此键必须设置为 `true` | `true` |

178| `cleanupPeriodDays` | 非活跃时间超过此期间的会话在启动时被删除(默认:30 天,最少 1 天)。设置为 `0` 会被拒绝并显示验证错误。也控制[孤立 subagent worktrees](/zh-CN/worktrees#clean-up-worktrees) 在启动时自动删除的年龄截止。要完全禁用记录写入,请设置 [`CLAUDE_CODE_SKIP_PROMPT_HISTORY`](/zh-CN/env-vars) 环境变量,或在非交互模式(`-p`)中使用 `--no-session-persistence` 标志或 `persistSession: false` SDK 选项。 | `20` |181| `cleanupPeriodDays` | 非活跃时间超过此期间的会话在启动时被删除(默认:30 天,最少 1 天)。设置为 `0` 会被拒绝并显示验证错误。也控制[孤立 subagent worktrees](/zh-CN/worktrees#clean-up-worktrees) 在启动时自动删除的年龄截止。要完全禁用记录写入,请设置 [`CLAUDE_CODE_SKIP_PROMPT_HISTORY`](/zh-CN/env-vars) 环境变量,或在非交互模式(`-p`)中使用 `--no-session-persistence` 标志或 `persistSession: false` SDK 选项。 | `20` |

179| `companyAnnouncements` | 在启动时显示给用户的公告。如果提供多个公告,它们将随机循环显示。 | `["Welcome to Acme Corp! Review our code guidelines at docs.acme.com"]` |182| `companyAnnouncements` | 在启动时显示给用户的公告。如果提供多个公告,它们将随机循环显示。 | `["Welcome to Acme Corp! Review our code guidelines at docs.acme.com"]` |

180| `defaultShell` | 输入框 `!` 命令的默认 shell。接受 `"bash"`(默认)或 `"powershell"`。设置 `"powershell"` 会在 Windows 上通过 PowerShell 路由交互式 `!` 命令。需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`。请参阅 [PowerShell tool](/zh-CN/tools-reference#powershell-tool) | `"powershell"` |183| `defaultShell` | 输入框 `!` 命令的默认 shell。接受 `"bash"`(默认)或 `"powershell"`。设置 `"powershell"` 会在 Windows 上通过 PowerShell 路由交互式 `!` 命令。需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`。请参阅 [PowerShell tool](/zh-CN/tools-reference#powershell-tool) | `"powershell"` |


183| `disableAutoMode` | 设置为 `"disable"` 以防止[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)被激活。从 `Shift+Tab` 循环中删除 `auto` 并在启动时拒绝 `--permission-mode auto`。在[managed 设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `"disable"` |186| `disableAutoMode` | 设置为 `"disable"` 以防止[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)被激活。从 `Shift+Tab` 循环中删除 `auto` 并在启动时拒绝 `--permission-mode auto`。在[managed 设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `"disable"` |

184| `disableDeepLinkRegistration` | 设置为 `"disable"` 以防止 Claude Code 在启动时向操作系统注册 `claude-cli://` 协议处理程序。[深链接](/zh-CN/deep-links)让外部工具通过预填充的提示打开 Claude Code 会话。在协议处理程序注册受限或单独管理的环境中很有用 | `"disable"` |187| `disableDeepLinkRegistration` | 设置为 `"disable"` 以防止 Claude Code 在启动时向操作系统注册 `claude-cli://` 协议处理程序。[深链接](/zh-CN/deep-links)让外部工具通过预填充的提示打开 Claude Code 会话。在协议处理程序注册受限或单独管理的环境中很有用 | `"disable"` |

185| `disabledMcpjsonServers` | 要拒绝的 `.mcp.json` 文件中特定 MCP servers 的列表 | `["filesystem"]` |188| `disabledMcpjsonServers` | 要拒绝的 `.mcp.json` 文件中特定 MCP servers 的列表 | `["filesystem"]` |

189| `disableRemoteControl` | {/* min-version: 2.1.128 */}禁用[远程控制](/zh-CN/remote-control):阻止 `claude remote-control`、`--remote-control` 标志、自动启动和会话内切换。通常放在[managed 设置](/zh-CN/permissions#managed-settings)中用于每设备 MDM 强制执行,但适用于任何作用域。需要 Claude Code v2.1.128 或更高版本 | `true` |

186| `disableSkillShellExecution` | 禁用 [skills](/zh-CN/skills) 和来自用户、项目、插件或额外目录源的自定义命令中的 `` !`...` `` 和 ` ```! ` 块的内联 shell 执行。命令被替换为 `[shell command execution disabled by policy]` 而不是被运行。捆绑和 managed skills 不受影响。在[managed 设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `true` |190| `disableSkillShellExecution` | 禁用 [skills](/zh-CN/skills) 和来自用户、项目、插件或额外目录源的自定义命令中的 `` !`...` `` 和 ` ```! ` 块的内联 shell 执行。命令被替换为 `[shell command execution disabled by policy]` 而不是被运行。捆绑和 managed skills 不受影响。在[managed 设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `true` |

187| `editorMode` | 输入提示的快捷键模式:`"normal"` 或 `"vim"`。默认:`"normal"`。在 `/config` 中显示为**快捷键模式** | `"vim"` |191| `editorMode` | 输入提示的快捷键模式:`"normal"` 或 `"vim"`。默认:`"normal"`。在 `/config` 中显示为**快捷键模式** | `"vim"` |

188| `effortLevel` | 跨会话持久化[努力级别](/zh-CN/model-config#adjust-effort-level)。接受 `"low"`、`"medium"`、`"high"` 或 `"xhigh"`。当您运行 `/effort` 时自动写入,带有这些值之一。请参阅[调整努力级别](/zh-CN/model-config#adjust-effort-level)了解支持的模型 | `"xhigh"` |192| `effortLevel` | 跨会话持久化[努力级别](/zh-CN/model-config#adjust-effort-level)。接受 `"low"`、`"medium"`、`"high"` 或 `"xhigh"`。当您运行 `/effort` 时自动写入,带有这些值之一。请参阅[调整努力级别](/zh-CN/model-config#adjust-effort-level)了解支持的模型 | `"xhigh"` |


550 },554 },

551 "extraKnownMarketplaces": {555 "extraKnownMarketplaces": {

552 "acme-tools": {556 "acme-tools": {

557 "source": {

553 "source": "github",558 "source": "github",

554 "repo": "acme-corp/claude-plugins"559 "repo": "acme-corp/claude-plugins"

555 }560 }

556 }561 }

562 }

557}563}

558```564```

559 565 


568* **本地设置**(`.claude/settings.local.json`):每台机器的覆盖(未提交)574* **本地设置**(`.claude/settings.local.json`):每台机器的覆盖(未提交)

569* **Managed 设置**(`managed-settings.json`):组织范围的策略覆盖,在所有作用域中阻止安装并从市场隐藏插件575* **Managed 设置**(`managed-settings.json`):组织范围的策略覆盖,在所有作用域中阻止安装并从市场隐藏插件

570 576 

577<Note>

578 项目设置优先于用户设置,因此在 `~/.claude/settings.json` 中将插件设置为 `false` 不会禁用项目的 `.claude/settings.json` 启用的插件。要在您的机器上选择退出项目启用的插件,请改为在 `.claude/settings.local.json` 中将其设置为 `false`。

579 

580 由 managed 设置强制启用的插件无法以这种方式禁用,因为 managed 设置会覆盖本地设置。

581</Note>

582 

571**示例**:583**示例**:

572 584 

573```json theme={null}585```json theme={null}


659* 仅在 managed 设置(`managed-settings.json`)中可用671* 仅在 managed 设置(`managed-settings.json`)中可用

660* 无法被用户或项目设置覆盖(最高优先级)672* 无法被用户或项目设置覆盖(最高优先级)

661* 在网络/文件系统操作之前强制执行(被阻止的源永远不会执行)673* 在网络/文件系统操作之前强制执行(被阻止的源永远不会执行)

662* 对源规范使用精确匹配(包括 `ref`、`path` 用于 git 源),除了 `hostPattern`,它使用正则表达式匹配674* 对源规范使用精确匹配(包括 `ref`、`path` 用于 git 源),除了 `hostPattern` 和 `pathPattern`,它们使用正则表达式匹配

663 675 

664**允许列表行为**:676**允许列表行为**:

665 677 


669 681 

670**所有支持的源类型**:682**所有支持的源类型**:

671 683 

672允许列表支持多种市场源类型。大多数源使用精确匹配,而 `hostPattern` 使用正则表达式匹配市场主机。684允许列表支持多种市场源类型。大多数源使用精确匹配,而 `hostPattern` 和 `pathPattern` 分别使用正则表达式匹配市场主机和文件系统路径。

673 685 

6741. **GitHub 存储库**:6861. **GitHub 存储库**:

675 687 


749* `url`:从 URL 提取主机名761* `url`:从 URL 提取主机名

750* `npm`、`file`、`directory`:不支持主机模式匹配762* `npm`、`file`、`directory`:不支持主机模式匹配

751 763 

7648. **路径模式匹配**:

765 

766```json theme={null}

767{ "source": "pathPattern", "pathPattern": "^/opt/approved/" }

768{ "source": "pathPattern", "pathPattern": ".*" }

769```

770 

771字段:`pathPattern`(必需:与 `file` 和 `directory` 源的 `path` 字段匹配的正则表达式模式)

772 

773使用路径模式匹配来允许基于文件系统的市场与网络源的 `hostPattern` 限制一起使用。设置 `".*"` 以允许所有本地路径,或使用更窄的模式来限制特定目录。

774 

752**配置示例**:775**配置示例**:

753 776 

754示例:仅允许特定市场:777示例:仅允许特定市场:

sub-agents.md +36 −11

Details

51 </Tab>51 </Tab>

52 52 

53 <Tab title="Plan">53 <Tab title="Plan">

54 一个研究代理,在 [plan mode](/zh-CN/common-workflows#use-plan-mode-for-safe-code-analysis) 期间使用,以在呈现计划之前收集上下文。54 一个研究代理,在 [plan mode](/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode) 期间使用,以在呈现计划之前收集上下文。

55 55 

56 * **Model**: 从主对话继承56 * **Model**: 从主对话继承

57 * **Tools**: 只读工具(拒绝访问 Write 和 Edit 工具)57 * **Tools**: 只读工具(拒绝访问 Write 和 Edit 工具)


76 | Agent | Model | Claude 何时使用它 |76 | Agent | Model | Claude 何时使用它 |

77 | :---------------- | :----- | :--------------------------- |77 | :---------------- | :----- | :--------------------------- |

78 | statusline-setup | Sonnet | 当您运行 `/statusline` 来配置您的状态行时 |78 | statusline-setup | Sonnet | 当您运行 `/statusline` 来配置您的状态行时 |

79 | Claude Code Guide | Haiku | 当您提出关于 Claude Code 功能的问题时 |79 | claude-code-guide | Haiku | 当您提出关于 Claude Code 功能的问题时 |

80 </Tab>80 </Tab>

81</Tabs>81</Tabs>

82 82 


180 180 

181**CLI 定义的 subagents** 在启动 Claude Code 时作为 JSON 传递。它们仅存在于该会话中,不会保存到磁盘,使其对快速测试或自动化脚本很有用。您可以在单个 `--agents` 调用中定义多个 subagents:181**CLI 定义的 subagents** 在启动 Claude Code 时作为 JSON 传递。它们仅存在于该会话中,不会保存到磁盘,使其对快速测试或自动化脚本很有用。您可以在单个 `--agents` 调用中定义多个 subagents:

182 182 

183```bash theme={null}183<Tabs>

184claude --agents '{184 <Tab title="macOS, Linux, WSL">

185 ```bash theme={null}

186 claude --agents '{

185 "code-reviewer": {187 "code-reviewer": {

186 "description": "Expert code reviewer. Use proactively after code changes.",188 "description": "Expert code reviewer. Use proactively after code changes.",

187 "prompt": "You are a senior code reviewer. Focus on code quality, security, and best practices.",189 "prompt": "You are a senior code reviewer. Focus on code quality, security, and best practices.",


192 "description": "Debugging specialist for errors and test failures.",194 "description": "Debugging specialist for errors and test failures.",

193 "prompt": "You are an expert debugger. Analyze errors, identify root causes, and provide fixes."195 "prompt": "You are an expert debugger. Analyze errors, identify root causes, and provide fixes."

194 }196 }

195}'197 }'

196```198 ```

199 </Tab>

200 

201 <Tab title="Windows PowerShell">

202 ```powershell theme={null}

203 claude --agents @'

204 {

205 "code-reviewer": {

206 "description": "Expert code reviewer. Use proactively after code changes.",

207 "prompt": "You are a senior code reviewer. Focus on code quality, security, and best practices.",

208 "tools": ["Read", "Grep", "Glob", "Bash"],

209 "model": "sonnet"

210 },

211 "debugger": {

212 "description": "Debugging specialist for errors and test failures.",

213 "prompt": "You are an expert debugger. Analyze errors, identify root causes, and provide fixes."

214 }

215 }

216 '@

217 ```

218 </Tab>

219</Tabs>

197 220 

198`--agents` 标志接受 JSON,具有与基于文件的 subagents 相同的 [frontmatter](#supported-frontmatter-fields) 字段:`description`、`prompt`、`tools`、`disallowedTools`、`model`、`permissionMode`、`mcpServers`、`hooks`、`maxTurns`、`skills`、`initialPrompt`、`memory`、`effort`、`background`、`isolation` 和 `color`。对系统提示使用 `prompt`,等同于基于文件的 subagents 中的 markdown 正文。221`--agents` 标志接受 JSON,具有与基于文件的 subagents 相同的 [frontmatter](#supported-frontmatter-fields) 字段:`description`、`prompt`、`tools`、`disallowedTools`、`model`、`permissionMode`、`mcpServers`、`hooks`、`maxTurns`、`skills`、`initialPrompt`、`memory`、`effort`、`background`、`isolation` 和 `color`。对系统提示使用 `prompt`,等同于基于文件的 subagents 中的 markdown 正文。

199 222 


212Subagent 文件使用 YAML frontmatter 进行配置,然后是 Markdown 中的系统提示:235Subagent 文件使用 YAML frontmatter 进行配置,然后是 Markdown 中的系统提示:

213 236 

214<Note>237<Note>

215 Subagents 在会话启动时加载。如果您通过手动添加文件来创建 subagent,请重启您的会话或使用 `/agents` 立即加载它。238 Subagents 在会话启动时加载。如果您直接在磁盘上添加或编辑 subagent 文件,请重启您的会话以加载它。通过 `/agents` 界面创建的 Subagents 无需重启即可立即生效。

216</Note>239</Note>

217 240 

218```markdown theme={null}241```markdown theme={null}


250| `memory` | No | [Persistent memory scope](#enable-persistent-memory):`user`、`project` 或 `local`。启用跨会话学习 |273| `memory` | No | [Persistent memory scope](#enable-persistent-memory):`user`、`project` 或 `local`。启用跨会话学习 |

251| `background` | No | 设置为 `true` 以始终将此 subagent 作为 [background task](#run-subagents-in-foreground-or-background) 运行。默认:`false` |274| `background` | No | 设置为 `true` 以始终将此 subagent 作为 [background task](#run-subagents-in-foreground-or-background) 运行。默认:`false` |

252| `effort` | No | 此 subagent 活跃时的努力级别。覆盖会话努力级别。默认:从会话继承。选项:`low`、`medium`、`high`、`xhigh`、`max`;可用级别取决于模型 |275| `effort` | No | 此 subagent 活跃时的努力级别。覆盖会话努力级别。默认:从会话继承。选项:`low`、`medium`、`high`、`xhigh`、`max`;可用级别取决于模型 |

253| `isolation` | No | 设置为 `worktree` 以在临时 [git worktree](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 中运行 subagent,为其提供存储库的隔离副本。如果 subagent 不进行任何更改,worktree 会自动清理 |276| `isolation` | No | 设置为 `worktree` 以在临时 [git worktree](/zh-CN/worktrees) 中运行 subagent,为其提供存储库的隔离副本。如果 subagent 不进行任何更改,worktree 会自动清理 |

254| `color` | No | Subagent 在任务列表和转录中的显示颜色。接受 `red`、`blue`、`green`、`yellow`、`purple`、`orange`、`pink` 或 `cyan` |277| `color` | No | Subagent 在任务列表和转录中的显示颜色。接受 `red`、`blue`、`green`、`yellow`、`purple`、`orange`、`pink` 或 `cyan` |

255| `initialPrompt` | No | 当此代理作为主会话代理运行时(通过 `--agent` 或 `agent` 设置),自动提交为第一个用户轮次。[Commands](/zh-CN/commands) 和 [skills](/zh-CN/skills) 被处理。前置于任何用户提供的提示 |278| `initialPrompt` | No | 当此代理作为主会话代理运行时(通过 `--agent` 或 `agent` 设置),自动提交为第一个用户轮次。[Commands](/zh-CN/commands) 和 [skills](/zh-CN/skills) 被处理。前置于任何用户提供的提示 |

256 279 


484exit 0507exit 0

485```508```

486 509 

487有关完整的输入架构,请参阅 [Hook input](/zh-CN/hooks#pretooluse-input),有关退出代码如何影响行为,请参阅 [exit codes](/zh-CN/hooks#exit-code-output)。510有关完整的输入架构,请参阅 [Hook input](/zh-CN/hooks#pretooluse-input),有关退出代码如何影响行为,请参阅 [exit codes](/zh-CN/hooks#exit-code-output)。在 Windows 上,在 PowerShell 中编写 hook 脚本,并在 hook 条目中添加 `shell: powershell`,如 [在 PowerShell 中运行 hooks](/zh-CN/hooks#windows-powershell-tool) 中所示。

488 511 

489#### 禁用特定 subagents512#### 禁用特定 subagents

490 513 


994exit 01017exit 0

995```1018```

996 1019 

997使脚本可执行:1020在 macOS 和 Linux 上,使脚本可执行:

998 1021 

999```bash theme={null}1022```bash theme={null}

1000chmod +x ./scripts/validate-readonly-query.sh1023chmod +x ./scripts/validate-readonly-query.sh

1001```1024```

1002 1025 

1003Hook 通过 stdin 接收 JSON,Bash 命令在 `tool_input.command` 中。退出代码 2 阻止操作并将错误消息反馈给 Claude。有关退出代码和 [Hook input](/zh-CN/hooks#pretooluse-input) 的详细信息,请参阅 [Hooks](/zh-CN/hooks#exit-code-output) 以获取完整的输入架构。1026在 Windows 上,用 PowerShell 编写验证脚本,并在 hook 条目中添加 `shell: powershell`。请参阅 [在 PowerShell 中运行 hooks](/zh-CN/hooks#windows-powershell-tool)。

1027 

1028Hook 通过 stdin 接收 JSON,Bash 命令在 `tool_input.command` 中。退出代码 2 阻止操作并将错误消息反馈给 Claude。有关退出代码和输出的详细信息,请参阅 [Hooks](/zh-CN/hooks#exit-code-output),有关完整的输入架构,请参阅 [Hook input](/zh-CN/hooks#pretooluse-input)。

1004 1029 

1005## 后续步骤1030## 后续步骤

1006 1031 

vs-code.md +13 −3

Details

95* **权限模式**:点击提示框底部的模式指示器以切换模式。在正常模式下,Claude 在每个操作前请求许可。在 Plan mode 中,Claude 描述它将做什么,并在进行更改前等待批准。VS Code 会自动将计划作为完整的 markdown 文档打开,您可以添加内联注释以在 Claude 开始前提供反馈。在自动接受模式下,Claude 进行编辑而不询问。在 VS Code 设置中的 `claudeCode.initialPermissionMode` 下设置默认值。95* **权限模式**:点击提示框底部的模式指示器以切换模式。在正常模式下,Claude 在每个操作前请求许可。在 Plan mode 中,Claude 描述它将做什么,并在进行更改前等待批准。VS Code 会自动将计划作为完整的 markdown 文档打开,您可以添加内联注释以在 Claude 开始前提供反馈。在自动接受模式下,Claude 进行编辑而不询问。在 VS Code 设置中的 `claudeCode.initialPermissionMode` 下设置默认值。

96* **命令菜单**:点击 `/` 或输入 `/` 以打开命令菜单。选项包括附加文件、切换模型、切换扩展思考、查看计划使用情况(`/usage`)以及启动 [Remote Control](/zh-CN/remote-control) 会话(`/remote-control`)。自定义部分提供对 MCP servers、hooks、memory、permissions 和 plugins 的访问。带有终端图标的项目在集成终端中打开。96* **命令菜单**:点击 `/` 或输入 `/` 以打开命令菜单。选项包括附加文件、切换模型、切换扩展思考、查看计划使用情况(`/usage`)以及启动 [Remote Control](/zh-CN/remote-control) 会话(`/remote-control`)。自定义部分提供对 MCP servers、hooks、memory、permissions 和 plugins 的访问。带有终端图标的项目在集成终端中打开。

97* **上下文指示器**:提示框显示您使用了多少 Claude 的 context window。Claude 在需要时自动压缩,或者您可以手动运行 `/compact`。97* **上下文指示器**:提示框显示您使用了多少 Claude 的 context window。Claude 在需要时自动压缩,或者您可以手动运行 `/compact`。

98* **扩展思考**:让 Claude 花更多时间推理复杂问题。通过命令菜单(`/`)切换它。Claude 的推理在对话中显示为折叠块:点击一个块来阅读它,或按 `Ctrl+O` 以展开或折叠会话中的每个思考块。有关详细信息,请参阅[扩展思考](/zh-CN/common-workflows#use-extended-thinking-thinking-mode)。98* **扩展思考**:让 Claude 花更多时间推理复杂问题。通过命令菜单(`/`)切换它。Claude 的推理在对话中显示为折叠块:点击一个块来阅读它,或按 `Ctrl+O` 以展开或折叠会话中的每个思考块。有关详细信息,请参阅[扩展思考](/zh-CN/model-config#extended-thinking)。

99* **多行输入**:按 `Shift+Enter` 添加新行而不发送。这也适用于问题对话框的"其他"自由文本输入。99* **多行输入**:按 `Shift+Enter` 添加新行而不发送。这也适用于问题对话框的"其他"自由文本输入。

100 100 

101### 引用文件和文件夹101### 引用文件和文件夹


115 115 

116### 恢复过去的对话116### 恢复过去的对话

117 117 

118点击 Claude Code 面板顶部的**会话历史**按钮以访问您的对话历史记录。您可以按关键字搜索或按时间浏览(今天、昨天、过去 7 天等)。点击任何对话以使用完整的消息历史记录恢复它。新会话根据您的第一条消息接收 AI 生成的标题。将鼠标悬停在会话上以显示重命名和删除操作:重命名以给它一个描述性标题,或删除以将其从列表中删除。有关恢复会话的更多信息,请参阅[常见工作流](/zh-CN/common-workflows#resume-previous-conversations)。118点击 Claude Code 面板顶部的**会话历史**按钮以访问您的对话历史记录。您可以按关键字搜索或按时间浏览(今天、昨天、过去 7 天等)。点击任何对话以使用完整的消息历史记录恢复它。新会话根据您的第一条消息接收 AI 生成的标题。将鼠标悬停在会话上以显示重命名和删除操作:重命名以给它一个描述性标题,或删除以将其从列表中删除。有关恢复会话的更多信息,请参阅[管理会话](/zh-CN/sessions)。

119 119 

120### 从 Claude.ai 恢复远程会话120### 从 Claude.ai 恢复远程会话

121 121 


399claude --worktree feature-auth399claude --worktree feature-auth

400```400```

401 401 

402每个 worktree 维护独立的文件状态,同时共享 git 历史记录。这可以防止 Claude 实例在处理不同任务时相互干扰。有关更多详细信息,请参阅[使用 Git worktrees 运行并行 Claude Code 会话](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees)。402每个 worktree 维护独立的文件状态,同时共享 git 历史记录。这可以防止 Claude 实例在处理不同任务时相互干扰。有关更多详细信息,请参阅[使用 Git worktrees 运行并行会话](/zh-CN/worktrees)。

403 403 

404## 使用第三方提供商404## 使用第三方提供商

405 405 


476 476 

477或者,点击**状态栏**(右下角)中的"✱ Claude Code"。即使没有打开文件也可以使用。您也可以使用**命令面板**(`Cmd+Shift+P` / `Ctrl+Shift+P`)并输入"Claude Code"。477或者,点击**状态栏**(右下角)中的"✱ Claude Code"。即使没有打开文件也可以使用。您也可以使用**命令面板**(`Cmd+Shift+P` / `Ctrl+Shift+P`)并输入"Claude Code"。

478 478 

479### macOS 上 Cmd+Esc 无效

480 

481在 macOS Tahoe 及更高版本上,系统游戏覆盖快捷键默认绑定到 `Cmd+Esc`,并在按键到达 VS Code 之前拦截它。要释放此快捷键:

482 

4831. 打开系统设置

4842. 转到键盘,然后键盘快捷键,然后游戏控制器

4853. 清除游戏覆盖复选框

486 

487或者,将扩展重新绑定到不同的键:打开 VS Code [键盘快捷键编辑器](https://code.visualstudio.com/docs/configure/keybindings)(`Cmd+K Cmd+S`),搜索 `Claude Code: Focus input`,并分配新的绑定。

488 

479### Claude Code 从不响应489### Claude Code 从不响应

480 490 

481如果 Claude Code 没有响应您的提示:491如果 Claude Code 没有响应您的提示: