Skip to content

Repository files navigation

图片生成插件 (astrbot_plugin_free_image)

astrbot_plugin_free_image 是一个面向 AstrBot 的图片生成插件,支持文生图、图生图、预设模板生图、LLM 函数工具调用、多模型回退、配额管理、生成历史、图片缓存和沉浸式自拍功能。

插件的核心特色是“API 管线”:你可以在 WebUI 中配置多个图片生成节点,插件会按顺序调用,当前节点失败时自动回退到下一个节点。插件还支持高度自定义自拍人设和自拍风格,赋予机器人更生动的交互体验。另外,插件内置了 Vertex AI 匿名逆向节点,可用性受上游服务状态影响。

主要特性

能力 说明
文生图 使用 #文生图 <描述> 直接生成图片。
图生图 支持直接发送图片、引用图片、@用户头像、默认使用发送者 QQ 头像作为参考图。
预设模板 通过 prompt_list 配置模板触发词,例如“手办化”“真人化”等。
多图输入 图生图最多读取 10 张参考图,传给 Provider 的张数由具体 Provider 能力决定。
动图处理 GIF/WebP 等动图会自动提取第一帧作为参考图。
多模型回退 api_pipeline 从上到下调度,当前节点失败时自动回退到下一个节点。
指定模型生图 使用 文生图-<序号> 等命令指定单个模型生图,不回退;所有用户可用。
Key 轮换 每个 Provider 节点可配置多个 api_keys,运行时自动 Round-robin 使用。
退避重试 对 429、资源耗尽、网络波动等错误进行重试和退避。
权限配额 支持管理员免限制、用户/群黑白名单、用户/群每日额度、永久次数和签到奖励。
历史与缓存 记录生图历史;可选保存生成图片缓存,并支持按大小、时间和数量自动清理。
LLM 工具 注册 image_generation 工具,允许模型在对话中主动调用生图能力。
人设自拍 配置好自拍人设后,支持 #自拍 命令和 send_selfie LLM 工具,让机器人用固定形象出镜。
QQ 优化 群聊简洁模式可贴表情,成功后只发送图片;也支持引用回复和多图分条策略。
插件控制台 AstrBot Pages 内提供管线、模板、自拍、统计和设置页面,与 WebUI 修改插件配置等价。

安装与配置

  1. 将本仓库放入 AstrBot 插件目录并启用插件。
  2. 安装依赖:本仓库已在 requirements.txt 声明 aiohttpbeautifulsoup4curl_cffiPillow
  3. 在 AstrBot WebUI 中配置 api_pipeline,至少添加一个已启用的图片生成节点。
  4. 如果节点需要 API Key,请在对应 api_pipeline 节点的 api_keys 中填写。聊天命令不再提供 Key 增删查功能。

常用配置项:

配置项 说明
api_pipeline 图片生成 Provider 管线,决定模型、API 地址、Key、代理、超时和重试。
prompt_list 预设模板列表,格式为 触发词:提示词
general.prefix 是否要求命令带前缀或 @机器人 唤醒,推荐开启。
general.concise_mode QQ 群聊简洁模式:收到画图请求贴 OK 表情(124),收到自拍请求贴爱心表情(66),成功后只发图片。
general.quote_reply_mode 控制生成成功后的图片消息是否引用回复。
general.multi_image_send_mode 控制多图结果是否合并发送或分条发送。
general.download_timeout 下载用户图片、头像或远程结果图片的超时时间。
cache.enable_image_cache 是否保存成功生成的图片缓存。关闭后仍会记录生图历史,但不保存图片文件。
cache.image_cache_max_size_mb 最大缓存大小(MB),留空或 0 表示不限制。
cache.image_cache_max_age_hours 最长缓存保存时间(小时),留空或 0 表示不限制。
cache.image_cache_max_count 最多保存缓存图片张数,留空或 0 表示不限制。
quota.rate_limit_seconds 非管理员全局生图冷却时间。
llm_tools.llm_tool_description LLM 看到的普通画图工具描述。
llm_tools.llm_prompt_description LLM 构造最终生图 Prompt 时参考的描述。
selfie.selfie_binding_mode 自拍人设绑定模式,默认"优先 AstrBot persona"。
selfie.selfie_default_persona_id 全局默认自拍人设 ID,留空则自动取列表第一个。
selfie.selfie_persona_manual_override 手动指定 selfie 人设 ID,仅在“只使用手动指定的selfie人设”模式下生效。
selfie.selfie_style_mode 自拍风格注入模式:不注入 / 自动 / 指定。

用户命令

命令 用途 示例
#文生图 <描述> 根据文字生成图片。 #文生图 一位在霓虹灯下的赛博朋克少女
#文生图-<序号> <描述> 指定单个模型生图,不回退。序号见 #画图模型 #文生图-2 赛博朋克少女
#图生图 <描述> 根据图片和文字修改/重绘图片。 发送或引用图片后输入 #图生图 改成油画风格
#图生图-<序号> <描述> 指定单个模型做图生图,不回退。 发送图片后输入 #图生图-2 改成油画风格
#画图帮助 查看已加载的模板触发词。 #画图帮助
#画图帮助 <模板名> 查看某个模板的完整提示词。 #画图帮助 手办化
#画图签到 签到领取个人永久次数,需开启签到功能。 #画图签到
#画图查询次数 查询自己的个人剩余次数和当前群共享次数。 #画图查询次数
<模板名> 使用预设模板做图生图。 发送图片后输入 手办化
<模板名>-<序号> 指定单个模型使用预设模板,不回退。 发送图片后输入 手办化-2
#自拍 <描述> 用配置好的自拍人设生成机器人自拍。 #自拍 在便利店门口喝冰咖啡
#自拍-<序号> <描述> 指定单个模型生成自拍,不回退。 #自拍-2 在便利店门口喝冰咖啡
#自拍帮助 查看自拍相关命令速查、当前风格模式和绑定模式。 #自拍帮助
#自拍人设 查看 [ID或名称] 查看当前命中的人设,或浏览指定人设详情。 #自拍人设 查看 椰子
#自拍人设 列表 查看所有自拍人设。 #自拍人设 列表
#自拍风格 查看 [ID或名称] 查看当前命中的风格,或浏览指定风格详情。 #自拍风格 查看 cinematic
#自拍风格 列表 查看所有风格模板。 #自拍风格 列表

图生图输入优先级:

  1. 引用消息中的图片
  2. 当前消息中的图片
  3. 当前消息中 @ 的 QQ 用户头像
  4. 发送者自己的 QQ 头像

如果你开启了 general.prefix=true,模板触发也需要命令前缀或 @机器人 唤醒,避免日常聊天误触。

指定模型生图

文生图图生图自拍 或任意模板名后追加 -<序号>,即可指定本次只使用管线中对应序号的模型,不回退。序号来自 #画图模型 显示的列表(从 1 开始,含已关闭节点)。

命令 说明
#文生图-<序号> <描述> 指定模型做文生图。
#图生图-<序号> <描述> 指定模型做图生图(需附带图片)。
<模板名>-<序号> [额外描述] 指定模型使用预设模板图生图(需附带图片)。
#自拍-<序号> <动作描述> 指定模型生成自拍。

行为说明:

  • 指定模型模式下,管线只调用该序号对应的 Provider,不回退到其他节点。
  • 该序号节点已关闭时,回复 模型 X🔴<名称> 已关闭,请选择其他模型。
  • 序号超出范围时,回复 命令格式或参数错误,请重试。 并附上当前管线列表。
  • 指定模型生图失败时,回复 ❌ 指定模型生成失败 (<耗时>s)\n原因: <错误>,不会触发回退。
  • LLM 工具(image_generation / send_selfie)不支持指定模型,始终走自动回退。

管理员命令

管理员指 AstrBot 全局管理员,名单来自 AstrBot 全局配置 admins_id

命令 用途 示例
#画图添加模板 新增模板,若预设指令已存在则取消添加。 #画图添加模板 姿势表:为这幅图创建一个姿势表
#画图模型 查看当前 API 管线顺序和启用状态(所有用户可用,管理员额外看到置顶/开启/关闭提示)。 #画图模型
#画图模型 置顶 <序号> 将指定节点置顶。 #画图模型 置顶 3
#画图模型 开启 <序号> 启用指定节点。 #画图模型 开启 2
#画图模型 关闭 <序号> 关闭指定节点。 #画图模型 关闭 2
#画图缓存 状态/开启/关闭/清理 查看、开关或清理生成图片缓存。清理会删除全部已保存缓存图片,不删除生图历史记录。 #画图缓存 状态
#画图简洁模式 开启/关闭 切换简洁模式,等效于 WebUI 的 general.concise_mode 开关。 #画图简洁模式 开启
#画图增加用户次数 给用户增加永久次数,支持 @ 或 QQ 号。 #画图增加用户次数 @某人 10
#画图增加群组次数 给群组增加永久次数。 #画图增加群组次数 987654 50
#画图查询次数 @用户 管理员查询指定用户次数。 #画图查询次数 @某人
#自拍人设 添加 <ID> <名称> 发送/引用图片后执行,保存为自拍人设参考图。 #自拍人设 添加 yeko 椰子
#自拍人设 绑定 <ID或名称> 将当前会话 SID 绑定到指定人设。 #自拍人设 绑定 椰子
#自拍人设 默认 <ID或名称> 设置全局默认回退人设。 #自拍人设 默认 椰子
#自拍风格 添加 <ID> <名称> <提示词> 新增自定义风格模板,关键词用竖线追加。 #自拍风格 添加 warm 日常暖光 soft warm light|暖光|窗光
#自拍风格 模式 <不注入/自动/指定> 切换风格注入模式。 #自拍风格 模式 自动
#自拍风格 选择 <ID或名称> 在"指定"模式下设定默认风格。 #自拍风格 选择 cinematic

