Skip to content

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

Description

@fanfan8899333-bit

问题描述

在启用「群聊上下文感知 -> 自动理解图片(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 以帮助修复该问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions