跳转到内容

定时任务

定时任务在你不在场时执行一段提示词。每次触发都会新建一个线程,发送提示词,让智能体带着完整工具权限干活,记录结果,然后归档线程。

建一个最快的办法是把它描述出来:

每个工作日早上 8 点,检查 ~/projects/api 最近一天的依赖更新,有大版本升级的告诉我。

八千代会把这句话变成一个 cron 表达式、一个工作区,以及 —— 手写时最容易搞砸的那部分 —— 一段能在没有人类在场的情况下活下来的提示词。它知道下面这些规则,因为它们就在它的 help 技能里。

你也可以用 设置 → 定时任务 或直接用命令行。这一页剩下的部分讲的是底下究竟发生了什么,定时任务出岔子的时候值得知道。

每个定时任务只能是其中之一 —— 两个都设或都不设都会被拒绝。

  • 循环cronExpression)—— 按 cron 触发,每次运行后重新武装。删除之前一直存在。
  • 一次性runAt)—— 在某个 ISO 时间点触发一次,然后自我停用,好让运行历史依然可见。

要在两者之间切换,设置新字段并把旧的设成 null

  1. 连通性检查。 离线则这次运行记为 skipped,不发起任何模型调用。循环任务在下一个 tick 重试;一次性任务不会。
  2. 重叠保护。 如果同一个定时任务的上次运行还在进行,这次触发会被丢弃。一个定时任务绝不会并行跑两次。
  3. 创建线程。 一个标题为 Schedule: <name> 的新线程,带上配置好的工作区。定时运行是第一方本地线程 —— 完整记忆调取,所有工具。
  4. 投递提示词。 提示词作为第一条用户消息发出,正常的工具集里额外加上 reportScheduleResult
  5. 完成。 记录结果和 token 数,并发出系统通知。
  6. 归档。 线程自动归档。工作区目录不动。
  7. 重新武装或停用,取决于模式。

五个字段,按你的本地时区:分 时 日 月 星期。取值范围分别是 0–590–231–311–120–7(0 和 7 都表示周日)。

表达式含义
0 9 * * *每天 09:00
*/30 * * * *每 30 分钟
0 * * * *每小时
0 10 * * 1每周一 10:00
0 0 1 * *每月 1 号午夜
0 */6 * * 1-5工作日每 6 小时
0 8,12,17 * * 1-5工作日 08:00、12:00 和 17:00

执行定时运行的智能体没人可问。在交互里好用的提示词到这儿经常失效 —— 这也是让八千代替你写提示词、而不是把你在聊天里会打的那一行粘进来的主要理由。

如果你要自己写:

要:

  • 写成自包含的 —— 确切的路径、确切的命令,以及「做完了」长什么样。
  • 任务涉及文件时设置 workspacePath
  • 循环任务里用相对时间表述(「过去 24 小时内」),绝不写死日期。
  • 结尾明确指示它调用 reportScheduleResult

不要:

  • 写得开放式,或者依赖某段这次运行根本看不到的对话上下文。

一个可用的样子:

检查 ~/projects/api 在过去 24 小时内发布的依赖更新。运行 pnpm outdated --json,把有大版本升级的都总结出来。完成后调用 reportScheduleResult,状态 success 并附一句话摘要;如果没能完成,则用 failure 并简短说明原因。

有两种状态,混为一谈会把你绕晕。

运行状态 —— 机器本身跑通了吗?

含义
running进行中
completed模型回应了。这不说明任务是否成功。
failed以错误终止;见 error 字段
skipped触发时离线;模型根本没被调用

结果状态 —— 任务做成了吗?只有智能体调用了 reportScheduleResult 时才存在:

含义
success智能体报告任务完成
failure智能体报告没能完成;resultSummary 说明原因
缺失智能体从没调用那个工具 —— 去修提示词

运行历史在 设置 → 定时任务 → 历史,或者:

Terminal window
yachiyo schedule runs # 最近的运行,所有任务
yachiyo schedule runs <schedule-id> # 单个任务

八千代自带两个定时任务。你可以停用它们,但删不掉;升级时它们的提示词文本会被刷新,而你的 cron 和启用/停用偏好会保留。

定时任务默认干什么
Self-Review每天 12:00阅读近期线程及其工具调用历史,找出具体可以做得更好的地方 —— 不是给你写总结。
Things Daily Review每天 22:00把当天的活动对照已有的 Things 建索引,把对话挂到它们所属的话题上。
症状检查什么
从没触发过启用了吗(schedule list 里的 )?应用在运行吗?cron 表达式真的是你以为的意思吗?
skipped机器当时离线。循环任务会重试;一次性任务现在已停用 —— 重新启用以重试同一个 runAt
failed 且提示「Interrupted by app restart.」应用在运行途中关闭了。这次运行的 threadId 指向那个归档线程,里面可能有半成品。
completed,但没有结果状态提示词没让智能体调用 reportScheduleResult。已经跑过的运行没法追溯修正。
completed,结果为 failureresultSummary。通常是路径写错、权限缺失,或者 enabledTools 卡得太死。
命令行改了但没生效运行中的应用大约 60 秒内会拾取命令行的改动。设置界面的改动是即时的。

启动时,任何还停留在上一次会话的 running 状态的运行都会被恢复为 failed,附带「Interrupted by app restart.」—— 运行不会被永久卡住。