定时任务
定时任务在你不在场时执行一段提示词。每次触发都会新建一个线程,发送提示词,让智能体带着完整工具权限干活,记录结果,然后归档线程。
建一个最快的办法是把它描述出来:
每个工作日早上 8 点,检查
~/projects/api最近一天的依赖更新,有大版本升级的告诉我。
八千代会把这句话变成一个 cron 表达式、一个工作区,以及 —— 手写时最容易搞砸的那部分 —— 一段能在没有人类在场的情况下活下来的提示词。它知道下面这些规则,因为它们就在它的 help 技能里。
你也可以用 设置 → 定时任务 或直接用命令行。这一页剩下的部分讲的是底下究竟发生了什么,定时任务出岔子的时候值得知道。
每个定时任务只能是其中之一 —— 两个都设或都不设都会被拒绝。
- 循环(
cronExpression)—— 按 cron 触发,每次运行后重新武装。删除之前一直存在。 - 一次性(
runAt)—— 在某个 ISO 时间点触发一次,然后自我停用,好让运行历史依然可见。
要在两者之间切换,设置新字段并把旧的设成 null。
一次触发发生什么
Section titled “一次触发发生什么”- 连通性检查。 离线则这次运行记为
skipped,不发起任何模型调用。循环任务在下一个 tick 重试;一次性任务不会。 - 重叠保护。 如果同一个定时任务的上次运行还在进行,这次触发会被丢弃。一个定时任务绝不会并行跑两次。
- 创建线程。 一个标题为
Schedule: <name>的新线程,带上配置好的工作区。定时运行是第一方本地线程 —— 完整记忆调取,所有工具。 - 投递提示词。 提示词作为第一条用户消息发出,正常的工具集里额外加上
reportScheduleResult。 - 完成。 记录结果和 token 数,并发出系统通知。
- 归档。 线程自动归档。工作区目录不动。
- 重新武装或停用,取决于模式。
Cron 表达式
Section titled “Cron 表达式”五个字段,按你的本地时区:分 时 日 月 星期。取值范围分别是 0–59、0–23、1–31、1–12、0–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 |
写一段能独自存活的提示词
Section titled “写一段能独自存活的提示词”执行定时运行的智能体没人可问。在交互里好用的提示词到这儿经常失效 —— 这也是让八千代替你写提示词、而不是把你在聊天里会打的那一行粘进来的主要理由。
如果你要自己写:
要:
- 写成自包含的 —— 确切的路径、确切的命令,以及「做完了」长什么样。
- 任务涉及文件时设置
workspacePath。 - 循环任务里用相对时间表述(「过去 24 小时内」),绝不写死日期。
- 结尾明确指示它调用
reportScheduleResult。
不要:
- 写得开放式,或者依赖某段这次运行根本看不到的对话上下文。
一个可用的样子:
检查
~/projects/api在过去 24 小时内发布的依赖更新。运行pnpm outdated --json,把有大版本升级的都总结出来。完成后调用reportScheduleResult,状态success并附一句话摘要;如果没能完成,则用failure并简短说明原因。
有两种状态,混为一谈会把你绕晕。
运行状态 —— 机器本身跑通了吗?
| 值 | 含义 |
|---|---|
running | 进行中 |
completed | 模型回应了。这不说明任务是否成功。 |
failed | 以错误终止;见 error 字段 |
skipped | 触发时离线;模型根本没被调用 |
结果状态 —— 任务做成了吗?只有智能体调用了 reportScheduleResult 时才存在:
| 值 | 含义 |
|---|---|
success | 智能体报告任务完成 |
failure | 智能体报告没能完成;resultSummary 说明原因 |
| 缺失 | 智能体从没调用那个工具 —— 去修提示词 |
运行历史在 设置 → 定时任务 → 历史,或者:
yachiyo schedule runs # 最近的运行,所有任务yachiyo schedule runs <schedule-id> # 单个任务内置定时任务
Section titled “内置定时任务”八千代自带两个定时任务。你可以停用它们,但删不掉;升级时它们的提示词文本会被刷新,而你的 cron 和启用/停用偏好会保留。
| 定时任务 | 默认 | 干什么 |
|---|---|---|
| Self-Review | 每天 12:00 | 阅读近期线程及其工具调用历史,找出具体可以做得更好的地方 —— 不是给你写总结。 |
| Things Daily Review | 每天 22:00 | 把当天的活动对照已有的 Things 建索引,把对话挂到它们所属的话题上。 |
有东西没触发时
Section titled “有东西没触发时”| 症状 | 检查什么 |
|---|---|
| 从没触发过 | 启用了吗(schedule list 里的 ✓)?应用在运行吗?cron 表达式真的是你以为的意思吗? |
skipped | 机器当时离线。循环任务会重试;一次性任务现在已停用 —— 重新启用以重试同一个 runAt。 |
failed 且提示「Interrupted by app restart.」 | 应用在运行途中关闭了。这次运行的 threadId 指向那个归档线程,里面可能有半成品。 |
completed,但没有结果状态 | 提示词没让智能体调用 reportScheduleResult。已经跑过的运行没法追溯修正。 |
completed,结果为 failure | 读 resultSummary。通常是路径写错、权限缺失,或者 enabledTools 卡得太死。 |
| 命令行改了但没生效 | 运行中的应用大约 60 秒内会拾取命令行的改动。设置界面的改动是即时的。 |
启动时,任何还停留在上一次会话的 running 状态的运行都会被恢复为 failed,附带「Interrupted by app restart.」—— 运行不会被永久卡住。