生命周期钩子
钩子让你在 Agent 活动发生时进行观测和把控。你针对某个生命周期事件注册一个具名回调,
运行时会在该节点调用它,回调返回一个决策,例如 { action: "continue" }。钩子可用于
审计、脱敏、日志记录,或在不修改 Agent 提示词的前提下实施策略。
其生命周期是对称的:registerHook 按名称添加回调,hookCount 告诉你当前有多少个钩子
处于活动状态,unregisterHook 则按名称移除某个钩子。
注意事项:
- 钩子回调返回一个决策。返回
{ action: "continue" }(Node)/{"action": "continue"}(Python)/&code.HookResponse{Action: "continue"}(Go)即可让 Agent 继续执行。 - 永久拒绝返回带原因的
block。临时拒绝返回带原因的retry,并附上delayMs(Node)、delay_ms(Python)或DelayMS(Go)。在send或stream回合中,被拒绝的工具调用会发出permission_denied事件,模型收到的是Hook denied <tool>: <reason>,而不是工具输出。对于宿主 直接调用(session.tool(...)和类型化辅助方法),被拒绝的结果还会带有error_kind.type = "hook_denied"以及retryable和retry_after_ms,宿主无需解析输出文本。 - 路径匹配器读取工具的
file_path参数,没有时回退到path。 - 匹配器(Node 为
{ pathPattern: '**/.env*' },Python 为{'path_pattern': ...}, Go 为HookMatcher{PathPattern: ...})将钩子限定到路径匹配该模式的事件,而{ priority: 100 }用于对同一事件上的多个钩子排序(数值越小越先执行)。 - 回调只接收一个参数,即事件本身。
- Node 回调若抛出异常、返回无效值或超过超时时间(配置中的
timeoutMs,默认 30,000 毫秒),该钩子即视为失败。在关卡事件(pre_tool_use、permission_request、pre_compact、pre_prompt、pre_planning、pre_run_control)上,该动作会被阻止, 原因为Required hook '<name>' failed: ...;在其他事件上,智能体会继续执行。 hookCount/hook_count/HookCount反映当前已注册钩子的数量,在测试中可方便地断言注册与 清理是否生效。unregisterHook/unregister_hook/UnregisterHook接收你注册时使用的名称。请始终拆除不再需要的 钩子,以免它们在多次运行之间泄漏。- 把钩子当作生产关卡前,请先验证你所依赖的具体 event path。