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-TW/agent-sdk/typescript#setting-source) 或 [`setting_sources`](/zh-TW/agent-sdk/python#setting-source) 項目啟用時(預設 `query()` 選項就是這樣)。 SDK 檢查為該事件類型註冊的 hooks。這包括您在 `options.hooks` 中傳遞的回調 hooks 和來自設定檔案的 shell 命令 hooks,當相應的 [`settingSources`](/zh-TW/agent-sdk/typescript#settingSources) 或 [`setting_sources`](/zh-TW/agent-sdk/python#setting_sources) 項目啟用時(預設 `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-TW/agent-sdk/typescript#hook-input) 和 [Python](/zh-TW/agent-sdk/python#hook-input) SDK 參考中的完整類型定義。* **輸入資料:** 一個包含事件詳細資訊的類型物件。每個 hook 類型都有自己的輸入形狀(例如,`PreToolUseHookInput` 包括 `tool_name` 和 `tool_input`,而 `NotificationHookInput` 包括 `message`)。請參閱 [TypeScript](/zh-TW/agent-sdk/typescript#hookinput) 和 [Python](/zh-TW/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-TW/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-TW/hooks#defer-a-tool-call-for-later)。對於 `PostToolUse` hooks,您可以設定 `additionalContext` 以將資訊附加到工具結果,或設定 `updatedToolOutput` 以在 Claude 看到之前完全替換工具的輸出。
240 240
241241返回 `{}` 以允許操作而不進行變更。SDK 回調 hooks 使用與 [Claude Code shell 命令 hooks](/zh-TW/hooks#json-output) 相同的 JSON 輸出格式,其記錄每個欄位和事件特定選項。對於 SDK 類型定義,請參閱 [TypeScript](/zh-TW/agent-sdk/typescript#sync-hook-json-output) 和 [Python](/zh-TW/agent-sdk/python#sync-hook-json-output) SDK 參考。返回 `{}` 以允許操作而不進行變更。SDK 回調 hooks 使用與 [Claude Code shell 命令 hooks](/zh-TW/hooks#json-output) 相同的 JSON 輸出格式,其記錄每個欄位和事件特定選項。對於 SDK 類型定義,請參閱 [TypeScript](/zh-TW/agent-sdk/typescript#synchookjsonoutput) 和 [Python](/zh-TW/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-TW/agent-sdk/typescript#hook-input) 和 [Python](/zh-TW/agent-sdk/python#hook-input) SDK 參考中的完整輸入類型。此範例在每次子代理完成時記錄摘要:使用 `SubagentStop` hooks 監控子代理何時完成其工作。請參閱 [TypeScript](/zh-TW/agent-sdk/typescript#hookinput) 和 [Python](/zh-TW/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-TW/hooks#matcher-patterns))729* 對於非工具 hooks,如 `Stop` 和 `SubagentStop`,匹配器匹配不同的欄位(請參閱[匹配器模式](/zh-TW/hooks#matcher-patterns))
730730* 當代理達到 [`max_turns`](/zh-TW/agent-sdk/python#claude-agent-options) 限制時,hooks 可能不會觸發,因為會話在 hooks 可以執行前結束* 當代理達到 [`max_turns`](/zh-TW/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-TW/hooks#hook-events) 在設定檔案中定義(例如 `.claude/settings.json`)。要從您的 SDK 應用程式載入 shell 命令 hooks,請使用 [`setting_sources`](/zh-TW/agent-sdk/python#setting-source) 或 [`settingSources`](/zh-TW/agent-sdk/typescript#setting-source) 包括適當的設定來源:`SessionStart` 和 `SessionEnd` 可以在 TypeScript 中註冊為 SDK 回調 hooks,但在 Python SDK 中不可用(`HookEvent` 省略它們)。在 Python 中,它們僅作為[shell 命令 hooks](/zh-TW/hooks#hook-events) 在設定檔案中定義(例如 `.claude/settings.json`)。要從您的 SDK 應用程式載入 shell 命令 hooks,請使用 [`setting_sources`](/zh-TW/agent-sdk/python#settingsource) 或 [`settingSources`](/zh-TW/agent-sdk/typescript#settingsource) 包括適當的設定來源:
779 779
780<CodeGroup>780<CodeGroup>
781 ```python Python theme={null}781 ```python Python theme={null}