-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Description
背景
当前内置的"未来任务"功能本质上是一个 AI Agent 唤醒器:到达计划时间后,唤醒主 Agent,将 note 作为 prompt 发送给 LLM,由 LLM 自主决定如何行动,最后通过 send_message_to_user 工具将结果发回会话。
这种设计在需要 AI 自主判断的场景下很有价值,但在大量日常定时场景中存在明显不足——用户无法绕过 LLM,直接执行一条精确的机器人指令,或者投递一段确定性的图文消息。每次执行都必须经过 LLM 推理,既消耗 token,又引入不确定性(LLM 可能曲解意图、改写内容、甚至拒绝执行)。
社区插件 astrbot_plugin_reminder(作者 @Foolllll)提供了一套更贴近实际需求的定时系统,支持精确指令执行和富媒体消息投递。经过代码级对比,以下是内置功能与插件之间的差距分析。
核心痛点
以一个具体场景说明问题:
我想让机器人每天 9:00 在群里执行
/签到,同时发送一段固定的早安图文消息。
- 使用插件:
/添加任务 每日签到 0 9 * * * /签到— 精确执行,零 token 消耗,结果 100% 可预期。 - 使用内置未来任务:只能写一段 note(如"请在群里执行签到指令"),LLM 收到后可能执行签到,也可能理解偏差、自由发挥、或因上下文污染导致行为不一致。而且每次执行都要消耗 LLM token。
本质上,目前的未来任务 只有"软执行"(LLM 推理),缺少"硬执行"(确定性指令/消息投递)。两者应当共存互补。
功能对比
| 能力 | 内置未来任务 | 插件 astrbot_plugin_reminder |
|---|---|---|
| Cron 表达式调度 | ✅ | ✅ |
| 一次性定时执行 | ✅ | ❌ |
| 时区支持 | ✅ | ❌ |
| AI Agent 驱动执行 | ✅ | ❌ |
| WebUI 管理界面 | ✅ | ❌ |
| 执行状态记录(last_run / last_error) | ✅ | ❌ |
精确执行机器人指令(如 /签到) |
❌ | ✅ |
| 直接投递消息(不经过 LLM) | ❌ | ✅ |
| 富媒体消息(图文混排) | ❌ | ✅ |
| 单任务多会话启停控制 | ❌ | ✅ |
| 任务链接(提醒触发指令) | ❌ | ✅ |
| 聊天指令管理(增删改查) | ❌ | ✅ |
| 任务编辑(修改 cron / 内容) | ❌ | ✅ |
便捷目标指定(@群号 / #好友号) |
❌ | ✅ |
| 用户级权限控制(白名单) | ❌ | ✅ |
详细差距分析
1. 无法精确执行机器人指令
现状:所有未来任务都通过 _woke_main_agent 唤醒 AI Agent,将 note 文本作为 prompt 送入 LLM。不存在"直接触发一条 bot 指令"的机制。
插件做法:任务类型 (is_task=True) 通过 EventFactory 构建一个仿真的 AstrMessageEvent,注入事件队列,等同于用户真实发送了该指令。通过 CommandTrigger 拦截 event.send 和 bot.api.call_action,将 bot 的响应转发回目标会话。
建议:新增 command 类型的任务,在计划时间直接触发指定的 bot 指令并将响应转发至目标会话。适用场景:定时签到、定时查询天气、定时清理缓存等。
2. 无法直接投递确定性消息
现状:note 字段只是给 LLM 的 prompt,最终发送内容由 LLM 生成,不可控。没有"到点直接发一条固定消息"的能力。
插件做法:提醒类型 (is_task=False) 维护 message_structure(有序的文本/图片组件列表),到时间后直接通过 context.send_message() 发送,不经过任何 LLM。
建议:新增 direct_message 类型的任务,支持预设固定文本(未来可扩展图文),到时间直接投递。适用场景:每日提醒、通知公告、定时问候等。
3. 不支持富媒体内容
现状:WebUI 表单中 note 是纯文本输入框。底层 CronJob 模型的 payload 是 JSON dict,虽然理论上可扩展,但目前未支持任何富媒体。
插件做法:message_structure 是一个有序列表,支持 {type: "text", content: "..."} 和 {type: "image", path: "..."} 交替排列,完美保持图文顺序。图片自动下载并持久化到本地。
建议:在直接消息投递模式下,支持图文混排内容的存储和发送。WebUI 可提供文件上传组件或富文本编辑器。
4. 单任务无法关联多个会话
现状:每个未来任务绑定唯一的 session 字段。要在多个群里执行同一个任务,只能创建多份。
插件做法:每个提醒/任务有 enabled_sessions 列表,同一个任务定义可以在多个会话中独立启用/停用,例如 /启动提醒 早安 @群号B。
建议:支持 enabled_sessions 列表,允许单个任务在多个会话中复用,并提供逐会话的启停控制。
5. 不支持任务链接 / 任务编排
现状:任务之间完全独立,无法建立依赖关系。
插件做法:通过 /链接提醒 <提醒名> <指令> 将一个或多个 bot 指令绑定到提醒上。提醒发送后,所有链接的指令会并发执行。
建议:支持任务的后置钩子或链式执行,例如"发送早安消息后自动执行签到"。
6. 缺少聊天端的任务管理能力
现状:未来任务只能通过 WebUI 或 AI 工具调用(create_future_task 等)管理。不通过 WebUI 的用户无法管理定时任务。
插件做法:提供完整的聊天指令集:/添加提醒、/添加任务、/查看提醒、/编辑提醒、/删除提醒、/启动提醒、/停止提醒、/链接提醒、/查看链接、/删除链接、/提醒帮助。
建议:提供内置的聊天指令(或内置 Star)用于定时任务的增删改查,让功能对所有用户可达。
7. WebUI 不支持编辑已有任务
现状:WebUI 只能新建、启用/禁用、删除任务。后端虽然有 PATCH /api/cron/jobs/<job_id> 接口,但前端未提供编辑入口。想修改 cron 表达式或 note 只能删了重建。
插件做法:/编辑提醒 和 /编辑任务 可以原地修改 cron 和内容,自动重建所有已启用会话的调度。
建议:在 WebUI 任务表格中增加编辑按钮,复用已有的 PATCH 接口。
8. 目标会话选择不友好
现状:需要用户手动输入完整的 platform_id:message_type:session_id 格式字符串(如 aiocqhttp:GroupMessage:123456),对普通用户非常不友好。
插件做法:通过 @群号 和 #好友号 简写指定目标,平台信息自动从当前会话推断。
建议:在 WebUI 中提供会话选择器(下拉菜单或搜索框),从已连接平台的活跃会话中选取,而非手工填写。
总结
内置"未来任务"的核心优势在于 AI Agent 驱动的智能执行、一次性定时、时区支持和 WebUI 管理。但它目前 只有"软执行"模式(所有任务都依赖 LLM 推理),缺少"硬执行"模式(确定性的指令触发和消息投递)。
建议的演进方向是:
- 短期:新增
command(精确指令执行)和direct_message(直接消息投递)两种任务类型,与现有的active_agent类型并列,让用户按需选择。同时在 WebUI 补齐编辑功能和会话选择器。 - 中期:支持多会话绑定、任务链接、聊天端管理指令,逐步覆盖插件的核心能力。
这样既保留了 AI 驱动的独特优势,又补齐了确定性执行的能力短板,减少用户对第三方插件的依赖。