坐席自助排班
Agent 自调度 (Agent Self-Scheduling)
使用场景
- 当用户要求 agent 执行重复性、定时、心跳或循环工作时。
- 当你需要在 cron、外部调度器、钩子 (hooks) 或内置 agent 调度之间做出选择时。
首先要确认:agent 是否具有内置调度器(Hermes $\rightarrow$ Camp B),还是由你控制时钟(其他所有 $\rightarrow$ Camp A)?
通用底线:cron 的最小间隔为 1 分钟(5 字段表达式,无秒级)——适用于所有阵营。对于亚分钟级需求,你必须使用 while ...; sleep N; done 循环、TS 扩展或事件钩子。切勿将 LLM 置于紧凑的定时器中。
Camp A — 单次运行 agent,由你控制时钟
这类 agent 运行一次后即退出(除非恢复,否则不具备记忆)。请在外部对其进行调度。
claude -p "PROMPT" --output-format json --allowedTools "Read,Edit,Bash" # Claude Code
codex exec --json "PROMPT" # Codex
pi run "PROMPT" # Pi将其封装在时钟中:
# 1. cron (最低 1 分钟间隔)
*/10 * * * * cd /path/to/project && pi run "check X and report" >> ~/agent.log 2>&1
2. systemd timer (Linux,重启后依然有效,日志记录更佳) — OnUnitActiveSec=10min
3. 简单循环 (亚分钟级,或无 cron 可用时)
while true; do pi run "check X"; sleep 30; done注意事项(若忽略,将导致无人值守运行失败):
- 权限阻塞。 传递
--allowedTools(Claude) 或沙箱/自动批准标志 (Codex),否则运行将阻塞在提示符处。
- 使用 JSON 输出 (
--output-format json/--json),以便封装程序能够确定性地解析结果。
- 运行是无记忆的。 使用恢复命令 (
codex exec resume --last) 或将状态持久化到文件中供下次运行读取。
Pi 在设计上没有内置调度器/循环/心跳 —— 仅支持外部时钟(或用于 agent 端定时器的 TS 扩展)。
cmux — 仅限编排,无调度器
cmux 没有定时器/监听/cron。循环运行它的三种方式:由编排器驱动(在自己的时钟上执行 send $\rightarrow$ sleep $\rightarrow$ read-screen)、简单的 while-sleep 封装,或者(推荐)通过 cmux notify + OSC 终端钩子实现事件驱动,这比轮询更便宜且响应更快。read-screen 是非中断性的,可以安全地进行轮询。
如果循环在检查另一个 agent,请在每次检查时向用户发送一行状态更新:agent 正在做什么,是否在正轨上。(Claude Code 在完成后可能会预填一条预测的用户消息 —— 这是 Claude 的行为,而非用户。)
Camp B — Hermes 内置调度器
Hermes 的网关每 60 秒滴答一次,并在全新的隔离会话中运行到期任务。首先检查状态:
hermes gateway install # 用户级 (使用 --system 可在重启后生存)
hermes cron create "every 1h" "summarize new emails and report" --skill himalaya
hermes cron create "0 9 * * *" "post daily standup" # cron 表达式
hermes cron create "30m" "one-shot reminder in 30 min" # 单次延迟Hermes 特有功能:零 Token 模式(运行脚本并原样交付 stdout —— 用于看门狗)、链式调用 (context_from 将一个任务的输出管道传输到下一个任务)、自终止 (self-ter...
消除循环以及循环安全性(定时会话不能创建更多定时任务 —— 不要在定时任务内部进行调度)。每次运行都是一个全新的会话:提示词必须包含所有上下文。
心跳模式 (Heartbeat pattern)
通过一个快速循环的“滴答” (tick) 来控制多个较慢的单项任务检查:滴答进程读取任务列表及每个任务的 last_run 时间戳,仅对到期任务执行操作。在 Hermes 中使用循环任务(无到期任务时使用 zero-token 模式);在 Camp A 中使用 while-sleep 循环。定义活跃时间段,并在没有到期任务时保持静默 —— 避免产生无意义的空日志。
验证触发 (在报告成功之前)
1. Camp A:确认一个周期后日志文件有所增长,或手动运行一次封装命令 $\rightarrow$ 输出干净的 JSON 且退出码为 0。
2. Camp B:hermes cron list 显示该任务且 next_run 时间正常;触发一次立即运行以确认交付。
3. 确认权限/沙箱标志已配置 —— 最常见的静默失败是权限提示导致进程挂起。
4. 心跳验证:确认在没有到期任务时,滴答进程保持静默。
局限性
- 改编自
davidondrej/skills;在执行前请验证本地路径、工具、凭据和 Agent 功能。
- 对于涉及命令执行、远程访问、调度、浏览器自动化或文件修改的工作流,请先获得用户的明确批准并确认目标环境。