Hooks
Hooks 提供了一个可扩展的事件驱动系统,用于在响应智能体命令和事件时自动执行操作。Hooks 会从目录中自动发现,并且可以通过 CLI 命令进行管理,方式与 OpenClaw 中的 Skills 类似。
熟悉基础
Hooks 是在某些事情发生时运行的小脚本。它们有两种类型:
- Hooks(本页):当智能体事件触发时,在 Gateway 网关内运行,例如
/new、/reset、/stop或生命周期事件。 - Webhooks:外部 HTTP webhook,可让其他系统在 OpenClaw 中触发工作。请参阅 Webhook Hooks,或使用
openclaw webhooks获取 Gmail 辅助命令。
Hooks 也可以打包在插件中;请参阅 Plugins。
常见用途:
- 当你重置会话时保存一份内存快照
- 为故障排除或合规保留命令审计轨迹
- 当会话开始或结束时触发后续自动化
- 当事件触发时,将文件写入智能体工作区或调用外部 API
如果你会写一个小型 TypeScript 函数,你就能编写一个 hook。Hooks 会被自动发现,你可以通过 CLI 启用或禁用它们。
概览
Hooks 系统允许你:
- 当发出
/new时,将会话上下文保存到 memory - 记录所有命令以供审计
- 在智能体生命周期事件上触发自定义自动化
- 在不修改核心代码的情况下扩展 OpenClaw 的行为
入门指南
内置 Hooks
OpenClaw 自带四个会被自动发现的内置 hook:
- 💾 session-memory:当你发出
/new时,将会话上下文保存到你的智能体工作区(默认是~/.openclaw/workspace/memory/) - 📎 bootstrap-extra-files:在
agent:bootstrap期间,从已配置的 glob/路径模式中注入额外的工作区引导文件 - 📝 command-logger:将所有命令事件记录到
~/.openclaw/logs/commands.log - 🚀 boot-md:当 Gateway 网关启动时运行
BOOT.md(需要启用内部 hooks)
列出可用 hooks:
openclaw hooks list
启用一个 hook:
openclaw hooks enable session-memory
检查 hook 状态:
openclaw hooks check
获取详细信息:
openclaw hooks info session-memory
新手引导
在新手引导期间(openclaw onboard),系统会提示你启用推荐的 hooks。向导会自动发现符合条件的 hooks 并供你选择。
Hook 发现
Hooks 会从三个目录中自动发现(按优先级顺序):
- 工作区 hooks:
<workspace>/hooks/(每个智能体单独配置,优先级最高) - 托管 hooks:
~/.openclaw/hooks/(用户安装,在各工作区之间共享) - 内置 hooks:
<openclaw>/dist/hooks/bundled/(随 OpenClaw 一起提供)
托管 hook 目录既可以是 单个 hook,也可以是 hook 包(包目录)。
每个 hook 都是一个包含以下内容的目录:
my-hook/
├── HOOK.md # 元数据 + 文档
└── handler.ts # 处理器实现
Hook 包(npm/归档)
Hook 包是标准的 npm 包,它们通过 package.json 中的 openclaw.hooks 导出一个或多个 hook。使用以下命令安装它们:
openclaw hooks install <path-or-spec>
npm spec 仅支持注册表形式(包名 + 可选的精确版本或 dist-tag)。 Git/URL/file spec 和 semver 范围会被拒绝。
裸 spec 和 @latest 会保持在稳定轨道上。如果 npm 将其中任意一种解析为预发布版本,OpenClaw 会停止并要求你通过预发布标签(例如 @beta/@rc)或精确的预发布版本显式选择加入。
package.json 示例:
{
"name": "@acme/my-hooks",
"version": "0.1.0",
"openclaw": {
"hooks": ["./hooks/my-hook", "./hooks/other-hook"]
}
}
每个条目都指向一个包含 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 文档:
---
name: my-hook
description: "关于此 hook 功能的简短描述"
homepage: https://docs.openclaw.ai/automation/hooks#my-hook
metadata:
{ "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---
# My Hook
详细文档写在这里……
## 它的作用
- 监听 `/new` 命令
- 执行某些操作
- 记录结果
## 要求
- 必须安装 Node.js
## 配置
无需配置。
元数据字段
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:绕过资格检查(布尔值)install:安装方式(对于内置 hooks:[{"id":"bundled","kind":"bundled"}])
处理器实现
handler.ts 文件会导出一个 HookHandler 函数:
const myHandler = async (event) => {
// 仅在 'new' 命令时触发
if (event.type !== "command" || event.action !== "new") {
return;
}
console.log(`[my-hook] New command triggered`);
console.log(` Session: ${event.sessionKey}`);
console.log(` Timestamp: ${event.timestamp.toISOString()}`);
// 你的自定义逻辑写在这里
// 可选:向用户发送消息
event.messages.push("✨ My hook executed!");
};
export default myHandler;
事件上下文
每个事件都包含:
{
type: 'command' | 'session' | 'agent' | 'gateway' | 'message',
action: string, // 例如 'new'、'reset'、'stop'、'received'、'sent'
sessionKey: string, // 会话标识符
timestamp: Date, // 事件发生时间
messages: string[], // 将消息推入这里以发送给用户
context: {
// 命令事件:
sessionEntry?: SessionEntry,
sessionId?: string,
sessionFile?: string,
commandSource?: string, // 例如 'whatsapp'、'telegram'
senderId?: string,
workspaceDir?: string,
bootstrapFiles?: WorkspaceBootstrapFile[],
cfg?: OpenClawConfig,
// 消息事件(完整详情见“消息事件”部分):
from?: string, // message:received
to?: string, // message:sent
content?: string,
channelId?: string,
success?: boolean, // message:sent
}
}
事件类型
命令事件
在发出智能体命令时触发:
command:所有命令事件(通用监听器)command:new:发出/new命令时command:reset:发出/reset命令时command:stop:发出/stop命令时