agent-sdk/hooks.md +10 −10
24 </Step>24 </Step>
25 25
26 <Step title="SDK 收集已注册的 hooks">26 <Step title="SDK 收集已注册的 hooks">
2727 SDK 检查为该事件类型注册的 hooks。这包括您在 `options.hooks` 中传递的回调 hooks 和来自设置文件的 shell 命令 hooks,当相应的 [`settingSources`](/zh-CN/agent-sdk/typescript#setting-source) 或 [`setting_sources`](/zh-CN/agent-sdk/python#setting-source) 条目启用时(默认 `query()` 选项就是这样)。 SDK 检查为该事件类型注册的 hooks。这包括您在 `options.hooks` 中传递的回调 hooks 和来自设置文件的 shell 命令 hooks,当相应的 [`settingSources`](/zh-CN/agent-sdk/typescript#settingsource) 或 [`setting_sources`](/zh-CN/agent-sdk/python#settingsource) 条目启用时(默认 `query()` 选项就是这样)。
28 </Step>28 </Step>
29 29
30 <Step title="匹配器过滤哪些 hooks 运行">30 <Step title="匹配器过滤哪些 hooks 运行">
225 225
226每个 hook 回调接收三个参数:226每个 hook 回调接收三个参数:
227 227
228228* **输入数据:** 一个包含事件详细信息的类型化对象。每个 hook 类型都有自己的输入形状(例如,`PreToolUseHookInput` 包括 `tool_name` 和 `tool_input`,而 `NotificationHookInput` 包括 `message`)。请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#hook-input) 和 [Python](/zh-CN/agent-sdk/python#hook-input) SDK 参考中的完整类型定义。* **输入数据:** 一个包含事件详细信息的类型化对象。每个 hook 类型都有自己的输入形状(例如,`PreToolUseHookInput` 包括 `tool_name` 和 `tool_input`,而 `NotificationHookInput` 包括 `message`)。请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#hookinput) 和 [Python](/zh-CN/agent-sdk/python#hookinput) SDK 参考中的完整类型定义。
229 * 所有 hook 输入共享 `session_id`、`cwd` 和 `hook_event_name`。229 * 所有 hook 输入共享 `session_id`、`cwd` 和 `hook_event_name`。
230 * 当 hook 在子代理内触发时,`agent_id` 和 `agent_type` 被填充。在 TypeScript 中,这些在基础 hook 输入上,对所有 hook 类型都可用。在 Python 中,它们仅在 `PreToolUse`、`PostToolUse` 和 `PostToolUseFailure` 上。230 * 当 hook 在子代理内触发时,`agent_id` 和 `agent_type` 被填充。在 TypeScript 中,这些在基础 hook 输入上,对所有 hook 类型都可用。在 Python 中,它们仅在 `PreToolUse`、`PostToolUse` 和 `PostToolUseFailure` 上。
231* **工具使用 ID**(`str | None` / `string | undefined`):关联同一工具调用的 `PreToolUse` 和 `PostToolUse` 事件。231* **工具使用 ID**(`str | None` / `string | undefined`):关联同一工具调用的 `PreToolUse` 和 `PostToolUse` 事件。
236您的回调返回一个具有两类字段的对象:236您的回调返回一个具有两类字段的对象:
237 237
238* **顶级字段**控制对话:`systemMessage` 将消息注入到对话中,对模型可见,`continue`(Python 中的 `continue_`)确定代理在此 hook 后是否继续运行。238* **顶级字段**控制对话:`systemMessage` 将消息注入到对话中,对模型可见,`continue`(Python 中的 `continue_`)确定代理在此 hook 后是否继续运行。
239239* **`hookSpecificOutput`** 控制当前操作。内部的字段取决于 hook 事件类型。对于 `PreToolUse` hooks,这是您设置 `permissionDecision`(`"allow"`、`"deny"` 或 `"ask"`)、`permissionDecisionReason` 和 `updatedInput` 的地方。在 TypeScript SDK 中,`permissionDecision` 也接受 `"defer"` 以结束查询并[稍后恢复](/zh-CN/hooks#defer-a-tool-call-for-later);此值在 Python SDK 中不可用。对于 `PostToolUse` hooks,您可以设置 `additionalContext` 以将信息附加到工具结果,或设置 `updatedToolOutput` 以在 Claude 看到之前完全替换工具的输出。* **`hookSpecificOutput`** 控制当前操作。内部的字段取决于 hook 事件类型。对于 `PreToolUse` hooks,这是您设置 `permissionDecision`(`"allow"`、`"deny"`、`"ask"` 或 `"defer"`)、`permissionDecisionReason` 和 `updatedInput` 的地方。返回 `"defer"` 结束查询,以便您可以[稍后恢复它](/zh-CN/hooks#defer-a-tool-call-for-later)。对于 `PostToolUse` hooks,您可以设置 `additionalContext` 以将信息附加到工具结果,或设置 `updatedToolOutput` 以在 Claude 看到之前完全替换工具的输出。
240 240
241241返回 `{}` 以允许操作而不进行更改。SDK 回调 hooks 使用与 [Claude Code shell 命令 hooks](/zh-CN/hooks#json-output) 相同的 JSON 输出格式,其中记录了每个字段和事件特定的选项。对于 SDK 类型定义,请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#sync-hook-json-output) 和 [Python](/zh-CN/agent-sdk/python#sync-hook-json-output) SDK 参考。返回 `{}` 以允许操作而不进行更改。SDK 回调 hooks 使用与 [Claude Code shell 命令 hooks](/zh-CN/hooks#json-output) 相同的 JSON 输出格式,其中记录了每个字段和事件特定的选项。对于 SDK 类型定义,请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#synchookjsonoutput) 和 [Python](/zh-CN/agent-sdk/python#synchookjsonoutput) SDK 参考。
242 242
243<Note>243<Note>
244 当多个 hooks 或权限规则适用时,**deny** 优先于 **defer**,**defer** 优先于 **ask**,**ask** 优先于 **allow**。如果任何 hook 返回 `deny`,操作将被阻止,无论其他 hooks 如何。244 当多个 hooks 或权限规则适用时,**deny** 优先于 **defer**,**defer** 优先于 **ask**,**ask** 优先于 **allow**。如果任何 hook 返回 `deny`,操作将被阻止,无论其他 hooks 如何。
326</CodeGroup>326</CodeGroup>
327 327
328<Note>328<Note>
329329 使用 `updatedInput` 时,您还必须包括 `permissionDecision: 'allow'`。始终返回新对象而不是改变原始 `tool_input`。 使用 `updatedInput` 时,您还必须包括 `permissionDecision: 'allow'` 以自动批准修改的输入,或 `permissionDecision: 'ask'` 以将其显示给用户。使用 `'defer'` 时,`updatedInput` 会被忽略。始终返回新对象而不是改变原始 `tool_input`。
330</Note>330</Note>
331 331
332### 添加上下文并阻止工具332### 添加上下文并阻止工具
489 489
490### 跟踪子代理活动490### 跟踪子代理活动
491 491
492492使用 `SubagentStop` hooks 监控子代理何时完成其工作。请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#hook-input) 和 [Python](/zh-CN/agent-sdk/python#hook-input) SDK 参考中的完整输入类型。此示例在每次子代理完成时记录摘要:使用 `SubagentStop` hooks 监控子代理何时完成其工作。请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#hookinput) 和 [Python](/zh-CN/agent-sdk/python#hookinput) SDK 参考中的完整输入类型。此示例在每次子代理完成时记录摘要:
493 493
494<CodeGroup>494<CodeGroup>
495 ```python Python theme={null}495 ```python Python theme={null}
621 621
622### 将通知转发到 Slack622### 将通知转发到 Slack
623 623
624624使用 `Notification` hooks 从代理接收系统通知并将其转发到外部服务。通知针对特定事件类型触发:`permission_prompt`(Claude 需要权限)、`idle_prompt`(Claude 等待输入)、`auth_success`(身份验证完成)和 `elicitation_dialog`(Claude 提示用户)。每个通知包括一个带有人类可读描述的 `message` 字段,以及可选的 `title`。使用 `Notification` hooks 从代理接收系统通知并将其转发到外部服务。通知针对特定事件类型触发:`permission_prompt`(Claude 需要权限)、`idle_prompt`(Claude 等待输入)、`auth_success`(身份验证完成)、`elicitation_dialog`(Claude 提示用户)、`elicitation_response`(用户回答了引导)和 `elicitation_complete`(引导已关闭)。每个通知包括一个带有人类可读描述的 `message` 字段,以及可选的 `title`。
625 625
626此示例将每个通知转发到 Slack 频道。它需要一个 [Slack 传入 webhook URL](https://api.slack.com/messaging/webhooks),您可以通过将应用添加到您的 Slack 工作区并启用传入 webhooks 来创建:626此示例将每个通知转发到 Slack 频道。它需要一个 [Slack 传入 webhook URL](https://api.slack.com/messaging/webhooks),您可以通过将应用添加到您的 Slack 工作区并启用传入 webhooks 来创建:
627 627
727* 检查您的匹配器模式是否与工具名称完全匹配727* 检查您的匹配器模式是否与工具名称完全匹配
728* 确保 hook 在 `options.hooks` 中的正确事件类型下728* 确保 hook 在 `options.hooks` 中的正确事件类型下
729* 对于非工具 hooks,如 `Stop` 和 `SubagentStop`,匹配器匹配不同的字段(请参阅[匹配器模式](/zh-CN/hooks#matcher-patterns))729* 对于非工具 hooks,如 `Stop` 和 `SubagentStop`,匹配器匹配不同的字段(请参阅[匹配器模式](/zh-CN/hooks#matcher-patterns))
730730* 当代理达到 [`max_turns`](/zh-CN/agent-sdk/python#claude-agent-options) 限制时,hooks 可能不会触发,因为会话在 hooks 可以执行前结束* 当代理达到 [`max_turns`](/zh-CN/agent-sdk/python#claudeagentoptions) 限制时,hooks 可能不会触发,因为会话在 hooks 可以执行前结束
731 731
732### 匹配器未按预期过滤732### 匹配器未按预期过滤
733 733
769 };769 };
770 ```770 ```
771 771
772772* 您还必须返回 `permissionDecision: 'allow'` 以使输入修改生效* 您还必须返回 `permissionDecision: 'allow'` 或 `'ask'` 以使输入修改生效
773 773
774* 在 `hookSpecificOutput` 中包括 `hookEventName` 以识别输出针对的 hook 类型774* 在 `hookSpecificOutput` 中包括 `hookEventName` 以识别输出针对的 hook 类型
775 775
776### Python 中不可用会话 hooks776### Python 中不可用会话 hooks
777 777
778778`SessionStart` 和 `SessionEnd` 可以在 TypeScript 中注册为 SDK 回调 hooks,但在 Python SDK 中不可用(`HookEvent` 省略了它们)。在 Python 中,它们仅作为[shell 命令 hooks](/zh-CN/hooks#hook-events) 在设置文件中定义(例如 `.claude/settings.json`)。要从您的 SDK 应用程序加载 shell 命令 hooks,请使用 [`setting_sources`](/zh-CN/agent-sdk/python#setting-source) 或 [`settingSources`](/zh-CN/agent-sdk/typescript#setting-source) 包括适当的设置源:`SessionStart` 和 `SessionEnd` 可以在 TypeScript 中注册为 SDK 回调 hooks,但在 Python SDK 中不可用(`HookEvent` 省略了它们)。在 Python 中,它们仅作为[shell 命令 hooks](/zh-CN/hooks#hook-events) 在设置文件中定义(例如 `.claude/settings.json`)。要从您的 SDK 应用程序加载 shell 命令 hooks,请使用 [`setting_sources`](/zh-CN/agent-sdk/python#settingsource) 或 [`settingSources`](/zh-CN/agent-sdk/typescript#settingsource) 包括适当的设置源:
779 779
780<CodeGroup>780<CodeGroup>
781 ```python Python theme={null}781 ```python Python theme={null}