API Key 请统一在 AstrBot WebUI 的 api_pipeline 节点中配置和管理。

输出行为

普通模式:

  1. 收到请求后先回复“正在生成”。
  2. 成功后发送图片,并附带耗时、剩余次数、命中模型等信息。
  3. 失败后返回聚合错误信息,便于判断是哪一个 Provider 失败。

简洁模式:

  1. 仅 QQ 群聊生效,私聊仍按普通模式处理。
  2. 收到请求时尝试给原消息贴 OK 表情,不主动发“正在生成”。
  3. 成功后只发图片或视频组件,不附带说明文字。
  4. 失败仍会发送失败原因;当全部 API 均失败时,仅返回简短失败提示,避免刷屏。

发送策略由以下配置控制:

配置项 可选值
general.quote_reply_mode 始终引用回复始终单独发送命令引用回复,函数调用单独发送命令单独发送,函数调用引用回复
general.multi_image_send_mode 始终不分条始终分条群聊不分条,私聊分条群聊分条,私聊不分条

Provider 支持

template_key 需要 API Key 能力与备注
vertex_ai_anonymous Vertex AI 匿名逆向接口,依赖 curl_cffi,内置 reCAPTCHA、浏览器指纹轮换和会话老化。
gemini Gemini 原生 API,支持多模态输入、Gemini 3 图片清晰度配置和可选 Google Search。
openai_images OpenAI Images API;无参考图走 /generations,有参考图走 /edits。支持 n(生成数量)和 size(尺寸,留空自动推断)。
openai_responses 兼容 /v1/responses,通过 image_generation tool 解析图片结果。
openai_compat_chat 兼容 /v1/chat/completions,可解析 URL、Markdown 图片、data URI、JSON、SSE 和视频 URL。
siliconflow 通用 /images/generations 实现,支持远程 URL 或 base64 图片结果。
bigmodel 通用 /images/generations 实现,支持远程 URL 或 base64 图片结果。

Provider 行为说明:

  1. 所有需要 Key 的 Provider 都通过 api_keys 自动轮换。
  2. 429、quota、rate limit、resource exhausted 会触发资源限制退避。
  3. 普通网络错误会触发 3-5 秒随机退避。
  4. openai_compat_chat 若解析到视频 URL,会用 AstrBot Video.fromURL 发送;如果端点返回 base64 视频数据,插件会提示当前不支持直接发送内嵌视频。

权限、配额与签到

行为
管理员 不受黑白名单、次数、冷却限制,剩余次数显示为
用户黑名单 优先级最高,命中后静默拒绝。
群黑名单 优先级最高,命中后静默拒绝。
用户白名单 非空时只允许名单内用户使用,管理员除外。
群白名单 非空时只允许名单内群使用。
用户次数 用户总次数 = 永久次数 + 今日剩余固定额度。
群组次数 群总次数 = 永久次数 + 今日剩余固定额度。
扣费顺序 同时启用用户和群限制时,优先扣群次数,群次数不足再扣用户次数。
签到奖励 只增加用户永久次数,不直接写入每日额度。
冷却限制 全局冷却,任何非管理员触发都会刷新冷却时间。

LLM 函数工具

插件会注册两个 LLM 工具。

image_generation — 普通画图/改图:

参数 说明
prompt LLM 根据用户上下文改写后的最终生图提示词。
count 可选。生图数量(1~3),默认 1。除非用户明确要求多张,否则 LLM 不会主动传该参数。

