Skip to content

[Feature] 增强"未来任务"功能:支持精确指令执行与直接消息投递 #5112

@singularity2000

Description

@singularity2000

背景

当前内置的"未来任务"功能本质上是一个 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.sendbot.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 推理),缺少"硬执行"模式(确定性的指令触发和消息投递)。

建议的演进方向是:

  1. 短期:新增 command(精确指令执行)和 direct_message(直接消息投递)两种任务类型,与现有的 active_agent 类型并列,让用户按需选择。同时在 WebUI 补齐编辑功能和会话选择器。
  2. 中期:支持多会话绑定、任务链接、聊天端管理指令,逐步覆盖插件的核心能力。

这样既保留了 AI 驱动的独特优势,又补齐了确定性执行的能力短板,减少用户对第三方插件的依赖。

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:coreThe bug / feature is about astrbot's core, backend

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions