课程大纲
自动化、多 Agent 与高级执行(核心生产力)
适用版本: OpenClaw v2026.4.11(stable) 验证日期: 2026-04-12 目标读者: 想让 OpenClaw 从被动应答变成主动执行的用户 难度: ⭐⭐⭐⭐ 高级 适合首次阅读: 否——建议先完成第 7 篇《生产级记忆架构与自动化记忆维护》的生产基线
⚠️ 本篇面向已经跑稳 workspace + 记忆系统的用户。 如果你的 SOUL.md / MEMORY.md / HEARTBEAT.md 还没就位,请先完成第 6 篇《记忆系统、SOUL 与个性化进化》和第 7 篇《生产级记忆架构与自动化记忆维护》。
目标
让 OpenClaw 从「我问它答」进化到「它主动替我做」。三个生产力杠杆:
- Cron / Heartbeat — 定时执行和持续巡检
- Multi-Agent — 不同任务路由给不同专长的 Agent
- Tool Use / MCP — 调用外部工具不翻车的执行纪律
前置条件
- 已完成本系列前面的章节,特别是第 6 篇《记忆系统、SOUL 与个性化进化》和第 7 篇《生产级记忆架构与自动化记忆维护》
openclaw daemon status显示运行中- workspace 已部署(SOUL / MEMORY / AGENTS / HEARTBEAT 都在位)
- 至少一个消息渠道接好
第一次只做这一个自动化
如果你赶时间,先只配 1 个 cron + 1 个 heartbeat,10 分钟跑通核心机制:
json5// 在 openclaw.json 中添加(JSON5 格式) { cron: { jobs: [ { name: "daily-briefing", schedule: "0 9 * * *", timezone: "Asia/Shanghai", // ⚠️ 请替换:换成你的时区 prompt: "生成今日简报:天气、日历、未读邮件摘要", delivery: { channel: "telegram", // ⚠️ 请替换:换成你实际使用的渠道 chatId: "me", }, }, ], }, heartbeat: { enabled: true, interval: "5m", quiet_hours: ["22:00", "08:00"], profile: "lean", }, }
验证:
bash# 确认 cron 任务已注册 openclaw cron list # 手动触发一次(不等调度器) openclaw cron trigger daily-briefing # 确认 heartbeat 在跑 openclaw heartbeat status
跑通了再往下扩展。
让 OpenClaw 帮你配置自动化
不想手动写 JSON?直接把下面的 prompt 发给你的 OpenClaw,让它按你的需求生成配置:
💡 一键配置 prompt(点击展开,复制发给 Bot)
text帮我配置 OpenClaw 的自动化任务。按步骤来,每步确认后再进下一步: [第 1 步:信息收集] 一次性问我: - 我需要哪些定时任务(早报、邮件检查、周报、备份...) - 每个任务的触发时间和频率 - 结果投递到哪个渠道(Telegram / Slack / Discord) - 是否需要 heartbeat 持续巡检(磁盘、服务、记忆维护) - 是否需要多 Agent(还是全用 main Agent) [第 2 步:生成 cron 配置] 根据收集的信息,生成 openclaw.json 的 cron.jobs 数组。 每个 job 包含 name / schedule / timezone / prompt / delivery。 用 diff 展示给我确认。 [第 3 步:生成 heartbeat 配置] 如果需要 heartbeat,生成 HEARTBEAT.md 检查项和 openclaw.json 的 heartbeat 配置。 用 diff 展示给我确认。 [第 4 步:生成多 Agent 配置](如果需要) 根据任务类型建议 Agent 分工,生成 agents.list 配置。 每个 Agent 包含 id / workspace / model / skills / sandbox。 用 diff 展示给我确认。 [第 5 步:写入并验证] 确认后写入 openclaw.json 和 HEARTBEAT.md。 运行 openclaw cron list 确认任务注册成功。 手动触发第一个 cron 任务,把输出展示给我。 任何一步失败就停,不要跳过。不要一口气跑完所有步骤。
一、自动化基础(Cron × Heartbeat)
Cron vs Heartbeat
| 维度 | Cron | Heartbeat |
|---|---|---|
| 触发方式 | 按绝对时间表 | 按相对间隔 + 状态机 |
| 适用场景 | 定点任务:早报、周报、备份 | 持续巡检:健康监控、漂移检测 |
| 状态感知 | 无状态(每次独立) | 有状态(双次确认才告警) |
| 告警 | 默认输出所有 | 默认静默,仅异常才响 |
一句话分法: 有确定时间点 → Cron。有持续监控需求 → Heartbeat。
Cron 任务三种写法
📖 以下是 OpenClaw 的真实配置语法。示例中的
name、prompt、delivery等值是示意内容,不是必须长成这样——按你的实际需求填写。
标准 cron 表达式(推荐生产使用):
json5{ name: "daily-briefing", schedule: "0 9 * * *", // 分 时 日 月 周 timezone: "Asia/Shanghai", prompt: "生成今日早报", delivery: { channel: "telegram", chatId: "me" }, }
every 间隔语法(简单周期):
json5{ name: "inbox-check", every: "30m", prompt: "检查未读邮件,只通知重要的" }
at 一次性触发(执行后自动禁用):
json5{ name: "meeting-reminder", // ⚠️ 请替换:换成你实际的提醒时间 at: "2026-04-15T13:55:00+08:00", prompt: "提醒我 14:00 的产品评审", }
Cron 进阶字段
| 字段 | 作用 |
|---|---|
agent | 指定由哪个子 Agent 执行(默认 main) |
profile | 启动时加载哪个 context profile |
timeout_seconds | 强制超时,防止任务挂死 |
retry | 失败重试策略(max_attempts + backoff_ms) |
on_failure | 失败时的降级动作(通知 / fallback prompt) |
stagger | 分散投递时间,避免多个任务同时刷屏或打爆 API |
💡 建议: 第一次写 cron 时先把
schedule设成every: "2m",确认 prompt 和 delivery 都对了,再改回真正的时间表。
让 cron 更可靠 🔬 进阶可选
思路来源: 借鉴 Hermes agent 的 fresh instance + execution stagger 设计——每次 cron 触发全新实例、避免上次状态残留;多任务错峰启动、避免 API 峰值限流。
Isolated session(独立会话): OpenClaw 支持两种 cron 执行模式:
| 模式 | 行为 | 适用场景 |
|---|---|---|
sessionTarget: "main"(默认) | 把事件注入你的主会话,Agent 带完整上下文处理 | 需要对话感的任务(生活助手式早报) |
sessionTarget: "isolated" | 独立会话、全新 context、跑完即销毁 | 后台自动化任务(备份、监控、日报) |
生产级 cron 建议用 isolated 避免上次运行残留污染本次:
json5{ name: "daily-briefing", schedule: "0 9 * * *", sessionTarget: "isolated", // 每次全新会话 prompt: "生成今日早报", }
⚠️ 版本说明: Isolated session 的具体行为(session key 复用规则、日志归档)随版本有变化。2026 年的多个 Issue 讨论过"isolated 是否真的每次全新",以你实际使用版本的行为为准。
Per-Agent 路由(agentId): 用 agent 字段把 cron 绑定到特定 Agent,和主 Agent 完全隔离 workspace 和记忆:
json5{ name: "ops-health-check", schedule: "*/30 * * * *", sessionTarget: "isolated", agent: "ops-bot", // 路由到专用 Agent prompt: "检查所有服务健康状态", }
这样 ops-bot 的运维决策不会污染 main Agent 的对话记忆。配合第二章 Multi-Agent 的配置使用。
错峰触发: 多个 cron 如果都定在整点(0 9 * * *),会同时向 LLM API 发起请求,容易触发限流。解决方式:把时间错开几分钟。
json5{ name: "task-a", schedule: "0 9 * * *" }, // 9:00 { name: "task-b", schedule: "3 9 * * *" }, // 9:03 { name: "task-c", schedule: "7 9 * * *" }, // 9:07
💡 建议: 3 个以上同时段 cron 必做错峰。单个用户不需要用到分散秒数的复杂 stagger 字段——错开几分钟就够了,可预测、可调试。
Heartbeat 机制
Heartbeat 是 OpenClaw 的被动自检循环:每 N 分钟读 HEARTBEAT.md → 执行该跑的检查 → 异常连续两次才告警 → 无异常返回 HEARTBEAT_OK(静默)。
HEARTBEAT.md 定义检查项(对应第 6 篇《记忆系统、SOUL 与个性化进化》模板包中的那份):
markdown# HEARTBEAT.md ## Recurring Checks - check disk and memory usage on the main host - check that the main OpenClaw service is running - review memory/ for notes worth promoting ## Memory Maintenance Checks - verify last memory-sync-daily ran within 25 hours - check MEMORY.md line count < 200 (warn) / < 300 (critical) ## Rules - Stay quiet during quiet hours (22:00-08:00) - Two consecutive failures before escalating - Track state in memory/heartbeat-state.json
以上是示例内容,按你的运维需求增删检查项。
🔧 聊天里总是出现"如果有 HEARTBEAT.md 就读..."这段文字怎么办?(点击展开)
这是 2026 年最常见的 heartbeat 踩坑之一。看到类似下面的内容出现在聊天记录:
如果有 HEARTBEAT.md 就读(工作区上下文)。严格遵守。不要推断或重复之前聊天中的旧任务。如果没有需要注意的内容,请回复 HEARTBEAT_OK...
那是 OpenClaw 内部注入给模型的心跳唤醒提示词,本来应该是后台调用、不该暴露到聊天里。常见原因有三种:
- 心跳跑在主会话里 — 没开
isolatedSession: true,每次心跳都在主会话留下一条合成消息 target配置错 — 应该"none"(静默)却设成了会投递的值- 模型返回超过
ackMaxChars— 本应返回纯HEARTBEAT_OK,但 Agent 多说了几句,超过 300 字符就不会被丢弃
标准修复:在 openclaw.json 加四个字段
json5{ agents: { defaults: { heartbeat: { every: "30m", target: "none", // 静默执行,不投递 lightContext: true, // 只注入 HEARTBEAT.md,不加载整个 workspace isolatedSession: true, // 每次心跳用全新会话,不污染主会话 directPolicy: "block", // 禁止 DM 投递 ackMaxChars: 300, // 默认值,短 OK 回复会被自动丢弃 }, }, }, }
改完重启生效:
bashopenclaw daemon restart
验证修复
bash# 手动触发一次心跳 openclaw heartbeat trigger # 观察主聊天窗口,应该不再出现唤醒提示词 # 日志里可以看到心跳执行,但会话记录保持干净 openclaw logs --follow
参考: 官方文档 Heartbeat Configuration · 相关 Issue #43168 / #12186
⚠️ 版本说明:
isolatedSession/lightContext/ackMaxChars是 OpenClaw 2026.3+ 的 heartbeat 字段。旧版本字段名可能不同,以你实际使用版本的openclaw heartbeat --help输出为准。
任务调试
bash# 查看任务注册(schedule、next run、last run) openclaw cron list # 手动触发 openclaw cron trigger daily-briefing openclaw heartbeat trigger # 查看日志 openclaw logs --follow
| 症状 | 原因 | 修复 |
|---|---|---|
next_run 显示 null | cron 表达式错误 | 检查 5 字段格式 |
| 任务没触发 | daemon 没运行或时区错误 | openclaw daemon status + 确认 timezone |
| 任务超时 | 没配 timeout_seconds | 加超时或换更快的模型 |
二、Multi-Agent 协作
为什么需要多个 Agent
一个 main Agent 什么都干时,SOUL.md 会越写越长、技能越装越多、上下文越来越臃肿。Multi-Agent 的核心思路:不同任务路由给不同专长的 Agent,每个 Agent 有独立的 workspace、模型、工具权限。
配置多 Agent
在 openclaw.json 的 agents.list 中定义:
json5{ agents: { defaults: { model: { primary: "anthropic/claude-sonnet-4-6" }, }, list: [ { id: "researcher", // ⚠️ 以下是示例配置,按你的实际需求调整 workspace: "~/.openclaw/agents/researcher", model: { primary: "anthropic/claude-opus-4-6" }, skills: ["summarize", "web-browse", "obsidian"], sandbox: { mode: "all" }, }, { id: "executor", workspace: "~/.openclaw/agents/executor", model: { primary: "anthropic/claude-sonnet-4-6" }, skills: ["github", "bash-runner"], sandbox: { mode: "non-main" }, }, { id: "reviewer", workspace: "~/.openclaw/agents/reviewer", model: { primary: "anthropic/claude-opus-4-6" }, skills: ["code-review", "summarize"], sandbox: { mode: "all" }, }, ], }, }
每个 Agent 有独立的 workspace、model、skills 允许列表和 sandbox 策略。
最小骨架:Researcher / Executor / Reviewer
三角色是社区最常见的 Multi-Agent 模式:
| 角色 | 职责 | 模型建议 | 工具策略 |
|---|---|---|---|
| Researcher | 搜索、阅读、总结 | 强模型(Opus) | 只读工具,全沙箱 |
| Executor | 写代码、跑命令、操作文件 | 快模型(Sonnet) | 读写工具,受限沙箱 |
| Reviewer | 审查 Executor 的输出、检查质量 | 强模型(Opus) | 只读工具,全沙箱 |
在 cron 中指定 Agent:
json5{ name: "weekly-research", schedule: "0 18 * * 0", agent: "researcher", // 路由给 researcher Agent prompt: "基于过去一周的 daily log 生成周报", }
按渠道绑定 Agent
不同渠道可以绑定不同 Agent,实现「工作渠道用严格 Agent,个人渠道用宽松 Agent」:
json5{ agents: { list: [ { id: "work-agent", // 绑定到 Slack 的特定频道 channels: { slack: { chatIds: ["C01WORK"] } }, sandbox: { mode: "all" }, }, { id: "personal-agent", channels: { telegram: { chatIds: ["me"] } }, sandbox: { mode: "off" }, }, ], }, }
💡 建议: 先只加 1 个子 Agent(比如 researcher),确认路由和隔离正常后再扩展。不要一上来就配 5 个 Agent——调试复杂度是指数级的。
三、Tool Use / MCP / 执行纪律
MCP 工具集成
OpenClaw 通过 MCP(Model Context Protocol)集成外部工具。从 Agent 角度看,MCP 工具和内置工具没有区别。
三层集成方式:
| 层级 | 方式 | 适用场景 |
|---|---|---|
| 全局 | openclaw.json 的 MCP servers 配置 | 所有 Agent 共享的工具 |
| Per-Agent | agents.list[].mcpServers | 特定 Agent 专属的工具 |
| Per-Skill | SKILL.md 指令中引用 | 技能调用时按需使用 |
执行纪律操作清单
📖 以下是让 Agent 可靠调用工具的实操规则,不是理论宣言。
写进 AGENTS.md 或 SOUL.md 的规则:
- 破坏性命令(
rm、drop、force push、reset)必须先确认再执行 - 外部可见操作(发消息、发邮件、创建 PR)必须先确认
- 文件写入前先读取当前内容,避免覆盖
- 命令执行失败时报告错误,不要假装成功
- 长任务设置
timeout_seconds,防止挂死 - 工具调用结果写入日志,方便事后审计
在 Agent 配置中强制执行:
json5{ agents: { defaults: { sandbox: { mode: "non-main", // 非 main Agent 默认沙箱 scope: "session", }, }, }, }
sandbox.mode 三个值:
| 模式 | 行为 |
|---|---|
off | 不沙箱(仅限你完全信任的 main Agent) |
non-main | 非 main Agent 沙箱化 |
all | 所有 Agent 都沙箱化(最安全) |
Per-Agent 工具允许/拒绝列表:
json5{ id: "researcher", skills: ["summarize", "web-browse"], // 只允许这些技能 // 这个 Agent 无法调用 bash、文件写入等危险工具 }
💡 建议: Researcher 和 Reviewer 角色用
sandbox: { mode: "all" },只给只读工具。Executor 用sandbox: { mode: "non-main" },给受控的读写权限。安全策略的完整体系见第 9 篇《安全最佳实践(重磅章节)》。
验证清单
bash# 1. cron 任务注册 openclaw cron list # 2. 手动触发 cron 成功 openclaw cron trigger daily-briefing # 3. heartbeat 运行中 openclaw heartbeat status # 4. 多 Agent 路由(如果配了) openclaw agents list # 应该看到你定义的 Agent 列表 # 5. 查看日志确认执行 openclaw logs --follow
常见问题
Q: Cron 任务和 Heartbeat 有什么区别?
Cron 按时间表触发(每天 9 点),无状态。Heartbeat 按间隔巡检(每 5 分钟),有状态(双次确认才告警)。Cron 负责"开始工作",Heartbeat 负责"持续监控"。
Q: 多 Agent 之间能共享记忆吗?
默认各 Agent 有独立 workspace。如果需要共享,可以让多个 Agent 指向同一份 MEMORY.md(只读),但写入建议隔离——否则会出现记忆冲突。
Q: cron 任务每次都创建新的会话实例吗?
是的,OpenClaw 默认每次 cron 触发都启动新的会话实例(fresh instance),不继承上次的上下文。这是防止状态残留和上下文污染的关键设计。不要为了"省 token"把 cron 绑到长期 session 上。
Q: 怎么控制 cron 的 token 消耗?
三个手段:精简 prompt、用 lean profile 启动(减少注入的记忆文件)、给简单任务指定低成本模型。先跑一周看实际用量再优化。
Q: MCP server 怎么加?
在 openclaw.json 中配置 MCP servers。详见 OpenClaw MCP 文档。Per-Agent MCP 路由写在 agents.list[].mcpServers 里。
下一步
自动化和多 Agent 就位后,你的 OpenClaw 已经是一个真正的「主动同事」了。接下来去第 9 篇《安全最佳实践(重磅章节)》,给这套系统加上安全防线。