钩子
钩子提供了一个可扩展的事件驱动系统,用于根据代理命令和事件自动执行操作。钩子会从目录中自动发现,并可通过 CLI 命令进行管理,其工作方式与 OpenClaw 中的技能类似。入门指南
钩子是在某些事件发生时运行的小脚本。有两种类型的钩子:- 钩子(本页):在代理事件触发时在网关内运行,例如
/new、/reset、/stop或生命周期事件。 - Webhook:外部 HTTP Webhook,允许其他系统在 OpenClaw 中触发工作。请参阅 Webhook 钩子,或使用
openclaw webhooks获取 Gmail 辅助命令。
- 在重置会话时保存内存快照
- 保留命令的审计轨迹,以用于故障排除或合规性
- 在会话开始或结束时触发后续自动化
- 在事件触发时将文件写入代理工作区或调用外部 API
概述
钩子系统使您能够:- 在发出
/new时将会话上下文保存到内存中 - 记录所有命令以进行审计
- 在代理生命周期事件上触发自定义自动化
- 扩展 OpenClaw 的行为而无需修改核心代码
开始使用
内置钩子
OpenClaw自带四个内置钩子,这些钩子会自动发现:- 💾 session-memory:在您发出
/new时,将会话上下文保存到您的代理工作区(默认~/.openclaw/workspace/memory/) - 📝 command-logger:将所有命令事件记录到
~/.openclaw/logs/commands.log - 🚀 boot-md:在网关启动时运行
BOOT.md(需要启用内部钩子) - 😈 soul-evil:在清除窗口期间或随机情况下,将注入的
SOUL.md内容替换为SOUL_EVIL.md
入门指南
在上手过程中 (openclaw onboard),系统会提示您启用推荐的钩子。向导会自动检测符合条件的钩子,并将其呈现在您面前供您选择。
挂钩发现
钩子会从三个目录中自动发现(按优先级顺序):- 工作区钩子:
<workspace>/hooks/(每个代理专用,优先级最高) - 托管钩子:
~/.openclaw/hooks/(用户安装,跨工作区共享) - 内置钩子:
<openclaw>/dist/hooks/bundled/(随 OpenClaw 提供)
钩子包(npm/存档)
钩子包是标准 npm 包,通过openclaw.hooks 在 package.json 中导出一个或多个钩子。使用以下命令安装它们:
package.json:
HOOK.md 和 handler.ts(或 index.ts)的钩子目录。钩子包可以携带依赖项;这些依赖项将被安装在 ~/.openclaw/hooks/<id> 下。
钩子结构
__HEADING_0__HOOK.md 格式HOOK.md 文件包含 YAML 前言中的元数据以及 Markdown 文档:
元数据字段
metadata.openclaw 对象支持:
emoji:用于 CLI 的显示表情符号(例如"💾")events:要监听的事件数组(例如["command:new", "command:reset"])export:要使用的命名导出(默认为"default")homepage:文档 URLrequires:可选要求bins:PATH 上所需的二进制文件(例如["git", "node"])anyBins:必须存在这些二进制文件中的至少一个env:所需的环境变量config:所需的配置路径(例如["workspace.dir"])os:所需的平台(例如["darwin", "linux"])
always:绕过资格检查(布尔值)install:安装方法(对于内置钩子:[{"id":"bundled","kind":"bundled"}])
处理程序实现
handler.ts 文件导出一个 HookHandler 函数:
事件上下文
每个事件包括:事件类型
命令事件
在代理命令发出时触发:command:所有命令事件(通用监听器)command:new:当/new命令发出时command:reset:当/reset命令发出时command:stop:当/stop命令发出时
代理事件
agent:bootstrap:在工作区引导文件注入之前(钩子可能会改变context.bootstrapFiles)
网关事件
在网关启动时触发:gateway:startup:在通道启动并加载钩子之后
工具结果钩子(插件 API)
这些钩子不是事件流监听器;它们允许插件在 OpenClaw 将工具结果持久化之前同步调整工具结果。tool_result_persist:在工具结果写入会话记录之前对其进行转换。必须是同步的;返回更新的工具结果负载或undefined以保持原样。请参阅 代理循环。
未来事件
计划中的事件类型:session:start:新会话开始时session:end:会话结束时agent:error:代理遇到错误时message:sent:发送消息时message:received:接收消息时
创建自定义钩子
1. 选择位置
- 工作区钩子 (
<workspace>/hooks/):每个代理专用,优先级最高 - 托管钩子 (
~/.openclaw/hooks/):跨工作区共享
2. 创建目录结构
3. 创建 HOOK.md
4. 创建 handler.ts
5. 启用并测试
配置
新配置格式(推荐)
每个钩子的配置
钩子可以有自定义配置:附加目录
从额外目录加载钩子:旧版配置格式(仍受支持)
旧版配置格式仍可用于向后兼容:列出钩子
钩子信息
资格审查
启用/禁用
内置钩子
会话内存
在您发出/new 时,将会话上下文保存到内存中。
事件:command:new
要求:必须配置 workspace.dir
输出:<workspace>/memory/YYYY-MM-DD-slug.md(默认为 ~/.openclaw/workspace)
它做什么:
- 使用重置前的会话条目来查找正确的会话记录
- 提取最后15行对话
- 使用大语言模型生成描述性的文件名摘要
- 将会话元数据保存到带有日期的内存文件中
2026-01-16-vendor-pitch.md2026-01-16-api-design.md2026-01-16-1430.md(如果 slug 生成失败,则使用回退时间戳)
命令记录器
将所有命令事件记录到中央审计文件中。 事件:command
要求:无
输出:~/.openclaw/logs/commands.log
它做什么:
- 捕获事件详情(包括命令动作、时间戳、会话密钥、发件人ID和来源)
- 以JSONL格式追加到日志文件中
- 在后台静默运行
灵魂之恶
在清除窗口期间或随机情况下,将注入的SOUL.md 内容替换为 SOUL_EVIL.md。
事件:agent:bootstrap
文档:灵魂邪恶钩爪
输出:不写入任何文件;交换仅在内存中进行。
启用:
启动-md
在网关启动时(在通道启动后)运行BOOT.md。必须启用内部钩子才能运行。
事件:gateway:startup
要求:必须配置 workspace.dir
它做什么:
- 从您的工作区读取
BOOT.md - 通过代理运行器执行指令
- 通过消息工具发送任何请求的出站消息
最佳实践
保持处理程序快速
钩子在命令处理期间运行。请保持它们轻量:优雅地处理错误
始终包装有风险的操作:尽早过滤事件
如果事件不相关,尽早返回:使用特定的事件键
在可能的情况下,在元数据中指定确切的事件:调试
启用钩子日志记录
网关在启动时记录钩子加载情况:检查发现
列出所有已发现的钩子:检查注册
在您的处理程序中,记录何时被调用:资格验证
检查为什么某个钩子不符合资格:测试
网关日志
监控网关日志以查看钩子的执行情况:直接测试钩子
单独测试您的处理程序:架构
核心组件
src/hooks/types.ts:类型定义src/hooks/workspace.ts:目录扫描和加载src/hooks/frontmatter.ts:解析 HOOK.md 元数据src/hooks/config.ts:资格检查src/hooks/hooks-status.ts:状态报告src/hooks/loader.ts:动态模块加载器src/cli/hooks-cli.ts:CLI 命令src/gateway/server-startup.ts:在网关启动时加载钩子src/auto-reply/reply/commands-core.ts:触发命令事件
发现流程
事件流程
未发现钩子
-
检查目录结构:
-
验证 HOOK.md 格式:
-
列出所有已发现的钩子:
钩子未符合资格
检查要求:- 二进制文件(检查PATH)
- 环境变量
- 配置值
- 操作系统兼容性
钩子未执行
-
验证钩子是否已启用:
- 重启网关进程,以便重新加载钩子。
-
检查网关日志以查找错误:
处理程序错误
检查 TypeScript/导入错误:迁移指南
从旧版配置到发现
之前:-
创建钩子目录:
-
创建 HOOK.md:
-
更新配置:
-
验证并重启网关进程:
- 自动发现
- CLI 管理
- 资格检查
- 更完善的文档
- 一致的结构