Skip to content

第十二章:定时任务怎样触发、执行和投递 ​

简报现在有明确的身份、方法和交付对象。你希望“每周一早上整理一次”,不用临时再发消息。把这句话存下来,还缺什么?

系统必须有人持续看时间,知道任务属于哪个 Profile,届时取得材料、组织输入、执行,并留下结果。假如草稿已生成但聊天平台离线,不能把它当成“周报没写”,也不能假装用户已经收到。

本章把没有新消息时的一次任务拆成生命周期。产物是一张任务定义卡,以及触发、运行、保存、投递各阶段的状态表。

12.1 调度器决定何时开始,Agent 决定如何完成 ​

调度器是按时间或事件启动工作的程序。Cron 原本是一类时间调度约定,在 Hermes 中也用来统称相关任务功能。它不需要模型每秒想一遍“到周一了吗”。

时间规则和当前时刻的比较可以由确定性程序完成。轮到任务时,再启动需要判断的模型与工具循环。这样把持续等待和实际推理分开,避免让一个模型会话一直占着资源等时间过去。

图 12-1 教学视图:时间条件成立,只解决何时开始,尚未证明任务完成或用户收到结果。 点击图解可放大
左右滑动查看图解细节
触发条件、执行任务、保存结果和投递结果依次排列,三种成功需要分别确认

图 12-1 教学视图:时间条件成立,只解决何时开始,尚未证明任务完成或用户收到结果。

Hermes 支持单次延迟、间隔、固定时间表达等形式,也有事件触发路径。底层触发器可以有不同提供者,实际任务执行与交付仍有共同的生命周期。替换时钟,不应重新实现整套简报逻辑。

还有一个有用的反问:每次触发都需要 Agent 吗?如果工作只是运行固定程序并原样交付结果,Hermes 也支持不经过模型的任务方式。需要核对相互矛盾的自然语言材料,才有理由加入判断循环。

12.2 任务定义必须独立于“刚才那段聊天” ​

定时任务不是让模型在周一继续记住周五的最后一句话。Hermes 的计划运行可以在新的 Agent 会话中开始,不自动带入创建任务时的整段对话。

因此,任务定义需要包含稳定目标,或能明确找到所需材料。第九章的方法可以作为技能绑定并在运行时加载;第八章的偏好也应按实际记忆机制提供。不能只写“照旧整理一下”,却没有保存“旧”指什么。

任务卡项目简报教学设计缺失的后果
归属个人简报 Profile读到错误记忆、账号或技能
时间与时区用户确认的每周一早上不同运行环境对时间理解不同
输入与方法本周材料位置、简报技能、去重与冲突规则新会话没有足够依据
完成标准最多三件,不足说明,保留条件为凑数重复或编造
工作位置如需项目文件,明确所在目录找不到方法或写错位置
交付方式先保存草稿;获授权后送到指定目标生成与发送边界不明

Hermes 可以为任务绑定工作目录,将相关项目说明和文件工具的工作位置与本次运行关联。它解决“从哪里找项目”的问题,不能替代操作系统权限或对外发送的授权。

12.3 一次到点运行怎样展开 ​

回到统一任务时序,差别发生在开头:这次提出目标的是已保存任务,而不是一条刚到的聊天消息。后续仍要解析模型、准备输入、调用工具、处理反馈与交付。

图 12-2 教学主流程:图中展开需要模型判断的一类任务,不表示任何调度都必须调用模型。 点击图解可放大
左右滑动查看图解细节
到达计划时间后选择配置,执行前检查,启动新运行,保存产物,再按目标投递并分别记录结果

图 12-2 教学主流程:图中展开需要模型判断的一类任务,不表示任何调度都必须调用模型。

Hermes 的执行前检查会核对模型凭据、绑定技能、工作位置等条件。已知配置不满足时,可以先阻止运行并记录配置阻塞,避免到模型调用中途才发现基础资源不存在。

正式运行时,调度系统需要认领本次执行,防止相邻检查周期重复启动同一项工作。对于长任务,它还要跟踪运行归属;只有仍有权完成记账的运行,才可以更新对应结果。这里的“认领”是一种状态协调,不是模型写一句“我开始了”。

运行结束后记录产物和状态,再处理配置的投递路径。接收端可能在线、离线或拒绝消息,因此投递可以进入单独队列。把交付拆出来,才有条件在发送失败后保留已经完成的草稿。

12.4 哪个模型、哪个方法,是创建时定死的吗 ​

