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, зарегистрированных для этого типа события. Это включает callback hooks, которые вы передаете в `options.hooks`, и hooks команд shell из файлов настроек, когда соответствующая запись [`settingSources`](/ru/agent-sdk/typescript#setting-source) или [`setting_sources`](/ru/agent-sdk/python#setting-source) включена, что она есть для параметров `query()` по умолчанию. SDK проверяет наличие hooks, зарегистрированных для этого типа события. Это включает callback hooks, которые вы передаете в `options.hooks`, и hooks команд shell из файлов настроек, когда соответствующая запись [`settingSources`](/ru/agent-sdk/typescript#settingSources) или [`setting_sources`](/ru/agent-sdk/python#setting_sources) включена, что она есть для параметров `query()` по умолчанию.
28 </Step>28 </Step>
29 29
30 <Step title="Matchers фильтруют, какие hooks запускаются">30 <Step title="Matchers фильтруют, какие hooks запускаются">
225 225
226Каждый callback hook получает три аргумента:226Каждый callback hook получает три аргумента:
227 227
228228* **Входные данные:** типизированный объект, содержащий детали события. Каждый тип hook имеет свою форму входных данных (например, `PreToolUseHookInput` включает `tool_name` и `tool_input`, в то время как `NotificationHookInput` включает `message`). См. полные определения типов в справочниках [TypeScript](/ru/agent-sdk/typescript#hook-input) и [Python](/ru/agent-sdk/python#hook-input) SDK.* **Входные данные:** типизированный объект, содержащий детали события. Каждый тип hook имеет свою форму входных данных (например, `PreToolUseHookInput` включает `tool_name` и `tool_input`, в то время как `NotificationHookInput` включает `message`). См. полные определения типов в справочниках [TypeScript](/ru/agent-sdk/typescript#hookinput) и [Python](/ru/agent-sdk/python#hookinput) SDK.
229 * Все входные данные hook содержат `session_id`, `cwd` и `hook_event_name`.229 * Все входные данные hook содержат `session_id`, `cwd` и `hook_event_name`.
230 * `agent_id` и `agent_type` заполняются, когда hook срабатывает внутри подагента. В TypeScript они находятся на базовом входе hook и доступны для всех типов hook. В Python они находятся только на `PreToolUse`, `PostToolUse` и `PostToolUseFailure`.230 * `agent_id` и `agent_type` заполняются, когда hook срабатывает внутри подагента. В TypeScript они находятся на базовом входе hook и доступны для всех типов hook. В Python они находятся только на `PreToolUse`, `PostToolUse` и `PostToolUseFailure`.
231* **ID использования инструмента** (`str | None` / `string | undefined`): коррелирует события `PreToolUse` и `PostToolUse` для одного и того же вызова инструмента.231* **ID использования инструмента** (`str | None` / `string | undefined`): коррелирует события `PreToolUse` и `PostToolUse` для одного и того же вызова инструмента.
236Ваш callback возвращает объект с двумя категориями полей:236Ваш callback возвращает объект с двумя категориями полей:
237 237
238* **Поля верхнего уровня** контролируют разговор: `systemMessage` внедряет сообщение в разговор, видимое модели, и `continue` (`continue_` в Python) определяет, продолжает ли агент работать после этого hook.238* **Поля верхнего уровня** контролируют разговор: `systemMessage` внедряет сообщение в разговор, видимое модели, и `continue` (`continue_` в Python) определяет, продолжает ли агент работать после этого hook.
239239* **`hookSpecificOutput`** контролирует текущую операцию. Поля внутри зависят от типа события hook. Для hooks `PreToolUse` здесь вы устанавливаете `permissionDecision` (`"allow"`, `"deny"` или `"ask"`), `permissionDecisionReason` и `updatedInput`. В TypeScript SDK `permissionDecision` также принимает `"defer"` для завершения запроса и [возобновления позже](/ru/hooks#defer-a-tool-call-for-later); это значение недоступно в Python SDK. Для hooks `PostToolUse` вы можете установить `additionalContext` для добавления информации к результату инструмента, или `updatedToolOutput` для полной замены выходных данных инструмента перед тем, как Claude их увидит.* **`hookSpecificOutput`** контролирует текущую операцию. Поля внутри зависят от типа события hook. Для hooks `PreToolUse` здесь вы устанавливаете `permissionDecision` (`"allow"`, `"deny"`, `"ask"` или `"defer"`), `permissionDecisionReason` и `updatedInput`. Возврат `"defer"` завершает запрос, чтобы вы могли [возобновить его позже](/ru/hooks#defer-a-tool-call-for-later). Для hooks `PostToolUse` вы можете установить `additionalContext` для добавления информации к результату инструмента, или `updatedToolOutput` для полной замены выходных данных инструмента перед тем, как Claude их увидит.
240 240
241241Возвращайте `{}` для разрешения операции без изменений. SDK callback hooks используют тот же формат вывода JSON, что и [hooks команд shell Claude Code](/ru/hooks#json-output), который документирует каждое поле и опцию, специфичную для события. Для определений типов SDK см. справочники [TypeScript](/ru/agent-sdk/typescript#sync-hook-json-output) и [Python](/ru/agent-sdk/python#sync-hook-json-output) SDK.Возвращайте `{}` для разрешения операции без изменений. SDK callback hooks используют тот же формат вывода JSON, что и [hooks команд shell Claude Code](/ru/hooks#json-output), который документирует каждое поле и опцию, специфичную для события. Для определений типов SDK см. справочники [TypeScript](/ru/agent-sdk/typescript#synchookjsonoutput) и [Python](/ru/agent-sdk/python#synchookjsonoutput) SDK.
242 242
243<Note>243<Note>
244 Когда применяются несколько hooks или правил разрешений, **deny** имеет приоритет над **defer**, который имеет приоритет над **ask**, который имеет приоритет над **allow**. Если какой-либо hook возвращает `deny`, операция блокируется независимо от других hooks.244 Когда применяются несколько hooks или правил разрешений, **deny** имеет приоритет над **defer**, который имеет приоритет над **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Используйте hooks `SubagentStop` для мониторинга, когда подагенты завершают свою работу. См. полный тип входных данных в справочниках [TypeScript](/ru/agent-sdk/typescript#hook-input) и [Python](/ru/agent-sdk/python#hook-input) SDK. Этот пример логирует сводку каждый раз, когда подагент завершается:Используйте hooks `SubagentStop` для мониторинга, когда подагенты завершают свою работу. См. полный тип входных данных в справочниках [TypeScript](/ru/agent-sdk/typescript#hookinput) и [Python](/ru/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Используйте hooks `Notification` для получения системных уведомлений от агента и перенаправления их во внешние сервисы. Уведомления срабатывают для конкретных типов событий: `permission_prompt` (Claude нужно разрешение), `idle_prompt` (Claude ждет ввода), `auth_success` (аутентификация завершена) и `elicitation_dialog` (Claude запрашивает пользователя). Каждое уведомление включает поле `message` с описанием, понятным человеку, и опционально `title`.Используйте hooks `Notification` для получения системных уведомлений от агента и перенаправления их во внешние сервисы. Уведомления срабатывают для конкретных типов событий: `permission_prompt` (Claude нужно разрешение), `idle_prompt` (Claude ждет ввода), `auth_success` (аутентификация завершена), `elicitation_dialog` (Claude запрашивает пользователя), `elicitation_response` (пользователь ответил на запрос), и `elicitation_complete` (запрос закрыт). Каждое уведомление включает поле `message` с описанием, понятным человеку, и опционально `title`.
625 625
626Этот пример перенаправляет каждое уведомление в канал Slack. Требуется [URL входящего webhook Slack](https://api.slack.com/messaging/webhooks), который вы создаете, добавляя приложение в ваше рабочее пространство Slack и включая входящие webhooks:626Этот пример перенаправляет каждое уведомление в канал Slack. Требуется [URL входящего webhook Slack](https://api.slack.com/messaging/webhooks), который вы создаете, добавляя приложение в ваше рабочее пространство Slack и включая входящие webhooks:
627 627
727* Проверьте, что ваш паттерн matcher точно совпадает с именем инструмента727* Проверьте, что ваш паттерн matcher точно совпадает с именем инструмента
728* Убедитесь, что hook находится под правильным типом события в `options.hooks`728* Убедитесь, что hook находится под правильным типом события в `options.hooks`
729* Для non-tool hooks, таких как `Stop` и `SubagentStop`, matchers соответствуют разным полям (см. [matcher patterns](/ru/hooks#matcher-patterns))729* Для non-tool hooks, таких как `Stop` и `SubagentStop`, matchers соответствуют разным полям (см. [matcher patterns](/ru/hooks#matcher-patterns))
730730* Hooks могут не срабатывать, когда агент достигает лимита [`max_turns`](/ru/agent-sdk/python#claude-agent-options), потому что сеанс заканчивается перед тем, как hooks смогут выполниться* Hooks могут не срабатывать, когда агент достигает лимита [`max_turns`](/ru/agent-sdk/python#claudeagentoptions), потому что сеанс заканчивается перед тем, как hooks смогут выполниться
731 731
732### Matcher не фильтрует как ожидается732### Matcher не фильтрует как ожидается
733 733
769 };769 };
770 ```770 ```
771 771
772772* Вы также должны вернуть `permissionDecision: 'allow'` для того, чтобы изменение входных данных вступило в силу* Вы также должны вернуть `permissionDecision: 'allow'` или `'ask'` для того, чтобы изменение входных данных вступило в силу
773 773
774* Включите `hookEventName` в `hookSpecificOutput` для идентификации типа hook, для которого предназначен вывод774* Включите `hookEventName` в `hookSpecificOutput` для идентификации типа hook, для которого предназначен вывод
775 775
776### Hooks сеанса недоступны в Python776### Hooks сеанса недоступны в Python
777 777
778778`SessionStart` и `SessionEnd` могут быть зарегистрированы как SDK callback hooks в TypeScript, но недоступны в Python SDK (`HookEvent` их опускает). В Python они доступны только как [hooks команд shell](/ru/hooks#hook-events), определенные в файлах настроек (например, `.claude/settings.json`). Для загрузки hooks команд shell из вашего приложения SDK включите соответствующий источник настроек с [`setting_sources`](/ru/agent-sdk/python#setting-source) или [`settingSources`](/ru/agent-sdk/typescript#setting-source):`SessionStart` и `SessionEnd` могут быть зарегистрированы как SDK callback hooks в TypeScript, но недоступны в Python SDK (`HookEvent` их опускает). В Python они доступны только как [shell command hooks](/ru/hooks#hook-events), определенные в файлах настроек (например, `.claude/settings.json`). Для загрузки shell command hooks из вашего приложения SDK включите соответствующий источник настроек с [`setting_sources`](/ru/agent-sdk/python#settingsource) или [`settingSources`](/ru/agent-sdk/typescript#settingsource):
779 779
780<CodeGroup>780<CodeGroup>
781 ```python Python theme={null}781 ```python Python theme={null}