用一张钉钉表格,统一管理所有 Agent 的定时任务

One DingTalk Table to Rule All Agent Cron Jobs

一个越来越具体的烦恼

给 AI Agent 排定时任务,正在变成一件新的麻烦事。

最早我们写 cron,后来写脚本,再后来各种 Agent 框架自带调度器。结果是:定时配置散落在 crontab、launchd、代码常量、框架配置文件里,改一个执行时间要翻好几个地方;想知道「现在到底有哪些任务在跑、几点跑、跑完发到哪」,没有任何一个地方能一眼看全。

任务本身其实很简单——「每天下午一点,去小红书搜几个关键词,各出一份报告」。难的不是执行,而是管理:谁来记、谁来改、谁来排查。

One DingTalk Table to Rule All Agent Cron Jobs

核心思路:把「调度」变成数据

我的做法是把这件事彻底拆开:

  • 调度 (几点跑、跑什么、发哪个群)不该写在代码里,它应该是数据,放在一张表里。
  • 执行 (真的去刷小红书、写报告)不该由调度器操心,它应该交给 Agent。
  • 管理这张表 这件事,也不该让人去点界面,它应该交给一个 Coding Agent。

于是整套机制只有三样东西:

  1. 一张钉钉 AI 表格,叫「定时发消息」。每一行就是一个任务,字段朴素到只有:任务名称、钉钉群 ID、消息内容、发送时间、是否启用。
  2. 一个钉钉群,叫「树莓派」。里面住着好几个 Agent 和数字员工,它们都监听这个群。
  3. 一个 Coding Agent(opencode)配合 dws 命令行。我只跟它说话,它替我操作表格和自动化。

表格是唯一的配置源。群是任务的分发通道。Agent 是执行者。人,只负责看结果。

这和 好的 Harness 不挑笔 里说的验收侧与生成侧分离是同构的:表格定义「什么时候触发、触发什么」(验收侧),Agent 决定「怎么干」(生成侧)。两侧解耦,任何一侧换了另一侧不受影响。

实际演示:一句话建好一个定时任务

我想新增一个「每天定时刷小红书热点」的任务。我对 opencode 说的原话是:

在这张「定时发消息」表里加一行任务:@opencode 去小红书搜 钉钉 / 飞书 / Workbuddy / 千问办公 / 企业豆包 的热点,每一项出一份报告。然后用表格的自动化功能,每天定时把消息发到「树莓派」群。

opencode 做了两件事,并回读确认了结果:

已新增记录:digest: 小红书热点,发送时间 13:00,已启用。

已创建自动化工作流:每天 13:00 触发,发送钉钉消息到「树莓派」群,状态 RUNNING。
# generated by hugo AI

到点后消息会发到群里,群里的数字员工会接单执行。

整个过程我没有打开过表格界面。新增记录、读取字段定义、创建钉钉 AI 表格的原生自动化工作流、校验运行状态——这些全是它在背后用 dws 一条条命令完成的。我要做的只是描述意图。

接下来发生的事,是全自动的

每天 13:00,表格的自动化工作流准时把那条消息发进树莓派群:

@opencode 去小红书搜 钉钉 / 飞书 / Workbuddy / 千问办公 / 企业豆包 的热点,每一项出一份报告。

群里被 @ 到的数字员工认领这条消息,真的去打开小红书、逐个搜索、整理热点,然后把五份报告发回群里。

我不需要登录任何后台,不需要手动触发,不需要守着终端。我只是在某个时刻打开钉钉群,把报告看完。 消息即工单,群即工作台。

┌─────────────┐     13:00 触发      ┌─────────────┐
│  AI 表格     │ ──────────────────→ │  钉钉群      │
│  (配置源)    │   自动化工作流       │  (分发通道)  │
│             │   发送群消息         │             │
└─────────────┘                     └──────┬──────┘
                                           │ @数字员工
                                    ┌─────────────┐
                                    │  Agent 执行  │
                                    │  搜索→整理   │
                                    │  →发回报告   │
                                    └─────────────┘
# generated by hugo AI

为什么说这套设计是「Agent 友好」的

回头看,它有几个特点恰好契合 Agent 时代的工作方式:

任务用自然语言描述。 表格里写的不是函数调用,而是一句人话,外加 @ 一个具体的 Agent。谁来干、干什么,一目了然,也不需要翻译给机器。

配置即数据。 所有定时任务集中在一张表里,几点跑、跑什么、发哪个群、是否启用,全是可读的行列。排查问题不再需要 grep 一堆配置文件。

管理本身也被 Agent 化了。 增删改一个任务,等于跟 Coding Agent 说一句话。它连表格记录带自动化工作流一起建好、校验好。人退到了「提需求」的位置。

多个 Agent 共享一个群,天然分工。 群里有多个数字员工,消息 @ 到谁谁就接。一个群同时承载了小红书报告、Google Analytics 摘要、公众号数据、亚马逊榜单等好几条任务线,互不干扰。

这最后一点和 Agent 时代的权限:从 RBAC 到五层信任架构 里的委托模型呼应:群消息里的 @ 就是一次显式委托——「这件事我交给你」,权限边界清晰,审计轨迹天然存在(聊天记录就是日志)。

怎么复刻

最小闭环只需要四步:

  1. 建一张 AI 表格,字段包含:任务名称、群 ID、消息内容、发送时间、是否启用。
  2. 准备一个群,把需要干活的 Agent / 数字员工拉进去,并确保它们监听这个群。
  3. 让 Coding Agent 往表里写任务行,并为每行创建一个「定时触发 → 发送群消息」的自动化工作流。
  4. 到点后,被 @ 的 Agent 在群里接单执行,把结果发回群。

调度交给表格,执行交给 Agent,人只看群。这大概才是定时任务在 Agent 时代该有的样子。

你在管理 Agent 定时任务上踩过什么坑?欢迎留言讨论。


See also