[Bug] 群聊历史图片转述把本地文件路径直接传给视觉模型,导致全部失败

Abierto
#10,918 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
Medio día
Aptitud para principiantes
62/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
ai

Línea de trabajo

Start in astrbot/builtin_stars/astrbot/group_chat_context.py: the image URL is chosen near line 209 (comp.url if comp.url else comp.file), and get_image_caption near lines 104-109 passes it to provider.text_chat(image_urls=...) unchanged. Compare with prepare_request_images in astr_main_agent.py, which already converts local files. Add a normalization step that turns local paths and file:// into base64 data URLs, and leaves http(s) and existing data URLs alone. Done when a local image in group history gets a caption instead of a 400. Note the comment thread: a patch that treated paths as base64 produced an invalid data URL.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug
问题描述

环境

  • AstrBot 版本:4.29.3(已确认 4.29.4 未修复,group_chat_context.py 两版本 sha256 一致)
  • 平台:aiocqhttp / NapCat(QQ)
  • 系统:Windows 11
  • 相关配置:
    • provider_ltm_settings.group_icl_enable = true
    • provider_ltm_settings.image_caption = true
    • provider_ltm_settings.image_caption_provider_id = bigmodel/glm-4v-flash

现象

开启「群聊上下文感知 → 自动理解图片」后,群里有图片消息时日志报错,且图片描述始终为空:

[ERROR] [astrbot.group_chat_context:219]: 获取图片描述失败: Error code: 400 - 图片输入格式/解析错误

换成其他视觉模型后同样失败:

模型 报错
glm-4v-flash HTTP 400 · code 1210 · 图片输入格式/解析错误
glm-4.6v-flash 同上
deepseek-flash HTTP 400 · Unsupported image_url format

原因分析

astrbot/builtin_stars/astrbot/group_chat_context.py 中,图片参数取自组件的本地落地文件:

# 第 209 行
url = comp.url if comp.url else comp.file

在本机环境下 comp.url 为空,comp.file 是一个本地临时文件路径:

C:\Users\<user>\.astrbot_launcher\instances\<id>\core\data\temp\media_image_20261101135205643_89a0.jpg

然后原样塞进 provider:

# 第 104-109 行
response = await provider.text_chat(
    prompt=image_caption_prompt,
    session_id=uuid.uuid4().hex,
    image_urls=[image_url],   # ← 本地路径,未做任何转换
    persist=False,
)

而 image_urls 只接受 http(s) URL 或 base64 / data URL,不接受本地路径,因此各家模型都返回 400。

对比:主对话链路(astr_main_agent.py 的 prepare_request_images)会做格式转换,所以「当前消息里的图」能正常识别;只有这条历史转述路径漏了这一步。

验证

同一张本地图片,三种传法直接请求模型 API:

传入形式 glm-4v-flash 结果
本地路径 C:\...\a.jpg ❌ 400 · code 1210
标准 data URL data:image/jpeg;base64,... ✅ 正确识别
裸 base64 ✅ 正确识别

把本地文件读成字节、转成 data URL 后再请求,三张真实图片全部成功:

10 KB   表情包 → "熊猫头配上文字尬笑"
131 KB  动漫图 → "长发女孩,背景有彩色泡泡和蛋糕"
1439 KB 游戏图 → "炉石传说的卡牌图片"

期望行为

get_image_caption 应该先把图片引用统一成模型可用的形式,再进行请求。建议在第 209 行取到 url 后、或 get_image_caption 内部加一步转换:

async def get_image_caption(self, image_url, image_caption_provider_id, image_caption_prompt):
    image_url = await self._normalize_image_url(image_url)
    ...

_normalize_image_url 需要覆盖:

  • 本地路径 / file:// → 读字节 → base64 data URL
  • base64://xxx(OneBot 约定)→ 去掉前缀转 data URL
  • 裸 base64 → 转 data URL
  • http(s) / 已是 data URL → 原样返回

另外建议按 provider_settings.image_compress_options.max_size(默认 1280)压缩一次再编码,避免大图请求体过大。

影响范围

  • 只影响「群聊上下文感知 → 自动理解图片」这条历史转述链路
  • 当前消息的图片识别不受影响(走 prepare_request_images,有转换)
  • 开启该功能时,每张群图都会失败一次,既产生无用的 API 调用,也可能带来明显延迟

临时规避

关闭 provider_ltm_settings.image_caption 即可不再报错,代价是历史图片只显示占位符。

需要历史图片描述的话,可以在插件里 monkey-patch GroupChatContext.get_image_caption 做上述转换,不改核心文件、升级不丢。

如何复现?
  1. 开启 provider_ltm_settings.image_caption,并配置任一视觉模型
  2. 在群里发送一张图片(无需 @ 机器人)
  3. 观察日志:获取图片描述失败: Error code: 400 - 图片输入格式/解析错误
  4. 群聊上下文中该图片显示为空(连 [Image] 占位都没有)
AstrBot 版本

4.29.3

操作系统

Windows

部署方式

windows desktop

使用的消息平台适配器

onebot v11

错误日志
控制台输出(AstrBot 4.29.3,Windows,来自用户终端截图)

[2026-11-01 13:49:50.096] [astrbot_plugin_caption_fix] [INFO] [astrbot_plugin_caption_fix.main:103]: [caption_fix] 第 1 次修正图片格式(C:\Users\<user>\... → data URL)
[2026-11-01 13:49:50.096] [Core] [WARN] [v4.29.3] [sources.openai_source:201]: 图片预处理结果为空,将忽略。
[2026-11-01 13:52:05.466] [astrbot_plugin_caption_fix] [INFO] [astrbot_plugin_caption_fix.main:103]: [caption_fix] 第 2 次修正图片格式(C:\Users\<user>\... → data URL)
[2026-11-01 13:52:05.648] [Core] [WARN] [v4.29.3] [sources.openai_source:201]: 图片预处理结果为空,将忽略。

未装补丁时的原始报错(同一环境):

[2026-11-01 13:13:31.864] [Core] [ERROR] [v4.29.3] [astrbot.group_chat_context:219]: 获取图片描述失败: Error code: 400 - 图片输入格式/解析错误

说明:
- AstrBot 未开启 log_file_enable,控制台是唯一输出渠道,故以上为逐行抄录
- 上面两行 WARN 出现在装了格式转换补丁之后;补丁把本地路径误当成 base64 处理,
  产出无效 data URL,因此被 openai_source 判为空
- 未装补丁时,本地路径原样发出,模型侧返回 400
辅助信息

No response

检查清单
  • 我已在 Issue 列表中搜索过相关问题仍无法解决,或该问题从未被报告过。
  • 我已尝试过禁用所有插件,排除了可能是因插件导致的问题。
  • 我报告的问题与 AstrBot 本体相关,而非在报告某一插件的问题。
  • 我已阅读并同意本项目的贡献者行为准则。
  • (可选)我愿意提交 PR 以帮助修复该问题。
Lenguaje dominante
Python
Estrellas
46.4k
Forks
3.4k
Merge medio
1 d 11 h
PR fusionados (30 d)
120

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de AstrBotDevs/AstrBot

Todos los issues de AstrBotDevs/AstrBot

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.