8 8
9Claude Agent SDK 提供权限控制来管理 Claude 如何使用工具。使用权限模式和规则来定义自动允许的内容,以及使用 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 在运行时处理其他所有情况。9Claude Agent SDK 提供权限控制来管理 Claude 如何使用工具。使用权限模式和规则来定义自动允许的内容,以及使用 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 在运行时处理其他所有情况。
10 10
11<h2 id="how-permissions-are-evaluated">11## 权限如何被评估
12 权限如何被评估
13</h2>
14 12
15当 Claude 请求一个工具时,SDK 按以下顺序检查权限:13当 Claude 请求一个工具时,SDK 按以下顺序检查权限:
16 14
17<Steps>15**1. Hooks**
18 <Step title="Hooks">
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>
21 16
22 <Step title="拒绝规则">17首先运行 [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)。
23 检查 `deny` 规则(来自 `disallowed_tools` 和 [settings.json](/docs/zh-CN/settings-reference#permission-settings))。如果拒绝规则匹配,工具被阻止,即使在 `bypassPermissions` 模式下也是如此。裸名称拒绝规则如 `Bash` 在此评估开始之前将工具从 Claude 的上下文中移除,因此只有作用域规则如 `Bash(rm *)` 在此步骤被检查。
24 </Step>
25 18
26 <Step title="询问规则">19**2. 拒绝规则**
27 检查来自 [settings.json](/docs/zh-CN/settings-reference#permission-settings) 的 `ask` 规则。如果询问规则匹配,调用会传递到您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得确认,即使在 `bypassPermissions` 模式下也是如此。
28 20
29 需要用户交互的工具行为相同:`AskUserQuestion` 和 MCP 工具,其服务器设置了 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool),总是传递到回调,即使当允许规则匹配时也是如此。在 `dontAsk` 模式下,两种情况都被拒绝,因为该模式从不提示。MCP 注解需要 Claude Code v2.1.199 或更高版本。21检查 `deny` 规则(来自 `disallowed_tools` 和 [settings.json](/docs/zh-CN/settings-reference#permission-settings))。如果拒绝规则匹配,工具被阻止,即使在 `bypassPermissions` 模式下也是如此。裸名称拒绝规则如 `Bash` 在此评估开始之前将工具从 Claude 的上下文中移除,因此只有作用域规则如 `Bash(rm *)` 在此步骤被检查。
30 22
31 您的组织设置为 `ask` 的 [claude.ai connector](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 工具也在此步骤离开流程。每个调用都传递到回调,即使在 `bypassPermissions` 模式下,即使当允许规则匹配时也是如此。回调接收原因 `Your organization requires approval for this tool`。在 `dontAsk` 模式下,调用被拒绝,因为该模式从不提示。23**3. 询问规则**
32 </Step>
33 24
34 <Step title="权限模式">25检查来自 [settings.json](/docs/zh-CN/settings-reference#permission-settings) 的 `ask` 规则。如果询问规则匹配,调用会传递到您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得确认,即使在 `bypassPermissions` 模式下也是如此。
35 应用活跃的 [权限模式](#permission-modes):
36 26
37 * 在 `bypassPermissions` 模式下,Claude Code 批准到达此步骤的所有内容,除了针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除,这些会传递下去。27需要用户交互的工具行为相同:`AskUserQuestion` 和 MCP 工具,其服务器设置了 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool),总是传递到回调,即使当允许规则匹配时也是如此。在 `dontAsk` 模式下,两种情况都被拒绝,因为该模式从不提示。MCP 注解需要 Claude Code v2.1.199 或更高版本。
38 * 在 `acceptEdits` 模式下,Claude Code 批准 [接受编辑模式](#accept-edits-mode-acceptedits) 下列出的文件操作。
39 * 在 `plan` 模式下,Claude Code 将文件编辑和 shell 写入工具发送到您的 `canUseTool` 回调,无论允许规则如何,因此在规划时写入操作无法自动批准。
40 * 在其他模式下,请求传递下去。
41 </Step>
42 28
43 <Step title="允许规则">29您的组织设置为 `ask` 的 [claude.ai connector](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 工具也在此步骤离开流程。每个调用都传递到回调,即使在 `bypassPermissions` 模式下,即使当允许规则匹配时也是如此。回调接收原因 `Your organization requires approval for this tool`。在 `dontAsk` 模式下,调用被拒绝,因为该模式从不提示。
44 检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。工具自己批准的调用也在此步骤被解决,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)。
45 30
46 针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准。它们是否随后到达您的回调取决于权限模式:例如在 `auto` 模式的 Agent SDK 会话中,Claude Code 默认拒绝它们而不调用它。[关键路径](/docs/zh-CN/permission-modes#critical-paths) 模式表列出了每种模式对它们的处理方式。31**4. 权限模式**
47 32
48 允许规则不会批准从 [网络路径](/docs/zh-CN/permissions#network-paths) 进行的读取。33应用活跃的 [权限模式](#permission-modes):
49 </Step>
50 34
51 <Step title="canUseTool 回调">35* 在 `bypassPermissions` 模式下,Claude Code 批准到达此步骤的所有内容,除了针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除,这些会传递下去。
52 如果上述任何步骤都未解决,调用您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得决定。在 `dontAsk` 模式下,此步骤被跳过,工具被拒绝。36* 在 `acceptEdits` 模式下,Claude Code 批准 [接受编辑模式](#accept-edits-mode-acceptedits) 下列出的文件操作。
37* 在 `plan` 模式下,Claude Code 将文件编辑和 shell 写入工具发送到您的 `canUseTool` 回调,无论允许规则如何,因此在规划时写入操作无法自动批准。
38* 在其他模式下,请求传递下去。
53 39
54 在 TypeScript SDK 中,如果您设置了 [`permissionPrompts: 'none'`](/docs/zh-CN/agent-sdk/typescript#options),您的回调在此步骤不会被调用。[`PermissionRequest` hook](/docs/zh-CN/hooks#permissionrequest) 仍然有机会决定,如果它不决定,Claude Code 拒绝调用。该选项需要 Claude Code v2.1.259 或更高版本。40**5. 允许规则**
55 </Step>
56</Steps>
57 41
58<img src="https://mintcdn.com/claude-code/jYgs7qigNjO1Badj/images/agent-sdk/permissions-flow.svg?fit=max&auto=format&n=jYgs7qigNjO1Badj&q=85&s=c771ad9085b1277d3708027a49c744bc" className="dark:hidden" alt="六步权限评估流程的图表,与上述步骤匹配:工具请求通过 hooks、拒绝规则、询问规则、权限模式、允许规则和 canUseTool。Hooks、拒绝规则和 canUseTool 可以路由到被阻止;权限模式绕过、允许规则和 canUseTool 可以路由到执行;询问规则路由到 canUseTool。" width="1180" height="260" data-path="images/agent-sdk/permissions-flow.svg" />42检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。工具自己批准的调用也在此步骤被解决,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)。
59 43
60<img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/agent-sdk/permissions-flow-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=e53a91e9059cbf51852b7cedb4dd4251" className="hidden dark:block" alt="六步权限评估流程的图表,与上述步骤匹配:工具请求通过 hooks、拒绝规则、询问规则、权限模式、允许规则和 canUseTool。Hooks、拒绝规则和 canUseTool 可以路由到被阻止;权限模式绕过、允许规则和 canUseTool 可以路由到执行;询问规则路由到 canUseTool。" width="1180" height="260" data-path="images/agent-sdk/permissions-flow-dark.svg" />44针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准。它们是否随后到达您的回调取决于权限模式:例如在 `auto` 模式的 Agent SDK 会话中,Claude Code 默认拒绝它们而不调用它。[关键路径](/docs/zh-CN/permission-modes#critical-paths) 模式表列出了每种模式对它们的处理方式。
45
46允许规则不会批准从 [网络路径](/docs/zh-CN/permissions#network-paths) 进行的读取。
47
48**6. canUseTool 回调**
49
50如果上述任何步骤都未解决,调用您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得决定。在 `dontAsk` 模式下,此步骤被跳过,工具被拒绝,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview) 仍然可以批准[部分此类调用](/docs/zh-CN/permissions#precedence-among-rules-hooks-and-mods)。
51
52在 TypeScript SDK 中,如果您设置了 [`permissionPrompts: 'none'`](/docs/zh-CN/agent-sdk/typescript#options),您的回调在此步骤不会被调用。[`PermissionRequest` hook](/docs/zh-CN/hooks#permissionrequest) 仍然有机会决定,如果它不决定,Claude Code 拒绝调用。该选项需要 Claude Code v2.1.259 或更高版本。
53
54
61 55
62如果您在 TypeScript SDK 期望评估顺序在咨询回调之前自动批准调用的配置中传递 `canUseTool` 回调,SDK 在构造查询时会发出一次 Node.js 进程警告。警告的代码是 `CLAUDE_SDK_CAN_USE_TOOL_SHADOWED`。两个配置会触发它:56如果您在 TypeScript SDK 期望评估顺序在咨询回调之前自动批准调用的配置中传递 `canUseTool` 回调,SDK 在构造查询时会发出一次 Node.js 进程警告。警告的代码是 `CLAUDE_SDK_CAN_USE_TOOL_SHADOWED`。两个配置会触发它:
63 57
73* **Hooks:** 运行自定义代码以允许、拒绝或修改工具请求。请参阅 [使用 hooks 控制执行](/docs/zh-CN/agent-sdk/hooks)。67* **Hooks:** 运行自定义代码以允许、拒绝或修改工具请求。请参阅 [使用 hooks 控制执行](/docs/zh-CN/agent-sdk/hooks)。
74* **canUseTool 回调:** 在运行时提示用户批准,当没有更早的步骤解决调用时。请参阅 [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input)。68* **canUseTool 回调:** 在运行时提示用户批准,当没有更早的步骤解决调用时。请参阅 [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input)。
75 69
76<h2 id="allow-and-deny-rules">70## 允许和拒绝规则
77 允许和拒绝规则
78</h2>
79 71
80`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)在上述评估流程中向允许和拒绝规则列表添加条目。如果你在 `allowed_tools` 中命名了某个[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability),Claude Code 也会选择加入该会话。任何其他未在 `allowed_tools` 中列出的工具仍然可供 Claude 使用,对其的调用如果需要批准,则会进入权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内限定模式。72`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)在上述评估流程中向允许和拒绝规则列表添加条目。如果你在 `allowed_tools` 中命名了某个[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability),Claude Code 也会选择加入该会话。任何其他未在 `allowed_tools` 中列出的工具仍然可供 Claude 使用,对其的调用如果需要批准,则会进入权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内限定模式。
81 73
92 84
93使用 `//path` 表示绝对文件系统路径:`Edit(//secrets/**)` 的拒绝规则会阻止在磁盘上 `/secrets` 下任何位置的写入。使用单个前导斜杠时,`Edit(/secrets/**)` 在规则的源处锚定。对于通过 `allowed_tools` 或 `disallowed_tools` 传递的规则,这意味着会话的工作目录,因此规则不会阻止磁盘上的 `/secrets`。请参阅 [Read 和 Edit 规则](/docs/zh-CN/permissions#read-and-edit) 了解四种锚定形式以及来自设置文件的规则如何解析。85使用 `//path` 表示绝对文件系统路径:`Edit(//secrets/**)` 的拒绝规则会阻止在磁盘上 `/secrets` 下任何位置的写入。使用单个前导斜杠时,`Edit(/secrets/**)` 在规则的源处锚定。对于通过 `allowed_tools` 或 `disallowed_tools` 传递的规则,这意味着会话的工作目录,因此规则不会阻止磁盘上的 `/secrets`。请参阅 [Read 和 Edit 规则](/docs/zh-CN/permissions#read-and-edit) 了解四种锚定形式以及来自设置文件的规则如何解析。
94 86
95<Warning>87> [!WARNING]
96 **自动批准的工具永远不会到达 `canUseTool`。** 在任何早期步骤中被批准的工具调用,通过 `acceptEdits` 或 `bypassPermissions`,或通过允许规则,会跳过你的 `canUseTool` 回调,因此你在那里放置的权限检查会被该工具无声地绕过。88>
97 89> **自动批准的工具永远不会到达 `canUseTool`。** 在任何早期步骤中被批准的工具调用,通过 `acceptEdits` 或 `bypassPermissions`,或通过允许规则,会跳过你的 `canUseTool` 回调,因此你在那里放置的权限检查会被该工具无声地绕过。
98 允许规则永远不会自动批准 `AskUserQuestion`、标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、连接器工具[你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools),或针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 移除。在 `dontAsk` 模式中,Claude Code 拒绝这些调用而不调用回调。在其他模式中,前三个会到达回调。根据[权限模式](/docs/zh-CN/permission-modes#critical-paths),关键路径移除要么到达回调,要么 Claude Code 拒绝它而不调用它,就像它在 `auto` 模式中对 Agent SDK 会话默认做的那样。90>
99 91> 允许规则永远不会自动批准 `AskUserQuestion`、标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、连接器工具[你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools),或针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 移除。在 `dontAsk` 模式中,Claude Code 拒绝这些调用而不调用回调。在其他模式中,前三个会到达回调。根据[权限模式](/docs/zh-CN/permission-modes#critical-paths),关键路径移除要么到达回调,要么 Claude Code 拒绝它而不调用它,就像它在 `auto` 模式中对 Agent SDK 会话默认做的那样。
100 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称会自动批准对该工具的每个调用,上述例外和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外,而像 `Bash(npm test *)` 这样的限定规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会进入回调。对于必须在每个工具调用上运行的检查,使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hook 在每个其他步骤之前运行,hook 拒绝即使在 `bypassPermissions` 模式中也适用。92>
101</Warning>93> 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称会自动批准对该工具的每个调用,上述例外和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外,而像 `Bash(npm test *)` 这样的限定规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会进入回调。对于必须在每个工具调用上运行的检查,使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hook 在每个其他步骤之前运行,hook 拒绝即使在 `bypassPermissions` 模式中也适用。
102 94
103对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:95对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:
104 96
109};101};
110```102```
111 103
112列出的工具被批准,[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外,而每个其他会提示的调用都会被拒绝。在 `default` 模式中不需要批准的调用会运行,无论您是否列出它们,例如[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)、不在运行前询问的 `Agent` 等工具,以及工作目录内的文件读取。要将工具从请求中完全移除,请将其裸名称添加到 `disallowedTools`。104列出的工具被批准,[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外。每个其他会提示的调用则会被拒绝,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview) 仍然可以批准[其中的部分调用](/docs/zh-CN/permissions#precedence-among-rules-hooks-and-mods)。
105
106在 `default` 模式中不需要批准的调用会运行,无论您是否列出它们。其中包括[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)、不在运行前询问的 `Agent` 等工具,以及工作目录内的文件读取。要将工具从请求中完全移除,请将其裸名称添加到 `disallowedTools`。
113 107
114<Warning>108> [!WARNING]
115 **`allowed_tools` 不限制 `bypassPermissions`。** `allowed_tools` 预批准你列出的工具。其他未列出的工具不匹配任何允许规则,会进入权限模式,其中 `bypassPermissions` 批准它们。将 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起设置仍然会批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果你需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。109>
116</Warning>110> **`allowed_tools` 不限制 `bypassPermissions`。** `allowed_tools` 预批准你列出的工具。其他未列出的工具不匹配任何允许规则,会进入权限模式,其中 `bypassPermissions` 批准它们。将 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起设置仍然会批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果你需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。
117 111
118你也可以在 `.claude/settings.json` 中声明式地配置允许、拒绝和询问规则。当启用 `project` 设置源时会读取这些规则,默认 `query()` 选项就是这样。如果你显式设置 `setting_sources`(TypeScript:`settingSources`),请包含 `"project"` 以使其应用。请参阅[权限设置](/docs/zh-CN/settings-reference#permission-settings)了解规则语法。112你也可以在 `.claude/settings.json` 中声明式地配置允许、拒绝和询问规则。当启用 `project` 设置源时会读取这些规则,默认 `query()` 选项就是这样。如果你显式设置 `setting_sources`(TypeScript:`settingSources`),请包含 `"project"` 以使其应用。请参阅[权限设置](/docs/zh-CN/settings-reference#permission-settings)了解规则语法。
119 113
120<h2 id="permission-modes">114## 权限模式
121 权限模式
122</h2>
123 115
124权限模式提供对 Claude 如何使用工具的全局控制。您可以在调用 `query()` 时设置权限模式,或在流式会话期间动态更改它。116权限模式提供对 Claude 如何使用工具的全局控制。您可以在调用 `query()` 时设置权限模式,或在流式会话期间动态更改它。
125 117
126在 Claude Code v2.1.302 或更高版本中,您的应用会以 `default` 模式启动,除非您设置了权限模式,或者应用从其设置文件中的 [`permissions.defaultMode`](/docs/zh-CN/settings-reference#permissions-defaultmode) 获取权限模式。在 `default` 模式下,Claude Code 会拒绝任何需要批准的工具调用,除非您通过允许规则、hook、`canUseTool` 回调或权限提示工具批准它。如果工具调用被拒绝,请参阅[在 `claude -p` 和 Agent SDK 运行中工具调用被拒绝](/docs/zh-CN/permission-modes#which-mode-a-non-interactive-run-starts-in)。118在 Claude Code v2.1.302 或更高版本中,您的应用会以 `default` 模式启动,除非您设置了权限模式,或者应用从其设置文件中的 [`permissions.defaultMode`](/docs/zh-CN/settings-reference#permissions-defaultmode) 获取权限模式。在 `default` 模式下,Claude Code 会拒绝任何需要批准的工具调用,除非您通过允许规则、hook、`canUseTool` 回调或权限提示工具批准它。如果工具调用被拒绝,请参阅[在 `claude -p` 和 Agent SDK 运行中工具调用被拒绝](/docs/zh-CN/permission-modes#which-mode-a-non-interactive-run-starts-in)。
127 119
128<h3 id="available-modes">120### 可用模式
129 可用模式
130</h3>
131 121
132SDK 支持以下权限模式:122SDK 支持以下权限模式:
133 123
134| 模式 | 描述 | 工具行为 |124| 模式 | 描述 | 工具行为 |
135| :- | :- | :- |125| :- | :- | :- |
136| `default` | 标准权限行为 | 无基于模式的自动批准;需要批准且不匹配任何允许规则的调用会触发您的 `canUseTool` 回调 |126| `default` | 标准权限行为 | 无基于模式的自动批准;需要批准且不匹配任何允许规则的调用会触发您的 `canUseTool` 回调 |
137| `dontAsk` | 拒绝而不是提示 | 任何会提示的调用都被拒绝。由 `allowed_tools` 或规则批准的调用会运行,`default` 模式下不需要批准的调用也会运行;连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和需要用户交互的工具即使您已预先批准也会被拒绝,[来自网络路径的读取](/docs/zh-CN/permissions#network-paths)以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除也会被拒绝。`canUseTool` 永远不会被调用 |127| `dontAsk` | 拒绝而不是提示 | 任何原本会提示的调用都会被拒绝,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview) 仍可以批准[其中部分调用](/docs/zh-CN/permissions#precedence-among-rules-hooks-and-mods)。由 `allowed_tools` 或规则批准的调用会运行,`default` 模式下不需要批准的调用也会运行。[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具和需要用户交互的工具即使您已预先批准也会被拒绝。[来自网络路径的读取](/docs/zh-CN/permissions#network-paths)以及针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 删除即使您已预先批准也会被拒绝。`canUseTool` 永远不会被调用 |
138| `acceptEdits` | 自动接受文件编辑 | 文件编辑和[文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)会自动批准 |128| `acceptEdits` | 自动接受文件编辑 | 文件编辑和[文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)会自动批准 |
139| `bypassPermissions` | 绕过权限检查 | 工具运行时无需权限提示,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。请谨慎使用 |129| `bypassPermissions` | 绕过权限检查 | 工具运行时无需权限提示,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。请谨慎使用 |
140| `plan` | 规划模式 | Claude 在不编辑您的源文件的情况下探索和规划;文件编辑永远不会自动批准,而是通过您的 `canUseTool` 回调提示 |130| `plan` | 规划模式 | Claude 在不编辑您的源文件的情况下探索和规划;文件编辑永远不会自动批准,而是通过您的 `canUseTool` 回调提示 |
141| `auto` | 模型分类批准 | 模型分类器审查 shell 命令和网络请求等操作,允许或阻止它审查的每一个操作。有关可用性和决策顺序,请参阅[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) |131| `auto` | 模型分类批准 | 模型分类器审查 shell 命令和网络请求等操作,允许或阻止它审查的每一个操作。有关可用性和决策顺序,请参阅[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) |
142 132
143<Warning>133> [!WARNING]
144 **子代理继承:** 子代理在父会话的权限模式下运行,除非您在其[`AgentDefinition`](/docs/zh-CN/agent-sdk/typescript#agentdefinition)上设置 `permissionMode`,且父会话处于 `default`、`dontAsk` 或 `plan` 模式。即使这样,Claude Code 也永远不会应用 `"bypassPermissions"` 值,并且仅当该子代理[可以使用自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)时才会应用 `"auto"` 值。子代理仅在父会话本身处于 `bypassPermissions` 模式时才在该模式下运行。 `bypassPermissions` 异常需要 Claude Code v2.1.267 或更高版本。134>
135> **子代理继承:** 子代理在父会话的权限模式下运行,除非您在其[`AgentDefinition`](/docs/zh-CN/agent-sdk/typescript#agentdefinition)上设置 `permissionMode`,且父会话处于 `default`、`dontAsk` 或 `plan` 模式。即使这样,Claude Code 也永远不会应用 `"bypassPermissions"` 值,并且仅当该子代理[可以使用自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)时才会应用 `"auto"` 值。子代理仅在父会话本身处于 `bypassPermissions` 模式时才在该模式下运行。 `bypassPermissions` 异常需要 Claude Code v2.1.267 或更高版本。
136>
137> 子代理可能具有不同的系统提示和比主代理更少受限的行为,因此继承 `bypassPermissions` 会授予它们完整的自主系统访问权限。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)仍然适用。
145 138
146 子代理可能具有不同的系统提示和比主代理更少受限的行为,因此继承 `bypassPermissions` 会授予它们完整的自主系统访问权限。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)仍然适用。139### 设置权限模式
147</Warning>
148
149<h3 id="set-permission-mode">
150 设置权限模式
151</h3>
152 140
153您可以在启动查询时设置一次权限模式,或在会话活跃时动态更改它。141您可以在启动查询时设置一次权限模式,或在会话活跃时动态更改它。
154 142
155<Tabs>143**在查询时**
156 <Tab title="在查询时">144
157 在创建查询时传递 `permission_mode`(Python)或 `permissionMode`(TypeScript)。145在创建查询时传递 `permission_mode`(Python)或 `permissionMode`(TypeScript)。
158 146
159 <CodeGroup>147```python Python theme={null}
160 ```python Python theme={null}148import asyncio
161 import asyncio149from claude_agent_sdk import query, ClaudeAgentOptions
162 from claude_agent_sdk import query, ClaudeAgentOptions
163 150
164 151
165 async def main():152async def main():
166 async for message in query(153 async for message in query(
167 prompt="Help me refactor this code",154 prompt="Help me refactor this code",
168 options=ClaudeAgentOptions(155 options=ClaudeAgentOptions(
173 print(message.result)160 print(message.result)
174 161
175 162
176 asyncio.run(main())163asyncio.run(main())
177 ```164```
178 165
179 ```typescript TypeScript theme={null}166```typescript TypeScript theme={null}
180 import { query } from "@anthropic-ai/claude-agent-sdk";167import { query } from "@anthropic-ai/claude-agent-sdk";
181 168
182 async function main() {169async function main() {
183 for await (const message of query({170 for await (const message of query({
184 prompt: "Help me refactor this code",171 prompt: "Help me refactor this code",
185 options: {172 options: {
190 console.log(message.result);177 console.log(message.result);
191 }178 }
192 }179 }
193 }180}
194 181
195 main();182main();
196 ```183```
197 </CodeGroup>
198 </Tab>
199 184
200 <Tab title="在流式传输期间">185**在流式传输期间**
201 调用 `set_permission_mode()`(Python)或 `setPermissionMode()`(TypeScript)以在会话中途更改模式。新模式立即对所有后续工具请求生效。这让您可以从限制性开始,随着信任建立而放宽权限,例如在审查 Claude 的初始方法后切换到 `acceptEdits`。
202 186
203 <CodeGroup>187调用 `set_permission_mode()`(Python)或 `setPermissionMode()`(TypeScript)以在会话中途更改模式。新模式立即对所有后续工具请求生效。这让您可以从限制性开始,随着信任建立而放宽权限,例如在审查 Claude 的初始方法后切换到 `acceptEdits`。
204 ```python Python theme={null}
205 import asyncio
206 from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
207 188
189```python Python theme={null}
190import asyncio
191from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
208 192
209 async def main():193
194async def main():
210 async with ClaudeSDKClient(195 async with ClaudeSDKClient(
211 options=ClaudeAgentOptions(196 options=ClaudeAgentOptions(
212 permission_mode="default", # Start in default mode197 permission_mode="default", # Start in default mode
223 print(message.result)208 print(message.result)
224 209
225 210
226 asyncio.run(main())211asyncio.run(main())
227 ```212```
228 213
229 ```typescript TypeScript theme={null}214```typescript TypeScript theme={null}
230 import { query } from "@anthropic-ai/claude-agent-sdk";215import { query } from "@anthropic-ai/claude-agent-sdk";
231 216
232 async function main() {217async function main() {
233 const q = query({218 const q = query({
234 prompt: "Help me refactor this code",219 prompt: "Help me refactor this code",
235 options: {220 options: {
246 console.log(message.result);231 console.log(message.result);
247 }232 }
248 }233 }
249 }234}
250 235
251 main();236main();
252 ```237```
253 </CodeGroup>
254 </Tab>
255</Tabs>
256 238
257<h3 id="mode-details">239### 模式详情
258 模式详情
259</h3>
260 240
261<h4 id="accept-edits-mode-acceptedits">241#### 接受编辑模式(`acceptEdits`)
262 接受编辑模式(`acceptEdits`)
263</h4>
264 242
265自动批准文件操作,以便 Claude 可以编辑代码而无需提示。其他工具(如不是文件系统操作的 Bash 命令)仍需要正常权限。243自动批准文件操作,以便 Claude 可以编辑代码而无需提示。其他工具(如不是文件系统操作的 Bash 命令)仍需要正常权限。
266 244
277 255
278**使用场景:** 您信任 Claude 的编辑并希望更快地迭代,例如在原型设计期间或在隔离目录中工作时。256**使用场景:** 您信任 Claude 的编辑并希望更快地迭代,例如在原型设计期间或在隔离目录中工作时。
279 257
280<h4 id="don’t-ask-mode-dontask">258#### 不要询问模式(`dontAsk`)
281 不要询问模式(`dontAsk`)259
282</h4>260将任何权限提示转换为拒绝,而不调用 `canUseTool`,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview) 仍可以批准[其中部分调用](/docs/zh-CN/permissions#precedence-among-rules-hooks-and-mods)。由 `allowed_tools`、`settings.json` 允许规则或 hook 预先批准的工具会正常运行。`default` 模式下不需要批准的调用也会运行,例如在您的工作目录内的文件读取和对 `Agent` 的调用。
283 261
284将任何权限提示转换为拒绝,而不调用 `canUseTool`。由 `allowed_tools`、`settings.json` 允许规则或 hook 预先批准的工具会正常运行,`default` 模式下不需要批准的调用也会运行,例如在您的工作目录内的文件读取和对 `Agent` 的调用。连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具、[来自网络路径的读取](/docs/zh-CN/permissions#network-paths),以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除即使允许规则匹配也会被拒绝。`PreToolUse` hook 允许也不会放行关键路径删除或来自网络路径的读取。262[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具、需要用户交互的工具、[来自网络路径的读取](/docs/zh-CN/permissions#network-paths),以及针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 删除即使允许规则匹配也会被拒绝。`PreToolUse` hook 允许也不会放行关键路径删除或来自网络路径的读取。
285 263
286**使用场景:** 您希望为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是依赖 `canUseTool` 不存在的无声依赖。264**使用场景:** 您希望为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是依赖 `canUseTool` 不存在的无声依赖。
287 265
288<h4 id="bypass-permissions-mode-bypasspermissions">266#### 绕过权限模式(`bypassPermissions`)
289 绕过权限模式(`bypassPermissions`)
290</h4>
291 267
292自动批准工具使用而无需提示,除了下面警告中列出的情况。钩子仍会执行,如果需要可以阻止操作。在 Linux 和 macOS 上,Claude Code 拒绝在此模式下以 root 身份或在[已识别的沙箱](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)外的 `sudo` 下启动,查询在第一轮之前失败。268自动批准工具使用而无需提示,除了下面警告中列出的情况。钩子仍会执行,如果需要可以阻止操作。在 Linux 和 macOS 上,Claude Code 拒绝在此模式下以 root 身份或在[已识别的沙箱](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)外的 `sudo` 下启动,查询在第一轮之前失败。
293 269
294<Warning>270> [!WARNING]
295 请极其谨慎使用。Claude 在此模式下具有完整的系统访问权限。仅在您信任所有可能操作的受控环境中使用。271>
296 272> 请极其谨慎使用。Claude 在此模式下具有完整的系统访问权限。仅在您信任所有可能操作的受控环境中使用。
297 `allowed_tools` 不会限制此模式。每个工具都被批准,而不仅仅是您列出的工具。这些控制仍然适用:273>
298 274> `allowed_tools` 不会限制此模式。每个工具都被批准,而不仅仅是您列出的工具。这些控制仍然适用:
299 * 拒绝规则、显式 `ask` 规则和钩子在模式检查之前被评估,仍然可以阻止工具。275>
300 * 连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具,以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除仍然会转到您的 `canUseTool` 回调。276> * 拒绝规则、显式 `ask` 规则和钩子在模式检查之前被评估,仍然可以阻止工具。
301 * [跨会话消息保护措施](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)仍然适用。277> * 连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具,以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除仍然会转到您的 `canUseTool` 回调。
302</Warning>278> * [跨会话消息保护措施](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)仍然适用。
303 279
304<h4 id="plan-mode-plan">280#### 规划模式(`plan`)
305 规划模式(`plan`)
306</h4>
307 281
308Claude 探索代码库并生成计划,而不编辑您的源文件。只读工具的运行方式与 `default` 权限模式相同。282Claude 探索代码库并生成计划,而不编辑您的源文件。只读工具的运行方式与 `default` 权限模式相同。
309 283
315 289
316**使用场景:** 您希望 Claude 提议更改而不执行它们,例如在代码审查期间或当您需要在进行更改之前批准更改时。290**使用场景:** 您希望 Claude 提议更改而不执行它们,例如在代码审查期间或当您需要在进行更改之前批准更改时。
317 291
318<h4 id="auto-mode-auto">292#### 自动模式(`auto`)
319 自动模式(`auto`)
320</h4>
321 293
322分类器模型会在 shell 命令和网络请求等操作运行之前对其进行审查,并允许或阻止它审查的每一个操作。有关自动模式所需的模型和提供商以及它评估操作的顺序,请参阅[使用自动模式消除权限提示](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)。294分类器模型会在 shell 命令和网络请求等操作运行之前对其进行审查,并允许或阻止它审查的每一个操作。有关自动模式所需的模型和提供商以及它评估操作的顺序,请参阅[使用自动模式消除权限提示](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)。
323 295
328 300
329在调用 `set_model()`、`setModel()` 或 `applyFlagSettings()` 之后更改为 `default` 模式需要 Claude Code v2.1.299 或更高版本。301在调用 `set_model()`、`setModel()` 或 `applyFlagSettings()` 之后更改为 `default` 模式需要 Claude Code v2.1.299 或更高版本。
330 302
331<h2 id="related-resources">303## 相关资源
332 相关资源
333</h2>
334 304
335有关权限评估流程中的其他步骤:305有关权限评估流程中的其他步骤:
336 306