生命周期钩子

钩子让你在 Agent 活动发生时进行观测和把控。你针对某个生命周期事件注册一个具名回调, 运行时会在该节点调用它,回调返回一个决策,例如 { action: "continue" }。钩子可用于 审计、脱敏、日志记录,或在不修改 Agent 提示词的前提下实施策略。

其生命周期是对称的:registerHook 按名称添加回调,hookCount 告诉你当前有多少个钩子 处于活动状态,unregisterHook 则按名称移除某个钩子。

Rust
Node.js
Python
Go

注意事项:

  • 钩子回调返回一个决策。返回 { 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。