Hooks
Hooks 提供可扩展的事件驱动系统,用于响应 agent 命令与事件来自动化动作。Hooks 会从目录自动发现,并可通过 CLI 管理,类似 OpenClaw 的 skills。先弄清楚
Hooks 是在“某件事发生时”运行的小脚本。有两类:- Hooks(本页):在 Gateway 内运行,当 agent 事件触发,如
/new、/reset、/stop或生命周期事件。 - Webhooks:外部 HTTP webhook,用于让其它系统触发 OpenClaw 工作。见 Webhook Hooks 或用
openclaw webhooks获取 Gmail 辅助命令。
- 会话重置时保存记忆快照
- 记录命令审计轨迹以便排障/合规
- 会话开始或结束时触发后续自动化
- 事件触发时在 agent 工作区写文件或调用外部 API
概览
Hooks 系统允许你:- 当
/new触发时保存会话上下文到 memory - 记录所有命令以便审计
- 在 agent 生命周期事件上触发自定义自动化
- 无需修改核心代码即可扩展 OpenClaw 行为
快速开始
内置 Hooks
OpenClaw 自带四个 hooks,会自动发现:- 💾 session-memory:你发出
/new时,将会话上下文保存到 agent 工作区(默认~/.openclaw/workspace/memory/) - 📝 command-logger:将所有命令事件写入
~/.openclaw/logs/commands.log - 🚀 boot-md:gateway 启动时运行
BOOT.md(需启用内部 hooks) - 😈 soul-evil:在清洗窗口或随机概率下,将注入的
SOUL.md内容替换为SOUL_EVIL.md
Onboarding
在 onboarding(openclaw onboard)期间,会提示你启用推荐 hooks。向导会自动发现可用 hooks 并供你选择。
Hook 发现
Hooks 会从三个目录自动发现(按优先级):- 工作区 hooks:
<workspace>/hooks/(每 agent,最高优先级) - 托管 hooks:
~/.openclaw/hooks/(用户安装,跨工作区共享) - 内置 hooks:
<openclaw>/dist/hooks/bundled/(随 OpenClaw 发布)
Hook 包(npm/archives)
Hook 包是标准 npm 包,通过package.json 中的 openclaw.hooks 导出一个或多个 hook。用下面命令安装:
package.json:
HOOK.md 与 handler.ts(或 index.ts)。Hook 包可携带依赖,会安装到 ~/.openclaw/hooks/<id>。
Hook 结构
HOOK.md 格式
HOOK.md 文件包含 YAML frontmatter 元数据 + Markdown 文档:
元数据字段
metadata.openclaw 对象支持:
emoji:CLI 显示用 emoji(例如"💾")events:要监听的事件数组(例如['command:new', 'command:reset'])export:使用的命名导出(默认为"default")homepage:文档 URLrequires:可选要求bins:PATH 上必须存在的可执行文件(例如['git', 'node'])anyBins:至少存在这些二进制之一env:需要的环境变量config:需要的配置路径(例如['workspace.dir'])os:需要的平台(例如['darwin', 'linux'])
always:跳过资格检查(boolean)install:安装方式(对内置 hooks:[{"id":"bundled","kind":"bundled"}])
Handler 实现
handler.ts 导出一个 HookHandler 函数:
事件上下文
每个事件包含:事件类型
Command 事件
当 agent 命令被触发:command:所有命令事件(通用监听)command:new:发出/new时command:reset:发出/reset时command:stop:发出/stop时
Agent 事件
agent:bootstrap:工作区 bootstrap 文件注入前(hooks 可修改context.bootstrapFiles)
Gateway 事件
Gateway 启动时触发:gateway:startup:频道启动且 hooks 加载后
Tool Result Hooks(插件 API)
这些 hooks 不是事件流监听器;它们让插件在 OpenClaw 持久化前同步调整工具结果。tool_result_persist:在写入会话转录前转换工具结果。必须同步;返回更新后的 payload,或返回undefined以保持原样。见 Agent Loop。
未来事件
计划中的事件类型:session:start:新会话开始session:end:会话结束agent:error:agent 出错message:sent:消息发送message:received:消息接收
创建自定义 Hooks
1. 选择位置
- 工作区 hooks(
<workspace>/hooks/):每 agent,最高优先级 - 托管 hooks(
~/.openclaw/hooks/):跨工作区共享
2. 创建目录结构
3. 创建 HOOK.md
4. 创建 handler.ts
5. 启用并测试
配置
新配置格式(推荐)
单 hook 配置
Hooks 可以有自定义配置:额外目录
从额外目录加载 hooks:旧配置格式(仍支持)
旧格式为兼容保留:CLI 命令
列出 Hooks
Hook 信息
资格检查
启用/禁用
内置 Hooks
session-memory
发出/new 时保存会话上下文到 memory。
事件: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 生成失败则回退为时间戳)
command-logger
将所有命令事件记录到集中审计文件。 事件:command
要求:无
输出:~/.openclaw/logs/commands.log
行为:
- 捕获事件详情(命令动作、时间戳、会话 key、发件人 ID、来源)
- 以 JSONL 格式追加日志
- 后台静默运行
soul-evil
在清洗窗口或随机概率下,将注入的SOUL.md 内容替换为 SOUL_EVIL.md。
事件:agent:bootstrap
文档:SOUL Evil Hook
输出:不写文件;仅内存内替换。
启用:
boot-md
gateway 启动时运行BOOT.md(频道启动后)。
需要启用内部 hooks。
事件:gateway:startup
要求:必须配置 workspace.dir
行为:
- 从工作区读取
BOOT.md - 通过 agent runner 执行指令
- 通过消息工具发送任何需要的外发消息
最佳实践
处理器保持轻量
Hooks 运行在命令处理期间。保持轻量:优雅处理错误
总是包裹可能失败的操作:早过滤事件
若事件不相关,尽早返回:使用更具体的事件 key
尽可能在 metadata 中指定精确事件:调试
启用 Hook 日志
gateway 启动时会记录 hook 加载:检查发现
列出所有已发现 hooks:检查注册
在 handler 中记录调用:验证资格
检查为何 hook 不可用:测试
Gateway 日志
监控 gateway 日志以查看 hook 执行:直接测试 Hooks
在隔离环境中测试 handler:架构
核心组件
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:gateway 启动时加载 hookssrc/auto-reply/reply/commands-core.ts:触发命令事件
发现流程
事件流
故障排查
Hook 未发现
-
检查目录结构:
-
验证 HOOK.md 格式:
-
列出所有已发现 hooks:
Hook 不具备资格
检查要求:- 二进制(检查 PATH)
- 环境变量
- 配置值
- OS 兼容性
Hook 未执行
-
确认 hook 已启用:
- 重启 gateway 进程以重新加载 hooks。
-
检查 gateway 日志是否有错误:
Handler 错误
检查 TypeScript/import 错误:迁移指南
从旧配置迁移到发现式
Before:-
创建 hook 目录:
-
创建 HOOK.md:
-
更新配置:
-
验证并重启 gateway 进程:
- 自动发现
- CLI 管理
- 资格检查
- 更好的文档
- 一致的结构