定时任务(Cron)
你可以使用自然语言或 cron 表达式安排任务自动运行。Hermes 通过单个 cronjob 工具来统一管理 cron,而不是拆成多个独立工具。
当前 cron 能做什么
Cron 任务现在可以:
- 创建一次性或周期性任务
- 暂停、恢复、编辑、触发和删除任务
- 给任务附加 0 个、1 个或多个技能
- 将结果投递回原始聊天、保存到本地文件,或发送到已配置的平台目标
- 在全新的智能体会话中运行,并使用正常的静态工具列表
Cron 运行出的会话不能递归创建新的 cron 任务。Hermes 会在 cron 执行上下文中禁用 cron 管理工具,以防止失控的计划任务循环。
创建计划任务
在聊天中使用 /cron
/cron add 30m "Remind me to check the build"
/cron add "every 2h" "Check server status"
/cron add "every 1h" "Summarize new feed items" --skill blogwatcher
/cron add "every 1h" "Use both skills and combine the result" --skill blogwatcher --skill maps
通过独立 CLI
hermes cron create "every 2h" "Check server status"
hermes cron create "every 1h" "Summarize new feed items" --skill blogwatcher
hermes cron create "every 1h" "Use both skills and combine the result" --skill blogwatcher --skill maps --name "Skill combo"
通过自然对话
你也可以直接正常对 Hermes 说:
Every morning at 9am, check Hacker News for AI news and send me a summary on Telegram.
Hermes 会在内部使用统一的 cronjob 工具来完成配置。
基于技能的 cron 任务
Cron 任务在运行 prompt 之前,可以先加载一个或多个技能。
单个技能
cronjob(
action="create",
skill="blogwatcher",
prompt="Check the configured feeds and summarize anything new.",
schedule="0 9 * * *",
name="Morning feeds",
)
多个技能
技能会按顺序加载,prompt 会作为叠加在这些技能之上的任务指令。
cronjob(
action="create",
skills=["blogwatcher", "maps"],
prompt="Look for new local events and interesting nearby places, then combine them into one short brief.",
schedule="every 6h",
name="Local brief",
)
当你想让计划任务继承可复用工作流,而不想把整段技能说明硬塞进 cron prompt 时,这种方式会很有用。
编辑任务
若只是修改现有任务,并不需要删掉再重建。
聊天中
/cron edit <job_id> --schedule "every 4h"
/cron edit <job_id> --prompt "Use the revised task"
/cron edit <job_id> --skill blogwatcher --skill maps
/cron edit <job_id> --remove-skill blogwatcher
/cron edit <job_id> --clear-skills
独立 CLI
hermes cron edit <job_id> --schedule "every 4h"
hermes cron edit <job_id> --prompt "Use the revised task"
hermes cron edit <job_id> --skill blogwatcher --skill maps
hermes cron edit <job_id> --add-skill maps
hermes cron edit <job_id> --remove-skill blogwatcher
hermes cron edit <job_id> --clear-skills
说明:
- 重复传入
--skill会直接替换该任务的技能列表 --add-skill会在现有列表后追加,而不是整体替换--remove-skill用于移除指定技能--clear-skills会移除全部已附加技能
生命周期操作
聊天中
/cron list
/cron pause <job_id>
/cron resume <job_id>
/cron run <job_id>
/cron remove <job_id>
独立 CLI
hermes cron list
hermes cron pause <job_id>
hermes cron resume <job_id>
hermes cron run <job_id>
hermes cron remove <job_id>
hermes cron status
hermes cron tick
含义如下:
pause— 保留任务,但停止继续调度resume— 重新启用任务,并计算下一次未来执行时间run— 在下一次调度 tick 时立即触发remove— 彻底删除任务
工作原理
Cron 的执行由 网关 守护进程负责。 网关 每 60 秒 tick 一次调度器,把到期任务放到隔离智能体会话中执行。
hermes 网关 install # Install as a user service
sudo hermes 网关 install --system # Linux: boot-time system service for servers
hermes 网关 # Or run in foreground
hermes cron list
hermes cron status
网关调度器行为
每次 tick 时,Hermes 会:
- 从
~/.hermes/cron/jobs.json读取任务 - 检查
next_run_at是否已到当前时间 - 为每个到期任务启动新的
AIAgent会话 - 如有附加技能,则在新会话中注入这些技能
- 运行 prompt 直到结束
- 投递最终响应
- 更新运行元数据与下一次计划时间
~/.hermes/cron/.tick.lock 文件锁会防止多个调度 tick 重叠执行同一批任务。
投递选项
创建计划任务时,你需要指定结果要投递到哪里:
| Option | Description | Example |
|---|---|---|
"origin" | 返回到任务创建来源 | 消息平台默认值 |
"local" | 仅保存到本地文件(~/.hermes/cron/output/) | CLI 默认值 |
"telegram" | Telegram home channel | Uses TELEGRAM_HOME_CHANNEL |
"telegram:123456" | 指定 Telegram chat ID | 直接投递 |
"telegram:-100123:17585" | 指定 Telegram topic | chat_id:thread_id |
"discord" | Discord home channel | |
"discord:#engineering" | 指定 Discord 频道 | 按频道名 |
"slack" | Slack home channel | |
"whatsapp" | WhatsApp home | |
"signal" | Signal | |
"matrix" | Matrix home room | |
"mattermost" | Mattermost home channel | |
"email" | ||
"sms" | 通过 Twilio 的 SMS | |
"homeassistant" | Home Assistant | |
"dingtalk" | DingTalk | |
"feishu" | Feishu/Lark | |
"wecom" | WeCom | |
"weixin" | Weixin (WeChat) | |
"bluebubbles" | BlueBubbles (iMessage) | |
"qqbot" | QQ Bot (Tencent QQ) |
智能体的最终响应会自动投递,因此你不需要在 cron prompt 中再显式调用 send_message。
响应包装
默认情况下,投递出去的 cron 输出会被包裹上头尾信息:
Cronjob Response: Morning feeds
-------------
<agent output here>
Note: The agent cannot see this message, and therefore cannot respond to it.
如果你希望直接投递原始输出,可将 cron.wrap_response 设为 false:
# ~/.hermes/config.yaml
cron:
wrap_response: false
静默抑制
如果智能体的最终响应以 [SILENT] 开头,则不会进行消息投递。输出仍会保存在本地(~/.hermes/cron/output/)用于审计,但不会发送给目标平台。
这很适合只在异常时才通知的监控任务:
Check if nginx is running. If everything is healthy, respond with only [SILENT].
Otherwise, report the issue.
任务失败时始终会投递,不受 [SILENT] 标记影响;只有成功运行才允许静默。
脚本超时
预运行脚本默认超时为 120 秒。如需更长时间,可这样配置:
# ~/.hermes/config.yaml
cron:
script_timeout_seconds: 300 # 5 minutes
或者设置 HERMES_CRON_SCRIPT_TIMEOUT 环境变量。解析顺序是:env var → config.yaml → 默认 120 秒。
Provider 恢复能力
Cron 任务会继承你配置的 fallback 大模型提供商(provider) 和 credential pool 轮换策略。如果主 API key 被限流,或主 大模型提供商(provider) 返回错误,cron agent 可以:
- 若配置了
fallback_providers(或旧版fallback_model),则回退到另一个 provider - 在相同 大模型提供商(provider) 内,从 credential pool 中轮换到下一个凭据
这意味着高频 cron 任务在高峰时段也更稳健,不会因为单个 key 被限流而整轮失败。
调度格式
智能体的最终响应会自动投递,因此对于相同目标,你不需要在 cron prompt 中再写 send_message。如果 cron 执行中调用了 send_message,且目标与调度器本来就会投递到的目标完全一致,Hermes 会跳过重复发送,并提示模型把面向用户的内容直接放在最终响应中。只有在你要额外投递到其他目标时,才需要显式调用 send_message。
相对延迟(一次性)
30m → Run once in 30 minutes
2h → Run once in 2 hours
1d → Run once in 1 day
间隔任务(循环)
every 30m → Every 30 minutes
every 2h → Every 2 hours
every 1d → Every day
Cron 表达式
0 9 * * * → Daily at 9:00 AM
0 9 * * 1-5 → Weekdays at 9:00 AM
0 */6 * * * → Every 6 hours
30 8 1 * * → First of every month at 8:30 AM
0 0 * * 0 → Every Sunday at midnight
ISO 时间戳
2026-03-15T09:00:00 → One-time at March 15, 2026 9:00 AM
重复行为
| Schedule type | Default repeat | Behavior |
|---|---|---|
One-shot (30m, timestamp) | 1 | 只运行一次 |
Interval (every 2h) | forever | 直到被删除 |
| Cron expression | forever | 直到被删除 |
你也可以覆盖默认值:
cronjob(
action="create",
prompt="...",
schedule="every 2h",
repeat=5,
)
程序化管理任务
面向智能体的 API 只有一个工具:
cronjob(action="create", ...)
cronjob(action="list")
cronjob(action="update", job_id="...")
cronjob(action="pause", job_id="...")
cronjob(action="resume", job_id="...")
cronjob(action="run", job_id="...")
cronjob(action="remove", job_id="...")
对于 update,传入 skills=[] 可删除全部附加技能。
任务存储
任务保存在 ~/.hermes/cron/jobs.json 中。任务执行输出保存在 ~/.hermes/cron/output/{job_id}/{timestamp}.md。
任务中的 model 和 provider 允许为 null。当这些字段缺省时,Hermes 会在执行时根据全局配置解析它们。只有当任务自身设置了覆盖值时,它们才会显式写入任务记录。
存储采用原子写入,因此中断写入不会留下半截损坏文件。
Prompt 仍然必须自包含
Cron 任务总是在一个全新的智能体会话中运行,因此 prompt 必须包含除附加技能外的一切必要信息。
BAD: "Check on that server issue"
GOOD: "SSH into server 192.168.1.100 as user 'deploy', check if nginx is running with 'systemctl status nginx', and verify https://example.com returns HTTP 200."
安全性
计划任务的 prompt 会在创建和更新时扫描 prompt injection 与凭据外泄模式。包含不可见 Unicode 欺骗、SSH 后门尝试或明显秘密窃取 payload 的 prompt 会被拦截。