自动化
钩子
钩子提供了一个可扩展的事件驱动系统,用于在响应智能体(agent)命令和事件时自动执行操作。钩子会自动从目录中发现,并可以通过 CLI 命令进行管理,类似于 OpenClaw 中技能的工作方式。
快速了解
钩子是当某些事件发生时运行的小脚本。有两种类型:
- 钩子(本页面):当智能体(agent)事件触发时在网关内部运行,例如
/new、/reset、/stop或生命周期事件。 - Webhooks:外部 HTTP webhook,允许其他系统在 OpenClaw 中触发工作。请参阅 Webhook 钩子 或使用
openclaw webhooks获取 Gmail 辅助命令。
钩子也可以捆绑在插件内部;请参阅 插件。常见用途:
- 重置会话时保存记忆快照
- 保留命令的审计跟踪以进行故障排除或合规性检查
- 会话开始或结束时触发后续自动化
- 事件触发时将文件写入代理工作区或调用外部 API
如果你能编写一个小的 TypeScript 函数,你就能编写一个钩子。钩子会被自动发现,你可以通过 CLI 启用或禁用它们。
概述
钩子系统允许你:
- 发出
/new命令时将会话上下文保存到记忆 - 记录所有命令以供审计
- 在智能体(agent)生命周期事件上触发自定义自动化
- 无需修改核心代码即可扩展 OpenClaw 的行为
开始使用
捆绑的钩子
OpenClaw 附带了四个捆绑的钩子,它们会被自动发现:
- 💾 session-memory:当你发出
/new时,将会话上下文保存到你的智能体(agent)工作区(默认~/.openclaw/workspace/memory/) - 📎 bootstrap-extra-files:在
agent:bootstrap期间,从配置的 glob/路径模式注入额外的工作区引导文件 - 📝 command-logger:将所有命令事件记录到
~/.openclaw/logs/commands.log - 🚀 boot-md:网关(Gateway)启动时运行
BOOT.md(需要启用内部钩子)
列出可用钩子:
openclaw hooks list
启用一个钩子:
openclaw hooks enable session-memory
检查钩子状态:
openclaw hooks check
获取详细信息:
openclaw hooks info session-memory
入门引导
在入门引导期间(openclaw onboard),系统会提示你启用推荐的钩子。向导会自动发现符合条件的钩子并呈现供你选择。
钩子发现
钩子会自动从三个目录中发现(按优先级顺序):
- 工作区钩子:
/hooks/(每个智能体,最高优先级) - 托管钩子:
~/.openclaw/hooks/(用户安装,跨工作区共享) - 捆绑钩子:
/dist/hooks/bundled/(随 OpenClaw 一起提供)
托管钩子目录可以是单个钩子或钩子包(包目录)。每个钩子是一个包含以下内容的目录:
my-hook/
├── HOOK.md # 元数据 + 文档
└── handler.ts # 处理器实现
钩子包 (npm/归档文件)
钩子包是标准的 npm 包,通过 package.json 中的 openclaw.hooks 导出一个或多个钩子。使用以下命令安装它们:
openclaw hooks install <path-or-spec>
Npm 规范仅限注册表(包名 + 可选的确切版本或分发标签)。Git/URL/文件规范和 semver 范围会被拒绝。裸规范和 @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)的钩子目录。钩子包可以附带依赖项;它们将被安装在 ~/.openclaw/hooks/ 下。每个 openclaw.hooks 条目在符号链接解析后必须保留在包目录内;逃逸的条目会被拒绝。安全说明:openclaw hooks install 使用 npm install --ignore-scripts 安装依赖项(无生命周期脚本)。保持钩子包依赖树为“纯 JS/TS”,避免依赖 postinstall 构建的包。
钩子结构
HOOK.md 格式
HOOK.md 文件包含 YAML 前言中的元数据以及 Markdown 文档:
---
name: my-hook
description: "此钩子功能的简短 描述"
homepage: https://docs.openclaw.ai/automation/hooks#my-hook
metadata:
{ "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---
# 我的钩子
详细文档放在这里...
## 功能
- 监听 `/new` 命令
- 执行某些操作
- 记录结果
## 要求
- 必须安装 Node.js
## 配置
无需配置。
元数据字段
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 函数:
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
}
}