Hermes 自动化进阶:用 Cron 实现从每日简报到自定义监控


如果你已经在用 Hermes Agent,却从未碰过它的 Cron 调度器,那你正在浪费它最强大的功能之一。Hermes 的 Cron 不是简单的“每过一小时跑个脚本”——它是一个完整的自动化框架:支持自然语言调度、技能增强型 Agent、多任务流水线、以及零 Token 的纯脚本看门狗。

通过本文,你将学会:

  • 用自然语言或 Cron 表达式安排定时/一次性任务
  • 给任务挂载技能,让 Agent 继承专家工作流
  • context_from 串联多个任务构成流水线
  • 运行纯脚本看门狗,完全不消耗 LLM Token
  • 搭建生产级每日简报、GitHub 监控和网站健康检查

我们从基础开始。

Hermes Cron 有何不同?

大多数 Cron 实现是在一个定时器上执行单个脚本。而 Hermes Cron 是在定时器上启动一个完整的 Agent 会话——你的提示词就是任务,Agent 可以使用所有工具(终端、文件、网页、浏览器、子代理),结果会被投递到你选择的聊天平台。

核心思路: Hermes 里的 Cron 任务,本质上就是一个“定时启动的 Hermes 会话”。你在对话里能让 Hermes 做的任何事,都可以定时让它自动完成。

在此基础上,Hermes Cron 还支持:

  • 技能注入——在运行提示词之前先加载一个或多个技能
  • 流水线串联——一个任务的输出自动成为下一个任务的上下文
  • 免 Agent 模式——纯定时脚本,零 Token 消耗,stdout 原样投递
  • 多平台投递——发到 Telegram、Discord、Slack、邮件、短信、飞书等任何已配置的平台
  • 完整生命周期管理——暂停、恢复、编辑、手动触发,聊天或 CLI 均可

调度器运行在 Hermes Gateway 后台守护进程中,每 60 秒 tick 一次。任务存储在 ~/.hermes/cron/jobs.json,使用文件锁(~/.hermes/cron/.tick.lock)防止重叠调度。

基础用法:三种方式创建任务

你可以通过三种方式创建 Cron 任务,最终都会进入同一个调度器。

1. 聊天中使用 /cron 命令

对话中最快捷的方式——直接输入 /cron

/cron add "every 2h" "检查服务器状态,报告任何问题"
/cron add "0 9 * * *" "总结昨天项目仓库的提交记录"
/cron add "30m" "提醒我站起来活动一下"

挂载技能:

/cron add "every 1h" "检查 Feed 是否有新文章" --skill blogwatcher

2. 独立 CLI 命令

CLI 版本完全一致,适合脚本化使用:

hermes cron create "every 2h" "检查服务器状态"
hermes cron create "0 9 * * *" "总结昨天的提交记录" --name "每日总结"

挂载多个技能:

hermes cron create "every 1h" "监控 Feed 和地图" \
  --skill blogwatcher \
  --skill maps \
  --name "多技能监控器"

3. 自然对话

直接告诉 Hermes 你想要什么:

“每天早上 9 点,检查 Hacker News 的 AI 新闻,把摘要发到 Telegram。”

Hermes 会自动使用内部的 cronjob 工具来创建任务——不用记任何命令。

日程格式参考

Hermes 支持四种日程格式:

格式 示例 行为
相对延迟 30m, 2h, 1d 一次性,延迟后执行一次
间隔 every 30m, every 2h, every 1d 循环执行直到删除
Cron 表达式 0 9 * * *(每天)、0 9 * * 1-5(工作日)、0 */6 * * *(每 6 小时) 按固定时间循环
ISO 时间戳 2026-12-25T09:00:00 未来特定时间执行一次

你还可以覆盖默认重复次数:

cronjob(
    action="create",
    prompt="检查邮箱是否有紧急消息",
    schedule="every 2h",
    repeat=5,        # 只运行 5 次,然后自动删除
)

技能增强型 Cron 任务

