生成模型 :Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗 :输入 ~220k tokens,输出 ~5k tokens(本节)
Cron 系统让 Agent 可以按时间计划执行任务。但有些场景不是按时间触发的——“收到一封新邮件时自动处理”、“外部系统发来 Webhook 时触发 Agent”。这一节看看 OpenClaw 的 Webhook 触发器和 Gmail Pub/Sub 集成是怎么做的。
26.3.1 Webhook 触发器
概念:HTTP 触发的 Agent 执行
Webhook 允许外部系统通过 HTTP 请求触发 Agent 执行。例如:
GitHub 推送代码时通知 Agent 执行代码审查
OpenClaw 在 Gateway 的 HTTP 层提供 Webhook 端点,路径默认为 /hooks。
Webhook 需要在配置文件中显式启用:
Copy hooks :
enabled : true
token : " my-secret-webhook-token " # 必须设置
path : " /hooks " # 默认值
maxBodyBytes : 262144 # 256KB,默认值 认证支持三种方式:
Webhook 支持两种触发模式:
Wake 模式直接向主会话注入一条系统事件文本,类似 Cron 的主会话模式。
Agent 模式:启动隔离 Agent
Agent 模式复用了 Cron 的隔离执行基础设施——它构造一个临时的 CronJob 对象,然后调用 runCronIsolatedAgentTurn 执行。Cron 和 Webhook 共享同一套执行引擎 ,区别仅在于触发方式,这是 OpenClaw 里一个很典型的设计取向。
注意安全措施:超过 maxBodyBytes 时立即 req.destroy() 断开连接,防止大负载耗尽内存。
26.3.2 Gmail Pub/Sub 邮件钩子(src/hooks/gmail.ts)
Gmail Pub/Sub 集成让 Agent 可以在收到新邮件时自动处理 ——例如自动回复、归档分类、提取关键信息等。
它的工作原理:
衍生解释——Google Cloud Pub/Sub :Pub/Sub(Publish/Subscribe)是 Google Cloud 的消息队列服务。Gmail API 允许通过 Pub/Sub 监听邮箱变更——当有新邮件时,Google 会向你指定的 HTTPS 端点发送一个推送通知(包含邮件的 historyId)。OpenClaw 监听这个推送,然后通过 Gmail API 获取邮件内容。
Gmail 推送需要一个可访问的 HTTPS URL。OpenClaw 默认使用本地 Gateway 地址:
由于 Google Pub/Sub 要求 HTTPS 端点,本地开发时需要通过 Tailscale Funnel 或类似的隧道服务将本地端口暴露为公网 HTTPS 地址。Gmail 配置中的 tailscale 字段就是为此设计的。
Gmail 集成涉及两个令牌:
hooks.token ——Gateway 的 Webhook 认证令牌
hooks.gmail.pushToken ——Pub/Sub 推送验证令牌
安全审计模块(src/security/audit-extra.ts)会检查:
hooks.token 是否与 Gateway 认证令牌重复(重复会增大攻击面)
hooks.path 是否为 "/"(会遮蔽其他 HTTP 端点)
26.3.3 钩子系统总览(src/hooks/hooks.ts)
OpenClaw 有两套"钩子"系统,容易混淆:
前面讨论的是外部钩子。内部钩子是另一套系统——它允许开发者在 Agent 的生命周期中注入自定义逻辑。
src/hooks/hooks.ts 是内部钩子系统的入口,它重新导出 internal-hooks.ts 的所有功能:
内部钩子通过事件注册和触发工作:
OpenClaw 自带几个内置钩子(位于 src/hooks/bundled/):
内部钩子的启用需要配置:
加载过程在 Gateway 启动时执行(src/hooks/loader.ts),扫描以下位置:
内置钩子目录 ——src/hooks/bundled/(随 OpenClaw 分发)
管理目录 ——~/.openclaw/hooks/(通过 openclaw hooks install 安装)
工作区钩子 ——<workspace>/hooks/(项目级钩子)
额外目录 ——hooks.internal.load.extraDirs 配置的自定义路径
每个钩子目录必须包含一个 HOOK.md 前置数据文件(描述钩子的元数据)和一个 handler.ts/handler.js 处理函数。
Cron、Webhook 和内部钩子的关系
三者的关系:
Cron 和 Webhook 是不同的触发源 ,但共享同一个 Agent 执行引擎
内部钩子 是 Agent 运行时的扩展点 ,无论 Agent 被 Cron、Webhook 还是用户消息触发,内部钩子都会在相应的生命周期点执行
Webhook 通过 HTTP 端点(默认 /hooks)接收外部请求,支持 Bearer Token、自定义头、查询参数三种认证方式
Webhook 有两种模式:Wake (注入系统事件到主会话)和 Agent (启动隔离 Agent 执行)
Agent 模式复用 Cron 的隔离执行基础设施——构造临时 CronJob 对象调用 runCronIsolatedAgentTurn
Gmail Pub/Sub 集成让 Agent 在收到新邮件时自动处理,通过 Google Cloud Pub/Sub 推送通知实现
Gmail 集成需要 HTTPS 端点,本地开发可通过 Tailscale Funnel 暴露
内部钩子 是另一套系统——Agent 生命周期扩展点,支持 session:new、agent:bootstrap 等事件
内置钩子包括会话记忆(session-memory)、命令日志(command-logger)等
Cron、Webhook 和内部钩子三者互补:Cron/Webhook 是触发源,内部钩子是 Agent 运行时的扩展点