SpyBara
Go Premium

Documentation 2026-10-16 22:59 UTC to 2026-10-17 23:57 UTC

23 files changed +195 −83. View all changes and history on the product overview
2026
Fri 30 23:01 Thu 29 23:57 Wed 28 23:57 Tue 27 22:59 Mon 26 22:57 Sun 25 23:58 Sat 24 22:59 Fri 23 22:59 Thu 22 22:58 Wed 21 23:02 Tue 20 23:00 Mon 19 23:58 Sat 17 23:57 Fri 16 22:59 Thu 15 23:58 Wed 14 22:58 Tue 13 23:57 Sun 11 23:57 Sat 10 23:01 Fri 9 23:02 Thu 8 22:58 Wed 7 23:59 Tue 6 23:59 Mon 5 23:58 Sun 4 23:58 Sat 3 23:57 Fri 2 22:59 Thu 1 23:59
Details

165 调用自定义工具165 调用自定义工具

166</h3>166</h3>

167 167 

168通过 `mcpServers` 选项将您创建的 MCP 服务器传递给 `query`。`mcpServers` 中的键成为每个工具的完全限定名称中的 `{server_name}` 段:`mcp__{server_name}__{tool_name}`。在 `allowedTools` 中列出该名称,以便工具运行而无需权限提示。168通过 `mcpServers` 选项将您创建的 MCP 服务器传递给 `query`。每个工具的[完全限定名称](/docs/zh-CN/agent-sdk/mcp#tool-naming-convention)为 `mcp__{server_name}__{tool_name}`,其中 `{server_name}` 是您在 `mcpServers` 中为服务器指定的键。如果该键包含 `.` 或空格等字符,请在编写 `{server_name}` 时将其替换为 `_`。在 `allowedTools` 中列出该完全限定名称,以便工具运行而无需权限提示。

169 169 

170这些代码片段重用了[天气工具示例](#weather-tool-example)中的 `weatherServer`,以询问 Claude 特定位置的天气。170这些代码片段重用了[天气工具示例](#weather-tool-example)中的 `weatherServer`,以询问 Claude 特定位置的天气。

171 171 

Details

235 235 

236| 选项 | 类型 | 默认值 | 描述 |236| 选项 | 类型 | 默认值 | 描述 |

237| - | - | - | - |237| - | - | - | - |

238| `matcher` | `string` | `undefined` | 针对事件的过滤字段匹配的模式,遵循[设置文件中匹配器的规则](/docs/zh-CN/hooks#matcher-patterns)。对于工具 hook,这是工具名称。内置工具包括 `Bash`、`Read`、`Write`、`Edit`、`Glob`、`Grep`、`WebFetch`、`Agent` 等(请参阅[工具输入类型](/docs/zh-CN/agent-sdk/typescript#tool-input-types)以获取完整列表)。MCP 工具使用模式 `mcp__<server>__<action>`,其中 `<server>` 是您在 `mcpServers` 配置中使用的键。 |238| `matcher` | `string` | `undefined` | 针对事件的过滤字段匹配的模式,遵循[设置文件中匹配器的规则](/docs/zh-CN/hooks#matcher-patterns)。对于工具 hook,该字段是工具名称。内置工具包括 `Bash`、`Read`、`Write`、`Edit`、`Glob`、`Grep`、`WebFetch`、`Agent` 等。请参阅[工具输入类型](/docs/zh-CN/agent-sdk/typescript#tool-input-types)以获取完整列表。MCP 工具使用模式 `mcp__<server>__<action>`,其中 `<server>` 是您在 `mcpServers` 配置中使用的键,其拼写方式遵循[工具命名约定](/docs/zh-CN/agent-sdk/mcp#tool-naming-convention)中的说明。 |

239| `hooks` | `HookCallback[]` | - | 必需。当模式匹配时执行的回调函数数组 |239| `hooks` | `HookCallback[]` | - | 必需。当模式匹配时执行的回调函数数组 |

240| `timeout` | `number` | `undefined` | 超时时间(秒)。省略时,Claude Code 应用[事件的默认超时](#hook-timeout)。您的 SDK 回调遵循 `command` hook 默认值 |240| `timeout` | `number` | `undefined` | 超时时间(秒)。省略时,Claude Code 应用[事件的默认超时](#hook-timeout)。您的 SDK 回调遵循 `command` hook 默认值 |

241 241 

agent-sdk/mcp.md +10 −1

Details

196 工具命名约定196 工具命名约定

197</h3>197</h3>

198 198 

199MCP 工具遵循命名模式 `mcp__<server-name>__<tool-name>`。例如,一个名为 `"github"` 的 GitHub 服务器,其中有一个 `list_issues` 工具,会变成 `mcp__github__list_issues`。199MCP 工具的命名格式为 `mcp__<server-name>__<tool-name>`,其中 `<server-name>` 是您注册服务器时使用的名称,例如它在 `mcpServers` 中的键。

200 

201服务器名称中的 `.` 和空格等字符会被替换为 `_`。下表显示了两个服务器键下 `list_issues` 工具的完整名称:

202 

203| `mcpServers` 中的键 | 完整工具名称 |

204| :- | :- |

205| `github` | `mcp__github__list_issues` |

206| `my.server` | `mcp__my_server__list_issues` |

207 

208在 `allowedTools` 和 [MCP 权限规则](/docs/zh-CN/permissions#mcp)中使用完整的工具名称。对于由[插件](/docs/zh-CN/agent-sdk/plugins)提供的服务器,`<server-name>` 采用[插件作用域形式](/docs/zh-CN/mcp#plugin-provided-mcp-servers),并以 `plugin_` 开头。

200 209 

201<h3 id="auto-approve-with-allowedtools">210<h3 id="auto-approve-with-allowedtools">

202 使用 allowedTools 自动批准211 使用 allowedTools 自动批准

Details

16 16 

17<Steps>17<Steps>

18 <Step title="Hooks">18 <Step title="Hooks">

19 首先运行 [hooks](/docs/zh-CN/agent-sdk/hooks)。Hook 可以直接拒绝调用或将其传递下去。返回 `allow` 的 hook 不会跳过下面的拒绝和询问规则;无论 hook 结果如何,这些规则都会被评估。`PreToolUse` hook 允许也不能批准针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 或 `rmdir` 删除。19 首先运行 [hooks](/docs/zh-CN/agent-sdk/hooks)。Hook 可以直接拒绝调用或将其传递下去。返回 `allow` 的 hook 不会跳过下面的拒绝和询问规则;无论 hook 结果如何,这些规则都会被评估。返回 `allow` 的 `PreToolUse` hook 也不能批准针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 或 `rmdir` 删除。关于该 `allow` 在计划模式下的作用,请参阅 [计划模式下的 hook 批准](/docs/zh-CN/permissions#hook-approvals-in-plan-mode)。

20 </Step>20 </Step>

21 21 

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


161 161 

162<Tabs>162<Tabs>

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

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

165 165 

166 <CodeGroup>166 <CodeGroup>

167 ```python Python theme={null}167 ```python Python theme={null}


173 async for message in query(173 async for message in query(

174 prompt="Help me refactor this code",174 prompt="Help me refactor this code",

175 options=ClaudeAgentOptions(175 options=ClaudeAgentOptions(

176 permission_mode="default", # 在此设置模式176 permission_mode="default", # Set the mode here

177 ),177 ),

178 ):178 ):

179 if hasattr(message, "result"):179 if hasattr(message, "result"):


190 for await (const message of query({190 for await (const message of query({

191 prompt: "Help me refactor this code",191 prompt: "Help me refactor this code",

192 options: {192 options: {

193 permissionMode: "default" // 在此设置模式193 permissionMode: "default" // Set the mode here

194 }194 }

195 })) {195 })) {

196 if ("result" in message) {196 if ("result" in message) {


216 async def main():216 async def main():

217 async with ClaudeSDKClient(217 async with ClaudeSDKClient(

218 options=ClaudeAgentOptions(218 options=ClaudeAgentOptions(

219 permission_mode="default", # 以默认模式开始219 permission_mode="default", # Start in default mode

220 )220 )

221 ) as client:221 ) as client:

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

223 223 

224 # 在会话中途动态更改模式224 # Change mode dynamically mid-session

225 await client.set_permission_mode("acceptEdits")225 await client.set_permission_mode("acceptEdits")

226 226 

227 # 使用新权限模式处理消息227 # Process messages with the new permission mode

228 async for message in client.receive_response():228 async for message in client.receive_response():

229 if hasattr(message, "result"):229 if hasattr(message, "result"):

230 print(message.result)230 print(message.result)


240 const q = query({240 const q = query({

241 prompt: "Help me refactor this code",241 prompt: "Help me refactor this code",

242 options: {242 options: {

243 permissionMode: "default" // 以默认模式开始243 permissionMode: "default" // Start in default mode

244 }244 }

245 });245 });

246 246 

247 // 在会话中途动态更改模式247 // Change mode dynamically mid-session

248 await q.setPermissionMode("acceptEdits");248 await q.setPermissionMode("acceptEdits");

249 249 

250 // 使用新权限模式处理消息250 // Process messages with the new permission mode

251 for await (const message of q) {251 for await (const message of q) {

252 if ("result" in message) {252 if ("result" in message) {

253 console.log(message.result);253 console.log(message.result);


314 314 

315Claude 探索代码库并生成计划,而不编辑您的源文件。只读工具的运行方式与 `default` 权限模式相同。315Claude 探索代码库并生成计划,而不编辑您的源文件。只读工具的运行方式与 `default` 权限模式相同。

316 316 

317在规划模式下,文件编辑永远不会自动批准,即使允许规则匹配。它们会通过您的 `canUseTool` 回调提示。 在 Claude Code v2.1.212 或更高版本上,修改文件的 shell 命令(如 `touch` 和 `rm`)会以相同方式到达您的 `canUseTool` 回调。317在计划模式下,文件编辑永远不会自动批准,即使允许规则匹配或 `PreToolUse` hook 返回 `allow`。它们会通过您的 `canUseTool` 回调提示。 在 Claude Code v2.1.212 或更高版本上,修改文件的 shell 命令(如 `touch` 和 `rm`)会以相同方式到达您的 `canUseTool` 回调。

318 318 

319在 TypeScript SDK 中,如果您在 `permissionMode: 'plan'` 旁边设置 `allowDangerouslySkipPermissions: true`,文件编辑和修改文件的 shell 命令仍然会到达您的 `canUseTool` 回调。该选项让您稍后可以使用 `setPermissionMode()` 切换到 `bypassPermissions`。319在 TypeScript SDK 中,如果您在 `permissionMode: 'plan'` 旁边设置 `allowDangerouslySkipPermissions: true`,文件编辑和修改文件的 shell 命令仍然会到达您的 `canUseTool` 回调。该选项让您稍后可以使用 `setPermissionMode()` 切换到 `bypassPermissions`。

320 320 


322 322 

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

324 324 

325<h4 id="auto-mode-auto">

326 自动模式(`auto`)

327</h4>

328 

329分类器模型会在 shell 命令和网络请求等操作运行之前对其进行审查,并允许或阻止它审查的每一个操作。有关自动模式所需的模型和提供商以及它评估操作的顺序,请参阅[使用自动模式消除权限提示](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)。

330 

331如果您使用 [`set_model()`](/docs/zh-CN/agent-sdk/python#claudesdkclient)、[`setModel()`](/docs/zh-CN/agent-sdk/typescript#query-object) 或 [`applyFlagSettings()`](/docs/zh-CN/agent-sdk/typescript#applyflagsettings) 将处于自动模式的会话切换到自动模式不支持的模型,会话将更改为 `default` 模式:

332 

333* **您会看到的内容**:一条子类型为 `status`、`permissionMode` 设置为 `"default"` 的 `system` 消息,TypeScript SDK 将其类型定义为 [`SDKStatusMessage`](/docs/zh-CN/agent-sdk/typescript#sdkstatusmessage)。此后,需要批准且不匹配任何允许规则的调用会到达您的 `canUseTool` 回调。

334* **返回自动模式**:切换到受支持的模型,然后调用 `set_permission_mode("auto")` 或 `setPermissionMode("auto")`。如果您切换回原模型但未进行该调用,会话将保持在 `default` 模式。当不受支持的模型处于活动状态时,该调用会失败并显示 `Cannot set permission mode to auto: auto mode unavailable for this model`。

335 

336在调用 `set_model()`、`setModel()` 或 `applyFlagSettings()` 之后更改为 `default` 模式需要 Claude Code v2.1.299 或更高版本。

337 

325<h2 id="related-resources">338<h2 id="related-resources">

326 相关资源339 相关资源

327</h2>340</h2>

Details

610| `receive_response()` | 接收消息直到并包括 ResultMessage |610| `receive_response()` | 接收消息直到并包括 ResultMessage |

611| `interrupt()` | 发送中断信号(仅在流式模式下工作) |611| `interrupt()` | 发送中断信号(仅在流式模式下工作) |

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

613| `set_model(model)` | 更改当前会话的模型。传递 `None` 以重置为 [Claude Code 的默认模型](/docs/zh-CN/model-config) |613| `set_model(model)` | 更改当前会话的模型。传递 `None` 以重置为 [Claude Code 的默认模型](/docs/zh-CN/model-config)。如果新模型不支持自动模式,处于 `auto` 模式的会话将[切换到 `default` 模式](/docs/zh-CN/agent-sdk/permissions#auto-mode-auto) |

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

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

616| `get_context_usage()` | 获取按类别、技能和工具分类的上下文窗口使用情况的详细信息。这与 `/context` 在交互式会话中显示的数据相同。返回 [`ContextUsageResponse`](#contextusageresponse)。为了计算详细信息,Claude Code 会发出几个不出现在消息流中的令牌计数 API 请求;见[这些请求如何处理](#contextusageresponse) |616| `get_context_usage()` | 获取按类别、技能和工具分类的上下文窗口使用情况的详细信息。这与 `/context` 在交互式会话中显示的数据相同。返回 [`ContextUsageResponse`](#contextusageresponse)。为了计算详细信息,Claude Code 会发出几个不出现在消息流中的令牌计数 API 请求;见[这些请求如何处理](#contextusageresponse) |


3884 在沙箱设置中设置 `"failIfUnavailable": True` 以改为停止。SDK 会将 `failIfUnavailable` 与已声明的 `SandboxSettings` 字段一起转发给 Claude Code。然后 `query()` 报告一个 `ResultMessage`,其 `subtype="error_during_execution"`,原因在 `errors` 中。因为这是一个单次 `query()` 调用,SDK 在生成该错误结果后会引发异常,所以请将循环包装在 try 块中以继续执行。有关错误约定,请参阅 [处理结果](/docs/zh-CN/agent-sdk/agent-loop#handle-the-result)。3884 在沙箱设置中设置 `"failIfUnavailable": True` 以改为停止。SDK 会将 `failIfUnavailable` 与已声明的 `SandboxSettings` 字段一起转发给 Claude Code。然后 `query()` 报告一个 `ResultMessage`,其 `subtype="error_during_execution"`,原因在 `errors` 中。因为这是一个单次 `query()` 调用,SDK 在生成该错误结果后会引发异常,所以请将循环包装在 try 块中以继续执行。有关错误约定,请参阅 [处理结果](/docs/zh-CN/agent-sdk/agent-loop#handle-the-result)。

3885</Note>3885</Note>

3886 3886 

3887要阻止沙箱化命令写入某个文件,请在沙箱设置中将其绝对路径列在 [`denyWrite`](/docs/zh-CN/settings-reference#sandbox-filesystem-denywrite) 下,例如 `"filesystem": {"denyWrite": ["/home/user/project/.env"]}`。SDK 会将 `filesystem` 与已声明的 `SandboxSettings` 字段一起转发给 Claude Code。沙箱启动后,会阻止对每个所列路径的写入。如果您列出的是 `.env` 或 `./.env`,沙箱化命令仍可以写入会话工作目录中的 `.env` 文件。3887要阻止沙箱化命令写入某个文件,请在沙箱设置中将其绝对路径列在 [`denyWrite`](/docs/zh-CN/settings-reference#sandbox-filesystem-denywrite) 下,例如 `"filesystem": {"denyWrite": ["/home/user/project/.env"]}`。SDK 会将 `filesystem` 与已声明的 `SandboxSettings` 字段一起转发给 Claude Code。沙箱启动后,会阻止对您所列的每个绝对路径的写入。

3888 3888 

3889<h4 id="example-usage">3889<h4 id="example-usage">

3890 示例用法3890 示例用法

Details

736| `interrupt()` | 中断查询。仅在流式输入模式下可用。当 CLI 在 [`SDKSystemMessage.capabilities`](#sdksystemmessage) 中声明了 `interrupt_receipt_v1` 能力时,会以一个 [`SDKControlInterruptResponse`](#sdkcontrolinterruptresponse) 完成,其中列出中断到达时仍处于待处理状态的消息。在 v2.1.205 之前的 CLI 上以 `undefined` 完成 |736| `interrupt()` | 中断查询。仅在流式输入模式下可用。当 CLI 在 [`SDKSystemMessage.capabilities`](#sdksystemmessage) 中声明了 `interrupt_receipt_v1` 能力时,会以一个 [`SDKControlInterruptResponse`](#sdkcontrolinterruptresponse) 完成,其中列出中断到达时仍处于待处理状态的消息。在 v2.1.205 之前的 CLI 上以 `undefined` 完成 |

737| `rewindFiles(userMessageId, options?)` | 将文件恢复到指定用户消息时的状态。传递 `{ dryRun: true }` 可预览更改。需要 `enableFileCheckpointing: true`。请参阅[文件检查点功能](/docs/zh-CN/agent-sdk/file-checkpointing) |737| `rewindFiles(userMessageId, options?)` | 将文件恢复到指定用户消息时的状态。传递 `{ dryRun: true }` 可预览更改。需要 `enableFileCheckpointing: true`。请参阅[文件检查点功能](/docs/zh-CN/agent-sdk/file-checkpointing) |

738| `setPermissionMode()` | 更改权限模式(仅在流式输入模式下可用) |738| `setPermissionMode()` | 更改权限模式(仅在流式输入模式下可用) |

739| `setModel()` | 更改模型(仅在流式输入模式下可用)。传递 `undefined` 或字符串 `"default"` 会重置为 [Claude Code 的默认模型](/docs/zh-CN/model-config) |739| `setModel()` | 更改模型(仅在流式输入模式下可用)。传递 `undefined` 或字符串 `"default"` 会重置为 [Claude Code 的默认模型](/docs/zh-CN/model-config)。如果新模型不支持自动模式,处于 `auto` 模式的会话会[切换到 `default` 模式](/docs/zh-CN/agent-sdk/permissions#auto-mode-auto) |

740| `setMaxThinkingTokens()` | *已弃用:* 请改用 `thinking` 选项。更改最大思考 token 数。传递 `null` 会将思考重置为会话默认值:会话中途的覆盖会被清除,对于禁用了思考的会话,思考保持关闭 |740| `setMaxThinkingTokens()` | *已弃用:* 请改用 `thinking` 选项。更改最大思考 token 数。传递 `null` 会将思考重置为会话默认值:会话中途的覆盖会被清除,对于禁用了思考的会话,思考保持关闭 |

741| `applyFlagSettings(settings)` | 在运行时将设置合并到会话的标志设置层(仅在流式输入模式下可用)。请参阅 [`applyFlagSettings()`](#applyflagsettings) |741| `applyFlagSettings(settings)` | 在运行时将设置合并到会话的标志设置层(仅在流式输入模式下可用)。请参阅 [`applyFlagSettings()`](#applyflagsettings) |

742| `updateSettings(source, settings)` | 将一个允许列表中的键写入项目的本地设置文件或您的用户设置文件,使该值在之后的会话中保持有效。请参阅 [`updateSettings()`](#updatesettings)。需要 TypeScript SDK v0.3.257 或更高版本,其捆绑了 Claude Code v2.1.257 |742| `updateSettings(source, settings)` | 将一个允许列表中的键写入项目的本地设置文件或您的用户设置文件,使该值在之后的会话中保持有效。请参阅 [`updateSettings()`](#updatesettings)。需要 TypeScript SDK v0.3.257 或更高版本,其捆绑了 Claude Code v2.1.257 |


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

6369| :- | :- | :- | :- |6369| :- | :- | :- | :- |

6370| `allowWrite` | `string[]` | `[]` | 允许写入访问的文件路径模式 |6370| `allowWrite` | `string[]` | `[]` | 允许写入访问的文件路径模式 |

6371| `denyWrite` | `string[]` | `[]` | 拒绝写入访问的文件路径模式。要阻止沙箱内对会话工作目录中某个文件的写入,请列出其绝对路径。如果列出的是 `.env` 或 `./.env`,沙箱内命令可以写入会话工作目录中的 `.env` 文件 |6371| `denyWrite` | `string[]` | `[]` | 拒绝写入访问的文件路径模式。要阻止沙箱内对会话工作目录中某个文件的写入,请列出其绝对路径。 |

6372| `denyRead` | `string[]` | `[]` | 拒绝读取访问的文件路径模式 |6372| `denyRead` | `string[]` | `[]` | 拒绝读取访问的文件路径模式 |

6373 6373 

6374<h3 id="permissions-fallback-for-unsandboxed-commands">6374<h3 id="permissions-fallback-for-unsandboxed-commands">

agent-view.md +2 −2

Details

738[权限模式](/docs/zh-CN/permissions) 取决于您启动会话的方式:738[权限模式](/docs/zh-CN/permissions) 取决于您启动会话的方式:

739 739 

740* **使用 `/bg` 或 `←` 转入后台**:Claude Code 保留会话原有的权限模式,因此您已切换到 `acceptEdits` 或 `auto` 的会话在分离后仍保持该模式740* **使用 `/bg` 或 `←` 转入后台**:Claude Code 保留会话原有的权限模式,因此您已切换到 `acceptEdits` 或 `auto` 的会话在分离后仍保持该模式

741* **从使用 `←` 打开的 Agent 视图分派**:目标自身的配置优先;当没有其他设置指定权限模式时,采用您来源会话的权限模式741* **从使用 `←` 打开的 Agent 视图分派**:Claude Code 首先从目标目录的配置获取新会话的权限模式,然后从您来源的会话获取

742* **从在 shell 中启动的 `claude agents` 分派,或使用 `claude --bg` 分派**:新会话的启动方式与在该目录中启动新的 `claude` 会话相同,除非您是从使用 [分派默认值](#dispatch-defaults) 打开的 Agent 视图分派的。[会话以哪种权限模式启动](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in) 列出了优先顺序742* **从在 shell 中启动的 `claude agents` 分派,或使用 `claude --bg` 分派**:新会话的启动方式与在该目录中启动新的 `claude` 会话相同,除非您是从使用 [分派默认值](#dispatch-defaults) 打开的 Agent 视图分派的。[会话以哪种权限模式启动](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in) 列出了优先顺序

743 743 

744对于您从使用 `←` 打开的 Agent 视图分派的会话,Claude Code 会从以下第一个适用的来源获取权限模式:744对于您从使用 `←` 打开的 Agent 视图分派的会话,Claude Code 会从以下第一个适用的来源获取权限模式:


7461. 目标目录的 [`permissions.defaultMode`](/docs/zh-CN/settings-reference#permissions-defaultmode)。适用两条来源规则:7461. 目标目录的 [`permissions.defaultMode`](/docs/zh-CN/settings-reference#permissions-defaultmode)。适用两条来源规则:

747 * `auto` 和 `bypassPermissions` [仅在来自托管设置、`--settings` 文件或 `~/.claude/settings.json` 时生效](/docs/zh-CN/settings-reference#permissions-defaultmode)。747 * `auto` 和 `bypassPermissions` [仅在来自托管设置、`--settings` 文件或 `~/.claude/settings.json` 时生效](/docs/zh-CN/settings-reference#permissions-defaultmode)。

748 * 如果项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `defaultMode` 选择了比您来源会话更宽松的模式,Claude Code 会拒绝它。748 * 如果项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `defaultMode` 选择了比您来源会话更宽松的模式,Claude Code 会拒绝它。

7492. 您来源会话的权限模式7492. 您来源会话的权限模式。如果该会话处于 `bypassPermissions` 模式,新会话可能会改为以手动模式启动,并显示通知 `Bypass permissions was requested at launch and ignored`。当您对绕过免责声明的接受记录仅存在于 `.claude/settings.local.json` 或 `--settings` 文件中时,就会发生这种情况。您可以继续使用手动模式,或 [将该接受记录添加到 `~/.claude/settings.json`](/docs/zh-CN/permission-modes#bypass-permissions-acceptance)。

750 750 

751当 Claude Code 因某个来源的模式过于宽松而拒绝它时,由列表中的下一个来源决定。例如,如果您从计划模式会话分派到一个其已签入设置要求 `acceptEdits` 的目录,新会话会以计划模式启动。如果您将该 `defaultMode` 移到 `~/.claude/settings.json`,则无论您来源会话的权限模式如何,它都会生效。751当 Claude Code 因某个来源的模式过于宽松而拒绝它时,由列表中的下一个来源决定。例如,如果您从计划模式会话分派到一个其已签入设置要求 `acceptEdits` 的目录,新会话会以计划模式启动。如果您将该 `defaultMode` 移到 `~/.claude/settings.json`,则无论您来源会话的权限模式如何,它都会生效。

752 752 

Details

84| `--continue`, `-c` | 加载当前目录中最近的对话,包括[已完成的后台会话](/docs/zh-CN/sessions#where-the-session-picker-looks);打开已完成的后台会话需要 Claude Code v2.1.257 或更高版本。跳过使用 `claude -p` 或 Agent SDK 创建的会话,以及第一个提示词为 `/loop` 的会话。`claude -p --continue` 包括 `-p`、SDK 和 `/loop` 会话。包括使用 `/add-dir` 添加此目录的会话 | `claude --continue` |84| `--continue`, `-c` | 加载当前目录中最近的对话,包括[已完成的后台会话](/docs/zh-CN/sessions#where-the-session-picker-looks);打开已完成的后台会话需要 Claude Code v2.1.257 或更高版本。跳过使用 `claude -p` 或 Agent SDK 创建的会话,以及第一个提示词为 `/loop` 的会话。`claude -p --continue` 包括 `-p`、SDK 和 `/loop` 会话。包括使用 `/add-dir` 添加此目录的会话 | `claude --continue` |

85| `--dangerously-load-development-channels` | 启用不在批准的允许列表上的[频道](/docs/zh-CN/channels-reference#test-during-the-research-preview),用于本地开发。接受 `plugin:<name>@<marketplace>` 和 `server:<name>` 条目。会提示确认,因此它在交互式会话中生效。使用 `-p` 时,Claude Code 会忽略此标志 | `claude --dangerously-load-development-channels server:webhook` |85| `--dangerously-load-development-channels` | 启用不在批准的允许列表上的[频道](/docs/zh-CN/channels-reference#test-during-the-research-preview),用于本地开发。接受 `plugin:<name>@<marketplace>` 和 `server:<name>` 条目。会提示确认,因此它在交互式会话中生效。使用 `-p` 时,Claude Code 会忽略此标志 | `claude --dangerously-load-development-channels server:webhook` |

86| `--dangerously-skip-permissions` | 跳过权限提示。等同于 `--permission-mode bypassPermissions`。请参阅[权限模式](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)了解此操作跳过和不跳过的内容。对于使用 `--bg` 启动的会话,当主管重新启动会话时,该模式[持续存在](/docs/zh-CN/agent-view#permission-mode-model-and-effort) | `claude --dangerously-skip-permissions` |86| `--dangerously-skip-permissions` | 跳过权限提示。等同于 `--permission-mode bypassPermissions`。请参阅[权限模式](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)了解此操作跳过和不跳过的内容。对于使用 `--bg` 启动的会话,当主管重新启动会话时,该模式[持续存在](/docs/zh-CN/agent-view#permission-mode-model-and-effort) | `claude --dangerously-skip-permissions` |

87| `--debug` | 启用调试模式,可选类别过滤,例如 `--debug='mcp,startup'` 或 `--debug='!1p'`。过滤器仅在 `=` 形式中绑定;空格分隔的过滤器启用调试模式而不进行过滤 | `claude --debug='mcp,startup'` |87| `--debug` | 启用调试模式,可选类别过滤,例如 `--debug='mcp,startup'` 或 `--debug='!mcp'`。过滤器仅在 `=` 形式中绑定;空格分隔的过滤器启用调试模式而不进行过滤 | `claude --debug='mcp,startup'` |

88| `--debug-file <path>` | 将调试日志写入特定文件路径。隐式启用调试模式。优先于 `CLAUDE_CODE_DEBUG_LOGS_DIR` | `claude --debug-file /tmp/claude-debug.log` |88| `--debug-file <path>` | 将调试日志写入特定文件路径。隐式启用调试模式。优先于 `CLAUDE_CODE_DEBUG_LOGS_DIR` | `claude --debug-file /tmp/claude-debug.log` |

89| `--desktop` | 在当前目录上打开 [Claude Desktop 应用](/docs/zh-CN/desktop)并退出,而不在终端中启动会话。添加 `--continue`,或带会话 ID 的 `--resume`,可改为[在 Desktop 中打开该会话](/docs/zh-CN/desktop#coming-from-the-cli)。此处的 `--resume` 仅接受会话 ID,不接受名称或会话记录路径。不接受提示词,也不接受除 `--verbose` 和 `--debug` 标志外的其他标志,因为应用会自行启动会话。当您使用 Claude 订阅登录时,可在 macOS 和 x64 Windows 上使用。需要 Claude Code v2.1.285 或更高版本 | `claude --desktop` |89| `--desktop` | 在当前目录上打开 [Claude Desktop 应用](/docs/zh-CN/desktop)并退出,而不在终端中启动会话。添加 `--continue`,或带会话 ID 的 `--resume`,可改为[在 Desktop 中打开该会话](/docs/zh-CN/desktop#coming-from-the-cli)。此处的 `--resume` 仅接受会话 ID,不接受名称或会话记录路径。不接受提示词,也不接受除 `--verbose` 和 `--debug` 标志外的其他标志,因为应用会自行启动会话。当您使用 Claude 订阅登录时,可在 macOS 和 x64 Windows 上使用。需要 Claude Code v2.1.285 或更高版本 | `claude --desktop` |

90| `--disable-slash-commands` | 为此会话禁用所有 skill 和命令 | `claude --disable-slash-commands` |90| `--disable-slash-commands` | 为此会话禁用所有 skill 和命令 | `claude --disable-slash-commands` |

costs.md +1 −1

Details

429一个已经打开数小时的会话可能会使用远超你的活动量所暗示的计划限额,通常是由于以下原因之一:429一个已经打开数小时的会话可能会使用远超你的活动量所暗示的计划限额,通常是由于以下原因之一:

430 430 

431* **长上下文**:Claude Code 在每个请求中发送你与它的完整对话,每当 Claude 使用工具时,它会发送另一个请求,其中包含该批工具结果。使用 [prompt caching](/docs/zh-CN/prompt-caching),Claude Code 以 [缓存令牌速率](https://platform.claude.com/docs/en/about-claude/pricing) 重新读取该历史记录,因此即使在已打开一整天的会话中提出一行问题,仍然会为整个对话消耗使用量。请参阅 [主动管理上下文](#manage-context-proactively) 了解保持上下文较小的方法431* **长上下文**:Claude Code 在每个请求中发送你与它的完整对话,每当 Claude 使用工具时,它会发送另一个请求,其中包含该批工具结果。使用 [prompt caching](/docs/zh-CN/prompt-caching),Claude Code 以 [缓存令牌速率](https://platform.claude.com/docs/en/about-claude/pricing) 重新读取该历史记录,因此即使在已打开一整天的会话中提出一行问题,仍然会为整个对话消耗使用量。请参阅 [主动管理上下文](#manage-context-proactively) 了解保持上下文较小的方法

432* **缓存未命中**:在超过 [缓存生命周期](/docs/zh-CN/prompt-caching#cache-lifetime) 的中断后的第一条消息会错过缓存并重新处理你的完整上下文。在订阅上生命周期为一小时,一旦你开始使用 [使用额度](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans),生命周期会降至五分钟;在 API 密钥或云提供商上,默认为五分钟。要在使用使用额度时保持一小时的生命周期,[自己选择 TTL](/docs/zh-CN/prompt-caching#choose-the-ttl-yourself)。在 Pro 和 Max 计划上,当你在长时间中断后恢复大型会话时,Claude Code [提供从摘要恢复](/docs/zh-CN/sessions#resume-from-a-summary) 的选项,以便后续请求不会携带完整历史记录432* **缓存未命中**:在超过 [缓存生命周期](/docs/zh-CN/prompt-caching#cache-lifetime) 的中断后,您的第一条消息会错过缓存并重新处理您的完整上下文。在订阅上生命周期为一小时,一旦您开始使用 [使用额度](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans),生命周期会降至五分钟;在 API 密钥或云提供商上,默认为五分钟。要在使用使用额度时保持一小时的生命周期,请[自行选择 TTL](/docs/zh-CN/prompt-caching#choose-the-ttl-yourself)

433* **计划任务**:[计划任务](/docs/zh-CN/scheduled-tasks) 按其间隔触发,即使会话处于空闲状态,每次都发送你的完整上下文433* **计划任务**:[计划任务](/docs/zh-CN/scheduled-tasks) 按其间隔触发,即使会话处于空闲状态,每次都发送你的完整上下文

434* **跨会话消息**:当此会话处于空闲状态时,Claude Code 将 [来自你另一个会话的消息](/docs/zh-CN/cross-session-messaging) 作为新轮次传递,每次都发送你的完整上下文。要保留入站消息而不是传递它们,请将 [`crossSessionInbound`](/docs/zh-CN/settings-reference#crosssessioninbound) 设置为 `hold`434* **跨会话消息**:当此会话处于空闲状态时,Claude Code 将 [来自你另一个会话的消息](/docs/zh-CN/cross-session-messaging) 作为新轮次传递,每次都发送你的完整上下文。要保留入站消息而不是传递它们,请将 [`crossSessionInbound`](/docs/zh-CN/settings-reference#crosssessioninbound) 设置为 `hold`

435* **目标检查**:当后台工作使活跃的 [目标](/docs/zh-CN/goal) 保持等待时,Claude Code [要求 Claude 检查该工作](/docs/zh-CN/goal#background-work-defers-evaluation),即使会话处于空闲状态,启动发送你完整上下文的新轮次。Claude Code 在你的提示之间每个目标最多启动三个空闲检查。在 v2.1.246 之前,空闲检查是无限制的。要关闭检查,请将 [`CLAUDE_CODE_GOAL_CHECKIN_MINUTES`](/docs/zh-CN/env-vars) 设置为 `0`。空闲检查需要 Claude Code v2.1.236 或更高版本435* **目标检查**:当后台工作使活跃的 [目标](/docs/zh-CN/goal) 保持等待时,Claude Code [要求 Claude 检查该工作](/docs/zh-CN/goal#background-work-defers-evaluation),即使会话处于空闲状态,启动发送你完整上下文的新轮次。Claude Code 在你的提示之间每个目标最多启动三个空闲检查。在 v2.1.246 之前,空闲检查是无限制的。要关闭检查,请将 [`CLAUDE_CODE_GOAL_CHECKIN_MINUTES`](/docs/zh-CN/env-vars) 设置为 `0`。空闲检查需要 Claude Code v2.1.236 或更高版本

env-vars.md +1 −1

Details

196| `ANTHROPIC_VERTEX_PROJECT_ID` | Google Cloud's Agent Platform 请求所指向的 GCP 项目 ID。请参阅[配置 GCP 凭据](/docs/zh-CN/google-vertex-ai#3-configure-gcp-credentials) |196| `ANTHROPIC_VERTEX_PROJECT_ID` | Google Cloud's Agent Platform 请求所指向的 GCP 项目 ID。请参阅[配置 GCP 凭据](/docs/zh-CN/google-vertex-ai#3-configure-gcp-credentials) |

197| `ANTHROPIC_WORKSPACE_ID` | [工作负载身份联合](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation)的工作区 ID。当您的联合规则的范围涵盖多个工作区时设置此变量,以便令牌交换知道要定位哪个工作区 |197| `ANTHROPIC_WORKSPACE_ID` | [工作负载身份联合](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation)的工作区 ID。当您的联合规则的范围涵盖多个工作区时设置此变量,以便令牌交换知道要定位哪个工作区 |

198| `API_FORCE_IDLE_TIMEOUT` | 覆盖 5 分钟的响应体空闲超时,该超时会在没有字节到达时中止流式模型响应。设置为 `0` 可关闭该超时,例如当缓慢的[网关](/docs/zh-CN/llm-gateway)或本地模型在数据块之间暂停超过 5 分钟时;设置为 `1` 可对所有提供商保持启用。未设置时,该超时在直接 Anthropic API、[Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws) 以及设置了 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1` 的 Amazon Bedrock 以外的提供商上处于启用状态。[流式看门狗](/docs/zh-CN/network-config#streaming-idle-watchdogs)独立于它运行,即使您在此处设置 `0`,也会中止长时间的静默暂停 |198| `API_FORCE_IDLE_TIMEOUT` | 覆盖 5 分钟的响应体空闲超时,该超时会在没有字节到达时中止流式模型响应。设置为 `0` 可关闭该超时,例如当缓慢的[网关](/docs/zh-CN/llm-gateway)或本地模型在数据块之间暂停超过 5 分钟时;设置为 `1` 可对所有提供商保持启用。未设置时,该超时在直接 Anthropic API、[Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws) 以及设置了 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1` 的 Amazon Bedrock 以外的提供商上处于启用状态。[流式看门狗](/docs/zh-CN/network-config#streaming-idle-watchdogs)独立于它运行,即使您在此处设置 `0`,也会中止长时间的静默暂停 |

199| `API_TIMEOUT_MS` | API 请求的超时时间,以毫秒为单位(默认值:600000,即 10 分钟;最大值:2147483647)。当请求在慢速网络上超时或通过代理路由时,请增大此值。超过最大值的值会使底层计时器溢出,导致请求立即失败 |199| `API_TIMEOUT_MS` | API 请求的超时时间,以毫秒为单位(默认:600000,即 10 分钟;最大值:2147483647)。流式请求必须在此时间内收到响应头。当请求在慢速网络上或通过代理路由时超时,请增大此值 |

200| `AWS_BEARER_TOKEN_BEDROCK` | 用于身份验证的 Amazon Bedrock API 密钥(请参阅 [Amazon Bedrock API 密钥](https://aws.amazon.com/blogs/machine-learning/accelerate-ai-development-with-amazon-bedrock-api-keys/)) |200| `AWS_BEARER_TOKEN_BEDROCK` | 用于身份验证的 Amazon Bedrock API 密钥(请参阅 [Amazon Bedrock API 密钥](https://aws.amazon.com/blogs/machine-learning/accelerate-ai-development-with-amazon-bedrock-api-keys/)) |

201| `BASH_DEFAULT_TIMEOUT_MS` | 前台 Bash 或 PowerShell 工具命令的默认超时时间,以毫秒为单位(默认值:120000,即 2 分钟)。高于[后台命令默认时间限制](/docs/zh-CN/tools-reference#time-limit-for-background-commands)的值会在无人值守会话中替换该默认值。后台时间限制需要 Claude Code v2.1.285 或更高版本 |201| `BASH_DEFAULT_TIMEOUT_MS` | 前台 Bash 或 PowerShell 工具命令的默认超时时间,以毫秒为单位(默认值:120000,即 2 分钟)。高于[后台命令默认时间限制](/docs/zh-CN/tools-reference#time-limit-for-background-commands)的值会在无人值守会话中替换该默认值。后台时间限制需要 Claude Code v2.1.285 或更高版本 |

202| `BASH_MAX_OUTPUT_LENGTH` | Claude Code 读回到命令结果中的 bash 输出的最大字符数(默认值:30000;最大值:150000)。如果您设置了 [`bashOutputMaxChars`](/docs/zh-CN/settings-reference#bashoutputmaxchars) 设置,Claude Code 会忽略此变量。请参阅[输出限制](/docs/zh-CN/tools-reference#output-limits) |202| `BASH_MAX_OUTPUT_LENGTH` | Claude Code 读回到命令结果中的 bash 输出的最大字符数(默认值:30000;最大值:150000)。如果您设置了 [`bashOutputMaxChars`](/docs/zh-CN/settings-reference#bashoutputmaxchars) 设置,Claude Code 会忽略此变量。请参阅[输出限制](/docs/zh-CN/tools-reference#output-limits) |

errors.md +3 −1

Details

346| `Can't open — this session is running in another terminal` | [后台会话错误](#this-session-is-running-in-another-terminal) |346| `Can't open — this session is running in another terminal` | [后台会话错误](#this-session-is-running-in-another-terminal) |

347| `This conversation is already open in another running Claude session` | [后台会话错误](#this-session-is-running-in-another-terminal) |347| `This conversation is already open in another running Claude session` | [后台会话错误](#this-session-is-running-in-another-terminal) |

348| `This session's saved conversation is no longer on disk` | [后台会话错误](#this-sessions-saved-conversation-is-no-longer-on-disk) |348| `This session's saved conversation is no longer on disk` | [后台会话错误](#this-sessions-saved-conversation-is-no-longer-on-disk) |

349| `Bypass permissions was requested at launch and ignored` | [使用 bypassPermissions 模式跳过所有检查](/docs/zh-CN/permission-modes#bypass-permissions-acceptance) |

349| `kept <id> — its worktree is still at <path>` | [后台会话错误](#worktree-has-commits-that-are-not-pushed-anywhere) |350| `kept <id> — its worktree is still at <path>` | [后台会话错误](#worktree-has-commits-that-are-not-pushed-anywhere) |

350| `kept <id> — <n> unpushed commits on <branch>` | [后台会话错误](#worktree-has-commits-that-are-not-pushed-anywhere) |351| `kept <id> — <n> unpushed commits on <branch>` | [后台会话错误](#worktree-has-commits-that-are-not-pushed-anywhere) |

351| `kept <id> — worktree has commits that are not pushed anywhere` | [后台会话错误](#worktree-has-commits-that-are-not-pushed-anywhere) |352| `kept <id> — worktree has commits that are not pushed anywhere` | [后台会话错误](#worktree-has-commits-that-are-not-pushed-anywhere) |


418* 连接断开。当连接在请求过程中途断开,且 Claude 尚未完成其响应的任何部分(包括其思考过程)时,Claude Code 会使用相同的退避重新发送请求,轮次继续进行,即使某些文本已经开始流式传输。当连接在 Claude 完成思考之后但在开始任何文本或工具调用之前断开时,Claude Code 改为快速连续重新发送请求最多两次,如果连接在该点继续断开,则以 `Connection lost before a response was produced` 结束轮次。419* 连接断开。当连接在请求过程中途断开,且 Claude 尚未完成其响应的任何部分(包括其思考过程)时,Claude Code 会使用相同的退避重新发送请求,轮次继续进行,即使某些文本已经开始流式传输。当连接在 Claude 完成思考之后但在开始任何文本或工具调用之前断开时,Claude Code 改为快速连续重新发送请求最多两次,如果连接在该点继续断开,则以 `Connection lost before a response was produced` 结束轮次。

419* Claude Code 检测到的连接在您的计算机进入睡眠状态时在请求过程中途被破坏。Claude Code 将其计为上述规则下的断开连接;一旦重试标签命名了具体原因,它会读作 `Connection lost while your computer was asleep`,如果轮次在 Claude 完成思考之后但在任何文本或工具调用之前结束,消息会读作 `Your computer went to sleep before a response was produced`。420* Claude Code 检测到的连接在您的计算机进入睡眠状态时在请求过程中途被破坏。Claude Code 将其计为上述规则下的断开连接;一旦重试标签命名了具体原因,它会读作 `Connection lost while your computer was asleep`,如果轮次在 Claude 完成思考之后但在任何文本或工具调用之前结束,消息会读作 `Your computer went to sleep before a response was produced`。

420* 停滞的响应流,当响应头已到达但 Claude 响应的任何部分都未到达,或当 Claude 完成思考但尚未开始任何文本或工具调用时:Claude Code 中止停滞连接,并最多再以流式方式发送一次请求。如果响应在 Claude 完成思考之后但在任何文本或工具调用之前第二次停滞,Claude Code 以 `The response stalled before a response was produced` 结束轮次。421* 停滞的响应流,当响应头已到达但 Claude 响应的任何部分都未到达,或当 Claude 完成思考但尚未开始任何文本或工具调用时:Claude Code 中止停滞连接,并最多再以流式方式发送一次请求。如果响应在 Claude 完成思考之后但在任何文本或工具调用之前第二次停滞,Claude Code 以 `The response stalled before a response was produced` 结束轮次。

421* 流式请求 API 从未用响应头回答,在 [first-byte deadline runs](/docs/zh-CN/network-config#streaming-idle-watchdogs) 的连接上:Claude Code 在截止时间中止它,并在重试预算内每个模型请求最多重新发送一次,然后如果该尝试也未得到回答,则以 [No response from API](#no-response-from-api) 结束轮次。在其他连接上,请求等待 `API_TIMEOUT_MS`。当您设置 `CLAUDE_CODE_RETRY_WATCHDOG` 时,一次重试上限不适用。422* 流式请求 API 从未用响应头回答,在 [first-byte deadline runs](/docs/zh-CN/network-config#streaming-idle-watchdogs) 的连接上:Claude Code 在截止时间中止它,并在重试预算内每个模型请求最多重新发送一次,然后如果该尝试也未得到回答,则以 [No response from API](#no-response-from-api) 结束轮次。当您设置 `CLAUDE_CODE_RETRY_WATCHDOG` 时,一次重试上限不适用。

422* 在 Claude 完成思考或开始任何文本或工具调用之前,被 API 输出内容过滤器拦截的流式响应。Claude Code 会在重试预算内重新发送一次请求,如果过滤器也拦截了第二次响应,则显示 [Output blocked by content filtering policy](#output-blocked-by-content-filtering-policy)。423* 在 Claude 完成思考或开始任何文本或工具调用之前,被 API 输出内容过滤器拦截的流式响应。Claude Code 会在重试预算内重新发送一次请求,如果过滤器也拦截了第二次响应,则显示 [Output blocked by content filtering policy](#output-blocked-by-content-filtering-policy)。

423* 临时 429 节流,但不是网关的支出限制 `429`,这不是节流;请参阅 [Spend limit reached](#spend-limit-reached)。424* 临时 429 节流,但不是网关的支出限制 `429`,这不是节流;请参阅 [Spend limit reached](#spend-limit-reached)。

424 * 当您使用 claude.ai 订阅登录时,这包括不携带您套餐配额头的 429 节流。在 v2.1.199 之前,Claude Code 仅对 API 密钥和企业登录重试这些节流。425 * 当您使用 claude.ai 订阅登录时,这包括不携带您套餐配额头的 429 节流。在 v2.1.199 之前,Claude Code 仅对 API 密钥和企业登录重试这些节流。


4552 4553 

4553* 根据[子代理可用的工具](/docs/zh-CN/sub-agents#available-tools)纠正错误命名的每个条目4554* 根据[子代理可用的工具](/docs/zh-CN/sub-agents#available-tools)纠正错误命名的每个条目

4554* 删除会话没有的工具条目,例如来自未连接的服务器的 MCP 工具4555* 删除会话没有的工具条目,例如来自未连接的服务器的 MCP 工具

4556* 如果该条目指向一个已连接的 MCP 服务器,请将该条目与该服务器的名称进行比较,以该服务器[工具名称](/docs/zh-CN/permissions#mcp)中的拼写为准,例如 `mcp__reports__v2__get_totals` 中的 `reports__v2`。对于该服务器,请写 `mcp__reports__v2__*`,即 `mcp__` 后跟完整名称和 `__*`。如果使用较短的 `mcp__reports`(它指向名为 `reports` 的服务器),子代理将得不到任何 `reports__v2` 工具

4555* 对于[后台子代理删除](/docs/zh-CN/sub-agents#available-tools)的工具(例如 `CronCreate`),删除该条目。要保留该工具,[关闭 fork 模式](/docs/zh-CN/sub-agents#turn-fork-mode-on-or-off)并要求 Claude 在前台运行子代理4557* 对于[后台子代理删除](/docs/zh-CN/sub-agents#available-tools)的工具(例如 `CronCreate`),删除该条目。要保留该工具,[关闭 fork 模式](/docs/zh-CN/sub-agents#turn-fork-mode-on-or-off)并要求 Claude 在前台运行子代理

4556* 删除 `tools` 字段而不是列出工具,以给子代理每个[子代理可用的工具](/docs/zh-CN/sub-agents#available-tools)4558* 删除 `tools` 字段而不是列出工具,以给子代理每个[子代理可用的工具](/docs/zh-CN/sub-agents#available-tools)

4557* 对于仅包含 `Agent` 的 `tools` 列表,提高[深度限制](/docs/zh-CN/sub-agents#let-subagents-spawn-their-own-subagents)或给该 Agent 至少一个其他工具:Claude Code 在该限制处保留 `Agent`,因此列表中没有其他内容会解析为零个工具4559* 对于仅包含 `Agent` 的 `tools` 列表,提高[深度限制](/docs/zh-CN/sub-agents#let-subagents-spawn-their-own-subagents)或给该 Agent 至少一个其他工具:Claude Code 在该限制处保留 `Agent`,因此列表中没有其他内容会解析为零个工具

hooks.md +54 −17

Details

476| `async` | 否 | 如果为 `true`,在后台运行而不阻止。请参阅 [在后台运行 hooks](#run-hooks-in-the-background) |476| `async` | 否 | 如果为 `true`,在后台运行而不阻止。请参阅 [在后台运行 hooks](#run-hooks-in-the-background) |

477| `asyncRewake` | 否 | 如果为 `true`,在后台运行并在退出代码 2 时唤醒 Claude。hook 的 stderr 或 stdout(如果 stderr 为空)显示给 Claude 作为 [系统提醒](/docs/zh-CN/glossary#system-reminder),以便它可以对长时间运行的后台失败做出反应 |477| `asyncRewake` | 否 | 如果为 `true`,在后台运行并在退出代码 2 时唤醒 Claude。hook 的 stderr 或 stdout(如果 stderr 为空)显示给 Claude 作为 [系统提醒](/docs/zh-CN/glossary#system-reminder),以便它可以对长时间运行的后台失败做出反应 |

478| `shell` | 否 | 用于此 hook 的 shell。接受 `"bash"` 或 `"powershell"`。默认为 `"bash"`,或在未安装 Git Bash 时在 Windows 上默认为 `"powershell"`。设置 `"powershell"` 在 Windows 上通过 PowerShell 运行命令。不需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL`,因为 hooks 直接生成 PowerShell。设置 `args` 时被忽略 |478| `shell` | 否 | 用于此 hook 的 shell。接受 `"bash"` 或 `"powershell"`。默认为 `"bash"`,或在未安装 Git Bash 时在 Windows 上默认为 `"powershell"`。设置 `"powershell"` 在 Windows 上通过 PowerShell 运行命令。不需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL`,因为 hooks 直接生成 PowerShell。设置 `args` 时被忽略 |

479| `onFailure` | 否 | hook 失败时对该操作的处理方式:`"continue"`(默认值)或 `"block"`。请参阅 [在 hook 失败时阻止操作](#block-the-action-when-a-hook-fails)。需要 Claude Code v2.1.295 或更高版本 |479| `onFailure` | 否 | hook 失败时触发该 hook 的操作是否继续进行:`"continue"` 或 `"block"`。有关 `"block"` 以及不设置该字段时的行为,请参阅 [在 hook 失败时阻止操作](#block-the-action-when-a-hook-fails)。需要 Claude Code v2.1.295 或更高版本 |

480 480 

481<a id="exec-form-and-shell-form" />481<a id="exec-form-and-shell-form" />

482 482 


829 829 

830* **成功**:hook 以 0 退出。Claude Code 应用 hook 打印的任何 [JSON 输出](#json-output)字段,除非这些字段阻止或拒绝该操作,否则操作继续进行。[启动后台进程的 hook](#hooks-that-start-a-background-process) 介绍了例外情况。830* **成功**:hook 以 0 退出。Claude Code 应用 hook 打印的任何 [JSON 输出](#json-output)字段,除非这些字段阻止或拒绝该操作,否则操作继续进行。[启动后台进程的 hook](#hooks-that-start-a-background-process) 介绍了例外情况。

831* **阻止错误**:hook 以 2 退出。在[可以阻止的事件](#exit-code-2-behavior-per-event)上,Claude Code 停止该操作。831* **阻止错误**:hook 以 2 退出。在[可以阻止的事件](#exit-code-2-behavior-per-event)上,Claude Code 停止该操作。

832* **非阻止错误**:hook 以任何其他代码退出,或以其他方式失败,例如无法启动或打印无效 JSON。操作继续进行,在 `PreToolUse` 等事件上,您会在会话记录中看到 `<hook name> hook error` 通知。如果希望失败的 hook 阻止操作,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。832* **非阻止错误**:hook 以任何其他代码退出,或以其他方式失败,例如无法启动或打印无效 JSON。操作继续进行,但[失败时会阻止操作的 hook](#block-the-action-when-a-hook-fails) 除外,例如 `onFailure` 设置为 `"block"` 的 hook。在 `PreToolUse` 等事件上,您会在会话记录中看到 `<hook name> hook error` 通知。

833 833 

834hook 打印到 stdout 的内容可能会改变结果。例如,如果 `PreToolUse` hook 以 1 退出但打印了通过验证的 JSON,则该运行是成功的,由 JSON 字段决定后续行为。要确定 hook 在 `PreToolUse` 等事件上的结果,请将其打印到 stdout 的内容与第一列匹配,并将其退出码与表头匹配:834hook 打印到 stdout 的内容可能会改变结果。例如,当 `PreToolUse` hook 以 1 退出但打印了通过验证的 JSON 时,该 JSON 仍然可以决定后续行为。要确定 hook 在 `PreToolUse` 等事件上的结果,请将其打印到 stdout 的内容与第一列匹配,并将其退出码与表头匹配:

835 835 

836| Stdout | 退出 0 | 退出 2 | 任何其他退出码 |836| Stdout | 退出 0 | 退出 2 | 任何其他退出码 |

837| :- | :- | :- | :- |837| :- | :- | :- | :- |

838| 通过 [schema 验证](#json-output)的 JSON 对象 | 成功。字段生效 | 阻止错误。Claude Code 仍读取字段,但它们无法覆盖阻止 | 成功。Claude Code 忽略退出码,仅由字段决定。设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails) 时,这算作失败 |838| 通过 [schema 验证](#json-output)的 JSON 对象 | 成功。字段生效 | 阻止错误。Claude Code 仍读取字段,但它们无法覆盖阻止 | 成功。Claude Code 忽略退出码,仅由字段决定。对于[失败时会阻止操作的 hook](#block-the-action-when-a-hook-fails),该运行则算作失败 |

839| [无法解析](#exit-code-0)或未通过 schema 验证的 JSON | 非阻止错误。通知带有解析或验证消息 | 阻止错误。您的 stderr 作为原因 | 非阻止错误。通知带有解析或验证消息 |839| [无法解析](#exit-code-0)或未通过 schema 验证的 JSON | 非阻止错误。通知带有解析或验证消息 | 阻止错误。您的 stderr 作为原因 | 非阻止错误。通知带有解析或验证消息 |

840| [纯文本](#exit-code-0)或无输出 | 成功 | 阻止错误。您的 stderr 作为原因 | 非阻止错误。通知带有您的 stderr 的第一行 |840| [纯文本](#exit-code-0)或无输出 | 成功 | 阻止错误。您的 stderr 作为原因 | 非阻止错误。通知带有您的 stderr 的第一行 |

841 841 


864* **两行或更多行,每行本身都可解析为 JSON,且第一行以 `{` 开头、最后一行以 `}` 结尾**:如果没有任何一行是设置了字段的 JSON 输出对象,则为纯文本;如果有一行是,则为解析失败。864* **两行或更多行,每行本身都可解析为 JSON,且第一行以 `{` 开头、最后一行以 `}` 结尾**:如果没有任何一行是设置了字段的 JSON 输出对象,则为纯文本;如果有一行是,则为解析失败。

865* **其他任何以 `{` 开头并以 `}` 结尾但不是有效 JSON 的内容**:解析失败。865* **其他任何以 `{` 开头并以 `}` 结尾但不是有效 JSON 的内容**:解析失败。

866 866 

867当 Claude Code 尝试将您的 stdout 解析为 JSON 但无法解析,或解析后的对象未通过 [schema 验证](#json-output)时,该运行是[非阻止错误](#exit-code-output)。`<hook name> hook error` 通知带有解析或验证消息。在添加纯文本 stdout 作为上下文的事件上,Claude Code 不会添加它未能解析的 stdout。867除非该 hook 是[失败时会阻止操作的 hook](#block-the-action-when-a-hook-fails),否则解析失败或解析后的对象未通过 [schema 验证](#json-output)都是[非阻止错误](#exit-code-output)。`<hook name> hook error` 通知带有解析或验证消息。在添加纯文本 stdout 作为上下文的事件上,Claude Code 不会添加它未能解析的 stdout。

868 868 

869Claude 从不看到以 0 退出的 hook 的 stderr。要在 `PreToolUse` 等事件上自己读取它,请启用[调试日志](#debug-hooks)。要从 `PostToolUse` 或 `PostToolUseFailure` hook 向 Claude 显示警告,请改为退出 2,以便 [Claude 看到 stderr](#exit-code-2-behavior-per-event),即使工具已经运行。869Claude 从不看到以 0 退出的 hook 的 stderr。要在 `PreToolUse` 等事件上自己读取它,请启用[调试日志](#debug-hooks)。要从 `PostToolUse` 或 `PostToolUseFailure` hook 向 Claude 显示警告,请改为退出 2,以便 [Claude 看到 stderr](#exit-code-2-behavior-per-event),即使工具已经运行。

870 870 


907 其他退出码907 其他退出码

908</h4>908</h4>

909 909 

910当 hook 以 0 或 2 以外的代码退出,并且向 stdout 打印纯文本或不打印任何内容时,该运行是[非阻止错误](#exit-code-output)。您会在会话记录中看到 `<hook name> hook error` 通知,带有 `Failed with non-blocking status code:` 和 hook stderr 的第一行。例如,当 `Bash` 上的 `PreToolUse` hook 向 stderr 打印 `something broke` 并以 1 退出时,`PreToolUse:Bash hook error` 通知带有以下行:910除非该 hook 是[失败时会阻止操作的 hook](#block-the-action-when-a-hook-fails),否则以 0 或 2 以外的退出码退出且 stdout 上为纯文本或无输出时,属于[非阻止错误](#exit-code-output)。如果操作继续进行,您会在会话记录中看到 `<hook name> hook error` 通知,带有 `Failed with non-blocking status code:` 和 hook stderr 的第一行。

911 

912例如,当 `Bash` 上的 `PreToolUse` hook 向 stderr 打印 `something broke` 并以 1 退出时,`PreToolUse:Bash hook error` 通知带有以下行:

911 913 

912```text theme={null}914```text theme={null}

913Failed with non-blocking status code: something broke915Failed with non-blocking status code: something broke


915 917 

916要捕获完整的 stderr 而不仅是第一行,请启用[调试日志](#debug-hooks)。918要捕获完整的 stderr 而不仅是第一行,请启用[调试日志](#debug-hooks)。

917 919 

918无法启动的 hook 也是非阻止错误。在 shell 形式下,当脚本路径不存在或不可执行时,shell 以某个代码(如 127)退出,通知带有解释器的消息,例如 `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`。当您设置策略 hook 时,请在其第一次运行时留意此通知,因为 `settings.json` 中拼写错误的路径意味着该 hook 从不运行。要改为阻止操作,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。920除非该 hook 是[失败时会阻止操作的 hook](#block-the-action-when-a-hook-fails),否则无法启动的 hook 也是非阻止错误。在 shell 形式下,当脚本路径不存在或不可执行时,shell 以某个代码(如 127)退出,通知带有解释器的消息。例如,当脚本路径不存在时,通知带有类似下面的一行:

921 

922```text theme={null}

923Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory

924```

925 

926当您设置策略 hook 时,请在其第一次运行时留意此通知,因为 `settings.json` 中拼写错误的路径意味着该 hook 从不运行。要在 hook 无法启动时阻止操作,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。

919 927 

920<Warning>928<Warning>

921 如果 stdout 上没有有效 JSON,Claude Code 将退出码 1 视为非阻止错误,即使 1 是传统的 Unix 失败代码。如果您的 hook 旨在强制执行策略,请使用 `exit 2`。929 没有有效 JSON 输出的退出码 1 是非阻止错误,除非该 hook 是[失败时会阻止操作的 hook](#block-the-action-when-a-hook-fails),即使 1 是传统的 Unix 失败代码。如果您的 hook 旨在强制执行策略,请使用 `exit 2`。

922</Warning>930</Warning>

923 931 

924<h4 id="timeouts">932<h4 id="timeouts">


929 937 

930在 [`PreModelSwitch`](#premodelswitch) 上,因超时被取消的 hook 会阻止模型切换。在 `PreToolUse` 上,两类 hook 的行为不同:938在 [`PreModelSwitch`](#premodelswitch) 上,因超时被取消的 hook 会阻止模型切换。在 `PreToolUse` 上,两类 hook 的行为不同:

931 939 

932* 超时的 `command`、`http` 或 `mcp_tool` hook 不阻止工具调用。调用通过正常[权限流程](/docs/zh-CN/permissions)继续,因此不要指望停滞的 hook 充当关卡。要在 `command` 或 `http` hook 超时时阻止调用,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。940* 超时的 `command`、`http` 或 `mcp_tool` hook 不阻止工具调用,但[失败时会阻止操作的 hook](#block-the-action-when-a-hook-fails) 除外。调用通过正常[权限流程](/docs/zh-CN/permissions)继续,因此不要指望停滞的 hook 充当关卡。要在 `command` 或 `http` hook 超时时阻止调用,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。

933* 超过其超时时间的 [Agent SDK 回调 hook](/docs/zh-CN/agent-sdk/hooks) 会[阻止工具调用](#pretooluse)。941* 超过其超时时间的 [Agent SDK 回调 hook](/docs/zh-CN/agent-sdk/hooks) 会[阻止工具调用](#pretooluse)。

934 942 

935<h4 id="hooks-that-start-a-background-process">943<h4 id="hooks-that-start-a-background-process">


959 hook 失败时阻止操作967 hook 失败时阻止操作

960</h4>968</h4>

961 969 

962在大多数事件上,当 hook 失败或超时时,Claude Code 仍会执行该操作,因此路径错误或脚本崩溃的策略 hook 会放行一切。要改为阻止操作,请在 `command` 或 `http` hook 上设置 `"onFailure": "block"`。默认值为 `"continue"`。需要 Claude Code v2.1.295 或更高版本。970在大多数事件上,当 hook 失败或超时时,Claude Code 仍会执行该操作。这样一来,路径错误或脚本崩溃的策略 hook 会放行一切。要改为阻止操作,请在 `command` 或 `http` hook 上设置 `"onFailure": "block"`。需要 Claude Code v2.1.295 或更高版本。

971 

972<Note>

973 在未安装 Git Bash 的 Windows 上,未设置 `onFailure` 的 shell 形式 `PreToolUse` 或 `PermissionRequest` 命令 hook 失败时,可能反而会[阻止工具调用](#failed-hooks-on-windows-without-git-bash)。

974</Note>

963 975 

964`.claude/settings.json` 中的这个 `PreToolUse` hook 会在每个 Bash 命令之前运行一个项目脚本,如果脚本失败则阻止该命令:976`.claude/settings.json` 中的这个 `PreToolUse` hook 会在每个 Bash 命令之前运行一个项目脚本,如果脚本失败则阻止该命令:

965 977 


1007* **`Stop`、`SubagentStop`、`TaskCompleted` 和 `TeammateIdle` hook**:这些事件上的退出码 2 会让 Claude 回去继续工作,而 Claude 无法修复无法运行的 hook1019* **`Stop`、`SubagentStop`、`TaskCompleted` 和 `TeammateIdle` hook**:这些事件上的退出码 2 会让 Claude 回去继续工作,而 Claude 无法修复无法运行的 hook

1008* **后台命令 hook**:设置了 [`async` 或 `asyncRewake`](#run-hooks-in-the-background) 的命令 hook1020* **后台命令 hook**:设置了 [`async` 或 `asyncRewake`](#run-hooks-in-the-background) 的命令 hook

1009 1021 

1022<h4 id="failed-hooks-on-windows-without-git-bash">

1023 未安装 Git Bash 的 Windows 上失败的 hook

1024</h4>

1025 

1026如果被阻止的工具调用的错误包含以下文本,则说明某个 `PreToolUse` 或 `PermissionRequest` 命令 hook 失败或超时,并阻止了该调用:

1027 

1028```text theme={null}

1029blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.

1030```

1031 

1032未设置 `shell` 的 shell 形式 hook 在未安装 Git Bash 时会在 PowerShell 中运行,而为 Bash 编写的脚本在那里可能无法按原样运行。请选择与您的 hook 匹配的修复方法:

1033 

1034* **hook 是为 Bash 编写的**:安装 [Git for Windows](https://git-scm.com/downloads/win);如果 Git Bash 已安装但 Claude Code 找不到它,请设置 [`CLAUDE_CODE_GIT_BASH_PATH`](/docs/zh-CN/env-vars),然后启动新会话

1035* **hook 运行单个 `.exe`,而不是 `.cmd` 或 `.bat` 文件**:将程序放在 `command` 中,将其参数放在 `args` 中,以使用 [exec 形式](#exec-form-and-shell-form),并添加 [`"onFailure": "block"`](#block-the-action-when-a-hook-fails)。这样 Claude Code 会在不使用 shell 的情况下启动该程序。如果没有 `"onFailure": "block"`,当程序失败、缺失或超时时,调用可能会继续进行

1036* **hook 是为 PowerShell 编写的**:为 hook 添加 `"shell": "powershell"` 和 [`"onFailure": "block"`](#block-the-action-when-a-hook-fails)。如果没有 `"onFailure": "block"`,当 hook 仍然失败或超时时,调用可能会继续进行。要查明 hook 失败的原因,请检查[调试日志](#debug-hooks)

1037* **hook 失败时操作应继续进行**:为 hook 添加 `"onFailure": "continue"`

1038 

1039对于显示此错误的 hook,0 或 2 以外的任何退出码都算作[失败](#block-the-action-when-a-hook-fails),即使 hook 打印了不拒绝该调用的 JSON。

1040 

1010<h4 id="exit-code-2-behavior-per-event">1041<h4 id="exit-code-2-behavior-per-event">

1011 每个事件的退出码 2 行为1042 每个事件的退出码 2 行为

1012</h4>1043</h4>


1060* **2xx 且空响应体**:成功,等同于退出码 0 且无输出1091* **2xx 且空响应体**:成功,等同于退出码 0 且无输出

1061* **2xx 且 JSON 对象响应体**:使用与命令 hook 相同的 [JSON 输出](#json-output) schema 解析。未通过 schema 验证的响应体是非阻止错误1092* **2xx 且 JSON 对象响应体**:使用与命令 hook 相同的 [JSON 输出](#json-output) schema 解析。未通过 schema 验证的响应体是非阻止错误

1062* **2xx 且任何其他响应体,如纯文本**:非阻止错误,处理方式与非 2xx 状态相同。Claude Code 不将文本添加到 Claude 的上下文1093* **2xx 且任何其他响应体,如纯文本**:非阻止错误,处理方式与非 2xx 状态相同。Claude Code 不将文本添加到 Claude 的上下文

1063* **非 2xx 状态**:非阻止错误,执行继续1094* **非 2xx 状态**:非阻止错误

1064* **连接失败**:非阻止错误,执行继续1095* **连接失败**:非阻止错误

1065* **超时**:hook 被取消,如[超时](#timeouts)下所述1096* **超时**:hook 被取消,如[超时](#timeouts)下所述

1066 1097 

1067HTTP hook 无法仅通过状态码发出阻止错误信号:非 2xx 状态或连接失败是[非阻止错误](#exit-code-output)。要阻止工具调用或拒绝权限,请返回 2xx 响应,其 JSON 响应体包含相应的决策字段。要在请求失败或返回非 2xx 状态时阻止操作,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。1098发生[非阻止错误](#exit-code-output)后,操作会继续进行,除非该 hook 是[失败时会阻止操作的 hook](#block-the-action-when-a-hook-fails)。要阻止工具调用或拒绝权限,请返回 2xx 响应,其 JSON 响应体包含相应的[决策字段](#decision-control)。要在请求失败或返回非 2xx 状态时阻止操作,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。

1068 1099 

1069<h3 id="json-output">1100<h3 id="json-output">

1070 JSON 输出1101 JSON 输出


1573}1604}

1574```1605```

1575 1606 

1607当提示词是您输入的 [skill](/docs/zh-CN/skills) 或自定义命令(例如 `/deploy staging`)时,hook 会接收您输入的原始行,而不是展开后的 skill 内容。如果 hook 阻止了该提示词,命令就不会运行,因此 skill [通过 `` !`<command>` `` 注入](/docs/zh-CN/skills#inject-dynamic-context)的 shell 命令也不会运行。若要改为根据命令的名称或参数进行匹配,请使用 [UserPromptExpansion](#userpromptexpansion)。

1608 

1576<h4 id="userpromptsubmit-decision-control">1609<h4 id="userpromptsubmit-decision-control">

1577 UserPromptSubmit 决策控制1610 UserPromptSubmit 决策控制

1578</h4>1611</h4>


2076 2109 

2077| 字段 | 说明 |2110| 字段 | 说明 |

2078| :- | :- |2111| :- | :- |

2079| `permissionDecision` | `"allow"` 会跳过权限提示,但以下情况除外:[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)、[从网络路径读取](/docs/zh-CN/permissions#network-paths),以及 `AskUserQuestion` 和 `ExitPlanMode`(它们需要[与 `updatedInput` 配合使用](#allow-with-updatedinput))。`"deny"` 会阻止工具调用。`"ask"` 会提示用户确认。`"defer"` 会正常退出,以便稍后恢复该工具。无论 hook 返回什么,[拒绝和询问规则](/docs/zh-CN/permissions#manage-permissions)仍会被评估 |2112| `permissionDecision` | `"allow"` 会跳过权限提示,但[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外。`AskUserQuestion` 和 `ExitPlanMode` 需要[将 `updatedInput` 与 `"allow"` 配合使用](#allow-with-updatedinput)。关于计划模式,请参阅[计划模式中的 hook 批准](/docs/zh-CN/permissions#hook-approvals-in-plan-mode)。`"deny"` 会阻止工具调用。`"ask"` 会提示用户确认。`"defer"` 会正常退出,以便稍后恢复该工具。无论 hook 返回什么,[拒绝和询问规则](/docs/zh-CN/permissions#manage-permissions)仍会被评估 |

2080| `permissionDecisionReason` | 对于 `"ask"`,在权限提示中显示给用户。当 Claude Code 在无人能回应该提示的 `-p` 运行中[拒绝该调用](/docs/zh-CN/headless#turn-off-permission-prompts-in-unattended-runs)时,Claude 会在工具结果中读取该原因。对于 `"deny"`,显示给 Claude。对于 `"allow"` 和 `"defer"`,仅写入[调试日志](#debug-hooks) |2113| `permissionDecisionReason` | 对于 `"ask"`,在权限提示中显示给用户。当 Claude Code 在无人能回应该提示的 `-p` 运行中[拒绝该调用](/docs/zh-CN/headless#turn-off-permission-prompts-in-unattended-runs)时,Claude 会在工具结果中读取该原因。对于 `"deny"`,显示给 Claude。对于 `"allow"` 和 `"defer"`,仅写入[调试日志](#debug-hooks) |

2081| `updatedInput` | 在执行前修改工具的输入参数。会替换整个输入对象,因此请将未更改的字段与修改后的字段一起包含。Claude Code 会针对您的 hook 返回的输入(而非 Claude 发送的输入)评估权限规则以及 Bash 命令的[自动转入后台资格](/docs/zh-CN/tools-reference#foreground-commands-that-move-to-the-background)。与 `"allow"` 结合可自动批准,与 `"ask"` 结合可向用户显示修改后的输入。对于 `"defer"`,会被忽略 |2114| `updatedInput` | 在执行前修改工具的输入参数。会替换整个输入对象,因此请将未更改的字段与修改后的字段一起包含。Claude Code 会针对您的 hook 返回的输入(而非 Claude 发送的输入)评估权限规则以及 Bash 命令的[自动转入后台资格](/docs/zh-CN/tools-reference#foreground-commands-that-move-to-the-background)。与 `"allow"` 结合可自动批准,与 `"ask"` 结合可向用户显示修改后的输入。对于 `"defer"`,会被忽略 |

2082| `additionalContext` | 与工具结果一起添加到 Claude 上下文中的字符串。当 `permissionDecision` 为 `"defer"` 时会被忽略。请参阅[为 Claude 添加上下文](#add-context-for-claude) |2115| `additionalContext` | 与工具结果一起添加到 Claude 上下文中的字符串。当 `permissionDecision` 为 `"defer"` 时会被忽略。请参阅[为 Claude 添加上下文](#add-context-for-claude) |


3717 3750 

3718无论决策如何,Claude Code 都会向用户显示您的 hook 返回的任何 `systemMessage`,因此报告成本的 hook 可以返回 `{"systemMessage": "..."}` 并以 0 退出。3751无论决策如何,Claude Code 都会向用户显示您的 hook 返回的任何 `systemMessage`,因此报告成本的 hook 可以返回 `{"systemMessage": "..."}` 并以 0 退出。

3719 3752 

3720在超时之前未响应的 PreModelSwitch hook 会阻止切换。有关超时在其他事件上的作用,请参阅[超时](#timeouts)。此事件的默认超时时间为 30 秒。`PreModelSwitch` 仅运行 `command`、`http` 和 `mcp_tool` hook,因此 `prompt` 和 `agent` 的默认值不适用。3753<h4 id="premodelswitch-timeouts-and-other-exit-codes">

3754 PreModelSwitch 超时和其他退出码

3755</h4>

3756 

3757在超时之前未响应的 PreModelSwitch hook 会阻止切换。此事件的默认超时时间为 30 秒。

3721 3758 

3722以 0 或 2 以外的代码退出且未打印 JSON 决策的 hook 属于非阻塞错误,如[其他退出码](#other-exit-codes)中所述。3759有关 0 或 2 以外的退出码的作用,请参阅[其他退出码](#other-exit-codes)。

3723 3760 

3724<h3 id="postmodelswitch">3761<h3 id="postmodelswitch">

3725 PostModelSwitch3762 PostModelSwitch


4096 4133 

4097您的 `content` 会替换用户的整个 `content` 对象,因此请包含您未更改的字段。请同时返回 `action`,因为 Claude Code 会忽略没有 `action` 的 `hookSpecificOutput`。4134您的 `content` 会替换用户的整个 `content` 对象,因此请包含您未更改的字段。请同时返回 `action`,因为 Claude Code 会忽略没有 `action` 的 `hookSpecificOutput`。

4098 4135 

4099当用户拒绝或取消时,ElicitationResult hook 也会运行,并且您的 `action` 会替换用户的 `action`。在返回 `accept` 之前,请检查输入的 `action` 是否为 `accept`,否则您的 hook 会将被拒绝的请求变成被接受的请求。此脚本在用户接受时进行相同的更改,保留其他字段,其他情况下不打印任何内容:4136当用户拒绝或取消时,ElicitationResult hook 也会运行,并且您的 `action` 会替换用户的操作。在返回 `accept` 之前,请检查输入的 `action` 是否为 `accept`,否则您的 hook 会将已拒绝的请求变为已接受。此脚本在用户接受时进行相同的更改,保留其他字段,否则不打印任何内容:

4100 4137 

4101```bash theme={null}4138```bash theme={null}

4102#!/bin/bash4139#!/bin/bash

hooks-guide.md +20 −7

Details

633 * 对于 `PreToolUse` hook,这不会批准工具调用:正常的 [权限流程](/docs/zh-CN/permissions) 仍然适用。633 * 对于 `PreToolUse` hook,这不会批准工具调用:正常的 [权限流程](/docs/zh-CN/permissions) 仍然适用。

634 * 对于 `UserPromptSubmit`、`UserPromptExpansion`、`SessionStart` 和 `PostModelSwitch` hooks,Claude Code 将 stdout [视为纯文本](/docs/zh-CN/hooks#exit-code-0) 添加到 Claude 的上下文中。634 * 对于 `UserPromptSubmit`、`UserPromptExpansion`、`SessionStart` 和 `PostModelSwitch` hooks,Claude Code 将 stdout [视为纯文本](/docs/zh-CN/hooks#exit-code-0) 添加到 Claude 的上下文中。

635* **退出 2**:Claude Code 阻止操作。写入原因到 stderr。它的去向取决于事件:某些事件将其反馈给 Claude,以便它可以调整,其他事件向用户显示它,还有一些(如 `ConfigChange` 和 `Elicitation`)不显示任何消息。某些事件无法被阻止:对于 `SessionStart` 和其他事件,退出 2 向用户显示 stderr,执行继续。有关每个事件的退出代码 2 行为的完整列表,请参阅 [每个事件的退出代码 2 行为](/docs/zh-CN/hooks#exit-code-2-behavior-per-event)。635* **退出 2**:Claude Code 阻止操作。写入原因到 stderr。它的去向取决于事件:某些事件将其反馈给 Claude,以便它可以调整,其他事件向用户显示它,还有一些(如 `ConfigChange` 和 `Elicitation`)不显示任何消息。某些事件无法被阻止:对于 `SessionStart` 和其他事件,退出 2 向用户显示 stderr,执行继续。有关每个事件的退出代码 2 行为的完整列表,请参阅 [每个事件的退出代码 2 行为](/docs/zh-CN/hooks#exit-code-2-behavior-per-event)。

636* **任何其他退出代码**:对于大多数事件,结果取决于你的 hook 打印到 stdout 的内容:636* **任何其他退出码**:对于大多数事件,操作会作为 [非阻止错误](/docs/zh-CN/hooks#exit-code-output) 继续进行,除非该 hook 属于 [失败时会阻止操作](/docs/zh-CN/hooks#block-the-action-when-a-hook-fails) 的 hook,或其 JSON 输出通过了验证:

637 * 通过架构验证的已解析对象:Claude Code 忽略退出代码,仅 JSON 决定结果,hook 不被报告为错误。每个事件的例外(如 `WorktreeCreate` 在任何非零退出时失败)列在参考的 [退出代码输出](/docs/zh-CN/hooks#exit-code-output) 部分中。637 * 通过 schema 验证的已解析对象:Claude Code 忽略退出码,仅由 JSON 决定结果,hook 不会被报告为错误。每个事件的例外(如 `WorktreeCreate` 在任何非零退出时失败)列在参考的 [退出码输出](/docs/zh-CN/hooks#exit-code-output) 部分中。

638 * 未通过架构验证的已解析对象,或 Claude Code [尝试解析为 JSON](/docs/zh-CN/hooks#exit-code-0) 但不是有效 JSON 的 stdout:非阻止错误;通知包含验证或解析消息。638 * 未通过 schema 验证的已解析对象,或 Claude Code [尝试解析为 JSON](/docs/zh-CN/hooks#exit-code-0) 但不是有效 JSON 的 stdout:非阻止错误;通知包含验证或解析消息。

639 * Claude Code [视为纯文本](/docs/zh-CN/hooks#exit-code-0) 的 stdout,或空 stdout:操作作为非阻止错误进行。成绩单显示 `<hook name> hook error` 通知,然后是 stderr 的第一行,前缀为 `Failed with non-blocking status code:`。要捕获完整的 stderr,使用 `claude --debug` 或在会话中运行 `/debug` 启用 [调试日志](/docs/zh-CN/hooks#debug-hooks)。639 * Claude Code [视为纯文本](/docs/zh-CN/hooks#exit-code-0) 的 stdout,或空 stdout:操作作为非阻止错误继续进行。会话记录显示 `<hook name> hook error` 通知,然后是 stderr 的第一行,前缀为 `Failed with non-blocking status code:`。要捕获完整的 stderr,请使用 `claude --debug` 或在会话中运行 `/debug` 启用 [调试日志](/docs/zh-CN/hooks#debug-hooks)。

640 640 

641<h4 id="structured-json-output">641<h4 id="structured-json-output">

642 结构化 JSON 输出642 结构化 JSON 输出


664 664 

665在 `PreToolUse` 上,Claude Code 处理每个 `permissionDecision` 值如下:665在 `PreToolUse` 上,Claude Code 处理每个 `permissionDecision` 值如下:

666 666 

667* `"allow"`:跳过交互式权限提示。拒绝和询问规则(包括企业托管拒绝列表)仍然适用;从 [网络路径](/docs/zh-CN/permissions#network-paths) 读取的提示、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具的提示,以及 [您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具的提示(在该设置到达 Claude Code 的会话中)也仍然适用667* `"allow"`:跳过交互式权限提示。拒绝和询问规则(包括企业托管拒绝列表)仍然适用,以下情况的提示也仍然适用:

668 

669 * 从 [网络路径](/docs/zh-CN/permissions#network-paths) 读取

670 * 标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具

671 * 在该设置到达 Claude Code 的会话中,[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具

672 

673 有关 `"allow"` 在计划模式下的作用,请参阅 [计划模式下的 hook 批准](/docs/zh-CN/permissions#hook-approvals-in-plan-mode)。

668* `"deny"`:取消工具调用并将原因发送给 Claude674* `"deny"`:取消工具调用并将原因发送给 Claude

669* `"ask"`:照常向用户显示权限提示675* `"ask"`:照常向用户显示权限提示

670 676 


1015 1021 

1016`PreToolUse` hooks 在任何权限模式检查之前触发,在每个[权限模式](/docs/zh-CN/permission-modes)中,包括 `dontAsk`。返回 `permissionDecision: "deny"` 的 hook 会阻止工具,即使在 `bypassPermissions` 模式或使用 `--dangerously-skip-permissions` 时也是如此。这让你强制执行用户无法通过更改其权限模式来绕过的策略。1022`PreToolUse` hooks 在任何权限模式检查之前触发,在每个[权限模式](/docs/zh-CN/permission-modes)中,包括 `dontAsk`。返回 `permissionDecision: "deny"` 的 hook 会阻止工具,即使在 `bypassPermissions` 模式或使用 `--dangerously-skip-permissions` 时也是如此。这让你强制执行用户无法通过更改其权限模式来绕过的策略。

1017 1023 

1018反过来则不成立:返回 `"allow"` 的 hook 不会绕过设置中的拒绝规则,并且在以下情况下也无法抑制提示:从[网络路径](/docs/zh-CN/permissions#network-paths)读取、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具,以及在该设置会传达到 Claude Code 的会话中[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具。设置文件和插件的 `hooks/hooks.json` 中的 hook 可以收紧限制,但不能放宽到超出权限规则允许的范围。1024反过来则不成立:设置文件和插件的 `hooks/hooks.json` 中的 hook 可以收紧限制,但不能放宽到超出权限规则允许的范围。返回 `"allow"` 的 hook 不会绕过设置中的拒绝规则,并且在以下情况下也无法抑制提示:

1025 

1026* 从[网络路径](/docs/zh-CN/permissions#network-paths)读取

1027* 标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具

1028* 在该设置会传达到 Claude Code 的会话中,[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具

1029 

1030在[计划模式](/docs/zh-CN/permissions#hook-approvals-in-plan-mode)中,如果您的 `PreToolUse` hook 对文件编辑返回 `"allow"`,您得到的提示、阻止或批准与没有 hook 时该编辑所得到的相同。要解除对 hook 批准的这一限制,请[批准计划](/docs/zh-CN/permission-modes#review-and-approve-a-plan)或切换到其他权限模式。

1019 1031 

1020您安装的处理 `tool.check` 的 [mod](/docs/zh-CN/plugins/mods/overview) 可以批准被您的 `PreToolUse` hook 阻止的调用,除非该 hook 位于托管设置中。[使用 hooks 扩展权限](/docs/zh-CN/permissions#extend-permissions-with-hooks)列出了哪些规则优先于 mod。1032您安装的处理 `tool.check` 的 [mod](/docs/zh-CN/plugins/mods/overview) 可以批准被您的 `PreToolUse` hook 阻止的调用,除非该 hook 位于托管设置中。在计划模式中,当此类调用为只读时,mod 可以批准它,但不能批准文件编辑或其他非只读调用。[使用 hooks 扩展权限](/docs/zh-CN/permissions#extend-permissions-with-hooks)列出了哪些规则优先于 mod。

1021 1033 

1022<h3 id="hook-not-firing">1034<h3 id="hook-not-firing">

1023 Hook 未触发1035 Hook 未触发


1042 ```1054 ```

1043* 如果你看到"command not found",使用绝对路径或 `${CLAUDE_PROJECT_DIR}` 来引用脚本。为了完全避免 shell 引用,添加 `"args": []` 来切换到 [exec 形式](/docs/zh-CN/hooks#exec-form-and-shell-form),它直接生成脚本而不使用 shell1055* 如果你看到"command not found",使用绝对路径或 `${CLAUDE_PROJECT_DIR}` 来引用脚本。为了完全避免 shell 引用,添加 `"args": []` 来切换到 [exec 形式](/docs/zh-CN/hooks#exec-form-and-shell-form),它直接生成脚本而不使用 shell

1044* 如果你看到"jq: command not found",安装 `jq` 或使用 Python/Node.js 进行 JSON 解析1056* 如果你看到"jq: command not found",安装 `jq` 或使用 Python/Node.js 进行 JSON 解析

1057* 如果消息包含 `blocking because Git Bash wasn't found`,说明您使用的是 Windows,Claude Code 未找到 Git Bash,并且失败或超时的 hook 阻止了该工具调用。有关修复方法,请参阅[在没有 Git Bash 的 Windows 上失败的 hook](/docs/zh-CN/hooks#failed-hooks-on-windows-without-git-bash)

1045* 如果通知显示 JSON 验证消息,你的 hook 的 stdout 解析为 JSON 但未通过架构验证。如果显示 JSON 解析消息,stdout 看起来像 JSON 对象但不是有效的 JSON。即使在退出 0 时也会发生两者。1058* 如果通知显示 JSON 验证消息,你的 hook 的 stdout 解析为 JSON 但未通过架构验证。如果显示 JSON 解析消息,stdout 看起来像 JSON 对象但不是有效的 JSON。即使在退出 0 时也会发生两者。

1046 1059 

1047 要修复解析失败,使用 JSON 编码器(如 `jq`)而不是字符串连接来构建有效负载,以便值内的引号和反斜杠被转义。参考的[退出代码输出](/docs/zh-CN/hooks#exit-code-output)部分涵盖了退出代码和 JSON 组合1060 要修复解析失败,使用 JSON 编码器(如 `jq`)而不是字符串连接来构建有效负载,以便值内的引号和反斜杠被转义。参考的[退出代码输出](/docs/zh-CN/hooks#exit-code-output)部分涵盖了退出代码和 JSON 组合

Details

1091* `event.sequence`:用于对事件排序的按进程计数器,详见[事件关联属性](#event-correlation-attributes)1091* `event.sequence`:用于对事件排序的按进程计数器,详见[事件关联属性](#event-correlation-attributes)

1092* `from_mode`:先前的权限模式,例如 `"default"`、`"plan"`、`"acceptEdits"`、`"auto"` 或 `"bypassPermissions"`1092* `from_mode`:先前的权限模式,例如 `"default"`、`"plan"`、`"acceptEdits"`、`"auto"` 或 `"bypassPermissions"`

1093* `to_mode`:新的权限模式1093* `to_mode`:新的权限模式

1094* `trigger`:引起变更的原因。取值为 `"shift_tab"`、`"exit_plan_mode"`、`"auto_gate_denied"` 或 `"auto_opt_in"` 之一。当转换源自 SDK 或 bridge 时不存在1094* `trigger`:导致更改的原因。为 `"shift_tab"`、`"exit_plan_mode"`、`"auto_gate_denied"` 或 `"auto_opt_in"` 之一。某些更改不存在此属性,例如 SDK 通过 [`setPermissionMode()`](/docs/zh-CN/agent-sdk/typescript#query-object) 设置权限模式时

1095 1095 

1096<h4 id="auth-event">1096<h4 id="auth-event">

1097 身份验证事件1097 身份验证事件

Details

203 流式空闲监视器203 流式空闲监视器

204</h2>204</h2>

205 205 

206Claude Code 运行四个独立的计时器,当流式模型响应变得安静时会中止该响应,因此死连接会失败并重试,而不是挂起。首字节截止时间涵盖等待响应头的时间,在响应到达之前。其他三个监视器各自监视实时响应的不同信号。206Claude Code 运行四个独立的计时器,当流式模型响应变得安静时会中止该响应,因此死连接会失败并重试,而不是挂起。完全没有收到响应头的请求会以以下两种方式之一结束:

207 

208* **在运行首字节截止时间的连接上**:第一次尝试会在该截止时间结束。要更改它,请设置 `CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS`。有关重试的等待时间,请参阅 [API 无响应](/docs/zh-CN/errors#no-response-from-api)。

209* **在其他连接上**:请求会在 5 到 6 分钟后、主体空闲超时触发时结束,除非您已关闭该超时。要更早结束,请降低 `API_TIMEOUT_MS`。

207 210 

208| 计时器 | 中止条件 | 运行位置 | 默认超时 |211| 计时器 | 中止条件 | 运行位置 | 默认超时 |

209| :- | :- | :- | :- |212| :- | :- | :- | :- |

210| 首字节截止时间 | Claude Code 发送请求后没有响应头到达 | 直接 Anthropic API 和 [Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws),包括通过 HTTPS 代理,但不包括当 `ANTHROPIC_BASE_URL` 或 `ANTHROPIC_AWS_BASE_URL` 通过 [gateway](/docs/zh-CN/gateways) 路由时。在 Amazon Bedrock 上可选,使用 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1`;不在 Google Cloud 的 Agent Platform 或 Microsoft Foundry 上运行 | 直接 Anthropic API 上为 180 秒,其他地方为 300 秒,加上每 32KB 请求体一秒 |213| 首字节截止时间 | Claude Code 发送请求后没有响应头到达 | 直接 Anthropic API 和 [Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws),包括通过 HTTPS 代理,但不包括当 `ANTHROPIC_BASE_URL` 或 `ANTHROPIC_AWS_BASE_URL` 通过[网关](/docs/zh-CN/gateways)路由时。在 Amazon Bedrock 上可选,使用 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1`;不在 Google Cloud 的 Agent Platform 或 Microsoft Foundry 上运行,也不在 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话中运行 | 直接 Anthropic API 上为 180 秒,其他地方为 300 秒,加上每 32KB 请求体一秒 |

211| 事件级监视器 | 没有响应事件解析。在字节级监视器运行在 Amazon Bedrock 以外的连接上的情况下,到达的字节(包括保活 ping)也会重置此监视器,最多约五分钟内没有解析的事件 | 每个提供商 | 300 秒 |214| 事件级监视器 | 没有响应事件解析。在字节级监视器运行在 Amazon Bedrock 以外的连接上的情况下,到达的字节(包括保活 ping)也会重置此监视器,最多约五分钟内没有解析的事件 | 每个提供商 | 300 秒 |

212| 字节级监视器 | 线路上没有字节到达,包括 SSE 保活 ping | 直接 Anthropic API、[Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws) 和[网关](/docs/zh-CN/gateways)连接,包括自定义 `ANTHROPIC_BASE_URL`。在 Amazon Bedrock `vnd.amazon.eventstream` 响应上可选,使用 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1`;不在 Google Cloud 的 Agent Platform 或 Microsoft Foundry 上运行 | 直接 Anthropic API 上为 180 秒。在 Claude Platform on AWS、Amazon Bedrock、[Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话中以及通过自定义 `ANTHROPIC_BASE_URL` 时为 300 秒 |215| 字节级监视器 | 线路上没有字节到达,包括 SSE 保活 ping | 直接 Anthropic API、[Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws) 和[网关](/docs/zh-CN/gateways)连接,包括自定义 `ANTHROPIC_BASE_URL`。在 Amazon Bedrock `vnd.amazon.eventstream` 响应上可选,使用 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1`;不在 Google Cloud 的 Agent Platform 或 Microsoft Foundry 上运行 | 直接 Anthropic API 上为 180 秒。在 Claude Platform on AWS、Amazon Bedrock、[Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话中以及通过自定义 `ANTHROPIC_BASE_URL` 时为 300 秒 |

213| 主体空闲超时 | 5 分钟内没有字节到达 | 除了直接 Anthropic API、Claude Platform on AWS 和设置了 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1` 的 Amazon Bedrock 之外的提供商,除非 [`API_FORCE_IDLE_TIMEOUT`](/docs/zh-CN/env-vars) 改变这一点 | 5 分钟 |216| 主体空闲超时 | 5 分钟内没有字节到达,包括等待响应头的时间 | 除了直接 Anthropic API、Claude Platform on AWS 和设置了 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1` 的 Amazon Bedrock 之外的提供商,除非 [`API_FORCE_IDLE_TIMEOUT`](/docs/zh-CN/env-vars) 改变这一点 | 5 分钟 |

214 217 

215如果设置 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1`,字节级监视器会在 Bedrock 上替换主体空闲超时,而不是与其并行运行。`CLAUDE_STREAM_IDLE_TIMEOUT_MS` 随后也会控制 Bedrock 流在 Claude Code 将连接视为死连接之前可以保持沉默多长时间,在下面列出的限制范围内。到达的字节仍然不会在 Bedrock 上重置事件级监视器。启用调试日志后,每个 Bedrock 流随后会记录一条以 `wire-heartbeat: _chunkTimes absent` 开头的调试消息。218如果设置 `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1`,字节级监视器会在 Bedrock 上替换主体空闲超时,而不是与其并行运行。`CLAUDE_STREAM_IDLE_TIMEOUT_MS` 随后也会控制 Bedrock 流在 Claude Code 将连接视为死连接之前可以保持沉默多长时间,在下面列出的限制范围内。到达的字节仍然不会在 Bedrock 上重置事件级监视器。启用调试日志后,每个 Bedrock 流随后会记录一条以 `wire-heartbeat: _chunkTimes absent` 开头的调试消息。

216 219 


220* `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 设置两个监视器的超时。Claude Code 将低于 5 分钟的值提高到 5 分钟,并将字节级监视器的值上限设为 30 分钟。223* `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 设置两个监视器的超时。Claude Code 将低于 5 分钟的值提高到 5 分钟,并将字节级监视器的值上限设为 30 分钟。

221* `CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS` 设置字节级监视器的超时,而不改变事件级监视器的超时,限制在 10 秒到 30 分钟之间,并优先于 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 用于该监视器。224* `CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS` 设置字节级监视器的超时,而不改变事件级监视器的超时,限制在 10 秒到 30 分钟之间,并优先于 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 用于该监视器。

222* `CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS` 直接设置首字节截止时间。保持未设置状态,Claude Code 使用字节级监视器的超时,因此 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 和 `CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS` 也会改变截止时间。有关限制、上传额度、`API_TIMEOUT_MS` 上限以及重试在无响应中止后等待多长时间,请参阅 [API 无响应](/docs/zh-CN/errors#no-response-from-api)。225* `CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS` 直接设置首字节截止时间。保持未设置状态,Claude Code 使用字节级监视器的超时,因此 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 和 `CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS` 也会改变截止时间。有关限制、上传额度、`API_TIMEOUT_MS` 上限以及重试在无响应中止后等待多长时间,请参阅 [API 无响应](/docs/zh-CN/errors#no-response-from-api)。

226* `API_TIMEOUT_MS` 限制等待响应头的时间。在首字节截止时间不运行的情况下(例如 Claude apps gateway 会话),将其设置为低于 `300000`(即 5 分钟),以便更快地重试未得到应答的请求。请将其保持在您预期的最长响应头等待时间以及最长[非流式请求](/docs/zh-CN/errors#streaming-response-ended-before-any-complete-data-was-received)所需时间之上:需要更长时间的请求会在每次重试时再次超时。

223* `API_FORCE_IDLE_TIMEOUT` 设置为 `0` 会关闭主体空闲超时,设置为 `1` 会为每个提供商打开它。监视器独立于它运行,因此要让流暂停超过其阈值,也要提高或禁用它们。227* `API_FORCE_IDLE_TIMEOUT` 设置为 `0` 会关闭主体空闲超时,设置为 `1` 会为每个提供商打开它。监视器独立于它运行,因此要让流暂停超过其阈值,也要提高或禁用它们。

224 228 

225当监视器中止停滞的流时,Claude Code 将中止视为中流失败,你看到的内容取决于响应已进行到多远。Claude Code 重试请求或以错误结束轮次,保留已完成的输出并显示 [不完整响应通知](/docs/zh-CN/errors#the-response-above-may-be-incomplete),或正常结束轮次。[自动重试](/docs/zh-CN/errors#automatic-retries) 说明每个结果适用的位置。229当监视器中止停滞的流时,Claude Code 将中止视为中流失败,你看到的内容取决于响应已进行到多远。Claude Code 重试请求或以错误结束轮次,保留已完成的输出并显示 [不完整响应通知](/docs/zh-CN/errors#the-response-above-may-be-incomplete),或正常结束轮次。[自动重试](/docs/zh-CN/errors#automatic-retries) 说明每个结果适用的位置。

Details

627 627 

628Claude Code 在您使用 [`--restricted`](/docs/zh-CN/cli-reference#cli-flags) 启动的会话中拒绝 `bypassPermissions`。`--restricted` 需要 Claude Code v2.1.248 或更高版本。628Claude Code 在您使用 [`--restricted`](/docs/zh-CN/cli-reference#cli-flags) 启动的会话中拒绝 `bypassPermissions`。`--restricted` 需要 Claude Code v2.1.248 或更高版本。

629 629 

630第一次使用此模式启动交互式会话时,Claude Code 会显示一个警告对话框,要求您接受对在没有权限检查的情况下执行的操作的责任:630<span id="bypass-permissions-acceptance" />第一次使用此模式启动交互式会话时,Claude Code 会显示一个警告对话框,要求您接受对在没有权限检查的情况下执行的操作的责任:

631 631 

632* **如果您接受**:Claude Code 在 `~/.claude/settings.json` 中将 `skipDangerousModePermissionPrompt` 设置为 `true`,因此后续会话会跳过对话框。要再次看到对话框,请从该文件中删除该键或将其设置为 `false`。[`skipDangerousModePermissionPrompt` 参考](/docs/zh-CN/settings-reference#skipdangerousmodepermissionprompt)列出了您或您的组织可以设置它的其他设置文件。632* **如果您接受**:Claude Code 在 `~/.claude/settings.json` 中将 `skipDangerousModePermissionPrompt` 设置为 `true`,因此后续会话会跳过对话框。要再次看到对话框,请从该文件中删除该键或将其设置为 `false`。[`skipDangerousModePermissionPrompt` 参考](/docs/zh-CN/settings-reference#skipdangerousmodepermissionprompt)列出了您或您的组织可以设置它的其他设置文件。

633* **如果您拒绝**:Claude Code 退出。633* **如果您拒绝**:Claude Code 退出。


635在[非交互模式](/docs/zh-CN/headless)中不显示对话框。当您的接受记录在用户设置或托管设置中时,[后台会话](/docs/zh-CN/agent-view)会遵循该接受:635在[非交互模式](/docs/zh-CN/headless)中不显示对话框。当您的接受记录在用户设置或托管设置中时,[后台会话](/docs/zh-CN/agent-view)会遵循该接受:

636 636 

637* 如果没有记录接受,`claude --bg --permission-mode bypassPermissions` 会被拒绝,直到您在交互式会话中接受对话框。637* 如果没有记录接受,`claude --bg --permission-mode bypassPermissions` 会被拒绝,直到您在交互式会话中接受对话框。

638* 如果 `skipDangerousModePermissionPrompt` 仅在 `.claude/settings.local.json` 中设置,后台会话启动时会忽略绕过请求,并固定显示通知 `Bypass permissions was requested at launch and ignored · if that was you, ~/.claude/settings.json needs "skipDangerousModePermissionPrompt": true`。要使绕过生效,请将该键添加到 `~/.claude/settings.json`,然后启动新的后台会话。638* 如果 `skipDangerousModePermissionPrompt` 仅在 `.claude/settings.local.json` 中设置,后台会话启动时会忽略绕过请求,并固定显示通知 `Bypass permissions was requested at launch and ignored · if that was you, ~/.claude/settings.json needs "skipDangerousModePermissionPrompt": true`。请将该键添加到 `~/.claude/settings.json`,然后启动新的后台会话。显示该通知的会话仍会运行:

639 * 如果 `--allow-dangerously-skip-permissions` 被忽略,`bypassPermissions` 不会出现在其 `Shift+Tab` 循环中。

640 * 如果 `--permission-mode bypassPermissions` 或 `--dangerously-skip-permissions` 被忽略,会话改为以手动模式启动。

639 641 

640在 Linux 和 macOS 上,当以 root 身份或在 `sudo` 下运行时,Claude Code 拒绝以此模式启动:642在 Linux 和 macOS 上,当以 root 身份或在 `sudo` 下运行时,Claude Code 拒绝以 `bypassPermissions` 模式启动:

641 643 

642```text theme={null}644```text theme={null}

643--dangerously-skip-permissions cannot be used with root/sudo privileges for security reasons645--dangerously-skip-permissions cannot be used with root/sudo privileges for security reasons


692 * 在未使用 `--restricted` 启动的会话中,项目[自动记忆](/docs/zh-CN/memory#storage-location)目录(例如 `~/.claude/projects/<project>/memory/`)中的 markdown 文件694 * 在未使用 `--restricted` 启动的会话中,项目[自动记忆](/docs/zh-CN/memory#storage-location)目录(例如 `~/.claude/projects/<project>/memory/`)中的 markdown 文件

693 * 在未使用 `--restricted` 启动的会话中,[子代理记忆](/docs/zh-CN/sub-agents#enable-persistent-memory)目录(例如 `.claude/agent-memory/`)中的 markdown 文件695 * 在未使用 `--restricted` 启动的会话中,[子代理记忆](/docs/zh-CN/sub-agents#enable-persistent-memory)目录(例如 `.claude/agent-memory/`)中的 markdown 文件

694* 使用 [`--plugin-dir`](/docs/zh-CN/plugins/mods/create#change-a-mod-with-claude) 加载的目录,因为当文件发生更改时,Claude Code 会从该目录重新加载并运行 mod 的代码696* 使用 [`--plugin-dir`](/docs/zh-CN/plugins/mods/create#change-a-mod-with-claude) 加载的目录,因为当文件发生更改时,Claude Code 会从该目录重新加载并运行 mod 的代码

697* `~/.claude/dev-mods/`,或 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars) 所指向目录中的 `dev-mods/`,Claude 会将[为您编写的 mod](/docs/zh-CN/plugins/mods/create#ask-claude-for-a-mod) 保存在此处

695 698 

696受保护的文件:699受保护的文件:

697 700 

permissions.md +20 −2

Details

595 MCP595 MCP

596</h3>596</h3>

597 597 

598MCP 规则使用在 Claude Code 中配置的服务器名称,可选地后跟该服务器提供的工具的名称。598要匹配某个 MCP 服务器的所有工具,请编写 `mcp__<server>__*`。要匹配单个工具,请编写其完整名称 `mcp__<server>__<tool>`。

599 599 

600* `mcp__puppeteer` 匹配由 `puppeteer` 服务器提供的任何工具600* `mcp__puppeteer` 匹配由 `puppeteer` 服务器提供的任何工具

601* `mcp__puppeteer__*` 使用通配符语法,也匹配来自 `puppeteer` 服务器的所有工具601* `mcp__puppeteer__*` 使用通配符语法,也匹配来自 `puppeteer` 服务器的所有工具

602* `mcp__puppeteer__puppeteer_navigate` 匹配由 `puppeteer` 服务器提供的 `puppeteer_navigate` 工具602* `mcp__puppeteer__puppeteer_navigate` 匹配由 `puppeteer` 服务器提供的 `puppeteer_navigate` 工具

603 603 

604对于 `<server>`,请按照服务器名称在该服务器工具名称中出现的形式编写。以下示例展示了对于包含特殊字符的名称、来自插件的服务器,以及包含 `__` 或以 `_` 结尾的名称应编写的规则:

605 

606* **包含 `.` 或空格等字符的名称**:这些字符会变为 `_`,因此对于您配置为 `my.server` 的服务器,请编写 `mcp__my_server__*`

607* **由插件提供的服务器**:`<server>` 采用[插件作用域形式](/docs/zh-CN/mcp#plugin-provided-mcp-servers),因此对于名为 `my-plugin` 的插件中的 `database-tools` 服务器,请编写 `mcp__plugin_my-plugin_database-tools__*`

608* **包含 `__` 或以 `_` 结尾的 `<server>`**:使用完整名称编写通配符形式 `mcp__<server>__*`。对于名为 `reports__v2` 的服务器,请编写 `mcp__reports__v2__*`。裸 `mcp__reports__v2` 和更短的 `mcp__reports` 作为 allow 规则都不匹配其工具,因为 Claude Code 会将两者都读作名为 `reports` 的服务器的规则

609 

604如果您的组织已设置[claude.ai 连接器](/docs/zh-CN/mcp#organization-controls-on-connector-tools)工具为 `ask`,该设置在您的会话中到达 Claude Code,该工具的 allow 规则不会生效:Claude Code 在每次调用时都会提示,即使在 `auto` 和 `bypassPermissions` 模式下。在 `dontAsk` 模式下(从不提示),Claude Code 会拒绝调用。Claude Code 自己获取的连接器工具显示为 `mcp__claude_ai_<server>__<tool>`。610如果您的组织已设置[claude.ai 连接器](/docs/zh-CN/mcp#organization-controls-on-connector-tools)工具为 `ask`,该设置在您的会话中到达 Claude Code,该工具的 allow 规则不会生效:Claude Code 在每次调用时都会提示,即使在 `auto` 和 `bypassPermissions` 模式下。在 `dontAsk` 模式下(从不提示),Claude Code 会拒绝调用。Claude Code 自己获取的连接器工具显示为 `mcp__claude_ai_<server>__<tool>`。

605 611 

606在 Claude Desktop 应用中的 [Cowork](https://claude.com/docs/cowork/overview) 会话中,Claude 通过 Cowork 的 `mcp__workspace__bash` 工具而不是内置 `Bash` 工具运行 shell 命令,Cowork 同样为 web 获取提供 `mcp__workspace__web_fetch`。Claude Code 也将命名整个 `Bash` 或 `WebFetch` 工具的 deny 规则应用于这些 Cowork 工具,因此托管的 `Bash` deny 规则阻止 Claude 在 Cowork 中运行 shell 命令。当 Claude Code 阻止此类调用时,消息命名 Cowork 工具:`Permission to use mcp__workspace__bash has been denied.` Allow 规则不会转移:Claude Code 从不将 `Bash` allow 规则应用于 `mcp__workspace__bash`。612在 Claude Desktop 应用中的 [Cowork](https://claude.com/docs/cowork/overview) 会话中,Claude 通过 Cowork 的 `mcp__workspace__bash` 工具而不是内置 `Bash` 工具运行 shell 命令,Cowork 同样为 web 获取提供 `mcp__workspace__web_fetch`。Claude Code 也将命名整个 `Bash` 或 `WebFetch` 工具的 deny 规则应用于这些 Cowork 工具,因此托管的 `Bash` deny 规则阻止 Claude 在 Cowork 中运行 shell 命令。当 Claude Code 阻止此类调用时,消息命名 Cowork 工具:`Permission to use mcp__workspace__bash has been denied.` Allow 规则不会转移:Claude Code 从不将 `Bash` allow 规则应用于 `mcp__workspace__bash`。


649 655 

650[Claude Code hooks](/docs/zh-CN/hooks-guide) 让您可以注册自定义 shell 命令,在运行时评估权限。当 Claude Code 进行工具调用时,PreToolUse hooks 在权限提示之前运行,适用于除了 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior) 之外的每个工具。hook 输出可以拒绝工具调用、强制提示或跳过提示以让调用继续。656[Claude Code hooks](/docs/zh-CN/hooks-guide) 让您可以注册自定义 shell 命令,在运行时评估权限。当 Claude Code 进行工具调用时,PreToolUse hooks 在权限提示之前运行,适用于除了 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior) 之外的每个工具。hook 输出可以拒绝工具调用、强制提示或跳过提示以让调用继续。

651 657 

658<h3 id="precedence-among-rules-hooks-and-mods">

659 规则、hook 和 mod 之间的优先级

660</h3>

661 

652PreToolUse hook 决定不会绕过权限规则。Claude Code 评估 deny 和 ask 规则,无论 PreToolUse hook 返回什么:匹配的 deny 规则会阻止调用,匹配的 ask 规则即使在 hook 返回 `"allow"` 或 `"ask"` 时仍然会提示。这保留了[管理权限](#manage-permissions)中描述的 deny 优先级,包括在托管设置中设置的 deny 规则。662PreToolUse hook 决定不会绕过权限规则。Claude Code 评估 deny 和 ask 规则,无论 PreToolUse hook 返回什么:匹配的 deny 规则会阻止调用,匹配的 ask 规则即使在 hook 返回 `"allow"` 或 `"ask"` 时仍然会提示。这保留了[管理权限](#manage-permissions)中描述的 deny 优先级,包括在托管设置中设置的 deny 规则。

653 663 

654该优先级涵盖设置文件中的 hooks 和插件的 `hooks/hooks.json` 中的 hooks。您安装的处理 `tool.check` 的[模块](/docs/zh-CN/plugins/mods/overview)会在规则和 `PreToolUse` hooks 已经决定之后回答,其答案可以替代它们的答案:664该优先级涵盖设置文件中的 hook 和插件的 `hooks/hooks.json` 中的 hook。您安装的处理 `tool.check` 的 [mod](/docs/zh-CN/plugins/mods/overview) 会在规则和 `PreToolUse` hook 已经决定之后回答。在[计划模式](#hook-approvals-in-plan-mode)之外,或对于只读调用,其答案可以替代它们的答案:

655 665 

656* **Ask 规则**:模块可以批准 ask 规则会提示的调用666* **Ask 规则**:模块可以批准 ask 规则会提示的调用

657* **来自 `PreToolUse` hook 的阻止**:模块可以批准调用,除非 hook 在托管设置中667* **来自 `PreToolUse` hook 的阻止**:模块可以批准调用,除非 hook 在托管设置中


664 674 

665阻止 hook 也优先于 allow 规则。以退出代码 2 退出的 hook 在权限规则被评估之前停止工具调用,因此即使 allow 规则会让调用继续,阻止也适用。要运行所有 Bash 命令而无需提示,除了您想要阻止的少数几个,将 `"Bash"` 添加到您的 allow 列表,并注册一个 PreToolUse hook 来拒绝那些特定命令。请参见[阻止对受保护文件的编辑](/docs/zh-CN/hooks-guide#block-edits-to-protected-files)以获取您可以调整的 hook 脚本。675阻止 hook 也优先于 allow 规则。以退出代码 2 退出的 hook 在权限规则被评估之前停止工具调用,因此即使 allow 规则会让调用继续,阻止也适用。要运行所有 Bash 命令而无需提示,除了您想要阻止的少数几个,将 `"Bash"` 添加到您的 allow 列表,并注册一个 PreToolUse hook 来拒绝那些特定命令。请参见[阻止对受保护文件的编辑](/docs/zh-CN/hooks-guide#block-edits-to-protected-files)以获取您可以调整的 hook 脚本。

666 676 

677<h3 id="hook-approvals-in-plan-mode">

678 计划模式中的 hook 批准

679</h3>

680 

681在[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)中,除 `ExitPlanMode` 外,您的 `PreToolUse` hook 返回的 `"allow"` 对文件编辑或其他非只读调用不起作用。您会得到与没有 hook 时该调用相同的提示、阻止或批准,并且 Claude Code 仍会应用 hook 返回的任何 `updatedInput`。如果 hook 以 `"allow"` 和 `updatedInput` 响应 [`ExitPlanMode`](/docs/zh-CN/hooks#allow-with-updatedinput),该工具仍会在无提示的情况下运行。

682 

683在计划模式中,处理 `tool.check` 的 mod 同样无法批准文件编辑或其他非只读调用,但它仍然可以阻止此类调用。要解除对 hook 和 mod 批准的这一限制,请[批准计划](/docs/zh-CN/permission-modes#review-and-approve-a-plan)或切换到其他权限模式。

684 

667<h2 id="working-directories">685<h2 id="working-directories">

668 工作目录686 工作目录

669</h2>687</h2>

Details

30 用你自己的话请求 mod,例如 `make a mod that shows the current git branch above the prompt`。Claude 在会话的 mods 文件夹中的自己的目录中编写 mod,该文件夹是 `~/.claude/dev-mods/` 后跟会话的 ID。mod 的完整路径看起来像 `~/.claude/dev-mods/3f2a9c1e-5b7d-4e8a-9c21-6d0f4b8a7e13/git-branch/`。30 用你自己的话请求 mod,例如 `make a mod that shows the current git branch above the prompt`。Claude 在会话的 mods 文件夹中的自己的目录中编写 mod,该文件夹是 `~/.claude/dev-mods/` 后跟会话的 ID。mod 的完整路径看起来像 `~/.claude/dev-mods/3f2a9c1e-5b7d-4e8a-9c21-6d0f4b8a7e13/git-branch/`。

31 31 

32 <Note>32 <Note>

33 在 `default` 和 `acceptEdits` [权限模式](/docs/zh-CN/permission-modes#protected-paths)中,Claude Code 在 Claude 创建 mod 的每个文件之前都会询问,因为 `~/.claude` 是一个受保护的路径。在每个文件出现时批准它。33 在 `default` 和 `acceptEdits` [权限模式](/docs/zh-CN/permission-modes)中,Claude Code 会在 Claude 创建 mod 的每个文件之前进行询问,因为 mods 文件夹是一个[受保护的路径](/docs/zh-CN/permission-modes#protected-paths)。请在每个文件出现时批准它。

34 </Note>34 </Note>

35 </Step>35 </Step>

36 36 

Details

216})216})

217```217```

218 218 

219在 `main` 上,即使有规则允许 `git push`,该 hook 也会返回 `deny`。在其他分支上以及对于其他命令,调用会得到与没有该 mod 时相同的决定。219该 hook 会在 `main` 上拒绝 `git push`,并放行其他所有调用:

220 

221* **在 `main` 上**:即使有规则允许 `git push`,该 hook 也会返回 `deny`

222* **在其他分支上以及对于其他命令**:调用会得到与没有该 mod 时相同的决定

220 223 

221该 hook 匹配的是命令文本,因此请将其视为对 Claude 的提醒。要为所有人阻止向 `main` 推送,请在您的 Git 托管平台上保护该分支。224该 hook 匹配的是命令文本,因此请将其视为对 Claude 的提醒。要为所有人阻止向 `main` 推送,请在您的 Git 托管平台上保护该分支。

222 225 

223hook 可以返回 `allow`、`ask` 或 `deny`,因此它也可以批准被托管设置之外的 `PreToolUse` hook 阻止的调用。[使用 hook 扩展权限](/docs/zh-CN/permissions#extend-permissions-with-hooks)列出了哪些决定优先于 mod。226hook 可以返回 `allow`、`ask` 或 `deny`,因此它也可以批准被托管设置之外的 `PreToolUse` hook 阻止的调用。在[计划模式](/docs/zh-CN/permissions#hook-approvals-in-plan-mode)下,对于非只读的调用(例如文件编辑),您的 hook 可以收紧 `next(e)` 返回的决定,但不能放宽它。[使用 hook 扩展权限](/docs/zh-CN/permissions#extend-permissions-with-hooks)列出了哪些决定优先于 mod。

224 227 

225<h3 id="rewrite-or-add-to-a-prompt">228<h3 id="rewrite-or-add-to-a-prompt">

226 改写或补充提示词229 改写或补充提示词


337* **来自托管设置的 `PreToolUse` hook**:在第一个 mod 的 `tool.call` hook 之前运行,其中任一 hook 的阻止都是最终决定,因此没有 mod 看到调用。340* **来自托管设置的 `PreToolUse` hook**:在第一个 mod 的 `tool.call` hook 之前运行,其中任一 hook 的阻止都是最终决定,因此没有 mod 看到调用。

338* **来自每个其他设置文件和插件的 `hooks/hooks.json` 的 `PreToolUse` hook**:在最后一个 mod 调用 `next` 后运行,作为 Claude Code 自己的行为的一部分。回答 `tool.call` 而不调用 `next` 的 mod 会阻止它们运行,调用 `next` 的 mod 在它返回的结果中看到它们的决定。341* **来自每个其他设置文件和插件的 `hooks/hooks.json` 的 `PreToolUse` hook**:在最后一个 mod 调用 `next` 后运行,作为 Claude Code 自己的行为的一部分。回答 `tool.call` 而不调用 `next` 的 mod 会阻止它们运行,调用 `next` 的 mod 在它返回的结果中看到它们的决定。

339 342 

340[`tool.check`](#approve-or-refuse-a-tool-call-before-the-user-is-asked) 在这些 hook 和权限规则做出决定后触发,因此其上的 hook 可以批准第二组中的 hook 所阻止的调用。343[`tool.check`](#approve-or-refuse-a-tool-call-before-the-user-is-asked) hook 可以批准被托管设置之外的 `PreToolUse` hook 阻止的调用,因为 `tool.check` 在这些 hook 和权限规则做出决定之后触发。在计划模式下,如果此类调用是只读的,`tool.check` hook 可以批准它,但不能批准文件编辑或其他非只读的调用。

341 344 

342<h3 id="handle-a-hook-that-fails">345<h3 id="handle-a-hook-that-fails">

343 处理失败的 hook346 处理失败的 hook

Details

205 205 

206为了生成摘要,Claude Code 会发送一个单独的请求,其系统提示词、工具和历史记录与您的对话相同,并附加一条摘要指令作为最后的用户消息。当缓存温暖时,该请求会从缓存中读取您的前缀,因此会话中途的 `/compact` 成本只是上下文大小所暗示成本的一小部分,其大部分时间都花在生成摘要上。206为了生成摘要,Claude Code 会发送一个单独的请求,其系统提示词、工具和历史记录与您的对话相同,并附加一条摘要指令作为最后的用户消息。当缓存温暖时,该请求会从缓存中读取您的前缀,因此会话中途的 `/compact` 成本只是上下文大小所暗示成本的一小部分,其大部分时间都花在生成摘要上。

207 207 

208在超过[缓存生命周期](#cache-lifetime)的中断之后,已没有缓存可读,因此摘要请求会将完整历史记录作为未缓存的输入重新处理。这就是为什么在您[恢复旧会话](/docs/zh-CN/sessions#resume-from-a-summary)时 `/compact` 的成本最高。无论缓存温暖还是已冷,压缩后的轮次都只需为短得多的摘要重建对话缓存,因此该轮次并不是耗时的部分。208在超过[缓存生命周期](#cache-lifetime)的中断之后,已没有缓存可读,因此摘要请求会将完整历史记录作为未缓存的输入重新处理。这就是为什么在您[恢复旧会话](/docs/zh-CN/sessions#resume-a-session)时 `/compact` 的成本最高。无论缓存温暖还是已冷,压缩后的轮次都只需为短得多的摘要重建对话缓存,因此该轮次并不是耗时的部分。

209 209 

210<Tip>210<Tip>

211 当您丢弃的上下文是您不再需要的内容时,压缩对您有利。要选择其开销发生的时间,请在工作中的自然间歇处(例如任务之间)运行 `/compact`,而不是等待自动压缩在任务中途触发。如果您走上了一条想要完全放弃的路径,请改用 [`/rewind`](#rewinding-the-conversation) 回退到较早的轮次。回退会截断回到一个已缓存的前缀,而不是像压缩那样构建新的前缀。211 当您丢弃的上下文是您不再需要的内容时,压缩对您有利。要选择其开销发生的时间,请在工作中的自然间歇处(例如任务之间)运行 `/compact`,而不是等待自动压缩在任务中途触发。如果您走上了一条想要完全放弃的路径,请改用 [`/rewind`](#rewinding-the-conversation) 回退到较早的轮次。回退会截断回到一个已缓存的前缀,而不是像压缩那样构建新的前缀。


310 310 

311缓存的前缀在不活动期间后过期。每个命中缓存的请求都会重置计时器,所以只要您继续工作,缓存就保持温暖。在足够长的间隙之后,下一个请求重新计算完整输入并重新建立缓存,这就是为什么步开后的第一个回合可能明显更慢。311缓存的前缀在不活动期间后过期。每个命中缓存的请求都会重置计时器,所以只要您继续工作,缓存就保持温暖。在足够长的间隙之后,下一个请求重新计算完整输入并重新建立缓存,这就是为什么步开后的第一个回合可能明显更慢。

312 312 

313在 Pro 或 Max 计划上,当您在长时间休息后恢复大型会话时,Claude Code [提供从摘要恢复](/docs/zh-CN/sessions#resume-from-a-summary),以便后续请求不会携带完整历史记录。

314 

315生存时间 (TTL) 控制缓存存活的间隙有多长。API 提供两个:五分钟 TTL 和[一小时 TTL](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration),它通过更长的中断保持缓存温暖,但[以更高的速率计费缓存写入](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pricing)。较长的 TTL 在您让会话空闲并返回到它时很有帮助,因为您跳过了过期前缀成本的重新处理。对于从不空闲超过五分钟的短工作突发,它成本更高,其中更高的写入速率适用,较长的缓存生命周期未被使用。313生存时间 (TTL) 控制缓存存活的间隙有多长。API 提供两个:五分钟 TTL 和[一小时 TTL](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration),它通过更长的中断保持缓存温暖,但[以更高的速率计费缓存写入](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pricing)。较长的 TTL 在您让会话空闲并返回到它时很有帮助,因为您跳过了过期前缀成本的重新处理。对于从不空闲超过五分钟的短工作突发,它成本更高,其中更高的写入速率适用,较长的缓存生命周期未被使用。

316 314 

317<h3 id="which-ttl-each-request-gets">315<h3 id="which-ttl-each-request-gets">

sandboxing.md +14 −0

Details

1080* **`Command line arguments`**:如果您使用 [`--settings`](/docs/zh-CN/settings#change-a-setting-for-one-session) 启动了 Claude Code,请检查您传入的文件或 JSON 是否设置了上述某个键。如果是,请在那里更改该值,或在不带这些键的情况下重新启动 Claude Code。1080* **`Command line arguments`**:如果您使用 [`--settings`](/docs/zh-CN/settings#change-a-setting-for-one-session) 启动了 Claude Code,请检查您传入的文件或 JSON 是否设置了上述某个键。如果是,请在那里更改该值,或在不带这些键的情况下重新启动 Claude Code。

1081* **`Enterprise managed settings`**:已加载您的组织的托管设置。如果它们设置了上述某个键,您无法通过 `/sandbox` 或您控制的任何设置文件更改该键,因此请联系您的管理员。1081* **`Enterprise managed settings`**:已加载您的组织的托管设置。如果它们设置了上述某个键,您无法通过 `/sandbox` 或您控制的任何设置文件更改该键,因此请联系您的管理员。

1082 1082 

1083<h3 id="/sandbox-prints-sandbox-settings-not-changed">

1084 `/sandbox` 打印 `Sandbox settings not changed`

1085</h3>

1086 

1087此行表示 `/sandbox` 无法将您在其面板中所做的选择保存到项目的 `.claude/settings.local.json`:

1088 

1089```text theme={null}

1090✗ Sandbox settings not changed: /home/you/project/.claude/settings.local.json couldn't be updated (EACCES). Start Claude Code in a project folder you can write to.

1091```

1092 

1093如果括号中的原因是 `EACCES`、`EPERM` 或 `EROFS`,请在您可以写入的项目文件夹中启动 Claude Code,然后在该会话中再次运行 `/sandbox`。

1094 

1095如果原因以 `Invalid JSON syntax in settings file` 开头,请更正项目的 `.claude/settings.local.json` 中的 JSON,然后再次运行 `/sandbox`。

1096 

1083<h2 id="limitations">1097<h2 id="limitations">

1084 限制1098 限制

1085</h2>1099</h2>

sessions.md +0 −14

Details

102* 运行不是通过[频道](/docs/zh-CN/channels)启动的102* 运行不是通过[频道](/docs/zh-CN/channels)启动的

103* 没有[拒绝规则](/docs/zh-CN/permissions#manage-permissions)移除 `ExitPlanMode` 工具103* 没有[拒绝规则](/docs/zh-CN/permissions#manage-permissions)移除 `ExitPlanMode` 工具

104 104 

105<h3 id="resume-from-a-summary">

106 从摘要恢复

107</h3>

108 

109在 Pro 或 Max 计划上,当您恢复已不活跃超过约一小时且超过 100,000 个 token 的会话时,Claude Code 会恢复对话,然后在您发送第一条消息之前打开一个对话框。到那时,会话的[提示缓存](/docs/zh-CN/prompt-caching#cache-lifetime)已过期,因此无论您选择对话框的哪个选项,下一个请求都会处理一次完整历史。

110 

111对话框提供三种继续会话的方式:

112 

113* **从摘要恢复**:立即运行 [`/compact`](/docs/zh-CN/context-window#what-survives-compaction)。后续请求携带摘要而不是完整历史。

114* **按原样恢复完整会话**:加载未更改的对话。

115* **不再询问**:恢复完整会话,并在以后所有恢复中不再显示该对话框。

116 

117按原样恢复会保持对话的每个细节可用,每个请求的成本随对话的大小而增长。从摘要恢复在每个后续请求上成本更低,因为它携带摘要而不是完整历史,但摘要遗漏的任何内容都不再位于 Claude 的上下文中。请参阅[为什么长会话中的使用量会增加](/docs/zh-CN/costs#why-usage-climbs-in-a-long-session)了解该每个请求成本的来源。

118 

119<h3 id="where-the-session-picker-looks">105<h3 id="where-the-session-picker-looks">

120 会话选择器查看的位置106 会话选择器查看的位置

121</h3>107</h3>

sub-agents.md +17 −5

Details

316| `name` | 是 | 最多 256 个字符的唯一标识符,例如 `code-reviewer` 或 `reviewer-v2`。[Hook](/docs/zh-CN/hooks#subagentstart) 以 `agent_type` 的形式接收此值。文件名不必与之一致。名称不能包含 `:`,该字符保留用于[插件作用域标识符](/docs/zh-CN/plugins/overview),例如 `my-plugin:reviewer` |316| `name` | 是 | 最多 256 个字符的唯一标识符,例如 `code-reviewer` 或 `reviewer-v2`。[Hook](/docs/zh-CN/hooks#subagentstart) 以 `agent_type` 的形式接收此值。文件名不必与之一致。名称不能包含 `:`,该字符保留用于[插件作用域标识符](/docs/zh-CN/plugins/overview),例如 `my-plugin:reviewer` |

317| `description` | 是 | Claude 何时应该委托给此 subagent |317| `description` | 是 | Claude 何时应该委托给此 subagent |

318| `tools` | 否 | [Tools](#available-tools) subagent 可以使用,作为逗号分隔的字符串,例如 `Read, Grep, Bash` 或 YAML 列表。如果省略,继承 subagents 可用的每个工具。如果列表中没有条目解析为工具,subagent 通常 [fails to launch](/docs/zh-CN/errors#agent-would-be-spawned-with-zero-tools) 并出现错误,命名条目。要将 Skills 预加载到上下文中,请使用 `skills` 字段而不是在此处列出 `Skill` |318| `tools` | 否 | [Tools](#available-tools) subagent 可以使用,作为逗号分隔的字符串,例如 `Read, Grep, Bash` 或 YAML 列表。如果省略,继承 subagents 可用的每个工具。如果列表中没有条目解析为工具,subagent 通常 [fails to launch](/docs/zh-CN/errors#agent-would-be-spawned-with-zero-tools) 并出现错误,命名条目。要将 Skills 预加载到上下文中,请使用 `skills` 字段而不是在此处列出 `Skill` |

319| `disallowedTools` | 否 | 要拒绝的工具,从继承或指定的列表中删除。格式与 `tools` 相同。带有说明符的条目,例如 `Bash(git push *)`,仍然 [removes the whole tool](#available-tools) |319| `disallowedTools` | 否 | 要拒绝的工具,会从继承的或指定的列表中移除。格式与 `tools` 相同。带有说明符的条目(例如 `Bash(git push *)`)仍会[移除整个工具](#restrict-which-tools-a-subagent-can-use) |

320| `model` | 否 | [Model](#choose-a-model) 使用:`sonnet`、`opus`、`haiku`、`fable`、完整模型 ID(例如,`claude-opus-5-5`)或 `inherit`。当您省略它时,Claude Code 在 [subagent model order](#choose-a-model) 中选择模型 |320| `model` | 否 | [Model](#choose-a-model) 使用:`sonnet`、`opus`、`haiku`、`fable`、完整模型 ID(例如,`claude-opus-5-5`)或 `inherit`。当您省略它时,Claude Code 在 [subagent model order](#choose-a-model) 中选择模型 |

321| `permissionMode` | 否 | [权限模式](#permission-modes):`default`、`acceptEdits`、`auto`、`dontAsk`、`bypassPermissions`、`plan`,或作为 `default` 别名的 `manual`。对[插件子代理](#choose-the-subagent-scope)会被忽略 |321| `permissionMode` | 否 | [权限模式](#permission-modes):`default`、`acceptEdits`、`auto`、`dontAsk`、`bypassPermissions`、`plan`,或作为 `default` 别名的 `manual`。对[插件子代理](#choose-the-subagent-scope)会被忽略 |

322| `maxTurns` | 否 | subagent 停止前的最大代理轮数。当 subagent 达到限制时,Claude Code 返回其输出标记为部分,Claude 可以 [resume it](#resume-subagents) 继续。部分标记需要 Claude Code v2.1.246 或更高版本 |322| `maxTurns` | 否 | subagent 停止前的最大代理轮数。当 subagent 达到限制时,Claude Code 返回其输出标记为部分,Claude 可以 [resume it](#resume-subagents) 继续。部分标记需要 Claude Code v2.1.246 或更高版本 |


475 475 

476在 [session without the Task tools](/docs/zh-CN/tools-reference#task-tool-availability) 中,Claude Code 也不向 subagents 提供任务工具,即使 subagent 运行不同的模型。进程内队友遵循您的会话相同的方式,而在其自己的 [split pane](/docs/zh-CN/agent-teams#choose-a-display-mode) 中的队友作为单独的 Claude Code 进程运行,因此其自己的模型决定。476在 [session without the Task tools](/docs/zh-CN/tools-reference#task-tool-availability) 中,Claude Code 也不向 subagents 提供任务工具,即使 subagent 运行不同的模型。进程内队友遵循您的会话相同的方式,而在其自己的 [split pane](/docs/zh-CN/agent-teams#choose-a-display-mode) 中的队友作为单独的 Claude Code 进程运行,因此其自己的模型决定。

477 477 

478要限制工具,使用 `tools` 字段作为允许列表或 `disallowedTools` 字段作为拒绝列表。此示例使用 `tools` 来仅允许 Read、Grep、Glob 和 Bash。Subagent 无法编辑文件、写入文件或使用任何 MCP 工具:478<h4 id="restrict-which-tools-a-subagent-can-use">

479 限制子代理可以使用的工具

480</h4>

481 

482要限制工具,请使用 `tools` 字段作为允许列表,或使用 `disallowedTools` 字段作为拒绝列表。如果两者都设置了,会先应用 `disallowedTools`,然后针对剩余的工具池解析 `tools`。同时列在两者中的工具会被移除。

483 

484此示例使用 `tools` 仅允许 Read、Grep、Glob 和 Bash。该子代理无法编辑文件、写入文件或使用任何 MCP 工具:

479 485 

480```yaml theme={null}486```yaml theme={null}

481---487---


495---501---

496```502```

497 503 

498如果两者都设置,`disallowedTools` 首先应用,然后 `tools` 针对剩余的池进行解析。同时列在两者中的工具被删除。

499 

500当 `tools` 列表中没有任何内容解析为工具时,例如因为每个条目都拼写错误或命名了对 subagents 不可用的工具,Claude Code 通常拒绝启动 subagent,Agent 工具返回一个错误,命名未解析的条目;请参阅 [Agent would be spawned with zero tools](/docs/zh-CN/errors#agent-would-be-spawned-with-zero-tools) 了解消息和如何修复每个条目。在 v2.1.208 之前,该 subagent 启动时没有工具,可能返回空的或令人困惑的结果。504当 `tools` 列表中没有任何内容解析为工具时,例如因为每个条目都拼写错误或命名了对 subagents 不可用的工具,Claude Code 通常拒绝启动 subagent,Agent 工具返回一个错误,命名未解析的条目;请参阅 [Agent would be spawned with zero tools](/docs/zh-CN/errors#agent-would-be-spawned-with-zero-tools) 了解消息和如何修复每个条目。在 v2.1.208 之前,该 subagent 启动时没有工具,可能返回空的或令人困惑的结果。

501 505 

502除了精确的工具名称之外,两个字段还接受 MCP 服务器级别的模式:`mcp__<server>` 或 `mcp__<server>__*` 授予或删除来自命名服务器的每个工具。在 `disallowedTools` 中,`mcp__*` 也删除来自任何服务器的每个 MCP 工具。此示例删除来自 `github` MCP 服务器的每个工具,同时保留来自其他服务器的工具和其池中的内置工具:506`tools` 和 `disallowedTools` 字段也接受针对整个 MCP 服务器的条目:

507 

508| 目标 | 字段 | 示例条目 |

509| :- | :- | :- |

510| 为子代理提供某个服务器的所有工具 | `tools` | `mcp__github__*` |

511| 排除某个服务器的工具 | `disallowedTools` | `mcp__github` 或 `mcp__github__*` |

512| 排除来自任何服务器的所有 MCP 工具 | `disallowedTools` | `mcp__*` |

513 

514此示例移除来自 `github` MCP 服务器的所有工具,同时保留子代理工具池中来自其他服务器的工具和内置工具:

503 515 

504```yaml theme={null}516```yaml theme={null}

505---517---