当挂载技能时,真正的威力就展现出来了。一个技能封装了一套可复用的工作流——Cron 任务加载它后,Agent 自动继承了该领域的专业知识,不需要你把长篇大论的指令塞进提示词里。

单个技能

cronjob(
    action="create",
    skill="blogwatcher",
    prompt="检查已配置的 Feed,总结任何新内容。",
    schedule="0 9 * * *",
    name="晨间 Feed",
)

多个技能

技能按顺序加载,提示词作为最终的任务指令叠加在所有技能之上:

cronjob(
    action="create",
    skills=["blogwatcher", "maps"],
    prompt="查找新的本地活动和有趣的地点,组合成一份简短简报。",
    schedule="every 6h",
    name="本地简报",
)

实用建议: 用技能做关注点分离。一个“数据收集”技能负责获取原始数据,一个“格式化”技能美化输出,一个“投递”技能负责路由。不同的任务可以混合搭配不同的技能。

在项目目录中运行

默认情况下,Cron 任务在 detached 模式下运行——不会加载任何 CLAUDE.mdAGENTS.md。传递 --workdir(CLI)或 workdir=(工具调用)可以让任务在特定仓库中运行:

hermes cron create "every 1d at 09:00" \
  "审核待审 PR,总结 CI 健康状况,发到 #eng 频道" \
  --workdir /home/me/projects/acme

当设置了 workdir 后,该目录下的项目上下文文件会被注入到系统提示中,所有文件/终端工具都会以该目录为工作路径。

串行化注意: 设置了 workdir 的任务会串行执行(不在并行池中),因为它们会改变进程全局的终端状态。没有设置 workdir 的任务仍然并行执行。

进阶:用 context_from 搭建多任务流水线

Cron 任务运行在隔离的会话中,不记得前一次运行的结果。但有时一个任务的输出恰好是下一个任务需要的内容。context_from 参数自动串联起这条链路。

流水线模式

我们搭建一个 3 阶段的 AI 新闻流水线——采集、筛选、投递:

# 第一步:找到采集任务的 ID
cronjob(action="list")

# 第二步:创建筛选任务,自动接收采集任务的输出
cronjob(
    action="create",
    prompt="读取 ~/.hermes/data/briefs/raw.md。对每条新闻的参与潜力和新颖度评分 1-10。输出前 5 条到 ~/.hermes/data/briefs/ranked.md。",
    schedule="30 7 * * *",
    context_from="<collector_job_id>",
    name="AI 新闻筛选",
)

# 第三步:创建投递任务,接收筛选任务的输出
cronjob(
    action="create",
    prompt="读取 ~/.hermes/data/briefs/ranked.md。写 3 条推文草稿(钩子 + 正文 + 话题标签)。",
    schedule="0 8 * * *",
    context_from="<triage_job_id>",
    deliver="telegram:7976161601",
    name="AI 新闻简报",
)

context_from 的工作原理:

  • 当任务 B 触发时,Hermes 从 ~/.hermes/cron/output/{job_a_id}/*.md 读取任务 A 的最新输出
  • 该输出自动预置到任务 B 的提示词前
  • 流水线可以是任意长度:A → B → C → …
  • 可以传单个 ID(字符串)多个 ID 的列表(汇聚模式)

何时使用流水线:

  • 多阶段处理(采集 → 过滤 → 格式化 → 投递)
  • 有依赖关系的任务,步骤 N 需要步骤 N−1 的结果
  • 扇出/扇入:一个聚合任务从多个采集任务收集结果

免 Agent 模式:纯脚本看门狗

对于不需要 LLM 的重复性任务——经典的系统看门狗、磁盘/内存告警、心跳检测、CI 通知——传递 no_agent=True。调度器按计划运行脚本并直接投递 stdout,零 Token,零推理调用

CLI 设置

hermes cron create "every 5m" \
  --no-agent \
  --script memory-watchdog.sh \
  --deliver telegram \
  --name "memory-watchdog"

由 Agent 自动设置

直接在聊天中告诉 Hermes:

“如果内存超过 85%,每 5 分钟在 Telegram 上通知我。”

Hermes 会把检查脚本写入 ~/.hermes/scripts/,并自动配置好 Cron 任务。

免 Agent 模式的行为规则

情况 行为
脚本有 stdout(非空) 原样投递作为消息
stdout 为空 静默 tick——什么都不发(看门狗模式)
退出码非零或超时 发送错误通知(防止看门狗无声失效)
最后一行是 {"wakeAgent": false} 静默 tick(与 LLM 任务使用同一门控)

脚本文件规则:

  • .sh / .bash → 使用 /bin/bash 运行
  • 其他后缀 → 使用当前 Python 解释器(sys.executable)运行
  • 必须放在 ~/.hermes/scripts/ 目录下

真实案例——内存看门狗脚本:

#!/bin/bash
# ~/.hermes/scripts/memory-watchdog.sh
THRESHOLD=85
USAGE=$(free | awk '/^Mem:/ {printf "%.0f", $3/$2 * 100}')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
    echo "⚠️  RAM 告警:已使用 ${USAGE}%(阈值:${THRESHOLD}%)"
    echo "占用最高的进程:"
    ps aux --sort=-%mem | head -6
fi
# 如果低于阈值,无 stdout → 静默 tick

这个脚本只在内存超过 85% 时输出内容。平静的日子不发任何消息——无打扰,不浪费注意力。

生命周期管理

每个 Cron 任务都有完整的生命周期。你可以从 CLI 或聊天中全盘管理。

CLI 命令

hermes cron list              # 列出所有任务(--all 显示已禁用的)
hermes cron pause my-digest   # 按名称或 ID 暂停
hermes cron resume my-digest  # 重新启用
hermes cron run my-digest     # 在下一个 tick 触发
hermes cron edit my-digest --schedule "every 4h"  # 修改日程
hermes cron edit my-digest --prompt "修改后的任务"
hermes cron edit my-digest --add-skill maps       # 添加技能
hermes cron edit my-digest --remove-skill maps    # 移除技能
hermes cron edit my-digest --clear-skills          # 清除所有技能
hermes cron remove my-digest  # 完全删除
hermes cron status            # 调度器状态
hermes cron runs my-digest --limit 20  # 执行历史

聊天中管理

/cron list
/cron pause <job_id>
/cron resume <job_id>
/cron run <job_id>
/cron edit <job_id> --schedule "every 4h"
/cron remove <job_id>

支持按名称查找: 所有命令都可以使用任务 ID(十六进制)或任务名称(不区分大小写)。如果有多个任务同名,命令会列出候选 ID 让你进一步区分。

执行历史

Hermes 将每次 Cron 执行记录在 ~/.hermes/cron/executions.db。每次尝试经历:claimedrunning → 最终状态 completedfailedunknown(进程重启后)。用 hermes cron runs [job-id] --limit 20 查看。

服务商恢复与模型固定

Cron 任务继承了你在配置中设置的回退服务商和凭证池轮转。如果主 API Key 被限流,任务会自动回退到备选服务商或轮换到池中的下一个凭证。

重要——模型固定行为: 创建 Cron 任务时如果不指定 provider/model,Hermes 会将当前的全局默认设置快照到任务中。如果之后你修改了全局默认,任务会安全关闭——跳过运行并提醒你显式固定 provider/model。这样可以防止无人值守的任务悄悄切换到付费服务或不同模型:

# 为任务固定一个特定模型
cronjob(
    action="update",
    job_id="<job_id>",
    provider="openrouter",
    model="anthropic/claude-sonnet-4",
)

对于无人值守运行,hermes setup --portal(Nous Portal OAuth)是最低摩擦的选项——OAuth 刷新是自动的。

安全规则: Cron 运行中的会话不能创建新的 Cron 任务。Hermes 在 Cron 执行期间会禁用 Cron 管理工具,防止出现失控的调度循环。

投递配置

平台定位

创建任务时,通过 deliver 参数指定结果发往哪里:

# 发到 Telegram
cronjob(action="create", ..., deliver="telegram")

# 发到指定的 Discord 频道
cronjob(action="create", ..., deliver="discord:#engineering")

# 发到多个平台
cronjob(action="create", ..., deliver="telegram,discord")

# 广播到所有已连接的家频道
cronjob(action="create", ..., deliver="all")

# 发回来源 + 所有频道
cronjob(action="create", ..., deliver="origin,all")

支持的平台包括 Telegram、Discord、Slack、WhatsApp、Signal、短信、邮件、飞书、钉钉、企业微信、Matrix 等。

静默模式

如果 Agent 的最终回复中包含 [SILENT],投递会被抑制。输出仍会本地保存以备审计,但不会发送消息:

# 提示词文本:
"检查 nginx 是否在运行。如果一切正常,只回复 [SILENT]。否则报告问题。"

失败的任务总是会投递——只有成功运行才能被静默抑制。

回复包装

默认情况下,投递的 Cron 输出会带有头/尾包装:

Cronjob Response: 晨间 Feed
-------------

<agent 的输出>

注意:Agent 无法看到此消息,因此无法回复。

要投递原始输出而不带包装:

# ~/.hermes/config.yaml
cron:
  wrap_response: false

可延续任务(回复 Cron 消息)

默认情况下,Cron 投递是“发完即忘”。将任务设为可延续(通过 attach_to_session=True),你就可以回复它——简报变成了可以对话的内容:

# ~/.hermes/config.yaml
cron:
  mirror_delivery: true

或者在工具中按任务设置:

cronjob(
    action="create",
    ...,
    attach_to_session=True,
)

在支持线程的平台(Telegram 话题、Discord 线程)上,每次投递都会开启一个专用线程。对于仅 DM 的平台(WhatsApp、Signal),简报会镜像到 DM 会话中。

实战场景:三个经过验证的配置

1. 个人每日简报

每天早上收集 GitHub 动态、天气和日历事项:

hermes cron create "0 8 * * 1-5" \
  "1. 检查我的 GitHub 通知,看是否有 PR 需要我审核
   2. 查询今天的天气预报
   3. 总结日历上需要关注的事项
   4. 整理成一份干净的晨间简报" \
  --deliver telegram \
  --name "daily-briefing"

为什么这样设计: 只在工作日运行(1-5),使用 Hermes 内置的网页搜索和文件工具,直接投递到 Telegram,喝咖啡时就能看。

2. GitHub 仓库看门狗

一个零 Token 的纯脚本,在仓库发布新版时通知你:

#!/bin/bash
# ~/.hermes/scripts/github-watchdog.sh
REPO="NousResearch/hermes-agent"
CACHE_FILE="$HOME/.hermes/cron/output/latest_release.txt"
LATEST=$(curl -s "https://api.github.com/repos/$REPO/releases/latest" | grep -o '"tag_name": *"[^"]*"' | head -1)

if [ ! -f "$CACHE_FILE" ]; then
    echo "$LATEST" > "$CACHE_FILE"
    echo "📦 已初始化 $REPO 的监控器——最新版:$LATEST"
    exit 0
fi

PREVIOUS=$(cat "$CACHE_FILE")
if [ "$LATEST" != "$PREVIOUS" ]; then
    echo "$LATEST" > "$CACHE_FILE"
    echo "🚀 $REPO 检测到新版本!"
    echo "   之前:$PREVIOUS"
    echo "   最新:$LATEST"
    echo "   查看:https://github.com/$REPO/releases/tag/$LATEST"
fi

配置任务:

hermes cron create "every 6h" \
  --no-agent \
  --script github-watchdog.sh \
  --deliver telegram \
  --name "github-release-watchdog"

零 Token 消耗。 脚本每 6 小时运行一次,只有版本真正变化时才发消息。

3. 网站健康检查器

一个多阶段流水线:网站检查 → 日志分析 → 告警投递。

阶段 1——采集器(纯脚本):

#!/bin/bash
# ~/.hermes/scripts/health-check.sh
URL="https://hermes-agent-lab.com"
STATUS=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$URL")
TIME=$(curl -s -o /dev/null -w "%{time_total}" --max-time 10 "$URL")
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] $URL → HTTP $STATUS (${TIME}s)"
hermes cron create "every 30m" \
  --no-agent \
  --script health-check.sh \
  --name "site-health-collector"

阶段 2——分析器(由 LLM 驱动,从采集器接收上下文):

hermes cron create "0 */2 * * *" \
  "检查 hermes-agent-lab.com 最近 4 次的健康检查结果。
   是否有明显的失败或响应缓慢?
   如果一切正常,只回复 [SILENT]。
   如果有问题,写出问题摘要并投递。" \
  --context_from "<collector_job_id>" \
  --name "site-health-analyst"

采集器每 30 分钟运行一次(免费,零 Token)。分析器每 2 小时运行一次,接收采集器的输出作为上下文,只在有问题时才发消息。

常见陷阱与解决方法

1. 忘记启动 Gateway

Cron 的执行由 Gateway 守护进程处理。如果不运行 Gateway,你的任务不会触发:

hermes gateway install     # 安装为用户服务
hermes gateway status      # 确认在运行
hermes gateway run         # 或者前台运行用于测试

2. 相对延迟与间隔混淆

  • 30m = 一次性,30 分钟后执行
  • every 30m = 循环,每 30 分钟执行

这是常见的错误。确实需要循环时,记得加上 every

3. 静默任务从不发消息

如果任务运行了但你看不到输出,Agent 可能回复了 [SILENT](成功时),或者脚本没有产生 stdout(免 Agent 模式)。检查本地输出:

ls ~/.hermes/cron/output/
cat ~/.hermes/cron/output/<job_id>/*.md

4. 模型/服务商突然不工作了

未固定的任务在创建时快照了当前默认设置。如果你改了服务商(hermes model),任务会提醒你显式固定。生产任务一定要固定:

hermes cron edit my-job --provider openrouter --model anthropic/claude-sonnet-4

5. 流水线任务时间重叠

当使用 context_from 串联任务时,确保上游任务在下游任务开始前已完成。如果任务 A 在 0 7 * * *(7:00)运行,任务 B 也在 0 7 * * *(7:00)运行,任务 B 得到的是任务 A 前一天的输出——如果是首次运行则是空文件。将它们的触发时间至少错开 15–30 分钟。

6. Workdir 任务互相阻塞

设置了 workdir 的任务会串行执行。设计流水线时要注意,不要让 workdir 任务成为瓶颈——保持它们简短,或者对繁重处理使用无 workdir 的中转任务。

总结

Hermes Cron 让你从手动操作升级为设置好就不用管。以下是速查表:

任务 方法 LLM 成本
个人每日简报 单个 LLM 任务 + 网页搜索
GitHub 发布监控 纯脚本看门狗
网站健康检查 + 告警 流水线:纯脚本采集器 → LLM 分析器 低(每 2 小时一次)
AI 新闻流水线 多任务链 + context_from 中等
磁盘/内存看门狗 纯脚本看门狗
多平台广播 单个任务 + deliver="all"

全功能 Agent 会话、技能注入、免 Agent 纯脚本模式、多任务流水线的组合,使 Hermes Cron 成为任何 AI Agent 框架中最通用的自动化工具之一。

快速上手

# 1 分钟入门:创建你的第一个任务
hermes cron create "every 1d at 09:00" "给我 3 句话总结一下今天 NousResearch/hermes-agent 仓库有什么新动态" --deliver telegram

# 列出并确认
hermes cron list
hermes cron status

# 手动触发查看效果
hermes cron run my-job-name

想了解更多 Hermes 自动化功能,参见官方 Cron 文档、我们的安装指南功能对比页