使用 Cron 自动化
每日简报机器人教程涵盖了基础知识。本指南更进一步 — 五个您可以为自己的工作流调整的实际自动化模式。
有关完整功能参考,请参阅计划任务 (Cron)。
关键概念
Cron 作业在全新的代理会话中运行,没有当前聊天的记忆。提示必须完全独立 — 包含代理需要知道的一切。
模式 1:网站变更监控
观察 URL 的变化,仅在发生变化时收到通知。
这里的 script 参数是秘密武器。一个 Python 脚本在每次执行前运行,其 stdout 成为代理的上下文。脚本处理机械工作(获取、差异);代理处理推理(这个变化有趣吗?)。
创建监控脚本:
mkdir -p ~/.hermes/scriptsimport hashlib, json, os, urllib.request
URL = "https://example.com/pricing"
STATE_FILE = os.path.expanduser("~/.hermes/scripts/.watch-site-state.json")
# 获取当前内容
req = urllib.request.Request(URL, headers={"User-Agent": "Hermes-Monitor/1.0"})
content = urllib.request.urlopen(req, timeout=30).read().decode()
current_hash = hashlib.sha256(content.encode()).hexdigest()
# 加载先前状态
prev_hash = None
if os.path.exists(STATE_FILE):
with open(STATE_FILE) as f:
prev_hash = json.load(f).get("hash")
# 保存当前状态
with open(STATE_FILE, "w") as f:
json.dump({"hash": current_hash, "url": URL}, f)
# 输出给代理
if prev_hash and prev_hash != current_hash:
print(f"{URL} 上检测到变化")
print(f"先前哈希: {prev_hash}")
print(f"当前哈希: {current_hash}")
print(f"\n当前内容(前 2000 个字符):\n{content[:2000]}")
else:
print("无变化")设置 cron 作业:
/cron add "每 1 小时" "如果脚本输出说检测到变化,总结页面上的变化以及为什么它可能重要。如果它说无变化,只用 [静默] 响应。" --script ~/.hermes/scripts/watch-site.py --name "价格监控" --deliver telegram[静默] 技巧
当代理的最终响应包含 [静默] 时,交付被抑制。这意味着您只在实际发生事情时收到通知 — 安静时间不会有垃圾邮件。
模式 2:每周报告
将来自多个来源的信息编译成格式化的摘要。这每周运行一次并交付到您的主频道。
/cron add "0 9 * * 1" "生成一份涵盖以下内容的每周报告:
1. 在网络上搜索过去一周的前 5 个 AI 新闻故事
2. 在 GitHub 上搜索 'machine-learning' 主题中的热门仓库
3. 在 Hacker News 上检查讨论最多的 AI/ML 帖子
格式化为每个来源都有部分的简洁摘要。包含链接。
保持在 500 字以内 — 只突出重要的内容。" --name "每周 AI 摘要" --deliver telegram从 CLI:
hermes cron create "0 9 * * 1" \
"生成一份涵盖热门 AI 新闻、热门 ML GitHub 仓库和讨论最多的 HN 帖子的每周报告。按部分格式化,包含链接,保持在 500 字以内。" \
--name "每周 AI 摘要" \
--deliver telegram0 9 * * 1 是一个标准的 cron 表达式:每周一上午 9:00。
模式 3:智能文件处理
监控目录中的新文件并自动处理它们。结合脚本和代理推理。
import os, json
from pathlib import Path
DOWNLOADS = Path.home() / "Downloads"
STATE_FILE = Path.home() / ".hermes/scripts/.downloads-state.json"
# 加载先前的文件列表
prev_files = set()
if STATE_FILE.exists():
prev_files = set(json.loads(STATE_FILE.read_text()))
# 获取当前文件(仅限今天,特定模式)
current_files = set()
for f in DOWNLOADS.glob("*.pdf"):
if f.stat().st_mtime > (time.time() - 86400): # 过去 24 小时
current_files.add(str(f))
# 保存当前状态
STATE_FILE.write_text(json.dumps(list(current_files)))
# 找到新文件
new_files = current_files - prev_files
if new_files:
print("检测到新 PDF 文件:")
for f in new_files:
print(f" - {f}")
else:
print("无新文件")/cron add "每 30 分钟" "对于脚本输出的每个新 PDF:
1. 阅读 PDF 并提取主要内容
2. 创建一个 3 句话的摘要
3. 用适当的标签命名文件(例如 YYYY-MM-DD-主题.pdf)
4. 将重命名的文件移动到 ~/Documents/Processed/
5. 向我发送一条消息,包含摘要和新文件名
如果没有新文件,响应 [静默]。" --script ~/.hermes/scripts/check-downloads.py --name "下载处理器" --deliver telegram模式 4:数据管道监控
检查数据管道健康状况并在出现问题时收到警报。
import requests, json, sys
API_ENDPOINT = "https://api.your-service.com/health"
API_KEY = os.getenv("SERVICE_API_KEY")
try:
resp = requests.get(API_ENDPOINT, headers={"Authorization": f"Bearer {API_KEY}"}, timeout=10)
data = resp.json()
issues = []
if data.get("queue_depth", 0) > 1000:
issues.append(f"队列深度高: {data['queue_depth']}")
if data.get("error_rate", 0) > 0.01:
issues.append(f"错误率高: {data['error_rate']:.2%}")
if not data.get("healthy", True):
issues.append("服务报告不健康")
if issues:
print("ALERT: 检测到管道问题")
for issue in issues:
print(f" - {issue}")
print(f"\n完整响应: {json.dumps(data, indent=2)}")
else:
print("HEALTHY: 所有指标正常")
except Exception as e:
print(f"ERROR: 无法检查管道: {e}")/cron add "每 5 分钟" "分析脚本输出:
- 如果它以 'ALERT' 开头,总结问题并通过 Telegram 发送紧急通知
- 如果它以 'ERROR' 开头,报告连接问题
- 如果它以 'HEALTHY' 开头,响应 [静默]
对于 ALERT 情况,包括建议的操作。" --script ~/.hermes/scripts/check-pipeline.py --name "管道监控" --deliver telegram模式 5:多技能工作流
使用单个 cron 作业协调多个技能的序列。
/cron add "0 8 * * 1-5" "这是一个多步骤的早晨工作流:
步骤 1 - 收集:
- 检查我的 Gmail 中来自重要发件人的未读邮件
- 查看我的 Google 日历中的今天日程
- 从 Hacker News 获取热门科技故事
步骤 2 - 分析:
- 识别任何需要我立即关注的紧急邮件
- 找出日程中的任何冲突或空档
- 标记与我的工作相关的 HN 故事
步骤 3 - 交付:
创建一份格式化的早报,包含:
- 紧急事项(如果有)
- 今天的日程概览
- 3 个相关的科技故事及其链接
- 建议的优先级
直接写入 ~/Documents/Briefings/daily-{today}.md 并通过 Telegram 发送摘要。" --name "早晨工作流" --deliver telegram管理您的 Cron 作业
列出所有作业
/cron list暂停/恢复作业
/cron pause 1 # 按 ID 暂停
/cron resume 1 # 按 ID 恢复手动运行作业
/cron run 1 # 立即执行作业 1删除作业
/cron delete 1编辑作业
/cron edit 1 --prompt "新提示文本" --schedule "0 10 * * *"最佳实践
1. 始终处理静默情况
当无事可做时使用 [静默] 技巧抑制通知:
如果没有任何变化,响应 [静默]。2. 使用脚本进行状态管理
脚本非常适合:
- 跟踪先前状态(哈希、文件列表、计数器)
- 调用 API 和解析响应
- 过滤数据以仅将相关内容发送给代理
3. 保持提示具体
Cron 提示应该包含代理需要知道的一切:
✅ 好: "检查 GitHub 中我的仓库的前 5 个未解决问题。对于每个问题,总结标题、标签和最后活动。如果任何问题的标签为 'urgent',请在响应中标记它。"
❌ 坏: "检查我的 GitHub 问题。"
4. 使用有意义的名称
名称出现在日志和通知中:
--name "server-health-monitor" # 良好:清晰
--name "job-1" # 差:含糊5. 测试您的脚本
在将其放入 cron 作业之前,手动运行脚本:
python ~/.hermes/scripts/watch-site.py6. 从宽松的调度开始
当您正在调试时,使用频繁的间隔:
/cron add "每 5 分钟" "..." --name "测试"验证它工作后,切换到生产间隔:
/cron edit <id> --schedule "0 9 * * 1"故障排除
作业不运行
检查网关是否正在运行:
hermes gateway status脚本失败
在隔离环境中手动测试:
cd ~/.hermes/scripts
python your-script.py代理响应意外
使用详细模式检查代理实际看到的内容:
/cron run <id> --verbose交付失败
验证 --deliver 平台是否已配置:
/hermes config show | grep -A5 telegram