§07你睡觉时它在干嘛:定时任务与看板
While You Sleep: Cron Jobs and the Kanban Board
前面几节都是你说一句它做一件。这一节让它自己动起来:一个每天按点跑的提醒,一串有先后顺序、做完一张自动接下一张的任务卡。最后我把这一晚上测试的token账单也摊开给你看。
用一句话建定时任务
在对话里直接说要它什么时候做什么就行,不用写cron表达式:
每个工作日早上9点,帮我检查~/demo/todo.md 里还没完成的事,整理成一句话提醒我。它调用⏰ cron 建了一个叫「工作日早9点待办提醒」的任务,回复里列出频率、内容和下次执行时间,并主动提醒了两件事:网关没在跑,任务不会自动触发;没接聊天平台,结果只能存在本地。
这两条提醒我挨个说。
第一,定时任务靠网关来跑。Hermes的调度器在gateway(消息网关)进程里,网关不开,任务只留在列表里,不会触发。用hermes cron list看得很清楚:
hermes cron list:任务编号、状态active、调度「weekdays at 9am」、无限重复、下次运行时间、投递到local。底下黄色警告:Scheduler is not ready,没有网关在服务这个profile,给出了安装网关服务的命令。
让网关跑起来有两种方式。hermes gateway run是在前台跑,关掉终端它就停;hermes gateway install会把它装成系统后台服务(macOS上是launchd,Linux上是systemd),开机自动起来。真打算让它每天早上提醒你,就用后者。我测试时用的是前台跑:
另开一个终端跑着hermes gateway run之后,hermes cron status变成「Gateway is running — cron jobs will fire automatically」,下次运行09:00。下面的看板里,第二张卡已经被网关自动接手,状态变成running(看板后面讲)。
第二,结果发到哪。没接聊天平台的时候,结果存成本地文件。想不等到明早就看效果,可以hermes cron run 任务编号再hermes cron tick ,手动让它跑一次:
手动触发一次后的输出文件,在 ~/.hermes/cron/output/任务编号/ 下面,按运行时间命名。最底下是这次的结果:「今天还有3件待办未完成:写橙皮书、剪视频、回评论。」
这份文件里我删掉了中间的Prompt部分。那里面Hermes在你的任务前面加了一段给定时任务专用的系统说明,其中一条是「如果确实没有新东西可报,就只回复[SILENT]」,这样它就不会每天早上给你发一条「今天没什么事」。
核心建议
接上Telegram、微信、飞书这些平台之后,在那个聊天窗口里发/sethome,把它设成「家」,以后定时任务的结果默认就发到这里。这条提示其实在你第一次打开hermes时就闪过(启动页底部的Tip)。
用看板串联任务
定时任务管什么时候做,看板(Kanban)管有先后关系的几件事怎么接力做完。比如我想要一份三句话版的周报,拆开是三步:先整理待办排优先级,再写周报草稿,再压成三句话。后一步要等前一步。
先用命令行建三张卡,后两张用--parent指明前置任务:
hermes kanban init hermes kanban create "整理 todo.md 里本周的待办,按优先级排序" --assignee default hermes kanban create "根据排好的待办写一份周报草稿" --assignee default --parent <第一张卡的编号>hermes kanban create "把周报压成三句话" --assignee default --parent <第二张卡的编号>hermes kanban list和stats:第一张卡是ready(▶),后两张因为前置没完成,停在todo(◻)。
--assignee default的意思是派给默认的这个Hermes。你可以建多个profile(比如一个专门写代码、一个专门做调研,各用各的模型),卡片派给谁,就由谁来干。
建好之后,同样要网关在跑,它里面有个调度器每60秒扫一次看板,把ready的卡派出去。不想等,可以手动hermes kanban dispatch跑一轮。每张卡会起一个独立的worker进程去干,干完写一段总结:
hermes kanban show看第一张卡:状态done,从开始到完成约37秒;Latest summary是worker写的总结(按优先级排成了回评论>写橙皮书>剪视频);Runs里记着每次运行。卡片默认用临时工作区,任务完成后会被删掉。
第一张做完,第二张自动从todo变成ready,被网关接走,然后是第三张。整个过程你不用盯着。在浏览器面板(§08)里看是这个样子:
浏览器面板的看板页,界面切成了简体中文。八列:待分类、待办、已调度、就绪、进行中、阻塞、Review、已完成。截图时第一张卡在「已完成」,第二张在「就绪」,第三张在「待办」。右上角「触发调度器」等于手动dispatch。
网关开起来之后,不到两分钟,后两张卡就接力跑完了(第二张02:27完成,第三张02:28完成,每张二三十秒):
同一个看板,三张卡都进了「已完成」。从建卡到全部完成,我没有再碰过它,只是开着网关。
第二张卡写的周报草稿、第三张卡压出来的三句话,worker都存成了文件(weekly-report.md、weekly-report-3lines.md),存在各自的临时工作区里。卡片一完成,临时工作区就被清掉了,文件跟着没了。我最后能找回来的,只有每张卡的那一行总结,以及在「会话」页里翻worker的最后一条回复:
1. 本周先回评论,时效性强,预计1小时。2. 接着写橙皮书,需要集中精力,预计2小时。3. 最后剪视频,可灵活安排,预计3小时,总工时约6小时。
其实第一张卡的详情里已经提醒过(tip_scratch_workspace那一行:「scratch workspaces are ephemeral」),是我没当回事。想留下产物,建卡时加--workspace dir:/你的/目录,或者在卡片描述里要求worker把产物作为附件(artifacts)交上来,这样清理之前会被拷进看板的附件存储。
注意
看板卡片和定时任务都是无人值守跑的,执行过程中没人在旁边点「同意」。Hermes对这类场景的默认策略是:碰到需要审批的危险命令直接拒绝。定时任务看approvals.cron_mode,看板worker这种单次查询看
single_query_mode,webhook这类看unattended_mode,默认都是deny。这是保护,但也说明别把「删
某个目录」「发布某个东西」这类不可逆的活直接丢进去。真要放,用 --triage 先停在「待分类」,或者让它做完停在Review等你看一眼。
统计token用量
最后说钱。hermes insights会统计最近30天的用量:
截到这里时的统计:6个会话,我一共只发了9条消息,工具调用27次,总token 522,576。按平台拆:命令行对话35万,一张看板卡片15.9万,一次定时任务8.5千。Cost一栏显示Unknown,因为它没有qwen3.7-plus的价格表。
9条消息,52万token。平均一条消息五六万token,原因是agent每一轮都要把系统提示、工具说明、记忆、技能目录一起发给模型,一轮里还会来回好几次(读文件、改文件、再回复)。最贵的是看板卡片:一张「排个优先级」的小卡就吃了15.9万,因为worker是一个完整的agent,从头加载一遍上下文再干活。
多数token是重复的前缀,支持缓存的模型会便宜很多(Hermes在设计上很在意保护这个缓存,§12讲的「冻结快照」就是为了它)。但你得有这个量级的概念:定时任务尽量写成一次跑完就结束的小活,看板卡片别拆得太碎,每张卡的固定开销都不低。