Skip to content

[Feature] 优化 aiocqhttp 适配器图片发送机制,避免强制 base64 转换以提升性能和降低内存占用 #6717

@FlanChanXwO

Description

@FlanChanXwO

Description / 描述

问题描述

当前 aiocqhttp 适配器在处理 ImageRecord 消息段时,强制将所有文件内容转换为 base64,导致网络传输数据膨胀 ,大图片(5MB以上)内存占用增加(图片全部加载到内存编码),以及CPU资源浪费,尤其是对于大图片有发送延迟的显著增加。

相关代码:
https://github.com/AstrBotDevs/AstrBot/blob/master/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py#L35-L45

期望行为

参考 NoneBot2 的实现,优先使用原始文件路径格式,让 NapCat 等协议端自行处理文件读取:

输入类型 当前行为 期望行为
file:///path/to/img.jpg 读取 → base64 编码 → 发送 原样透传给协议端
http://example.com/img.jpg 下载 → base64 编码 → 发送 原样透传(协议端可直接访问时)
内存中的 bytes base64 编码 → 发送 base64 编码 → 发送

Use Case / 使用场景

场景1:图片类插件(如 setu/涩图插件)

问题:插件需要发送从网络下载的动漫图片,用户通常一次请求多张(3-9张)。每张图片 2-5MB,使用 base64 后:

  • 单张 5MB 图片 → 6MB+ 传输数据
  • 一次发 5 张 → 额外传输 8MB+ 数据
  • 内存瞬间占用 33MB+,很容易触发 OOM

优化后:图片保存到本地临时文件,通过 file:// 发送,零内存拷贝。

场景2:AI 绘图插件(如 Stable Diffusion/NovelAI)

问题:AI 生成的高清图片(1024x1024 或更高)通常 3-8MB。用户频繁请求生成图片时:

  • base64 编解码占用大量 CPU
  • 生成的图片已经在本地文件系统,强制转 base64 是多余的

优化后:直接传递生成的文件路径给 NapCat 读取。

Willing to Submit PR? / 是否愿意提交PR?

  • Yes, I am willing to submit a PR. / 是的,我愿意提交 PR。

Code of Conduct

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.enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions