AstrBot 社区最近冒出来一个挺有意思的插件——astrbot_plugin_chatgpt_responses_image。做的事情不复杂:让 AstrBot 聊天机器人能调用 GPT Image 模型生图。但它的实现方式值得聊聊,因为它没走常规的 REST 请求-响应路线,而是基于 OpenAI 较新的 Responses API,用 SSE(Server-Sent Events)流式协议来处理整个生图流程。
这不是换个接口那么简单。对于在即时通讯场景里做 AI 生图的开发者来说,这套方案解决了几个真实的工程痛点。
先说背景:AstrBot 是什么
如果你还没接触过 AstrBot,简单讲——它是一个开源的一站式 Agentic 聊天机器人平台,目前在 GitHub 上已经积累了相当的社区活跃度。它的核心卖点是「一次部署,多端接入」,支持 QQ、Telegram、企业微信、飞书、钉钉、Slack 等数十款主流 IM 平台,内置了类似 Open WebUI 的轻量管理界面。

更关键的是它的插件生态。AstrBot 采用插件化架构,社区开发者可以通过编写插件来扩展功能,而不需要动核心代码。这次的生图插件就是这个生态里长出来的。
开发者 GALIAIS 在 LINUX DO 社区以开源推广的形式发布了这个插件,代码完整开源在 GitHub 上,没有闭源部分。这种社区驱动的开发模式,正是 AstrBot 生态健康运转的一个缩影。
为什么用 SSE 而不是普通 HTTP 请求?
这是这个插件最值得展开说的地方。
传统的 AI 生图调用流程大家都熟悉:发一个 POST 请求,等模型生成完毕,拿到完整响应,里面包含图片的 base64 或 URL。整个过程是同步阻塞的。对于一个 API 调用脚本来说,这没什么问题——等就等了。
但放到聊天机器人场景里,问题就来了。
想象一下:一个群里有 20 个人同时发「帮我画一张赛博朋克风格的猫」。如果每个请求都是同步阻塞的,要么你开 20 个并发连接(对 API 配额和服务器资源都是压力),要么用户排队等,体验极差。更麻烦的是,生图本身就是耗时操作,GPT Image 模型生成一张图通常需要几秒到十几秒,这段时间里用户看到的是一片沉默——他不知道请求是在处理中还是挂了。
SSE 协议天然解决了这个问题。
SSE 是一种服务端向客户端单向推送事件的协议,基于 HTTP 长连接。你可以把它理解成:客户端发起请求后,服务端不是一次性返回结果,而是像直播一样,持续推送状态更新。OpenAI 的 Responses API 支持 SSE 模式,生图过程中会推送多个事件——请求已接收、正在生成、生成完成、这是你的图片——客户端可以实时感知每个阶段。
对聊天机器人来说,这意味着:
- 可以在收到「正在生成」事件时,先给用户回一条「图片生成中,请稍候」
- 可以在生成完成时立即推送图片,而不是轮询等待
- 可以在出错时第一时间告知用户,而不是超时后才报错
这不是锦上添花,这是用户体验层面的质变。
多图输入:不只是文生图
这个插件的另一个亮点是支持多图输入的图生图能力。
所谓多图输入,就是用户可以同时发送多张参考图片,让模型基于这些图片进行理解和再创作。比如你发两张图——一张是某个建筑的外观,一张是某种艺术风格的示例——然后告诉模型「用第二张图的风格重新画第一张图的建筑」。
这在 OpenAI 的 Responses API 中是通过 multimodal input 实现的,请求体里可以包含多个 image 类型的 content block。插件在这一层做了封装,让 AstrBot 的用户可以在聊天窗口里直接发送多张图片加文字描述,插件会自动将它们组装成符合 API 规范的请求格式。
听起来简单,但在 IM 场景里处理多图输入其实有不少细节要考虑:
- 不同 IM 平台对图片消息的封装格式不同,有的是 URL,有的是 base64,有的是文件 ID 需要二次下载
- 用户可能分多条消息发送图片和文字,需要有上下文关联的逻辑
- 图片的分辨率和大小需要在发送给 API 之前做预处理,否则可能超出 token 限制或增加不必要的成本
这些脏活累活,插件都替你处理了。
队列控制:群聊场景的刚需
前面提到了 20 个人同时发生图请求的场景。SSE 解决了实时反馈的问题,但并发控制还需要额外的机制。
这个插件实现了一套请求队列系统。核心思路是:
- 所有生图请求进入一个先进先出的队列
- 同时处理的请求数量有上限(可配置)
- 超出并发限制的请求排队等待,用户会收到排队提示和预估等待时间
- 单个用户的并发请求数也有限制,防止一个人刷屏占满队列
这套机制对于群聊场景来说是刚需。没有队列控制的生图机器人,在活跃群里基本上是灾难——要么 API 调用频繁被限流,要么服务器资源被打满,要么用户体验一团糟。
从工程角度看,队列控制和 SSE 是天然配合的。因为 SSE 连接是长连接,队列系统可以精确知道每个请求的实时状态——正在排队、正在生成、已完成——并据此做调度决策。如果用的是传统的同步请求,你只能知道「发出去了」和「回来了」两个状态,中间是黑盒。
技术实现:怎么接 Responses API 的 SSE
对于想了解实现细节或者想做类似开发的同学,这里简单讲讲 OpenAI Responses API 的 SSE 模式是怎么工作的。
与传统的 Chat Completions API 不同,Responses API 是 OpenAI 较新推出的接口范式。它的设计理念更偏向「任务」而非「对话」——你提交一个任务(比如生成图片),API 以事件流的形式返回任务的执行过程。
一个典型的 SSE 事件流大概长这样:
event: response.created
data: {"id": "resp_xxx", "status": "in_progress"}
event: response.in_progress
data: {"id": "resp_xxx", "status": "in_progress"}
event: response.output_item.added
data: {"type": "image", "image": {"url": "https://..."}}
event: response.completed
data: {"id": "resp_xxx", "status": "completed"}
客户端通过监听这些事件,可以精确地知道任务进行到了哪一步。插件在实现上,需要维护一个 SSE 连接的生命周期管理——建立连接、解析事件、处理不同事件类型、处理连接断开和重连。
这比简单的 requests.post() 然后 response.json() 要复杂不少,但换来的是更好的实时性和更细粒度的控制能力。
跟现有方案比怎么样?
说实话,AstrBot 生态里做生图的插件不止这一个。之前也有基于 DALL·E API、Stable Diffusion WebUI API 的插件。这个插件的差异化在于:
第一,它用的是 Responses API 而非 Chat Completions API 或 Images API。Responses API 是 OpenAI 目前主推的新接口范式,未来大概率会成为主力。早点迁移到这套协议上,长期来看是对的。
第二,SSE 流式处理在聊天机器人场景里的体验确实更好。这不是理论上的优势,是用户能直接感知到的——从「发了消息然后干等」变成「发了消息马上有反馈」。
第三,队列控制是面向生产环境的设计。很多开源插件能跑 demo,但放到真实的群聊环境里就崩。有队列控制意味着这个插件是奔着实际使用去的,不是玩具。
当然,它也有局限。目前这个插件绑定的是 OpenAI 的 GPT Image 模型,如果你想用 Stable Diffusion、Midjourney 或者其他生图模型,这个插件帮不了你。另外,Responses API 本身还在演进中,接口可能会有变动,插件需要跟着更新。
对开发者的启发
抛开这个插件本身,它的实现思路对做类似开发的同学有几点参考价值:
在即时通讯场景里接 AI 能力,SSE/WebSocket 这类长连接协议几乎是必选项。同步请求在 demo 里没问题,但到了多用户并发的真实场景,实时反馈和状态管理的需求是绕不过去的。
队列控制不是可选的,是必须的。任何涉及外部 API 调用的功能,都需要考虑限流、排队、超时、重试这些问题。尤其是生图这种耗时长、成本高的操作,没有队列控制就是在裸奔。
插件化架构的价值在这种场景里体现得很明显。AstrBot 的核心不需要知道生图的细节,插件处理所有跟生图相关的逻辑,包括 API 调用、图片处理、队列管理。这种解耦让社区开发者可以专注于自己擅长的领域,而不需要理解整个系统。
如果你正在用 AstrBot 或者在考虑给自己的聊天机器人加上 AI 生图能力,这个插件值得看看。即使你不直接用它,它的 SSE 处理和队列控制的实现也是不错的参考。代码在 GitHub 上完全开源,直接去读源码是最快的学习方式。
顺便提一句,如果你在接 OpenAI 的 API 时遇到网络问题,像 OpenAI Hub(openai-hub.com)这类兼容 OpenAI 格式的聚合平台可以考虑,国内直连省去折腾代理的麻烦,对于这种需要维持 SSE 长连接的场景尤其有意义——毕竟长连接对网络稳定性的要求比短请求高得多。
参考来源:
- AstrBot GPT Image 生图插件发布帖 - LINUX DO — 插件作者的原始发布帖,包含功能介绍和使用说明
- AstrBot-Plugins/image-generation - GitHub — 插件完整源代码仓库
- AstrBot 项目主仓库 - GitHub — AstrBot 核心项目,包含架构文档和插件开发指南