工具调用规则:

  1. 当前消息或引用消息中含图片时,按图生图处理。
  2. 没有图片组件时,按文生图处理。
  3. LLM 工具入口不会把 @用户头像当作图生图输入,因为它只检查 ImageReply(Image) 组件。
  4. 工具被调用后,插件会创建后台任务发送结果,并 stop_event(),避免 LLM 继续输出导致超时。
  5. 批量生图(count > 1)时,每张图独立调用 API 并独立扣费;个人/群次数不足时,剩余张数会回复配额提示,不调用 API。

send_selfie — 机器人自拍(需要先配置自拍人设):

参数 说明
action 动作、场景、姿势描述,例如"在咖啡店窗边喝拿铁"。
style_id 可选。指定风格 ID 或名称,留空由插件自动选择。
count 可选。生图数量(1~3),默认 1。除非用户明确要求多张,否则 LLM 不会主动传该参数。

工具调用规则:

  1. 用户说"看看你""自拍一张""你现在的样子"等时,LLM 应调用 send_selfie,而非 image_generation
  2. 当前消息或引用消息中含图片时,图片会作为本次自拍的额外参考图;只有 @其他用户且无图时,会使用该用户头像作为额外参考图。
  3. send_selfie 始终按简洁模式发送结果;成功后直接发图,不给用户发送机械化成功文案。
  4. 失败时插件会在后台尝试调用当前会话的 LLM,用角色语气自然解释失败原因;如果当前没有可用 LLM,则发送降级提示。
  5. 自拍同样受权限、配额、冷却限制,不能绕过。

自拍功能快速上手

自拍功能让机器人拥有固定形象,可以用命令或对话触发出图。

第一步:准备参考图

发送一张(或多张)角色参考图,然后引用图片执行:

#自拍人设 添加 <ID> <名称>

例如:先发一张图,再发 #自拍人设 添加 yeko 椰子,插件会把图片保存为"椰子"人设。也支持直接发送一条包含命令和附带图片的消息。

第二步:绑定人设(可选)

插件提供三种绑定模式(在 WebUI 的 selfie.selfie_binding_mode 中选择):

  • 优先 AstrBot persona(默认):根据当前对话使用的 AstrBot persona 自动匹配自拍人设。在 WebUI 的人设库里,每个人设条目内有"绑定的 AstrBot Persona 名称列表",填入 AstrBot persona 的名称即可。找不到再回退到会话 SID 绑定,再找不到用全局默认。
  • 优先会话 SID:先按当前群/私聊绑定,找不到再按 AstrBot persona,再找不到用全局默认。适合同一 persona 在不同群显示不同形象。
  • 只使用手动指定的selfie人设:始终用 selfie.selfie_persona_manual_override 中填写的人设,找不到则回退到全局默认。适合极简配置。

用命令绑定当前会话 SID 到指定人设:

#自拍人设 绑定 椰子

