Skip to content

aiocqhttp: 转发消息未展开导致“总结一下”被判空消息 #5086

@constansino

Description

@constansino

问题描述

aiocqhttp (OneBot v11) 平台下,如果用户发送“合并转发消息”并随后要求机器人“总结一下”,机器人经常会把输入判定为“空消息”,无法总结。

这个问题在群聊里比较常见:

  1. A 发送合并转发(日志显示为 [转发消息]
  2. B 引用该消息并 @机器人 总结一下
  3. 机器人返回类似“你贴的是空消息,没法总结。发内容。”

复现方式

  1. 在 QQ 群(OneBot v11 / Napcat)中发送一条合并转发消息(包含若干文本节点)。
  2. 另一个用户引用该消息并 @机器人 总结一下
  3. 观察机器人回复。

实际行为

机器人上下文中只拿到 [转发消息] 占位符,未拿到转发节点正文,导致 LLM 认为可总结文本为空。

期望行为

机器人应尝试展开 forward 节点内容,将可读文本注入 message_str / 上下文,再执行总结。

现场日志证据(2026-02-13)

  • 13:54:20 vowm/...: [转发消息]
  • 13:54:50 加班到神志不清.ing/...: [引用消息] [At:...] 总结一下
  • 13:55:02 机器人回复:你贴的是空消息,没法总结。发内容。

根因分析

astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py_convert_handle_message_eventreplyget_msg 回查逻辑,但对 forward/forward_msg 没有调用 get_forward_msg 展开节点内容。

因此:

  • message_str 里只有占位信息([转发消息]),
  • 下游模型收到的有效文本不足,导致误判为空消息。

修复思路

aiocqhttp 适配器内新增 forward 展开逻辑:

  1. 识别 forward/forward_msg 段;
  2. 使用 get_forward_msg 拉取节点数据(兼容 id/message_id/forward_id 参数差异);
  3. 递归提取节点文本(保留 at/image/face 的轻量占位);
  4. 将展开文本拼入 message_str(附加长度上限,避免上下文爆炸);
  5. 拉取失败时至少保留 [转发消息],避免完全空输入。

影响范围

  • 主要影响 aiocqhttp 平台(OneBot v11 / Napcat)。
  • 其他适配器不受此改动直接影响。

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:platformThe bug / feature is about IM platform adapter, such as QQ, Lark, Telegram, WebChat and so on.priority: p0will fix asap

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions