---
title: image-studio
canonical_url: "https://www.modelscope.cn/studios/lf3000y/image-studio"
md_url: "https://www.modelscope.cn/studios/lf3000y/image-studio.md"
repository: lf3000y/image-studio
chinese_name: "Image Studio"
last_updated: 2026-10-12
sdk_type: gradio
sdk_version: 6.17.3
downloads: 0
stars: 10
---

# image-studio

> image-studio - lf3000y 在 ModelScope 创建的在线 Demo。RMBG-2.0 抠图、Real-CUGAN x4 超分与 GIF 逐帧处理；Qwen Image 2.1 文生图/最多 10 图参考编辑，支持视觉对话、SSE 进度、队列/显存查询和缓存。Qwen 生成仅限非商业研究与评估。

lf3000y/image-studio 是 ModelScope 魔搭社区上的在线可交互 Demo（创空间），基于 gradio 6.17.3 构建，中文名为「Image Studio」。

- **Repository**: lf3000y/image-studio
- **SDK**: gradio
- **SDK version**: 6.17.3
- **Downloads**: 0
- **Stars**: 10
- **Last updated**: 2026-10-12

Source: https://www.modelscope.cn/studios/lf3000y/image-studio

---

# Image Studio

GPU 图片工作台，默认进入智能对话。助手根据用户描述决定是否生成图片、参考图片编辑、抠图或超分；生成后也可继续 x4 超分、抠图，或先超分再抠图。独立图像工作台仍可直接调用 RMBG-2.0、Real-CUGAN x4 与官方 Qwen-Image-2.1-Turbo；“拆分图层”页由当前视觉对话模型规划，配套使用 LayerExtract 与 LayerRemove 逐层提取、移除并补全背景，可导出多图层 PSD。GIF 会按帧处理后重新编码，结果按原图 MD5 缓存。

创空间根路径直接返回工作台，不再等待 Gradio 组件脚本加载后才重定向。工作台首屏使用轻量加载层，按页面脚本、能力接口响应和进入工作台的真实阶段展示；接口慢或失败时可先进入或重试。Qwen 模型在后台准备时，页面保持基础工具可用，仅展示真实阶段；只有后端提供已下载字节数和总字节数时才计算下载百分比。容器休眠后的平台唤醒发生在应用返回页面之前，不属于页面能自行报告的进度。

图像工作台、智能对话、拆分图层和运行状态统一使用当前 iframe/浏览器可视高度（100dvh），导航与主要操作保持可见，内容仅在历史、参数、图层、队列等内部区域滚动。预览按剩余空间等比显示，窗口缩窄、打开开发工具或手机键盘变化时重新适配。“最近处理”是图像工作台的独立子 tab，不再占用处理画布高度；历史缩略图和对话图片可点击查看大图，支持适应窗口、原始尺寸及缩放。图像工作台刷新或再次进入时不恢复当前原图/参考图与结果画布，旧结果只留在“最近处理”；点击历史“重新载入”才主动恢复图片。正在处理的任务切换页面不会被清空。

## API

### 拆分图层

