跳到主要内容

定时任务(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 会:

  1. ~/.hermes/cron/jobs.json 读取任务
  2. 检查 next_run_at 是否已到当前时间
  3. 为每个到期任务启动新的 AIAgent 会话
  4. 如有附加技能,则在新会话中注入这些技能
  5. 运行 prompt 直到结束
  6. 投递最终响应
  7. 更新运行元数据与下一次计划时间

~/.hermes/cron/.tick.lock 文件锁会防止多个调度 tick 重叠执行同一批任务。

投递选项

创建计划任务时,你需要指定结果要投递到哪里:

OptionDescriptionExample
"origin"返回到任务创建来源消息平台默认值
"local"仅保存到本地文件(~/.hermes/cron/output/CLI 默认值
"telegram"Telegram home channelUses TELEGRAM_HOME_CHANNEL
"telegram:123456"指定 Telegram chat ID直接投递
"telegram:-100123:17585"指定 Telegram topicchat_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"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 typeDefault repeatBehavior
One-shot (30m, timestamp)1只运行一次
Interval (every 2h)forever直到被删除
Cron expressionforever直到被删除

你也可以覆盖默认值:

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

任务中的 modelprovider 允许为 null。当这些字段缺省时,Hermes 会在执行时根据全局配置解析它们。只有当任务自身设置了覆盖值时,它们才会显式写入任务记录。

存储采用原子写入,因此中断写入不会留下半截损坏文件。

Prompt 仍然必须自包含

Important

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 会被拦截。