不绑定时,插件会使用全局默认人设(用 #自拍人设 默认 <名称> 设置,或在 WebUI 的 selfie.selfie_default_persona_id 中填写)。全局默认也未设置时,自动取人设库第一个。

第三步:生成自拍

#自拍 在便利店门口喝冰咖啡

或者在对话中自然说"看看你现在的样子",LLM 会自动调用 send_selfie

自拍输出行为:

  • #自拍 命令受 general.concise_mode 控制。QQ 群聊开启简洁模式时,触发后尝试贴 [表情:66],成功后只发图片;关闭简洁模式时,会发送“正在生成”和成功说明。
  • send_selfie 函数工具始终按简洁模式发送结果,不给用户发送机械化成功文案;aiocqhttp 群聊中会尝试贴 [表情:66],失败只记录 debug 日志,不影响生成。
  • 成功状态会写入 info 日志,格式类似:✅ 生成成功 (50.48s) | 人设: xx | 风格: 自拍专用极致真实 | 个人剩余次数: 8 | 模型: gpt-image-2

自拍额外参考图规则:

场景 额外参考图
只有文字,无图片 不添加额外参考图,只用自拍人设参考图。
引用了图片 使用引用图片。
引用了图片且 @机器人 仅使用引用图片。
引用了图片且 @其他用户 仅使用引用图片。
发送了显式图片 使用显式图片。
发送了显式图片且 @其他用户 使用显式图片 + 该用户头像。
只有 @其他用户,无图 使用该用户头像。
只有 @机器人,无图 不添加额外参考图,只用自拍人设参考图。

自拍总参考图最多 10 张;超出时优先保留靠前的人设参考图,额外参考图只补齐剩余名额。

风格管理

  • #自拍风格 列表 — 查看已配置的风格模板(默认内置"自拍专用极致真实")
  • #自拍风格 模式 自动 — 让插件根据描述关键词自动选风格
  • #自拍风格 模式 指定 + #自拍风格 选择 <风格> — 固定使用某套风格
  • #自拍风格 添加 <ID> <名称> <提示词> — 新增自定义风格

目录结构

下面用相对路径说明插件代码、配置和运行数据的职责。

插件代码目录(data/plugins/astrbot_plugin_free_image/)
├─ main.py                         # AstrBot 插件入口、命令注册、LLM 工具、核心生图/自拍执行
├─ commands.py                     # 聊天命令处理逻辑:画图、模型管理、次数、自拍人设/风格管理
├─ pipeline.py                     # 图片生成 Provider 管线,负责多节点顺序调用和失败回退
├─ quota.py                        # 权限、冷却、配额、签到和 JSON 持久化
├─ history_cache.py                # 生图历史、图片缓存、Pages 偏好设置的持久化
├─ sender.py                       # 图片/视频发送策略、成功文案、引用回复、多图分条
├─ workflow.py                     # 用户图片、引用图、@头像、动图首帧等输入图片读取
├─ selfie.py                       # 自拍人设解析、风格选择、自拍 Prompt 拼接、参考图组合
├─ providers/                      # 各图片生成 Provider 的适配实现
│  ├─ base.py                      # Provider 基类、Key 轮换、重试退避公共逻辑
│  ├─ gemini.py                    # Gemini 原生 API
│  ├─ vertex_ai_anonymous.py       # Vertex AI 匿名逆向节点
│  ├─ openai_images.py             # OpenAI Images API
│  ├─ openai_responses.py          # OpenAI Responses API
│  ├─ openai_compat_chat.py        # OpenAI Chat Completions 兼容端点
│  └─ generic.py                   # SiliconFlow / BigModel 等通用图片接口
├─ pages/                          # AstrBot Pages 页面资源
│  └─ 插件配置/                    # 管线、模板、自拍、统计缓存和设置页面
├─ .astrbot-plugin/                # AstrBot 插件附加元数据
├─ _conf_schema.json               # AstrBot WebUI 配置项定义
├─ metadata.yaml                   # 插件元数据
├─ requirements.txt                # 插件依赖
├─ README.md                       # 使用说明
├─ LICENSE                         # 开源协议
└─ logo.png                        # 插件图标

AstrBot 插件配置目录(data/config/)
└─ astrbot_plugin_free_image_config.json      # WebUI 保存的插件配置,如 api_pipeline、配额、人设和风格模板

AstrBot 分配给本插件的数据目录(通常位于 data/plugin_data/astrbot_plugin_free_image/,以运行时实际路径为准)
├─ user_counts.json                # 用户永久次数
├─ group_counts.json               # 群组永久次数
├─ user_daily_counts.json          # 用户每日额度使用记录
├─ group_daily_counts.json         # 群组每日额度使用记录
├─ user_checkin.json               # 用户签到日期记录
├─ generation_history.json         # 生图历史记录
├─ pages_prefs.json                # Pages 用户偏好设置
├─ cache/
│  ├─ index.json                   # 缓存图片索引
│  └─ images/                      # 已保存的生成图片缓存
└─ selfie_personas/                # 命令添加的自拍人设参考图
   └─ <persona_id>/ref_*.png       # 某个自拍人设的参考图文件

说明:

  • data/plugins/astrbot_plugin_free_image/ 是插件代码目录。
  • data/config/astrbot_plugin_free_image_config.json 是 WebUI 配置文件,保存用户显式配置。
  • AstrBot 分配给本插件的数据目录用于保存次数、签到、生图历史、缓存索引、缓存图片和自拍参考图,便于卸载或迁移时统一处理。

常见问题

提示“API 管线为空或无已启用的提供商”

请在 WebUI 的 api_pipeline 中添加至少一个节点,并确认该节点 enabled=true

模板触发没反应

先用 #画图帮助 确认模板名是否存在。如果开启了 general.prefix=true,请使用命令前缀或 @机器人 唤醒。

图生图提示“请发送或引用一张图片”

插件没有拿到可用底图。请直接发送图片、引用图片、@QQ 用户,或确认当前平台能通过发送者 ID 获取 QQ 头像。

返回了视频但没有图片

只有 openai_compat_chat 兼容端点可能返回视频 URL。插件会发送视频组件;如果端点返回 base64 视频数据,当前不会直接发送。

About

强大的 Astrbot 图片生成插件。不仅支持文生图、图生图,还在API 容灾、自动化配额管理以及大模型工具调用方面达到了工业级标准。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages