一、前言:为什么你的 AI 助手总是"被动"?
你有没有这样的经历:
早上打开电脑,才发现昨晚有重要邮件没处理
开会前 5 分钟,突然想起有个日程忘了准备
模型 API 额度用完了,跑了一半的任务报错
Git 仓库好久没同步,代码冲突一堆
问题不在你,而在你的 AI 助手太"被动"。
它只会等你下指令,不会主动检查、主动提醒、主动执行。就像个只会听命令的机器人,而不是真正懂你的数字助手。
今天这篇文章,我要帮你把 OpenClaw 从"被动响应"升级成"主动服务"。
学完你能做到:
✅ 让 AI 每天自动检查邮件和日历
✅ 设置定时任务监控模型额度
✅ 自动同步 Git 仓库状态
✅ 创建周期性提醒(喝水/休息/日报)
✅ 理解心跳与 Cron 的区别,合理选择
这是 OpenClaw 系列第 4 篇,建议先阅读前 3 篇:
001 | OpenClaw 深度测评
002 | OpenClaw 安装配置完全指南
003 | OpenClaw 记忆系统详解
二、心跳机制:让 AI 学会"主动关心"
2.1 什么是心跳?
想象一下,你有个贴心的助理,每隔几小时就来问一次:
"老板,有什么需要我检查的吗?邮箱?日历?天气?"
这就是心跳机制——AI 定期"醒过来",主动检查你关心的事情。
在 OpenClaw 中,心跳通过 HEARTBEAT.md 文件配置。当系统发送心跳 poll 时,AI 会读取这个文件,执行指定的检查任务。
2.2 心跳 vs Cron:什么时候用哪个?
这是很多人容易混淆的点。先说结论:
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 多个检查可以批量执行 | 心跳 | 一次唤醒,多项检查,省 token |
| 需要精确时间(如 9:00 整) | Cron | 心跳时间会漂移 |
| 需要结合最近聊天上下文 | 心跳 | 心跳在主会话,有上下文 |
| 任务需要隔离执行 | Cron | Cron 可创建独立子会话 |
| 简单提醒(如"喝水") | Cron | 轻量,不占主会话 |
| 复杂检查(邮件 + 日历 + 天气) | 心跳 | 可组合多项检查 |
经验法则:
心跳 = "定期检查多项事务"
Cron = "精确时间执行单一任务"
2.3 HEARTBEAT.md 配置详解
先看看默认的心跳文件内容:
# HEARTBEAT.md# Keep this file empty (or with only comments) to skip heartbeat API calls.# Add tasks below when you want the agent to check something periodically.
默认是空的,这意味着心跳 poll 时 AI 会回复 HEARTBEAT_OK,不做任何事。
要启用心跳,你需要在文件中添加检查任务。例如:
# 心跳检查清单## 待办事项- [ ] 检查未读邮件(过去 4 小时)- [ ] 检查日历(未来 24 小时)- [ ] 检查天气(明天是否下雨)- [ ] 检查 Git 仓库状态## 注意事项- 晚上 23:00-08:00 保持安静,除非紧急- 如果人类正在忙碌,减少打扰- 有重要事项才主动通知,否则回复 HEARTBEAT_OK
关键点:
心跳检查是对话式的,AI 会理解你的意图
不需要写代码,用自然语言描述即可
AI 会记住上次检查时间,避免重复
可以在
memory/heartbeat-state.json追踪状态
2.4 心跳实战:配置你的第一个检查
让我们配置一个实用的心跳检查清单:
# HEARTBEAT.md - 尘风的日常检查## 每日检查(每 4-6 小时)### 工作相关- [ ] 邮箱:检查过去 4 小时的未读邮件,标记紧急的- [ ] 日历:检查未来 24 小时的会议,提前 2 小时提醒- [ ] Git:检查工作区仓库状态,有变更才通知### 生活相关- [ ] 天气:如果明天降雨概率>50%,提醒带伞- [ ] 空气:如果 AQI>100,提醒戴口罩### 项目监控- [ ] 公众号:检查新文章数据(阅读/收藏/转发)- [ ] 模型额度:检查各厂商剩余额度,低于 20% 预警## 静默规则- 23:00-08:00:除非紧急邮件,否则不通知- 如果人类连续 2 小时无操作,降低检查频率- 每次心跳先检查距离上次通知的时间,避免打扰## 通知策略- 重要事项:直接发消息通知- 一般事项:累积到下次心跳一起汇报- 无事项:回复 HEARTBEAT_OK(不显示给用户)
配置好后,AI 会在每次心跳时自动执行这些检查,有重要事项才通知你。
三、Cron 定时任务:精确控制执行时间
3.1 Cron 基础概念
Cron 是 Linux 传统的定时任务系统,OpenClaw 通过 cron 工具提供了类似功能。
Cron 表达式格式:
┌───── 分钟 (0-59)│ ┌───── 小时 (0-23)│ │ ┌───── 日期 (1-31)│ │ │ ┌───── 月份 (1-12)│ │ │ │ ┌───── 星期 (0-6, 0=周日)│ │ │ │ │* * * * *
常用示例:
| 表达式 | 含义 |
|---|---|
0 9 * * * | 每天早上 9:00 |
0 0 * * 1 | 每周一凌晨 0:00 |
*/30 * * * * | 每 30 分钟 |
0 8-20/2 * * * | 每天 8:00-20:00,每 2 小时 |
0 0 1 * * | 每月 1 号凌晨 0:00 |
3.2 OpenClaw Cron 任务类型
OpenClaw 的 Cron 支持两种任务类型:
类型 1:System Event(系统事件)
向主会话注入消息,适合提醒类任务:
{"name": "早晨提醒","schedule": {"kind": "cron","expr": "0 8 * * *","tz": "Asia/Shanghai" },"payload": {"kind": "systemEvent","text": "☀️ 早上好!今天是周二,记得参加 10:00 的团队会议。" },"sessionTarget": "main","enabled": true}
注意:sessionTarget: "main" 必须搭配 payload.kind: "systemEvent"。
类型 2:Agent Turn(代理执行)
创建独立会话执行任务,适合复杂任务:
{"name": "模型额度检查","schedule": {"kind": "cron","expr": "0 20 * * *","tz": "Asia/Shanghai" },"payload": {"kind": "agentTurn","message": "运行 scripts/check-quotas.ps1,更新 memory/model-quota-state.json,如果有额度低于 20% 的厂商,通知用户。","timeoutSeconds": 300 },"sessionTarget": "isolated","delivery": {"mode": "announce" },"enabled": true}
注意:sessionTarget: "isolated" 必须搭配 payload.kind: "agentTurn"。
3.3 创建 Cron 任务
使用 cron 工具的 add 动作创建任务:
# 通过 OpenClaw 内部调用(伪代码)cron action=add job={"name": "每日邮件检查","schedule": {"kind": "cron", "expr": "0 9 * * *", "tz": "Asia/Shanghai"},"payload": {"kind": "systemEvent", "text": "📬 提醒:检查昨日邮件"},"sessionTarget": "main","enabled": true}
在 OpenClaw 中,你可以通过自然语言让 AI 帮你创建:
"帮我创建一个每天早上 9 点的提醒,内容是'检查邮箱和日历'"
AI 会自动调用 cron add 创建任务。
3.4 管理 Cron 任务
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看任务 | cron list | 列出所有任务 |
| 查看禁用任务 | cron list includeDisabled=true | 包含已禁用的 |
| 立即执行 | cron run jobId=<id> | 手动触发一次 |
| 更新任务 | cron update jobId=<id> patch={...} | 修改配置 |
| 删除任务 | cron remove jobId=<id> | 永久删除 |
| 查看执行历史 | cron runs jobId=<id> | 查看过往执行记录 |
四、实战案例 1:每日邮件检查
4.1 需求分析
目标:每天早上 9:00 自动检查邮箱,汇总未读邮件。
检查内容:
过去 24 小时的未读邮件数量
标记为"紧急"的邮件(如老板/客户发来的)
包含关键词的邮件(如"紧急"/"会议"/"截止")
通知策略:
有紧急邮件:立即通知,列出标题和发件人
无紧急邮件:不通知(静默检查)
4.2 实现方案
由于 OpenClaw 本身不直接连接邮箱,我们需要借助外部工具:
方案 A:使用 IFTTT/Zapier webhook
在 IFTTT 创建规则:新邮件 → 发送 webhook
在 OpenClaw 创建 webhook 接收任务
收到 webhook 后,AI 汇总并通知
方案 B:使用本地脚本 + Cron
编写 PowerShell 脚本检查邮箱(通过 IMAP)
脚本输出未读邮件列表到文件
Cron 定时读取文件并通知
方案 C:使用 MCP Server(推荐)
配置 Gmail MCP Server
通过 mcporter skill 调用
AI 直接查询邮箱
这里展示方案 C的实现:
4.3 配置步骤
步骤 1:安装 Gmail MCP Server
npx -y @modelcontextprotocol/server-gmail步骤 2:配置 mcporter
在 TOOLS.md 添加:
### MCP Servers- Gmail: stdio 模式,命令 `npx -y @modelcontextprotocol/server-gmail`- 认证:OAuth 2.0,首次运行会打开浏览器授权
步骤 3:创建 Cron 任务
让 AI 帮你创建:
"创建一个每天早上 9 点的 Cron 任务,使用 Gmail MCP 检查未读邮件,如果有紧急邮件就通知我"
AI 会生成类似配置:
{"name": "每日邮件检查","schedule": {"kind": "cron","expr": "0 9 * * *","tz": "Asia/Shanghai"},"payload": {"kind": "agentTurn","message": "使用 mcporter 连接 Gmail MCP,查询过去 24 小时的未读邮件。筛选发件人包含'老板'或主题包含'紧急'的邮件。如果有,通知用户;如果没有,静默结束。","timeoutSeconds": 300},"sessionTarget": "isolated","delivery": {"mode": "announce"},"enabled": true}
4.4 测试与验证
创建后,立即手动执行一次:
cron run jobId=<任务 ID>检查输出是否符合预期,然后调整为正式配置。
五、实战案例 2:日历提醒
5.1 需求分析
目标:会议前 2 小时自动提醒,避免忘记准备。
检查内容:
未来 24 小时内的所有会议
会议时间、地点、参与人
是否需要准备材料
通知策略:
会议前 2 小时:发送提醒
会议前 30 分钟:再次提醒(可选)
无会议:不通知
5.2 实现方案
类似邮件检查,可以使用 Google Calendar MCP Server:
npx -y @modelcontextprotocol/server-google-calendar5.3 配置步骤
步骤 1:创建心跳检查
在 HEARTBEAT.md 添加:
- [ ] 日历:检查未来 24 小时的会议,提前 2 小时提醒步骤 2:创建 Cron 提醒
对于精确时间的提醒,使用 Cron 更合适:
{"name": "会议提醒检查","schedule": {"kind": "every","everyMs": 3600000 // 每小时检查一次},"payload": {"kind": "agentTurn","message": "使用 Google Calendar MCP 查询未来 2-2.5 小时内的会议。如果有,发送提醒:'⏰ 提醒:{会议主题} 将在 2 小时后开始({时间}),地点:{地点}'。","timeoutSeconds": 120},"sessionTarget": "isolated","delivery": {"mode": "announce"},"enabled": true}
5.4 进阶:智能提醒
可以加入更多逻辑:
## 智能提醒规则- 如果是"团队会议",提醒"准备好周报"- 如果是"客户会议",提醒"检查演示材料"- 如果是"面试",提醒"查看候选人简历"- 如果会议地点是"外部",提醒"预留交通时间"- 如果当前时间>20:00,不发送提醒(避免打扰)
这些规则可以写在 HEARTBEAT.md 或任务的 message 中,AI 会理解并执行。
六、实战案例 3:模型额度监控
6.1 需求分析
背景:使用多个 AI 厂商的 API,需要监控剩余额度,避免任务中途失败。
监控对象:
Qwen Portal(OAuth)
Groq(免费额度)
DeepSeek(充值额度)
智谱 AI(免费额度)
月之暗面(充值额度)
MiniMax(充值额度)
预警阈值:
剩余额度 < 20%:发送预警
剩余额度 < 5%:发送紧急预警
额度用完:发送告警
6.2 实现方案
OpenClaw 工作区已有现成的测试脚本:
# 查询额度powershell -File scripts/check-quotas.ps1# 测试模型(同时可检查额度)powershell -File scripts/test-models-minimal.ps1
状态文件:memory/model-quota-state.json
6.3 配置步骤
步骤 1:创建 Cron 任务
{"name": "模型额度监控","schedule": {"kind": "cron","expr": "0 20 * * *","tz": "Asia/Shanghai"},"payload": {"kind": "agentTurn","message": "运行 scripts/check-quotas.ps1,读取 memory/model-quota-state.json。如果有厂商额度低于 20%,通知用户:'⚠️ 额度预警:{厂商} 剩余{百分比}%,建议充值'。如果全部正常,静默结束。","timeoutSeconds": 300},"sessionTarget": "isolated","delivery": {"mode": "announce"},"enabled": true}
步骤 2:配置通知渠道
如果希望额度预警发送到特定渠道(如微信/钉钉),可以在 delivery 中配置 webhook:
"delivery": {"mode": "webhook","to": "https://your-webhook-url.com/alert"}
6.4 状态追踪
额度状态会记录在 memory/model-quota-state.json:
{"lastCheck": "2026-03-31T20:00:00+08:00","quotas": {"qwen": {"status": "✅ 活跃","type": "OAuth","limit": "N/A"},"groq": {"status": "⏳ 待配置","type": "API Key","limit": "免费额度"},"deepseek": {"status": "⏳ 待配置","type": "API Key","limit": "免费额度"}}}
AI 会对比历史数据,只在新出现预警时通知。
七、实战案例 4:Git 仓库状态同步
7.1 需求分析
目标:每天下班前检查 Git 仓库,确保代码已提交。
检查内容:
工作区是否有未提交的变更
是否有未推送的提交
是否有需要处理的 merge conflict
通知策略:
有未提交变更:提醒"记得提交代码"
有未推送提交:提醒"记得 push 到远程"
一切正常:不通知
7.2 实现方案
使用 exec 工具运行 Git 命令:
# 检查工作区状态git status --porcelain# 检查未推送的提交git log @{u}..# 检查需要拉取的提交git log ..@{u}
7.3 配置步骤
步骤 1:创建心跳检查
在 HEARTBEAT.md 添加:
- [ ] Git:检查工作区仓库状态,有变更才通知步骤 2:AI 执行逻辑
当心跳触发时,AI 会:
使用
exec运行git status --porcelain如果输出为空,说明工作区干净
如果有输出,提取变更文件列表
通知用户:"📝 Git 提醒:检测到 {N} 个未提交的文件,记得下班前提交"
步骤 3:可选的 Cron 任务
如果希望固定时间检查(如下班前 18:00):
{"name": "下班 Git 检查","schedule": {"kind": "cron","expr": "0 18 * * 1-5","tz": "Asia/Shanghai"},"payload": {"kind": "agentTurn","message": "运行 git status --porcelain 和 git log @{u}.. 检查当前工作区。如果有未提交或未推送的变更,通知用户。如果是周五,额外提醒'周末前记得 push 代码'。","timeoutSeconds": 120},"sessionTarget": "isolated","delivery": {"mode": "announce"},"enabled": true}
八、任务调度最佳实践
8.1 避免任务风暴
问题:如果创建了太多定时任务,可能在同一时间触发,导致资源竞争。
解决方案:
错开时间:不要把所有任务都设置在整点
❌ 全部
0 9 * * *✅ 分散为
0 9 * * *、5 9 * * *、10 9 * * *使用心跳批量检查:把相关检查合并到一次心跳
邮件 + 日历 + 天气 → 一次心跳完成
而不是创建 3 个独立的 Cron 任务
设置超时:避免任务卡住
"payload": {"kind": "agentTurn","message": "...","timeoutSeconds": 300 // 5 分钟超时}
8.2 任务失败处理
问题:任务执行失败怎么办?
策略:
记录日志:使用
cron runs jobId=<id>查看执行历史设置重试:对于关键任务,可以创建备份任务(延迟 5 分钟执行)
失败通知:在任务 message 中加入"如果执行失败,通知用户"
8.3 资源管理
内存与 Token:
心跳在主会话执行,会累积上下文 → 定期清理不需要的记忆
Cron 的 isolated 任务独立执行,不占主会话 → 适合长时间任务
使用
cleanup: "delete"自动清理临时子会话
并发控制:
避免同时运行多个 CPU 密集型任务
对于 API 调用,注意厂商的 rate limit
使用
yieldMs参数避免阻塞
8.4 调试技巧
测试新任务:
先创建禁用状态的任务:
"enabled": false使用
cron run jobId=<id>手动执行测试确认无误后,更新为
"enabled": true
查看执行日志:
# 查看任务历史cron runs jobId=<id># 查看最近 10 次执行cron runs jobId=<id> limit=10
临时禁用任务:
# 更新任务,设置为禁用cron update jobId=<id> patch={"enabled": false}
九、总结与行动清单
9.1 核心要点回顾
| 概念 | 关键点 |
|---|---|
| 心跳机制 | 定期检查多项事务,用自然语言配置 |
| Cron 任务 | 精确时间执行,支持 cron 表达式 |
| sessionTarget | main→systemEvent,isolated→agentTurn |
| 任务类型 | 提醒类用 systemEvent,执行类用 agentTurn |
| 失败处理 | 记录日志、设置超时、可选重试 |
9.2 立即行动清单
今天就能做的(30 分钟):
- 打开
HEARTBEAT.md,添加你的日常检查清单 - 创建一个每天早上 9 点的提醒(邮件 + 日历)
- 创建一个每天晚上 8 点的模型额度检查
本周完成的(2 小时):
- 配置 Gmail/Calendar MCP Server
- 创建 Git 状态检查任务
- 测试所有任务,调整通知策略
进阶优化(持续):
- 根据实际使用情况,调整检查频率
- 添加更多个性化检查(如股票/新闻/天气)
- 建立任务执行日志,分析优化
9.3 常见陷阱
| 陷阱 | 避免方法 |
|---|---|
| 心跳太频繁,打扰用户 | 设置静默时间(23:00-08:00) |
| Cron 任务太多,难以管理 | 合并相关任务,使用心跳批量检查 |
| 任务失败无感知 | 配置失败通知,定期检查执行历史 |
| 额度用完任务中断 | 设置额度预警(20%/5% 阈值) |
| 上下文累积太多 | 定期清理 MEMORY.md,使用 isolated 会话 |
夜雨聆风