Hooks 允许你在 AI 会话的关键生命周期节点注入自定义逻辑,支持审计日志、安全控制、上下文注入和动态行为修改。
完整事件类型定义见 SDK References。
在 options 的
每个 hook 回调接收事件输入、工具调用 ID 和上下文(TypeScript 中为 abort signal):
所有事件共享通用字段:
回调返回一个对象 / dict,通过以下字段控制行为:
拦截危险的 shell 命令:
覆盖工具输出,替换 AK/Token 等敏感信息:
截断超长的 Bash 输出,保留头尾:
阻止 AI 在任务未完成时停止:
自动放行 Read 工具的权限请求:
组合审计日志和安全拦截:
事件概览
| 事件 | 触发时机 | 可控行为 |
|---|---|---|
PreToolUse | 工具调用前 | 拦截 / 放行 / 修改输入 |
PostToolUse | 工具执行成功后 | 审计 / 注入上下文 / 覆盖输出 |
PostToolUseFailure | 工具执行失败后 | 错误处理 / 日志记录 |
UserPromptSubmit | 用户 prompt 发送前 | 注入上下文 / 拦截 |
SessionStart | 会话开始时 | 初始化 / 注入上下文 |
SessionEnd | 会话结束时 | 清理 / 日志记录 |
Stop | AI 停止生成时 | 阻止停止,强制继续 |
SubagentStart | 子 Agent 启动时 | 观察 / 日志记录 |
SubagentStop | 子 Agent 停止时 | 观察 / 日志记录 |
PreCompact | 上下文压缩前 | 观察 / 日志记录 |
PostCompact | 上下文压缩后 | 观察 / 日志记录 |
CwdChanged | 工作目录变更时 | 观察 / 日志记录 |
InstructionsLoaded | 指令文件加载时 | 观察 / 日志记录 |
FileChanged | 文件创建/修改/删除时 | 观察 / 日志记录 |
PermissionRequest | 权限申请时 | 自动批准 / 拒绝权限请求 |
配置
在 options 的 hooks 字段中配置 hooks:
Matcher
matcher 字段为正则表达式,只有工具名称匹配时 hook 才会触发:
回调函数
每个 hook 回调接收事件输入、工具调用 ID 和上下文(TypeScript 中为 abort signal):
输入
所有事件共享通用字段:hook_event_name(事件类型)、session_id(会话 ID)、transcript_path(记录文件路径)、cwd(工作目录)。每个事件还有专属字段,如 PreToolUse 的 tool_name 和 tool_input。
完整输入类型定义见 SDK References。
输出
回调返回一个对象 / dict,通过以下字段控制行为:
continue: false— 终止会话(Python 中字段名为continue_,序列化为 JSON"continue")decision: "block"+reason— 阻止工具执行或阻止 AI 停止hookSpecificOutput— 事件专属输出,如修改工具输入(updatedInput)、覆盖工具输出(updatedToolOutput)、注入上下文(additionalContext)
示例
安全拦截(PreToolUse)
拦截危险的 shell 命令:
脱敏敏感信息(PostToolUse)
覆盖工具输出,替换 AK/Token 等敏感信息:
裁剪过长输出(PostToolUse)
截断超长的 Bash 输出,保留头尾:
强制继续(Stop)
阻止 AI 在任务未完成时停止:
自动批准权限(PermissionRequest)
自动放行 Read 工具的权限请求:
完整权限模型请参见权限文档。
审计与安全控制(综合)
组合审计日志和安全拦截:
注意事项
- Hook 回调应尽快返回,避免阻塞 AI 执行。
matcher匹配tool_name字段,正则语法按各自语言解释(TypeScript 为 JavaScript 正则,Python 为re模块)。continue: false(Python 中为continue_: False)可终止会话——仅对PreToolUse、PostToolUse、PostToolUseFailure、UserPromptSubmit、Stop、SubagentStop事件有效,观察类事件(如SessionEnd、CwdChanged)会忽略此字段。- 当多个 hook 返回冲突的
decision值时,"deny"/"block"优先(最严格的规则生效)。 - 当多个 hook 都设置了
updatedToolOutput时,最后一个非空值生效。如需链式执行多个转换(如先脱敏再裁剪),请在单个回调内按顺序执行。 - Python SDK 使用尾部下划线字段名(
continue_)以避免与 Python 关键字冲突。SDK 在序列化时会自动转换为线路协议名称(continue)。