#9854·AstrBot

[Bug] 群聊上下文图片理解对 GIF 动图未进行多帧处理,导致仅能获得静态帧描述

Author: fanfan8899333-bitCreated Aug 28, 2026Updated Sep 15, 2026
Labelsbug

问题描述

在启用「群聊上下文感知 -> 自动理解图片(image_caption)」后,如果群成员发送 GIF 动图/QQ 动画表情,AstrBot 的图片转述功能不会对 GIF 进行抽帧或多帧处理,而是将整个 GIF 作为单个 image 输入直接交给配置的视觉模型。

部分视觉模型/API 虽然能够接收 image/gif,但实际只会按照其中某一静态画面进行描述,因此最终写入 group_chat_context 的内容只有静态图片信息,无法理解 GIF 中的动作、表情变化和前后过程。

经确认,该问题并不是 QQ 协议端将 GIF 转为了 JPEG。

以本次测试的 QQ 动画表情为例,SnowLuma 协议层获得:

fileId: "3ED4FA690934062E8BE1DA2AF9575B9E.jpg" fileSize: 783068 width: 240 height: 240 picFormat: 2000 subType: 1 summary: "[动画表情]"

其中 picFormat=2000 明确表示真实图片格式为 GIF。虽然 QQ 的 fileId 后缀为 .jpg,但实际媒体格式仍为 GIF。

AstrBot 收到的 OneBot 消息段为:

file: "3ED4FA690934062E8BE1DA2AF9575B9E.jpg" sub_type: 1 summary: "[动画表情]" url: "https://multimedia.nt.qq.com.cn/download?..."

AstrBot 的 group_chat_context 会优先使用 comp.url,并调用图片描述 Provider,但当前 get_image_caption() 仅传入:

image_urls=[image_url]

没有对 GIF 的 n_frames 进行检测,也没有进行抽帧后以多张图片传递给视觉模型。

因此当前实际流程为:

QQ GIF → AstrBot group_chat_context → 单个 GIF image → 图片转述模型 → 获得静态画面描述 → [Image: 静态描述] → 写入群聊上下文

实际测试 MiniMax-M3 时,GIF 最终只被描述成角色的头发、眼睛、兽耳等静态特征,没有描述 GIF 中的动作变化。

希望 AstrBot 内置的群聊图片转述功能能够对 GIF/APNG/Animated WebP 等动画图片进行多帧处理,而不是完全依赖 Provider 是否原生支持动画图片。

可能的改进方案

建议在 group_chat_context.get_image_caption() 调用 Provider 前增加动画图片预处理:

  1. 获取图片到本地后,根据实际 MIME / Pillow 判断是否为动画图片,而不是根据文件后缀判断;
  2. 如果检测到 GIF 且 n_frames > 1:
    • 均匀抽取 4~6 个代表帧;
    • 将帧转换为 JPEG/PNG;
    • 通过 image_urls=[frame1, frame2, ...] 一次性传递给图片转述 Provider;
  3. 在 image_caption_prompt 中附加提示,例如: “以下多张图片按照时间顺序来自同一个 GIF 动图,请综合各帧描述动作和表情变化。”
  4. 静态 JPEG/PNG 保持当前行为不变。

目前已有第三方 GIF Vision Helper 插件采用类似方案,可以证明这种处理方式能够兼容不原生支持 GIF 时序理解的多模态 Provider。

如何复现?

  1. 使用 OneBot v11 接入 QQ。
  2. 开启 AstrBot 的「群聊上下文感知」。
  3. 开启「自动理解图片」,并配置一个支持图片输入的视觉模型作为图片转述模型。
  4. 禁用所有第三方插件,避免插件影响测试。
  5. 在 QQ 群中发送一个动作变化明显的 GIF 动图,例如:
    • 第一阶段人物闭眼
    • 中间人物睁眼
    • 最后人物挥手
  6. 查看 AstrBot Debug 日志中的 group_chat_context 图片转述结果。
  7. 可以发现模型只描述其中的静态画面,没有获得 GIF 多帧中的动作变化。
  8. 对照协议端 Debug 日志,可以确认收到的原始图片实际为 GIF(picFormat=2000),并非 JPEG。

AstrBot 版本

v4.27.4

操作系统

Linux

部署方式

Docker

使用的消息平台适配器

OneBot v11(aiocqhttp,SnowLuma)

错误日志

SnowLuma:

event_input ... elements:[{
    type:"image",
    fileId:"3ED4FA690934062E8BE1DA2AF9575B9E.jpg",
    fileSize:783068,
    width:240,
    height:240,
    picFormat:2000,
    subType:1,
    summary:"[动画表情]"
}]

OneBot 转换后:

message:[{
    type:"image",
    data:{
        url:"https://multimedia.nt.qq.com.cn/download?...",
        file:"3ED4FA690934062E8BE1DA2AF9575B9E.jpg",
        sub_type:1,
        summary:"[动画表情]"
    }
}]

AstrBot:

[sources.anthropic_source] model='MiniMax-M3'

模型返回静态描述:
“这是一个动漫风格的可爱角色……
头发:青绿色长发……
眼睛:紫红色眼睛……
耳朵:一对尖尖的兽耳……
头上趴着一只小小的黑色猫咪……”

随后:

[astrbot.group_chat_context]
[Image: 这是一个动漫风格的可爱角色……]

辅助信息

No response

检查清单

  • 我已在 Issue 列表中搜索过相关问题仍无法解决,或该问题从未被报告过。
  • 我已尝试过禁用所有插件,排除了可能是因插件导致的问题。
  • 我报告的问题与 AstrBot 本体相关,而非在报告某一插件的问题。
  • 我已阅读并同意本项目的贡献者行为准则
  • (可选)我愿意提交 PR 以帮助修复该问题。