首页 / Hermes Agent 教程 / 自动化蓝图与生产化排障

Hermes Agent 教程

自动化蓝图与生产化排障

本教程共 25 篇 · 第 17 篇 · 更新于 2026-07-26 · 约 22 分钟阅读

Hermes AgentHermes Agent 教程自动化蓝图排障hermes send看门狗生产化

17. 自动化蓝图与生产化排障

本节目标:掌握六大自动化蓝图模式,学会用 hermes send 做轻量管道投递,遇到 cron 不触发、投递失败、技能加载错误等问题时知道怎么排查和修复。

上一章我们学会了 cron 定时任务的基本用法。这一章往前走一步—看看真实场景里人们都在用 cron 做什么,以及任务跑起来之后出了问题怎么修。

三种触发方式

在讲蓝图之前,先理清 Hermes 自动化的三种触发方式:

触发方式怎么触发用什么工具
定时调度按固定周期(每小时、每天、每周)cronjob 工具或 /cron 命令
GitHub 事件PR 打开、推送代码、Issue 创建、CI 结果Webhook 平台(hermes webhook subscribe
API 调用外部服务 POST JSON 到你的端点Webhook 平台(config.yaml 路由或 hermes webhook subscribe

三种方式都支持投递到 Telegram、Discord、Slack、SMS、邮件、GitHub 评论或本地文件。这一章主要讲定时调度蓝图,Webhook 触发会穿插提及。

蓝图一:每日简报机器人

这是最经典也最实用的自动化模式—让 Agent 每天早上帮你搜集信息、总结成简报、投递到你的聊天窗口。你喝着咖啡就能看到今天值得关注的动态。

基本版

hermes cron create "0 8 * * *" \
  "搜索网络上关于 AI 智能体和开源大模型的最新新闻。
  找到至少 5 篇过去 24 小时内的文章。总结最重要的 3 条,每条包含:
  清晰的标题、两句话摘要、来源链接。用友好专业的语气,带 emoji 标记。" \
  --name "Morning briefing" \
  --deliver telegram

每天早上 8 点,Agent 在全新会话里醒来,搜索网络、筛选新闻、格式化简报,发到你的 Telegram。

多主题版

一个简报覆盖多个领域:

hermes cron create "0 8 * * *" \
  "创建一份早间简报,覆盖三个主题。每个主题搜索过去 24 小时的新闻,总结前 2 条并附链接。

  主题:
  1. AI 和机器学习 - 重点关注开源模型和智能体框架
  2. 加密货币 - 重点关注比特币、以太坊和监管动态
  3. 太空探索 - 重点关注 SpaceX、NASA 和商业航天

  用分节标题和 emoji 格式化。结尾加上今天日期和一句激励语。" \
  --name "Multi-topic briefing" \
  --deliver telegram

委托加速版

如果简报内容多,可以让 Agent 把每个主题委托(Delegation)给子智能体并行处理:

hermes cron create "0 8 * * *" \
  "通过委托子智能体创建早间简报。委托三个并行任务:

  1. 委托:搜索过去 24 小时 AI/ML 新闻前 2 条,附链接
  2. 委托:搜索过去 24 小时加密货币新闻前 2 条,附链接
  3. 委托:搜索过去 24 小时太空探索新闻前 2 条,附链接

  收集所有结果,合并成一份简洁的简报,带分节标题、emoji 格式和来源链接。" \
  --name "Delegated briefing" \
  --deliver telegram

每个子智能体独立搜索、并行跑,主智能体最后合并成一份完整简报,速度比串行快得多。

工作日版

周末不想看简报?用 cron 表达式限定周一到周五:

hermes cron create "0 8 * * 1-5" "搜索最新 AI 和科技新闻..." --deliver telegram

个性化版

把你的身份和偏好写进 prompt,简报会更精准:

hermes cron create "0 8 * * *" \
  "你在为一位资深 ML 工程师生成简报,他关注:PyTorch 生态、Transformer 架构、开源权重模型、EU AI 法案。
  跳过产品发布和融资新闻,除非涉及开源。

  搜索这些主题的最新新闻。总结前 3 条并附链接。简洁、技术化--读者不需要基础解释。" \
  --name "Personalized briefing" \
  --deliver telegram
Tip

告诉 Agent 简报是给谁的,效果会好很多。写明你的角色、兴趣和想跳过的内容。

蓝图二:看门狗监控

监控类任务的核心原则:没事别说话。用 [SILENT] 标记让 Agent 在一切正常时保持沉默,只在出问题时才通知你。

网站变化监控

监控一个网页是否发生变化,变了才通知:

/cron add "every 1h" \
  "如果脚本输出显示 CHANGE DETECTED,总结页面变了什么、为什么可能重要。如果显示 NO_CHANGE,只回复 [SILENT]。" \
  --script ~/.hermes/scripts/watch-site.py \
  --name "Pricing monitor" \
  --deliver telegram

脚本负责机械工作(抓取、对比哈希),Agent 负责推理(这个变化重要吗)。脚本输出 NO_CHANGE 时,Agent 回复 [SILENT],Hermes 不投递消息。

磁盘空间告警(纯脚本模式)

不需要 LLM 推理的看门狗,用无 Agent 模式(--no-agent),脚本 stdout 直接投递:

cat > ~/.hermes/scripts/disk-alert.sh <<'EOF'
#!/usr/bin/env bash
THRESHOLD=90
df -h / /home 2>/dev/null | awk -v t="$THRESHOLD" '
  NR > 1 && $5+0 >= t {
    printf "Disk %s full on %s\n", $5, $6
  }
'
EOF
chmod +x ~/.hermes/scripts/disk-alert.sh

hermes cron create "*/15 * * * *" \
  --no-agent \
  --script disk-alert.sh \
  --deliver telegram \
  --name "disk-alert"

磁盘没超 90% 时脚本输出为空,Hermes 静默 tick。超了就输出告警行,直接发到 Telegram。零 token 消耗。

在线率监控

检查多个端点是否可达:

# ~/.hermes/scripts/check-uptime.py
import urllib.request, json, time

ENDPOINTS = [
    {"name": "API", "url": "https://api.example.com/health"},
    {"name": "Web", "url": "https://www.example.com"},
    {"name": "Docs", "url": "https://docs.example.com"},
]

results = []
for ep in ENDPOINTS:
    try:
        start = time.time()
        req = urllib.request.Request(ep["url"], headers={"User-Agent": "Hermes-Monitor/1.0"})
        resp = urllib.request.urlopen(req, timeout=10)
        elapsed = round((time.time() - start) * 1000)
        results.append({"name": ep["name"], "status": resp.getcode(), "ms": elapsed})
    except Exception as e:
        results.append({"name": ep["name"], "status": "DOWN", "error": str(e)})

down = [r for r in results if r.get("status") == "DOWN" or (isinstance(r.get("status"), int) and r["status"] >= 500)]
if down:
    print("OUTAGE DETECTED")
    for r in down:
        print(f"  {r['name']}: {r.get('error', f'HTTP {r[\"status\"]}')}")
else:
    print("NO_ISSUES")
hermes cron create "every 30m" \
  "如果脚本报告 OUTAGE DETECTED,总结哪些服务挂了并建议可能原因。如果 NO_ISSUES,回复 [SILENT]。" \
  --script ~/.hermes/scripts/check-uptime.py \
  --name "Uptime monitor" \
  --deliver telegram

蓝图三:代码仓库看护

每日 Issue 分诊

每晚自动给新 Issue 打标签、分优先级、写一句话备注:

hermes cron create "0 2 * * *" \
  "你是项目经理,给 NousResearch/hermes-agent 仓库做 Issue 分诊。

  1. 运行: gh issue list --repo NousResearch/hermes-agent --state open --json number,title,labels,author,createdAt --limit 30
  2. 找出过去 24 小时新建的 Issue
  3. 对每个新 Issue:
     - 建议优先级标签(P0-critical, P1-high, P2-medium, P3-low)
     - 建议分类标签(bug, feature, docs, security)
     - 写一句话分诊备注
  4. 总结:总 open 数、今日新增、按优先级分布

  格式化成清晰的摘要。如果没有新 Issue,回复 [SILENT]。" \
  --name "Nightly backlog triage" \
  --deliver telegram

PR 自动审查

PR 打开时自动审查代码,把审查意见直接发到 PR 评论。这需要 Webhook 触发:

hermes webhook subscribe github-pr-review \
  --events "pull_request" \
  --prompt "审查这个 PR:
  仓库: {repository.full_name}
  PR #{pull_request.number}: {pull_request.title}
  作者: {pull_request.user.login}
  Diff URL: {pull_request.diff_url}

  用 curl -sL {pull_request.diff_url} 获取 diff。

  审查要点:
  - 安全问题(注入、认证绕过、代码里的密钥)
  - 性能问题(N+1 查询、无界循环、内存泄漏)
  - 代码质量(命名、重复、错误处理)
  - 新行为缺少测试

  发布简洁的审查意见。如果是琐碎的文档/拼写修改,简短说明即可。" \
  --skill github-code-review \
  --deliver github_comment

文档漂移检测

每周扫描已合并的 PR,找出代码改了但文档没跟上的地方:

hermes cron create "0 9 * * 1" \
  "扫描 NousResearch/hermes-agent 仓库的文档漂移。

  1. 运行: gh pr list --repo NousResearch/hermes-agent --state merged --json number,title,files,mergedAt --limit 30
  2. 筛选过去 7 天合并的 PR
  3. 检查每个 PR 是否修改了:
     - 工具 schema(tools/*.py)-> 可能需要更新 docs/reference/tools-reference.md
     - CLI 命令 -> 可能需要更新 docs/reference/cli-commands.md
     - 配置选项 -> 可能需要更新 docs/user-guide/configuration.md
  4. 交叉检查:代码改了,同一个 PR 里文档有没有跟着改

  报告所有不同步的缺口。如果完全同步,回复 [SILENT]。" \
  --name "Docs drift detection" \
  --deliver telegram

蓝图四:数据采集管道

脚本做数据采集,Agent 做分析推理。两者配合,各干各的擅长事:

# ~/.hermes/scripts/collect-prices.py
import json, os, urllib.request
from datetime import datetime

DATA_DIR = os.path.expanduser("~/.hermes/data/prices")
os.makedirs(DATA_DIR, exist_ok=True)

url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd"
data = json.loads(urllib.request.urlopen(url, timeout=30).read())

entry = {"timestamp": datetime.now().isoformat(), "prices": data}
history_file = os.path.join(DATA_DIR, "history.jsonl")
with open(history_file, "a") as f:
    f.write(json.dumps(entry) + "\n")

# 加载最近历史供分析
lines = open(history_file).readlines()
recent = [json.loads(l) for l in lines[-24:]]

print(f"Current: BTC=${data['bitcoin']['usd']}, ETH=${data['ethereum']['usd']}")
print(f"Data points: {len(lines)} total, showing last {len(recent)}")
for r in recent[-6:]:
    print(f"  {r['timestamp']}: BTC=${r['prices']['bitcoin']['usd']}, ETH=${r['prices']['ethereum']['usd']}")
hermes cron create "every 1h" \
  "分析脚本输出的价格数据。报告:
  1. 当前价格
  2. 最近 6 个数据点的趋势方向(涨/跌/平)
  3. 任何显著波动(>5% 变化)

  如果价格平稳且无显著变化,回复 [SILENT]。如果有大波动,解释发生了什么。" \
  --script ~/.hermes/scripts/collect-prices.py \
  --name "Price tracker" \
  --deliver telegram

蓝图五:多技能工作流

把多个技能串起来,让一个定时任务完成复杂的多步骤工作:

hermes cron create "0 8 * * *" \
  "搜索 arXiv 上关于 'language model reasoning' 的 3 篇最有趣的论文。
  为每篇论文创建一个 Obsidian 笔记,包含标题、作者、摘要总结和关键贡献。" \
  --skill arxiv \
  --skill obsidian \
  --name "Paper digest" \
  --deliver local

技能按顺序加载:先 arxiv(教 Agent 怎么搜论文),再 obsidian(教 Agent 怎么写笔记)。prompt 把两者串起来。

蓝图六:安全审计

每周做一次代码安全审计:

hermes cron create "0 3 * * 0" \
  "对 hermes-agent 代码库做全面安全审计。

  1. 检查依赖漏洞(pip audit, npm audit)
  2. 搜索代码里的安全反模式:
     - 硬编码密钥或 API key
     - SQL 注入向量(查询里的字符串格式化)
     - 路径遍历风险(文件路径里的用户输入未校验)
     - 不安全的反序列化(pickle.loads, yaml.load 不用 SafeLoader)
  3. 审查最近 7 天的提交,找出安全相关的变更
  4. 检查是否有新增环境变量未文档化

  写一份安全报告,按严重程度分类(Critical, High, Medium, Low)。没问题就报告一切正常。" \
  --skill codebase-security-audit \
  --name "Weekly security audit" \
  --deliver telegram

hermes send:轻量管道投递

不是所有场景都需要定时任务。有时候你只是想把一个脚本的输出推到聊天窗口—CI 构建结果、部署通知、长任务完成提醒。hermes send 就是为这个设计的。

它是一个独立的 CLI 命令,不需要 Gateway 运行,不需要 LLM,复用 Hermes 已有的平台凭据,相当于一个跨平台的 curl

基本用法

# 纯文本发到平台 home 频道
hermes send --to telegram "deploy finished"

# 管道输入
echo "RAM 92%" | hermes send --to telegram:-1001234567890

# 发文件
hermes send --to discord:#ops --file /tmp/report.md

# 带标题
hermes send --to slack:#eng --subject "[CI] build.log" --file build.log

# Telegram 话题
hermes send --to telegram:-1001234567890:17585 "threaded reply"

CI/CD 通知

if ./scripts/deploy.sh; then
  hermes send --to slack:#deploys "deploy succeeded"
else
  tail -n 100 deploy.log | hermes send \
    --to slack:#deploys --subject "deploy failed"
  exit 1
fi

长任务完成提醒

./train.py --epochs 200 && \
  hermes send --to telegram "training done" || \
  hermes send --to telegram "training failed (exit $?)"

查看可用目标

hermes send --list              # 所有平台的所有目标
hermes send --list telegram     # 只看 Telegram
hermes send --list --json       # 机器可读
Note

hermes send 对 bot-token 平台(Telegram、Discord、Slack 等)不需要 Gateway 运行—它直接调用平台 REST API。只有依赖长连接的自定义插件平台才需要 Gateway。

什么时候用 hermes send vs cron

需求用什么
定时让 Agent 做事并自动投递结果cronjob + --deliver
脚本定时跑,stdout 直接投递,不需要 Agentcronjob --no-agent + --deliver
一次性把脚本输出推到聊天窗口hermes send
CI/CD 钩子、部署通知hermes send

生产化排障

任务建好了不代表能稳定跑。这一节是你在生产环境里最可能遇到的问题和修复方法。

问题一:任务不触发

检查 1:任务是否存在且活跃

hermes cron list

看任务状态是 [active] 还是 [paused][completed][completed] 说明 repeat 次数用完了,需要编辑重置。

检查 2:调度表达式对不对

格式错误的表达式会被静默当作一次性任务或直接拒绝。对照这个表验证:

表达式应该的含义
0 9 * * *每天 9:00
0 9 * * 1每周一 9:00
every 2h从现在起每 2 小时
30m30 分钟后执行一次

如果任务跑了一次就从列表消失了,它是一次性调度(30m1d、ISO 时间戳),这是预期行为。

检查 3:Gateway 在不在跑

Warning

这是最常见的坑。 Cron 任务由 Gateway 的后台 ticker 线程触发,每 60 秒 tick 一次。普通的 CLI 聊天会话不会自动触发 cron 任务。

你需要一个正在运行的 Gateway:

hermes gateway              # 前台运行
hermes gateway install      # 安装为用户级后台服务
sudo hermes gateway install --system  # Linux: 开机自启系统服务

临时调试可以手动触发一次 tick:

hermes cron tick

检查 4:系统时钟和时区

任务用本地时区。机器时钟不对或时区设错,任务会在错误的时间触发:

date                    # 看当前时间
hermes cron list        # 对比 next_run 和本地时间

问题二:投递失败

检查 1:投递目标对不对

目标区分大小写,需要对应平台已配置。常见问题:

目标需要什么
telegram.env 里有 TELEGRAM_BOT_TOKEN
discord.env 里有 DISCORD_BOT_TOKEN
slack.env 里有 SLACK_BOT_TOKEN
local~/.hermes/cron/output/ 有写权限
origin任务创建时的聊天窗口

投递失败时任务仍然会跑,只是结果发不出去。看 hermes cron list 里的 last_error 字段。

检查 2:是不是被 [SILENT] 静默了

如果 Agent 的回复包含 [SILENT],投递会被抑制。确保你的 prompt 没有意外地让 Agent 总是回复 [SILENT]

正确写法:「如果没有变化,回复 [SILENT]」。别让 Agent 把 [SILENT] 混在长段解释里,cron 会把整个回复都静默掉。

检查 3:平台权限

  • Telegram:机器人必须是目标群组/频道的管理员
  • Discord:机器人需要有目标频道的发送权限
  • Slack:机器人必须已加入工作区且有 chat:write 权限

问题三:技能加载失败

检查 1:技能装了没

hermes skills list

技能必须先安装才能绑定到 cron 任务。没装就先装:

hermes skills install <skill-name>

检查 2:技能名对不对

技能名区分大小写,必须和技能文件夹名完全匹配。从 hermes skills list 确认确切名字。

检查 3:技能是否支持无头模式

Warning

Cron 任务运行时,cronjobmessagingclarify 工具集被禁用。这是为了防止递归创建 cron、直接发消息(投递由调度器处理)和交互式提示。如果技能依赖这些工具集,在 cron 上下文里不能用。

检查技能文档,确认它支持非交互(无头)模式。

检查 4:多技能顺序

多个技能按顺序加载。如果技能 A 依赖技能 B 的上下文,确保 B 先加载:

/cron add "0 9 * * *" "..." --skill context-skill --skill target-skill

问题四:任务报错或超时

检查 1:看日志

hermes logs                        # 查看 Hermes 日志
# 或直接看文件
# ~/.hermes/logs/agent.log         # 调度器消息
# ~/.hermes/logs/errors.log        # 警告

检查 2:常见错误

错误原因修复
No such file or directory脚本路径不对用绝对路径,确认文件在 ~/.hermes/scripts/
Skill not found技能没装或换了机器hermes skills install <name>
任务跑了但没投递投递目标问题、输出为空、或被 [SILENT]见上面投递失败排查
任务卡住或超时默认 600 秒不活动超时用脚本处理数据采集,Agent 只做结果分析

超时可以调:

HERMES_CRON_TIMEOUT=1200    # 改成 20 分钟,0 表示无限制
Note

超时是基于不活动的,不是总时长。只要 Agent 在持续调用工具,计时器就不会触发。只有持续不活动才会超时。

检查 3:锁竞争

调度器用文件锁防止 tick 重叠。如果两个 Gateway 实例在跑,任务可能被延迟或跳过:

ps aux | grep hermes
# 杀掉重复的进程,只保留一个

检查 4:jobs.json 权限

ls -la ~/.hermes/cron/jobs.json
chmod 600 ~/.hermes/cron/jobs.json   # 确保当前用户可读写

问题五:性能问题

任务启动慢:每个 cron 任务创建全新的 Agent 会话,可能涉及 provider 认证和模型加载。对时间敏感的任务,调度时间提前几分钟留 buffer。

多个任务同时到期:调度器在每个 tick 里串行执行任务。如果多个任务同一时间到期,会排队跑。错开调度时间避免拥堵:

# 不要这样--两个任务同时到期
hermes cron create "0 9 * * *" "任务A..."
hermes cron create "0 9 * * *" "任务B..."

# 这样--错开 5 分钟
hermes cron create "0 9 * * *" "任务A..."
hermes cron create "5 9 * * *" "任务B..."

脚本输出太大:脚本 dump 几 MB 输出会拖慢 Agent 并可能超 token 限制。在脚本层面过滤和摘要,只输出 Agent 需要推理的部分。

排障速查命令

hermes cron list                    # 查看所有任务、状态、下次运行时间
hermes cron run <job_id>            # 立即触发一次(用于测试)
hermes cron edit <job_id>           # 修复配置
hermes cron status                  # 调度器状态
hermes cron runs <job_id> --limit 20  # 执行历史
hermes logs                         # 查看日志
hermes skills list                  # 确认技能已安装
hermes send --list                  # 查看可用投递目标
Tip

测试新任务时,先用 hermes cron run <job_id> 手动触发一次,确认输出正确,再等调度器自动跑。别等了半天发现 prompt 写错了。

自动化的核心心法

讲完蓝图和排障,最后总结几条让自动化稳定运行的心法:

Prompt 必须自包含。 Cron 任务在全新会话里跑,没有你当前聊天的记忆。URL、仓库名、格式偏好、投递指令,全部写进 prompt。

用 [SILENT] 控制噪音。 监控类任务在没事时回复 [SILENT],你只在出问题时收到通知。

脚本做机械活,Agent 做推理活。 数据采集、状态对比、阈值判断交给脚本;总结、分析、建议交给 Agent。这样又快又省 token。

Gateway 必须常驻。 Cron 靠 Gateway 的 ticker 触发。装成系统服务,别让它在前台挂着被人误关。

错开调度时间。 多个任务别挤在同一个分钟,串行执行会排队。

先测试再上线。 hermes cron run 手动触发一次,确认输出符合预期,再交给调度器自动跑。