`POST /api/layers/extract` 接收 multipart `image`（静态 PNG/JPG/WEBP，最大 25 MiB）和 `stream`。也可用 JSON 传 `image` data URL/base64/公开 HTTP(S) URL。图层数量由当前视觉对话模型按画面自主决定，不再要求用户选择；旧客户端的 `max_layers` 字段仅兼容接收并忽略，不影响 AI 方案。默认 `pipeline=peel`，按遮挡关系从最上层向下计算：先用 [LayerExtract](https://modelscope.cn/models/DiffSynth-Studio/Qwen-Image-2.1-LayerExtract) 从当前剩余画面提取目标，再将剩余画面与透明目标图送入 [LayerRemove](https://modelscope.cn/models/DiffSynth-Studio/Qwen-Image-2.1-LayerRemove)，移除目标并补全遮挡内容。最后的剩余画面作为最底层背景；透明底图片不凭空添加背景。**计算完成顺序与图层叠放顺序分离**，图层始终按底到顶叠放。拆层改用与日常画图相同的官方 Turbo Transformer，并在拆层操作期间挂载任务 LoRA；不再另外加载或常驻原始版 Transformer，也不再注入 Viggle 加速 LoRA。普通生成从不激活拆层 LoRA。系统拒绝空方案、重复目标和超过内部安全规模的异常方案，不静默截断结果。与其他图像任务共用单槽队列；取消在采样回调处生效。

拆层固定使用 `quality=turbo30`：在官方 Qwen-Image-2.1-Turbo 检查点上对每次 Extract、Remove 及背景补救执行 30 步；网页不再提供旧的 6/40 步质量选择。这里的 Turbo30 是拆层适配器实验配置，**不是**普通画图所用的官方原生 Turbo 8 步调度。LayerExtract/LayerRemove LoRA 原本基于非 Turbo 的 Qwen-Image-2.1 底模训练；私有 xGPU 已验证 1024px 示例的提取、移除、PSD 导出及随后原生 8 步生成，但不同提示词、种子、尺寸的质量仍有波动。紧密相连的附属部分应由视觉规划器与主体成组；不能把一次成功推断为任意目标都能分成独立图层，需人工核对每层。服务端会在缓存和 Remove 前检查提取层可见区域与当前画面的像素一致性，明显重画或错位时停止交付；这不能代替语义核对。首次拆层仍需准备任务 LoRA；显存不足会明确失败，不暗中回退。旧的 `pipeline=independent` 仅供诊断历史独立提取结果。缓存按底模、LoRA、调度与版本隔离，不能复用旧 6/9/40 步结果。视觉对话模型为每层生成目标短语 `xxx`，后端只拼接官方模板 `Extract the following object: xxx`；移除固定使用 `Remove the object from Figure 2 in Figure 1`。生成式拆层仍可能产生残留、阴影或补全误差，不能承诺无损还原。每层 `meta.timings_ms` 是墙钟阶段测量，不是精确 GPU kernel 时间。

可选 `seed` 为 `0..2147483647` 的整数（JSON 也可 `null`；multipart 使用纯整数字符串）。它与目标短语、画布尺寸、操作类型和叠放序号共同派生每步种子；旧质量档位请求归一化为 Turbo30 后使用同一套种子规则。不同 seed 隔离输出缓存、共享规划；不传时按源图和当前流程派生确定性种子，旧 `independent` 模式仍保留旧种子规则。响应与请求备份保留 `seed_requested`，每步 `meta.seed` 为实际推理种子，便于复现。

配套拆层每轮的剩余画面都会变化，且 Remove 使用两张输入，不能错误复用原图单条件缓存。每个提取/移除步骤独立缓存，缓存键包含实际输入哈希（Remove 按 Figure 1、Figure 2 顺序包含两个哈希）、模型修订、种子与画布；所有中间产物仍归属最初原图的 MD5 namespace。取消后重试可以命中已经完成的步骤；模型钩子和 LoRA 状态在成功、取消和失败后恢复。仅旧 `independent` 路径使用同图条件准备会话；GPU 常驻 INT8 模式下文本编码器、单个 Turbo Transformer 与 VAE 留在 GPU，条件缓存只在当前会话中复用，推理后释放临时张量和 CUDA 空闲块。显存不足时明确失败，不做 CPU offload，也不将同图缓存误用于新的剩余画面。

最终背景交付前，由当前视觉对话模型对照原图、图层计划和实际剩余画面检查主体残留。纯光照投影不视为实体，但肤色、衣物或手臂形状的残影不能仅因模糊就判为干净。发现残留时最多补救 3 轮（**不是限制图层数量**）：首轮复用该目标完整透明图进行 Remove；后续轮次按具体残片短语重新 Extract 后再 Remove。每次补救仍使用 Turbo30；每轮后重新检查，只有判定 `clear` 才交付背景；`uncertain`、无效检查结果或补救后仍有残留会明确报错，已交付前景仍可下载，不生成伪完整 PSD。内部补救切片不新增用户图层。验收和补救按真实输入、模型、提示词版本单独缓存；升级验收逻辑不废弃已有主链图层缓存。

明显透明的输入会额外向规划器提供真实 alpha 遮罩和透明度说明，避免把视觉预览合成的白色当成实体背景；画面内部确有墙面等背景时仍可规划它。紧密相连的完整物体组优先作为一致编辑单元，避免同一花盆等内容在多层重复。若结果在原透明区新增大面积不透明像素，质量检查会拒绝完成；检测允许随画布缩放的边缘容差（1K 时 2px），只改变测量掩膜，不裁切或修改输出图片。上述语义检查仍受视觉模型能力限制，不等于逐像素无损保证。

设置环境变量 `MODELSCOPE_API_KEY` 后，使用 `.venv/bin/python scripts/benchmark_layers.py --generate --profiles turbo30 --pipeline peel` 生成固定种子的 1K 测试图并测 Turbo30 配套拆层，或用 `--input /path/image.png --profiles turbo30` 测已有图片。`--case portrait|poster|scene` 覆盖遮挡人物、文字海报、非方图场景；`--generation-seed` 控制原图生成，`--seeds 11 29 73` 控制拆层多轮复现，按 `seed-N/profile` 保存。默认在私有临时目录保存输入、SSE 记录、独立 PNG、合成图和对比拼图，控制台不输出密钥或预签名 URL。脚本只自动验证传输和元数据，不把 HTTP 成功当作画质通过；空图层和原图覆盖缺口明确告警，合成图误差仅为辅助指标，须检查每层显隐、透明边缘、文本和遮挡关系，尤其应留意旧 LoRA 与 Turbo 底模组合后的细节偏差。

流式返回 `progress`（排队、`layers_analyzing`、`layers_planned`、`layer_started`、`layer_step`、`layer_complete`、`layer_remove_started/step/complete`、`layer_verifying`、`layer_repair_started/step/complete`）、`completed` 或 `error`；只有实际模型步骤产生步数。补救使用独立的 `attempt/max_attempts/repair_operation`，不将内部修复切片计入用户层数。`layers_planned` 给出真实计划、画布尺寸和隐藏的 `source_layer`。`layer_id` 稳定标识图层，`stack_index` 表示底到顶的位置；`completed_layers` 与 `operation_index` 单独表示实际处理进度，不以叠放序号冒充完成数。每个 `layer_complete.layer` 到达就立即按栈位置插入预览，不等待整个任务结束；背景在移除及验收通过后才插入底部，不显示原图冒充背景。处理中调整的显隐在最终响应后仍保留。最终/非流式均为 `{document, server_elapsed_ms}`，文档包含 `width`、`height`、`layers`（**底到顶**），每层含 `id/name/src/mime_type/visible/kind/meta`，`document.meta.final_qa` 记录真实验收和补救结果。画布统一为最长边不超过 1024px、32px 对齐，并附一张默认隐藏的原图参考层。图层 PNG 与规划元信息按原图 MD5 namespace 缓存，存储失败仍可返回 base64。

“拆分图层”页提供透明棋盘叠加预览、独立显隐与单层 PNG 下载。进入时默认是空白的“拆分工作台”，不会自动铺开上次结果；“历史拆分”子 tab 列出保存在当前浏览器 IndexedDB 的完整文档和显隐状态，点击记录才载入查看或导出。旧版仅保存的 `latest` 文档会迁入历史列表。每次拆分最多保存 128 MiB，浏览器配额不足时会提示及时导出 PSD，不自动删除旧记录。`POST /api/layers/export/psd` 接收 `{width,height,layers:[{name,src,visible}]}`，按同样的底到顶顺序返回 `image/vnd.adobe.photoshop`。PSD 内含所有真实 RGBA 像素图层（包括隐藏层）、中文名称与显隐状态，不是扁平预览图，也不包含原生可编辑文本或矢量形状。导出不触发 GPU 推理。

拆分为生成式推理，不保证逐像素重建原图，遮挡内容与边缘可能重绘；层数越多耗时越长。LayerExtract LoRA 模型卡标注 Apache-2.0，但使用的 Qwen 基础模型仍受非商业研究许可约束。

### 图像与对话

`GET /v1/models` 返回已就绪的 `rmbg-2.0`、`real-cugan-x4`、Qwen Image 模型 ID 与当前视觉对话模型。图像生成有两组规范前缀：`qwen-image-2.1` 按原文生成，`qwen-vl-image-2.1` 先由视觉对话模型润色；两者均调用[官方 Qwen-Image-2.1-Turbo 完整检查点](https://modelscope.cn/models/Qwen/Qwen-Image-2.1-Turbo)，使用模型保存的原生 8 步调度，不挂 Viggle 加速 LoRA。可选输出变体为 `-4k`、`-rmbg`、`-4k-rmbg`，例如 `qwen-vl-image-2.1-4k-rmbg`；依次表示生成后 x4 超分、抠图或先超分再抠图。旧 `-fast/-base/-quality` 及陌生的画图模型名作为兼容别名，实际仍是官方 8 步；响应元数据分别记录原请求名称、实际规范模型和步数，不声称运行了旧档位。RMBG 与 Real-CUGAN 的专用模型名保持独立语义。

生成请求默认启用 `character_search=true`（网页显示“联网找参考”）。视觉规划模型在一次调用中分别判断：用户是否要加入尚无外观参考的**明确命名角色或团体**，以及是否明确指定了**具体画师的画风**。只把提取出的短名称发送给受控来源：例如“画 MyGO 一起唱歌”会先核对已选角色再设计站位，“用这张图画它和初音的合照”保留用户图为第一参考并补充初音参考，“画梵高画风的橘猫”会检索画师作品作为画风条件。普通“画可爱猫猫”、纯扩图、改背景或只写“水彩风格”不会因此联网。网页可逐次关闭开关，API 可传 `character_search=false`；该字段适用于 `/api/chat`、`/v1/chat/completions`、`/v1/responses`、`/v1/images/generations` 及生成式 `/v1/images/edits`。模型未识别对象、未找到可靠参考或外站不可用时，仍按原请求生成，不编造参考命中。

参考需求规划和画面提示词设计属于出图前的可选步骤，不会无限等待远端对话模型：前者最多约 20 秒，后者最多约 30 秒，并共用 60 秒预处理截止时间；静默上游还有 10 秒读超时。超时则保留原始画面需求继续出图，客户端取消会及时中断隐藏调用并释放队列槽位。流式进度分别报告真实的 `reference_planning`、`prompt_enhancing` 和后续生成阶段，不把预处理等待显示为模型正在画图。

角色检索优先使用 [AniList 官方 GraphQL 角色数据](https://docs.anilist.co/reference/object/character)；单个命名角色未命中时，依次尝试 [Kitsu 的公开角色接口](https://kitsu.docs.apiary.io)、[萌娘百科公开 Wiki API](https://zh.moegirl.org.cn/api.php)，最后尝试 [Wikimedia Commons 文件接口](https://www.mediawiki.org/wiki/API:Imageinfo)。Kitsu 要求姓名精确/词序互换且唯一匹配，并核对关联动画为非成人；萌娘百科要求主命名空间词条标题与请求角色名完全一致且有可用缩略图。具体画师画风另走 [The Met Open Access API](https://metmuseum.github.io) 的公有领域作品。所有来源只从限定 HTTPS 域名下载限大小、格式和像素的图片，不抓取用户提供的任意网址，也不向外站发送整段提示词或上传图片。命名团体只使用匹配作品的 MAIN 角色，不让单人搜索结果冒充整个团体；同分歧义结果直接弃选。AniList、Kitsu 与萌娘百科的图片授权无法从当前查询可靠核实，页面标成“授权未核实”；参考图仅辅助本次生成，不等于生成结果或可自由传播的素材。Wikimedia Commons 回退已有模拟测试，但当前容器对该 API 的网络连接尚未实测成功，不能保证其每次可用。

检索结果可能使用与用户原话不同的展示语言（如「初音」对应 AniList 的 `Miku Hatsune`）。解析器保留每张图命中的原始短检索词并用于身份核对；另一个角色命中时，不会因此把已命中的别名角色丢掉。团体查询不把团体名误当成每位成员的个人姓名。

S3/本地缓存按规范化角色查询哈希存放带 7 天有效期的 `character-references/v1/queries/<sha256>/manifest.json`；未找到结果的清单有效 6 小时。由于 [AniList 对批量囤积与数据存储用途有限制](https://docs.anilist.co/guide/terms-of-use)，AniList 角色图像素**不长期写入 S3**，只在进程内有限容量缓存约 1 小时。画师画风参考仅使用 [The Met Open Access API](https://metmuseum.github.io) 明确标为公有领域的作品；单独缓存 `style-references/v1/queries/<sha256>/manifest.json` 与按内容 SHA-256 区分的 `style-references/v1/images/<sha256>.jpg`，记录作品、来源与许可。画师参考只提供笔触、配色等视觉语言，不能替代角色身份，也不应复刻原画内容。缓存/网络失败不阻断原图生成。外部参考与用户上传图合计最多 10 张，用户图始终在前。GPU 常驻模式下总参考图达到 3 张时，生成画布最长边默认不超过 768px；显存不足或推理 OOM 时保留所选比例重试 512px。API 元数据和 SSE 仍如实报告实际尺寸，网页只显示画幅比例，不用像素级降档提示打断操作。

`GET /api/status` 返回 `queue.waiting`（等待任务数）、`queue.active`（正在执行的任务数）、`queue.capacity`（并发槽数）、`queue_details`（运行任务的实际阶段/耗时和等待位置/剩余时限）、`gpu.devices[]`（整卡显存）、`system`（容器 cgroup 的 CPU/内存）和 `components[]`（API 进程、对话服务按 PID 实测的 CPU、RSS 内存）。Diffusers 图像引擎与 RMBG/Real-CUGAN 共用 API 进程，不重复列为独立进程。首次查询会取两个真实 CPU 样本；未启动/已停止组件 CPU 为 `0%`，采集失败才为 `null`。进程显存若因容器 PID 命名空间无法匹配无法准确归属，状态页不展示组件级显存，仅保留整卡 GPU 显存。网页的“运行状态”页仅在可见时每三秒刷新。

`POST /v1/images/edits` 支持 multipart 或 JSON，默认 `rmbg-2.0`；x4 超分传 `model=real-cugan-x4`，组合处理传 `operation=rmbg_then_upscale`（兼容名称，实际先超分再抠图）。生成式编辑与 `/v1/images/generations` 均默认使用官方原生 Turbo 8 步；旧档位和陌生画图 ID 走上述兼容别名。JSON 图片可为 base64、data URL 或公开 HTTP(S) URL。`stream=true` 返回 SSE 真实阶段、排队位置与每步耗时；非流式返回普通 JSON。

超分 API 和对话工具都不提供倍率选择参数：Real-CUGAN、组合处理及生成后的 `-4k` 变体固定执行 x4。用户在自然语言中写了其他倍率，只要选择超分，实际仍按固定 x4 处理；响应正文会如实标注“4 倍超分”，不会声称执行了其他倍率。

Qwen 文生图、图生图和对话工具统一使用官方原生 Turbo 的 8 步调度，包括 4–10 张最终参考图的请求；用户上传图、联网角色图和画风图都计入总数。旧模型 ID 与旧 `quality`、`steps`、`use_turbo` 值仅作输入兼容，不能改变实际 8 步推理。SSE 发出真实的 1–8 步 `generation_step`，响应元数据记录 `quality_mode=official_turbo`、实际 `steps_requested=8`、规范模型及原请求参数。新检查点与旧 Viggle/基础模型的缓存键按权重修订和采样配置隔离，不会误命中。`generation_step.step_duration_ms` 是后端单调时钟测量的相邻回调间隔，其余阶段耗时是墙钟测量，不冒充纯 GPU 内核时间。

图像生成的 `size=宽x高` 会自动等比缩至最长边 1024px，并将两边对齐到 32px，无需调用方手动对齐。响应 `meta.input_params` 记录 `size_requested` 和 `size_adjusted`，实际输出尺寸见 `meta.output_params`。

Qwen 图生图支持按顺序传最多 10 张参考图：multipart 可重复传 `image` 或 `image[]`，JSON 传 `images` 数组（旧的单张 `image`/`image_url` 保持兼容）。未指定目标画幅时首图决定输出比例；显式传 `size` 或在对话中指定画幅时，以目标画幅为准，参考图仅作为视觉内容来源，不会被强制拉伸。后续图片作为视觉参考；单图和双图各自最长边规范化至 768px，更多图时按总像素预算自动缩小（10 图时各图最长边最多 320px），防止耗尽显存。抠图和超分仍每次处理一张。对话工具 `image_to_image` 也支持 `image_refs` 图片 ID 数组；在对话页直接附多图时默认使用本轮全部参考图。

较多参考图会显著增加显存需求；GPU 常驻 INT8 模式下，3 张及以上参考图的生成画布最长边默认限制为 768px，低显存或 CUDA OOM 时保留画幅比例重试 512px，并在响应 `input_params.size_adjusted`、`size_actual` 及 SSE `output_size_adjusted` 中说明。此前旧方案在 5 图 1K 时曾逼近显存边界，因此多参考请求继续自动降低推理画布尺寸；不改变用户选择的画幅比例。原生 Turbo 三组件常驻 GPU，不启用 CPU offload，生成结束会回收未占用的 CUDA 缓存。非流式接口仍返回普通 JSON，流式请求持续提供真实进度与队列事件。

```bash
curl -F 'image=@example.png' -F 'model=real-cugan-x4' \
  https://<studio-host>/v1/images/edits

curl -F 'image[]=@first.png' -F 'image[]=@second.png' \
  -F 'model=qwen-vl-image-2.1' -F 'prompt=参考两张图设计一张插画' \
  https://<studio-host>/v1/images/edits

# 生成后依次 x4 超分、抠图（SSE 可见各步进度）
curl -N -H 'Content-Type: application/json' \
  -d '{"model":"qwen-vl-image-2.1-4k-rmbg","prompt":"一只坐在窗边的猫","stream":true}' \
  https://<studio-host>/v1/images/generations
```

`POST /v1/chat/completions` 接受 OpenAI 风格的 `messages`，`POST /v1/responses` 接受 `input`。两者均支持 `stream`。消息中的图片使用 `image_url` data URL，输出图片附在 `meta.images`（Responses 使用 `metadata.image_studio.images`）。图像工具队列和处理阶段通过扩展流式事件/字段提供。浏览器页面使用 `/api/chat` 和 `/api/images/process` 以获取专用进度事件。

对话页默认由 AI 选择工具，用户无须切换“自由对话/抠图/超分/文生图/图生图”模式；画图统一为官方 Turbo 原生 8 步。生成与图生图工具可选 `aspect_ratio`：`1:1`、`3:4`、`4:3`、`2:3`、`3:2`、`9:16`、`16:9`，最长边不超过 1024px 且对齐到 32px。“把这张图扩成手机壁纸”会选择 9:16 竖屏并要求补绘新增画面、保留主体，而非拉伸原图；用户写明比例时优先按用户要求。若要求“画图后超分”“画图后抠图”“画图后超分并抠图”，助手会选择相应生成后处理变体；调用 API 时可在 `image_model` 中指定原文版、润色版及后处理变体。旧模型名仍可输入，但实际都转到对应原生 8 步模型。网页发送后会保留画布比例、参考搜索和模型偏好作为下一条草稿设置；排队消息保留提交时的参数快照。浏览器本地记录以 IndexedDB 保存，刷新页面后恢复；清理站点数据、无痕模式或浏览器存储配额不足时无法保证保留。私有 S3 预签名图若未开放跨域读取，本地仅能保存其短期 URL，过期后需重新生成或从对象存储恢复。

网页上的“总耗时”从点击发送或开始处理时按浏览器单调时钟连续计时，收到完成或错误响应后停止，包含网络传输；SSE 的 `elapsed_ms`、`server_elapsed_ms` 仍分别保留真实后端耗时供 API 调用方使用，不用来覆盖网页计时。对话中的图像工具以追加式步骤记录展示：完成的排队、准备、去噪各步、解码及后处理不会被下一条状态覆盖；每步耗时由后端单调时钟事件或显式阶段字段计算，心跳只更新当前步骤，不虚构步数或百分比。

对话执行图像工具后，`content`/`output_text` 只返回简短文字，图片通过 `meta.images`（Responses 为 `metadata.image_studio.images`）或流式工具事件提供；正文不嵌入图片 Markdown 或预签名地址。启用私有 S3 后，图像结果响应使用预签名 `url`；S3 不可用时回退本地共享缓存并返回 `b64_json`，本地也不可用时仍返回推理结果的 base64。

S3 使用创空间密文变量 `S3_AK`、`S3_SK`、`S3_ENDPOINT`（HTTPS origin）、`S3_BUCKET`、`S3_PREFIX`。一个原图字节 MD5 对应一个 namespace：`<prefix>/image-studio/<md5>/origin.<ext>` 保存首张原图，多参考图时 `references/<序号>-<md5>/origin.<ext>` 保存后续原图；`requests/<uuid>.json` 保存每次请求参数，`outputs/<operation>/<params_hash>/image.<ext>` 与 `meta.json` 保存结果及输出参数。缓存键包含全部参考图的有序哈希。抠图、超分、组合处理和图生图的不同变体都归入同一个首图目录；生成后处理变体可复用基础图缓存，`-4k-rmbg` 还可复用 `-4k` 缓存，仅保存这些可单独使用的输出，不为每一步另建临时 namespace。仅结果图获得短期预签名链接，原图不对外签名。无原图的文生图使用 `text-<规范化提示词与参数哈希>` namespace。

基础对话可理解图片、抠图、4 倍超分或先超分再抠图；Qwen 生成模型就绪后才开放文生图和图生图。冷启动期间，远端对话若已规划出画图工具，请求会在 GPU 队列外等待图像模型就绪（最多 10 分钟），持续发送真实的 `waiting_for_model` 状态和心跳；模型加载失败会及时返回错误，客户端取消会停止等待。默认全局仅执行一项 GPU 任务，其余请求按 FIFO 最多等待 120 秒；流式排队状态会随位置变化及每五秒心跳更新。等待超时后非流式返回 HTTP 504（`code=queue_timeout`），流式返回 `error` 事件，不返回应用层 429。RMBG/Real-CUGAN 的 GIF 输入按帧处理，并尽可能保留动画时长、循环和透明信息。

Qwen 图像请求的客户端断开后，Diffusers 在下一次真实采样步回调处检查取消信号，停止后清理模型状态；GPU 队列槽在推理线程确实退出前保持占用，避免残留任务与新任务争用显存。已经在应用队列但尚未运行的断开请求会直接移出队列。

## 远端主模型与本地热备

主站生产配置为 `QWEN_CHAT_VARIANT=taichu5-9b`、`IMAGE_STUDIO_ENABLE_QWEN=1`：普通对话、工具规划、提示词润色和拆层语义检查优先使用独立私有 **AI Studio**，当前实际模型为 `TaichuAI/ZDTaichu5.0-9B`。远端固定为 `https://studio-lf3000y-ai-studio.api-inference.modelscope.net`，仅服务器从密文变量 `MODELSCOPE_TOKEN` 读取认证信息；不传给浏览器或构建子进程，不跟随重定向。`TAICHU_REMOTE_URL` 只允许同一固定 HTTPS origin。

`AI_STUDIO_MODEL` 默认 `auto`。主站从远端 `/api/status` 和 `/v1/models` 发现实际模型及稳定别名；旧版远端尚未声明 `auto` 时暂发实际模型 ID，发现别名后自动改发 `auto`。实际模型身份由状态与响应记录，`auto` 不用作语义缓存身份。主站 `/v1/models` 同时提供 `auto`、兼容别名 `taichu5-9b-bf16`，并在本地热备就绪后列出 `minicpm-v-4.6`。

MiniCPM-V 4.6 BF16 是主站 GPU 热备，图像引擎准备完后通过同一个 FIFO 独占槽预热。它不阻塞远端对话就绪；远端故障而热备尚未就绪时返回 503，不让请求等待整份模型下载。已就绪时，网络故障或远端 502/503/504 会进入短时熔断并将规划重新排入本地 GPU 队列；本地规划和后续图像工具共用一次队列占用，不在队列外抢占 GPU。认证、重定向、模型身份或严格 JSON/工具校验错误不会被降级吞掉；已经输出文字的请求不会拼接第二个模型重试。恢复探测通过后的请求自动回到远端，MiniCPM 保持热备，便于下次快速切换。排队时间仍取决于正在执行的图像任务，不能保证端到端秒级完成。

`POST /v1/chat/completions` 可显式传 `model=minicpm-v-4.6` 验收热备；这只是标准模型选择，仍使用同一个 GPU FIFO、支持流式/非流式，未暖好返回 503，不修改正常 `auto` 的路由或熔断状态。响应 `model` 和 `message.meta.backend_model` 标明实际后端，`meta.backend`/`meta.degraded` 标记本地降级。`/api/status` 与 `/api/capabilities` 的 `chat_backend` 报告远端就绪、热备就绪/预热、降级和冷却状态；远端与本地 GPU 热备在组件中分开显示。

图像工具结果的 `message.meta.tool_decision_source` 分为 `model`（模型原生工具调用）、`rule`（应用规则改判）、`explicit_mode`（请求明确指定处理模式）或 `none`。用它在线比较模型时，只有 `model` 才算模型自身正确调用；即使应用规则最终完成任务，也不算模型原生工具调用成功。

[MiniCPM-V 4.6 官方模型卡](https://huggingface.co/openbmb/MiniCPM-V-4.6)标明其采用 SigLIP2-400M 与 Qwen3.5-0.8B。3–4 GiB 只是当前热备容量规划范围，不是已测运行峰值，更不是“保证只占 2 GB”；加载、单图、双图、10 图和与 Qwen Image 并存的真实显存仍须在目标 GPU 验收，预算不足时拒绝就绪。`IMAGE_STUDIO_CHAT_STANDBY=0` 可关闭启动预热，不会让冷备在故障请求里临时下载。旧 Qwen3.5 GGUF 代码、校验权重与构建脚本仍保留，可显式配置 `QWEN_CHAT_VARIANT=qwen3.5-9b` 恢复旧后端；正常远端配置不会编译或常驻它。代码未指定 variant 时仍保留原 Qwen3-VL 兼容默认，不自动变更既有部署。

可选试验热备：保持 `QWEN_CHAT_VARIANT=taichu5-9b` 不变，单独设置 `IMAGE_STUDIO_STANDBY_MODEL=qwen3.5-4b-q4_k_m`，会使用 [ModelScope 的 unsloth/Qwen3.5-4B-GGUF](https://modelscope.cn/models/unsloth/Qwen3.5-4B-GGUF) Q4_K_M 权重与 F16 视觉投影器。两文件总大小约 3.18 GiB，下载 URL 固定到修订 `167b4afc359863325cb4164418c715421b4e9118`，分别校验 2,740,937,888 / 672,423,616 字节及仓库公布的 SHA-256；绝不从 Hugging Face 下载。此配置仅在启动预热时构建或复用固定版 CUDA `llama-server`，并在独立本地端口 `8082` 常驻；启动前要求至少 8 GiB 空闲显存，就绪后仍须保留 4 GiB。普通回答和工具决策共用一次生成，不做第二轮冗余回答。未配置时仍是 MiniCPM，不影响远端主模型。若模型只输出 Markdown 伪工具调用，服务拒绝该次回复，不会把它当成合法工具调用或向 SSE 泄露。

仅在停服或专用 GPU 维护窗口可对同一参考图分别运行 `.venv/bin/python scripts/probe_vision_tool_call.py --offline-maintenance --backend minicpm --image /path/to/image.png` 与 `.venv/bin/python scripts/probe_vision_tool_call.py --offline-maintenance --backend qwen --image /path/to/image.png`，比较原生 `tool_calls`、耗时与 `nvidia-smi` 显存快照。该独立脚本绕过在线服务的内存 GPU FIFO，不可与在线绘图并发；它直接调用视觉模型，不调用图像编辑工具，也不经过 API 的确定性意图兜底。返回码 0 表示得到预期原生工具调用，2 表示没有，1 表示运行错误。实际并存显存、工具准确率和质量需在 xGPU 实测后才能决定是否切换默认值。

规划、润色、QA 和文档语义身份按实际后端隔离；如果同次调用从远端切换到热备，不把热备判断写入原远端缓存键。已有纯图片 Extract/Remove 缓存保留，不因更换对话模型全部作废。

## 可选 Qwen 生成能力

`IMAGE_STUDIO_ENABLE_QWEN=1` 会在后台准备 ModelScope 固定修订的官方 Qwen-Image-2.1-Turbo 完整检查点。图像推理使用支持检查点内置 `sample_sigmas` 的 Diffusers 0.41.0，固定原生 8 步、CFG 1，不下载或注入 Viggle 加速 LoRA。当前创空间设置 `QWEN_IMAGE_GPU_RESIDENT_INT8=1`：TorchAO 0.16.0 将 DiT 与 Qwen3-VL 文本编码器的 Linear 权重量化为 INT8，三大组件（含 VAE）常驻 CUDA，不安装 CPU offload hooks；加载后以及每次推理前要求至少 8 GiB 空闲显存，否则明确失败。`GET /api/status` 的 `image_backend.residency` 可看到实际模式、加载后余量与量化层数。私有测试空间已实测 1K 文生图、单图编辑、4 图及 10 图编辑，均完成原生 8 步；具体速度和画质仍随输入与队列变化。默认部署的对话／润色由私有 AI Studio 提供；远端不可用时使用本地 Qwen3.5-4B 热备并遵守 GPU 显存余量门槛，热备也不可用时返回可理解的服务错误。兼容配置可设置 `QWEN_CHAT_VARIANT=qwen3.5-9b`，使用 Qwen3.5-9B Q4_K_M + F16 视觉投影器（模型名 `qwen3.5-9b-q4_k_m`）。模型就绪前 `/api/capabilities` 的 `generative_ready` 为 `false`，页面隐藏生成入口，已有抠图与超分继续可用。就绪后提供文生图与图生图，均可选 `qwen-image-2.1` 原文直通或 `qwen-vl-image-2.1` 视觉模型润色；对话图像工具默认采用润色版，也可单独传 `image_model` 选择原文版。参考图统一处理 EXIF、取 GIF 首帧、合成白底 RGB，默认最长边不超过 768px，并填充到 32 的倍数；文生图默认 1024×1024。相同提示词、模型版本与确定性参数可命中存储缓存；显式随机 seed 不复用旧结果。

Diffusers 图像引擎与 MiniCPM 热备位于主站 API 进程，远端 AI Studio 则使用独立创空间资源。显式旧 Qwen 本地配置才额外启动 `llama-server`；不同引擎不共用模型对象。图像服务在一次推理中按组件轮换使用显存，峰值与真实耗时须在目标 xGPU 上实测，不能由权重大小推断。

润色版由已就绪的视觉对话模型（默认远端 AI Studio，故障时使用本地 Qwen3.5-4B 热备）设计更完整的画面提示词，保留用户原始要求，按需补充主体细节、姿势、表情、场景、光照与画风；原文版不会调用润色模型。响应元信息和请求备份均记录原提示词与最终提示词。未指定模型时默认润色版；旧模型名 `qwen-image-2.1-int8` 仅作兼容别名，实际推理不再使用旧 INT8 引擎。参考图最长边 768px 是输入归一化上限；0–2 张参考图可保持默认 1K 输出，3 张及以上按显存策略将生成画布最长边限制为 768px，低显存时进一步降至 512px。

图生图润色时，`<INPUT_IMAGE_1>` 至 `<INPUT_IMAGE_10>` 表示用户上传图、外部角色图、画师画风图的有序占位；实际像素会在后续生成阶段传入。润色模型收到每张外部图的身份或画风映射，不能要求重新上传，也不能猜测占位图里未被用户描述的人物或物体。用户原始要求始终保留在最终提示词中；模型只补充不冲突的视觉细节。检索到的角色参考在润色前确定，人数或身份相互矛盾的润色稿会回退为通用描述；画风图不会被当成新人物。

为避免创空间启动时 GitHub 连接中断，仓库内附带固定提交 `a25c9865fe03c954c93fd755b5d79ae86ba99750` 的官方 `llama.cpp` 源码归档；构建前校验 SHA-256，归档内保留其原始 `LICENSE`。构建脚本仅在提取后的工作副本中修正两处 CMake 相对引用，不修改原始归档。

[官方 Qwen-Image-2.1-Turbo 检查点](https://modelscope.cn/models/Qwen/Qwen-Image-2.1-Turbo)沿用 Qwen 的非商业研究许可；普通生成和 Turbo30 拆层均不加载 Viggle LoRA。LayerExtract/LayerRemove 是独立任务 LoRA，其许可不替代生成模型许可；两者原为非 Turbo 底模训练，迁移后的实际画质和兼容性仍需验收。商业使用需另行核对并取得授权。生成速度须在目标 xGPU 上实测，不能由权重大小推断。

## 运行

部署为 ModelScope 免费 48GB 显存 xGPU Gradio 环境（64GB 系统内存）。首次启动需下载 RMBG 和 MiniCPM 模型权重；持久目录可防止每次重启重新下载。Real-CUGAN x4 的固定校验权重随代码提供。`IMAGE_STUDIO_PRELOAD=0` 可在本地只测试 API 结构；生产环境保持默认预热。设置 `RMBG_DEVICE=cuda` 要求抠图与超分运行在 GPU。