不一定。Hermes 的任务可以跟随全局模型选择,也可以有任务或调度层面的配置。未固定的任务,在下次触发时可能采用新的默认模型。绑定的技能也需要按实际加载规则取得内容。

跟随最新配置便于集中维护;固定选择有利于控制变化,但会增加单独更新和失效处理的负担。两者都不能省略第十章的兼容与能力检查。

例如,你周五换了主模型,周一的简报可能首次在该模型上运行。如果从未测试它的工具调用和事实边界,后台任务就成了第一次试验。更稳妥的维护方式是保存上次运行的实际模型、技能变化与结果范围,再决定是否允许新组合用于投递。

这是一条设计建议,不表示 Hermes 会自动锁住所有方法版本或为每次配置变化提供结果等价保证。

12.5 电脑关机以后,不能用一个“自动补跑”概括 ​

本地调度依赖相应服务实际运行。关闭聊天窗口不一定关闭网关;关闭电脑则会使本机无法按时处理。再次启动以后,还要判断哪些时间点错过、哪些已经执行过。

Hermes 对错过的周期有恢复与记账规则,包含迟到运行、合并积压或按设置跳过等情况。一次性任务与周期任务也有不同处理。不能假定离线五周后必定补发五份简报。

为什么不一律补齐?旧的“今天消息”可能已经过期,集中执行会产生突发开销和大量通知。为什么又不一律跳过?某些检查确实仍然有价值。调度设计需要区分“每个时间点都不可遗漏”和“恢复后了解当前状态即可”。

对于每周新闻,通常应先明确恢复时的资料时间范围。一次当前简报不能冒充五次历史检查,已错过的时段也不能悄悄被标成按时完成。

12.6 生成状态和投递状态分别看 ​

观察到的状态可以判断什么还不能判断什么
配置阻塞正式任务未按正常路径开始修复后是否还能取得原时间范围资料
任务运行失败本次没有正常交付可用产物已执行的工具是否产生过外部变化
产物已生成、投递排队内容阶段结束,交付尚未结算接收人是否已经看到
投递失败输出未按预期到达目标,或结果无法确认是否应该重做内容或直接重发
投递已结算系统按相应交付规则记录了结果人类是否阅读、内容是否事实正确

Hermes 的记录区分运行错误、配置阻塞、排队中和投递失败等状态。具体成功记号还要结合是否设置目标、是否有抑制投递等情况解释,不能把一个状态词当成“读者已收到并认可”的证明。

尤其是发送后连接中断:消息可能已到达,确认却没有回来。这时盲目重发可能重复。第十五章会用这个例子解释为什么需要“结果未知”这一类状态。

12.7 从手动到后台,先验证哪些事情 ​

先用相同任务卡手动触发,检查新会话是否能独立找齐材料与方法;再在受控时间验证调度;最后在测试目标确认投递。三个试验分别覆盖内容、时间和渠道,不能用其中一个代替全部。

案例目前是一份架构设计,没有创建真实简报任务或外发消息。它新增的成果,是“任务定义不依赖当前聊天”以及“一次执行有自己的结果记录”。这些成果会在故障与评估章节继续使用。

本章要点 ​

  • 触发器解决何时开始,任务执行解决怎样完成,结果投递解决交给谁。
  • 新会话需要独立任务定义和可加载材料,不能依赖“刚才那段聊天”。
  • 执行归属、错过时间点和投递状态需要明确记账,不是让模型自己承诺。
  • 修复发送故障通常不必重做整份简报;结果未知时更不能直接假定发送失败。

理解题 ​

1. 定时任务回复“找不到简报方法”,而交互对话昨天还能使用,先查什么?

查任务实际所属 Profile、绑定技能、工作目录和新会话的输入。昨天的对话可能已展开方法正文,定时运行没有继承整段聊天。先定位加载与归属,不能直接归咎于模型遗忘。

2. 草稿已保存,平台发送失败,应否重新搜索所有材料?

未必。先确认产物完整、来源与时间范围仍适用,再处理交付阶段。重新生成可能增加开销、引入不同结果;但若原产物缺失或已过时,也不能未经核对就重发。

3. 离线三周后只运行一次,能否据此说调度器丢了两次任务?

需要结合错过时间点的策略和记录。系统可能合并积压后执行一次,也可能明确跳过。应检查每个时段如何记账,不能用“当前只看到一次运行”推断三次都已完成或全部被静默丢弃。

下一章讨论一次任务内部的分工:什么时候值得让另一个 Agent 加入。

社区学习手册 · 正文与原创图解 CC BY-SA 4.0 · 代码 MIT