自动化蓝图与生产化排障
本教程共 25 篇 · 第 17 篇 · 更新于 2026-07-26 · 约 22 分钟阅读
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 直接投递,不需要 Agent | cronjob --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 小时 |
30m | 30 分钟后执行一次 |
如果任务跑了一次就从列表消失了,它是一次性调度(30m、1d、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:技能是否支持无头模式
WarningCron 任务运行时,
cronjob、messaging和clarify工具集被禁用。这是为了防止递归创建 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 手动触发一次,确认输出符合预期,再交给调度器自动跑。