Hooks
Hooks 提供了一个可扩展的事件驱动系统,用于响应代理命令和事件来自动执行操作。Hooks 会从指定目录中自动发现,并且可以通过 CLI 命令进行管理,工作方式类似于 OpenClaw 中的技能(skills)。入门导览
Hooks 是在某些事件发生时运行的小脚本。主要有两种类型:- Hooks(本页内容):当代理事件触发时,在网关内部运行,例如
/new、/reset、/stop或生命周期事件。 - Webhooks:外部 HTTP webhook,允许其他系统触发 OpenClaw 中的工作。参见 Webhook Hooks 或使用
openclaw webhooks获取 Gmail 辅助命令。
- 在重置会话时保存内存快照
- 记录命令审计跟踪以便排错或合规
- 会话开始或结束时触发后续自动化
- 事件触发时写入代理工作区文件或调用外部 API
概览
Hooks 系统允许您:- 在执行
/new时保存会话上下文到内存 - 记录所有命令以便审计
- 在代理生命周期事件时触发自定义自动化
- 无需修改核心代码即可扩展 OpenClaw 行为
快速开始
内置 Hooks
OpenClaw 自带四个自动发现的内置 hooks:- 💾 session-memory:当执行
/new时将会话上下文保存到代理工作区(默认目录~/.openclaw/workspace/memory/) - 📎 bootstrap-extra-files:在
agent:bootstrap期间,从配置的 glob/path 模式注入额外的工作区启动文件 - 📝 command-logger:将所有命令事件记录到
~/.openclaw/logs/commands.log - 🚀 boot-md:网关启动时运行
BOOT.md(需启用内部 hooks)
上手引导
在执行openclaw onboard 期间,系统会提示您启用推荐的 hooks。向导自动发现匹配的 hooks 并供您选择。
Hook 发现机制
Hooks 会自动从三个目录中发现(优先级按顺序):- 工作区 hooks:
<workspace>/hooks/(每代理独有,优先级最高) - 管理 hooks:
~/.openclaw/hooks/(用户安装的,跨工作区共享) - 内置 hooks:
<openclaw>/dist/hooks/bundled/(OpenClaw 自带)
Hook 包(npm/归档)
Hook 包是标准的 npm 包,通过package.json 中的 openclaw.hooks 字段导出一个或多个 hooks。安装命令:
@latest 会走稳定线路。如果 npm 解析到预发布版本,OpenClaw 会停止并要求您显式通过预发布标签(如 @beta、@rc)或精确预发布版本进行选择。
示例 package.json:
HOOK.md 和 handler.ts(或 index.ts)的 hook 目录。Hook 包可包含依赖,安装后放置于 ~/.openclaw/hooks/<id> 下。每个 openclaw.hooks 条目必须解析后的路径位于包目录内,超出将被拒绝。
安全提示:openclaw hooks install 使用 npm install --ignore-scripts 安装依赖(不执行生命周期脚本)。保持 hook 包依赖树为“纯 JS/TS”,避免依赖使用 postinstall 构建的包。
Hook 结构
HOOK.md 格式
HOOK.md 文件包含 YAML Frontmatter 的元数据和 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:安装方式(内置 hooks 为[{"id":"bundled","kind":"bundled"}])
处理器实现
handler.ts 文件导出一个 HookHandler 函数:
事件上下文
每个事件包含:事件类型
命令事件
代理命令发出时触发:command:所有命令事件(通用侦听)command:new:发出/new命令时command:reset:发出/reset命令时command:stop:发出/stop命令时
会话事件
session:compact:before:压缩历史摘要之前session:compact:after:压缩完成,含摘要元数据
type: "session",action: "compact:before"/compact:after 发送以上事件,订阅时使用复合键。使用时注册 session:compact:before 和 session:compact:after。
代理事件
agent:bootstrap:在注入工作区 bootstrap 文件之前(hooks 可变更context.bootstrapFiles)
网关事件
网关启动时触发:gateway:startup:频道启动及 hooks 加载后
消息事件
收发消息时触发:message:所有消息事件(通用监听)message:received:收取任一渠道入站消息。触发时处于早期处理,媒体还未解析,内容可能包含<media:audio>等原始占位符。message:transcribed:消息已全解析(包含音频转录和链接理解)。可通过transcript获取音频转录文本。需要使用音频转录内容时使用此 hook。message:preprocessed:所有媒体和链接解析完毕后触发,提供最终的丰富内容(转录、图片描述、链接摘要),在代理看到消息之前。message:sent:出站消息发送成功时
消息事件上下文
消息事件包含丰富上下文:示例:消息记录器 Hook
工具结果 Hooks(插件 API)
这类 hooks 不是事件流监听器,而是让插件同步修改工具结果,在 OpenClaw 持久化到会话之前。tool_result_persist:修改工具结果,必须是同步函数;返回更新后的结果或undefined保持不变。详见 Agent Loop。
插件 Hook 事件
压缩生命周期钩子,通过插件 hook 运行器暴露:before_compaction:压缩前,带计数与 token 元数据after_compaction:压缩后,含压缩摘要元数据
未来事件
计划支持的事件类型:session:start:新会话开始时session:end:会话结束时agent:error:代理遇到错误时
创建自定义 Hooks
1. 选择位置
- 工作区 hooks(
<workspace>/hooks/):每代理独享,优先级最高 - 管理 hooks(
~/.openclaw/hooks/):跨工作区共享
2. 创建目录结构
3. 创建 HOOK.md
4. 创建 handler.ts
5. 启用并测试
配置
新配置格式(推荐)
针对某个 Hook 的配置
额外目录加载
从其他目录加载 hooks:旧配置格式(仍支持)
旧格式为兼容性保留,依然有效:module 必须为工作区内相对路径。绝对路径和跳出工作区目录均被拒绝。
迁移建议:新 hook 使用基于发现机制。旧 handler 会在目录钩子后加载。
CLI 命令
列出 Hooks
查看 Hook 信息
检查条件
启用 / 禁用
内置 Hook 参考
session-memory
执行/new 时保存会话上下文到内存。
事件:command:new
需求:必须配置 workspace.dir
输出:<workspace>/memory/YYYY-MM-DD-slug.md(默认 ~/.openclaw/workspace)
功能说明:
- 利用重置前的会话条目定位对应的会话记录
- 抽取最后 15 行对话
- 通过 LLM 生成描述性文件名 slug
- 将会话元数据保存为日期命名的 memory 文件
2026-01-16-vendor-pitch.md2026-01-16-api-design.md2026-01-16-1430.md(slug 生成失败时回退的时间戳名)
bootstrap-extra-files
在agent:bootstrap 阶段注入额外的启动文件(例如 monorepo 本地的 AGENTS.md / TOOLS.md)。
事件:agent:bootstrap
需求:必须配置 workspace.dir
输出:不写文件,仅修改内存中的启动上下文
配置示例:
- 路径相对于工作区解析
- 文件必须位于工作区内(经过实际路径验证)
- 仅加载认可的启动文件名
- 子代理白名单仍生效(仅
AGENTS.md和TOOLS.md)
command-logger
将所有命令事件记录到集中审计文件。 事件:command
需求:无
输出:~/.openclaw/logs/commands.log
功能说明:
- 捕获事件细节(命令动作、时间戳、会话键、发送者 ID、来源)
- 以 JSONL 格式追加到日志文件
- 静默且后台运行
boot-md
网关启动时(频道启动后)执行BOOT.md。需启用内部 hooks。
事件:gateway:startup
需求:必须配置 workspace.dir
功能说明:
- 从工作区读取
BOOT.md - 通过代理运行器执行指令
- 使用消息工具发送请求的出站消息
最佳实践
保持处理器快速
Hooks 在命令处理中执行,保持轻量:优雅处理错误
确保包裹高风险操作:提前过滤事件
事件不相关时尽早返回:指定精确事件键
元数据中尽量指定具体事件:调试
启用 Hook 日志
网关启动时显示 hook 加载日志:检查发现情况
列出所有发现的 hooks:检查注册
在处理器中打印调用日志:校验资格
查看不合格原因:测试
监控网关日志
观察 hook 执行情况:独立测试 Hooks
直接测试处理器:架构
核心组件
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:网关启动时加载 hookssrc/auto-reply/reply/commands-core.ts:触发命令事件
发现流程
事件流程
故障排查
Hook 未被发现
-
检查目录结构:
-
验证 HOOK.md 格式:
-
列出所有已发现的 hook:
Hook 不合格
检查需求:- 二进制程序(检查 PATH)
- 环境变量
- 配置
- OS 兼容性
Hook 不执行
-
确认 hook 已启用:
- 重启网关进程以重新加载 hook。
-
查看网关日志是否有错误:
处理器错误
检查 TypeScript 或导入错误:迁移指南
从旧配置迁移到发现机制
旧配置示例:-
创建 hook 目录:
-
创建 HOOK.md:
-
更新配置:
-
验证并重启网关:
- 自动发现
- CLI 管理
- 资格检查
- 更好的文档支持
- 结构一致