hooks?

最近在使用各种 agent 时了解到一个新的名词——hooks(钩子)。说实话在第一次听到钩子这个词感觉云里雾里,钩子和 agent 能扯上什么关系,本来想吐槽一下这可能又是一种糟糕的翻译,但是在了解之后发现这个翻译还是比较形象的。

这里附一段通过 deepseek 查阅到的关于钩子的解释:

在编程中,“钩子”这个名字来源于一个形象的比喻:它像现实生活中的“钩子”,可以“钩住”某个正在运行的东西,再挂上你自己的东西。

具体来说:

  1. 钩住流程:程序本身有一个固定的执行流程(比如函数执行、事件循环)。钩子就像一个预设的“挂钩点”,能在流程的特定位置“钩住”这个过程,让你插入自定义的代码。
  2. 挂上功能:一旦钩子被“触发”(比如函数执行前、窗口关闭时),你事先挂在上面的代码就会自动运行。就像在衣钩上挂衣服,在鱼钩上挂鱼饵——钩子本身不干活,但为你提供了“加东西”的位置。

这段描述还是比较容易理解的,感觉有点像 GitHub actions 自动化任务,就是 在特定事件发生时,自动执行预设的代码

那么在 agent 中钩子是怎么体现的呢?

这里在 B 站上找到了一个视频,搬运自 YouTube:

【Claude Code 中的钩子(Hooks)】

【Claude Code 中的钩子(Hooks)】

视频中详细介绍了 hooks 和 Claude code 中 hooks 的使用场景和方式,

视频内容总结

什么是 Hooks?

  • 确定性执行:Hooks 与通过 claude.md 文件给出的提示词(Prompts)不同。提示词并不完美,有时可能被忽略;而 Hooks 是 决定性的(Deterministic),只要触发条件满足,它们就一定会百分之百执行,绝无例外 [00:20]。
  • 核心理念:如果某项操作需要每次都雷打不动地执行,不要把它写在提示词里,应该使用 Hook [03:10]。

常见应用场景

  • 自动格式化:在 Claude 编辑文件后自动运行代码格式化工具(如 Prettier、Go fmt 或 Ruff) [00:42]。
  • 合规性审计:记录 Claude 执行的所有命令以供日志留存 [00:42]。
  • 安全性拦截:阻止一些危险操作,例如修改生产环境文件或运行高危命令 [00:42]。
  • 状态通知:在 Claude 完成某项任务时向用户发送通知 [00:42]。

Hooks 的生命周期事件

Hooks 配置在 settings.json 文件中,可以针对以下不同的生命周期事件进行设置 [00:52]:

  • user_prompt_submit:在用户提交提示词、Claude 开始处理之前触发 [01:07]。
  • pre_tool_use:在调用工具(Tool call)之前触发,可用于拦截操作 [01:07]。
  • post_tool_use:在工具调用完成后触发,最常用于自动格式化(通过匹配 editmulti-edit 工具) [01:07]。
  • notification:在 Claude 发送通知时触发 [01:15]。
  • stop:在 Claude 完成所有响应并停止时触发 [01:15]。

拦截危险操作(安全规则)

  • 触发 pre_tool_use 时,Hook 会通过标准输入(stdin)接收 JSON 格式的工具名称和输入参数 [01:49]。
  • 返回值控制
    • 退出码 0:允许继续执行(Proceed) [02:10]。
    • 退出码 2:拦截该操作(Block) [02:10]。同时,标准错误(stderr)中的错误信息会反馈给 Claude,让它知道被拦截的原因并据此调整行为 [02:03]。
  • 利用该机制可以强制执行团队的刚性硬编码规则,例如禁止修改生产配置目录、禁止运行包含 rm -rf 的 Bash 命令或禁止直接向 main 分支提交代码 [02:17]。

团队共享与配置

  • 可以在项目的 settings.json(或项目内的 /hooks 目录)中配置 Hooks,并将其提交(Check-in)到 Git 仓库中 [02:26]。
  • 这样可以确保整个团队自动共享相同的 Hooks 规则 [02:33]。
  • 在编写 Hook 命令时,建议使用环境变量 CLAUDE_PROJECT_DIR 来引用项目内的脚本,以确保无论 Claude 当前的工作目录在哪里,脚本都能正确运行 [02:40]。

最后

值得一提的是,大语言模型的 “工具调用”(Function Calling/Tool Use) 能力,可以看作钩子机制的进化版。它不再仅仅是拦截,而是让 AI 自主决定调用哪个“钩子”(外部工具或 API)来完成目标,代表了一种从 确定性拦截概率性意图代理 的范式转移

hooks 一词也不是近期才出现的专有名词,早在计算机发展初期,操作系统的中断处理程序就使用到了 hooks,下面列举了一个表格来整理 hooks 在各个领域的应用。

领域 钩子的作用 典型应用场景
🌐 操作系统 拦截并处理系统级消息/调用 全局热键、输入法、系统监控、安全防护
🖥️ Web 前端 为组件注入状态、管理生命周期 React/Vue 开发、表单处理、动画控制
🗄️ Web 后端 处理跨切面关注点 身份验证、日志、请求预处理、数据库操作前后等
🧩 插件系统 为软件主体提供功能扩展点 图像处理软件插件、IDE 插件、论坛插件
🧠 智能体 (Agent) 观测、控制、扩展 AI 行为 日志审计、人机协同、安全检查、性能监控

以上内容均为个人看法,如有错误的地方欢迎评论区指正!感谢大家花时间阅读。