7.2 KiB
7.2 KiB
V2.1 图片生成方案(套图 + 单张 AI 生图)
状态:Phase A 前端开发中;Phase B 服务端平移 参照:image-suite-studio(下称 ISS)
server/services/{planner,generator,prompts,watermark}.py+ 面板 03/04 区块交互 原则:生成能力与 ISS 功能一致,交互移到 studio 试算页并新增「单张 AI 生图」。
1. 能力总览
| 能力 | 说明 | 状态 |
|---|---|---|
| 采集图片展示与勾选 | 按 main/sku/detail/generated 分组;勾选作为参考底图;默认全选主图+SKU 图 | Phase A 前端 ✅ |
| 手动上传补充参考图 | POST /api/materials/bytes,独立 upload 分组 |
Phase A 前端 ✅(接口已有) |
| 套图方案(默认) | 7 种基础类型各 1 张,数量 0-5 可调 | Phase A 前端 ✅ |
| AI 智能规划 | DeepSeek 按商品信息/图组统计/SKU 规格生成方案(POST /api/suite/plan) |
前端 ✅ / 服务端 Phase B |
| 一键生成 | 方案展开为逐张任务,串行队列多模型生成(POST /api/suite/generate + 轮询) |
前端 ✅ / 服务端 Phase B |
| 生成图水印 | 服务端 Pillow 合成(图片徽章/文字 + 不透明度,右下角) | 前端选项 ✅ / 服务端 Phase B |
| 生成结果与导出 | 结果网格、失败格错误、导出 ZIP(GET /api/suites/{id}/zip) |
前端 ✅ / 服务端 Phase B |
| 下载采集图片 | 勾选图打包 ZIP(POST /api/export/images,防盗链代理下载) |
前端 ✅ / 服务端 Phase B |
| 单张 AI 生图(V2.1 新增) | 每张采集图/生成图上「AI 生图」按钮 → 弹窗:要求文本域 + 模型选择 → 单张生成 | 前端 ✅ / 服务端 Phase B |
| 生成图回写商品 | 生成完成的图追加为 product_assets(generated) |
Phase B/D |
2. 目标平台与规格
试算页固定目标平台 Ozon:俄文图内文案、3:4(1536×2048)。
(ISS 的 wb/cn 选项不做;platform 字段仍随请求下发,服务端按平台决定文案语言与比例,保留扩展性。)
3. 出图方案(Plan)
- 类型白名单(10 种):white_bg 白底主图 / key_features 核心卖点图 / selling_pt 卖点图 / material 材质图 / lifestyle 场景展示图 / multi_scene 多场景拼图 / ecommerce_detail 电商详情图 / size_chart 尺寸标注图 / sku_collection SKU合集 / custom 创意图。
- 默认方案:前 7 种各 1 张;行点击切换 0↔1,± 调 0-5,「全部方案」批量开关。
- AI 规划:请求
{product_id, texts, sku_variants, image_stats, platform, requirements};DeepSeek 输出单行 JSON{summary, items:[{kind,title,detail,prompt_hint,count,variant_name}]};服务端清洗(kind 白名单、count 钳 0-3、幻觉 SKU 丢弃绑定、截断修复)。规则:每个带图 SKU 1 张 white_bg 且绑定 variant_name;总数 8-15。 - 规划并生成:勾选后规划完成直接进入生成。
- SKU 规格来源:
product_assets中group_key='sku'的variant_name去重。
4. 生成(Generate)
POST /api/suite/generate
{ product_id, texts, images:[{url, group_key, variant_name}], // 勾选的参考底图
style_set, style_prompt, requirements, plan, platform:'ozon', model, watermark }
→ { suite_id }
- texts 组装(前端已实现,source = product.raw + 包装字段覆盖):
title(title_zh||title) / price / brand / sales / shop / params(含尺寸、重量覆盖回参数表) / selling_point / desc。 - 参考图解析(服务端,ISS 逻辑):variant_name 精确匹配 SKU 图 → 回退 main 组第 1 张;material 偏好第 2 张;最多 2 张;本地 storage 直读,远程 URL 带站点 Referer 下载,转 data-URI 进请求。
- 提示词:按模型家族分册(alibaba 主体参考语义 / gpt edits 保真语义 / google 主体保持),共用 10 种图类型 builder + 商品上下文(参数表提炼卖点)+ 5 套风格 +
requirements置顶强制约束 + 图内文案按语言规范(俄文 ≤4 词)。 - 任务模型:进程内内存任务表 +
asyncio.Lock全局串行队列(防中转限流);逐张生成 → Pillow 水印 → 按 PNG 魔数定扩展名落storage。重启丢任务、图片不丢(与 ISS 一致,接受)。 - 前端轮询:
GET /api/suites/{id}每 3s;done/partial/failed终态;连续 3 次失败停止跟踪;超预算(5min/张+10min)提示。
5. 模型路由(与 ISS 一致,服务端 MODEL_PROVIDERS 表)
| Provider | 模型 | 调用 |
|---|---|---|
| doubao(火山方舟) | doubao-seedream-4-5-251128 | images/generations 同步,image 传 data-URI |
| tongyi(DashScope) | qwen-image-3.0-pro / wan2.7-image-pro / wan2.6-image / wan2.6-t2i | qwen 同步;wan 异步 task 轮询;t2i 纯文生图 |
| rightapi(中转) | gpt-image-2 / gpt-image-2-vip / nano-banana(-2/-2-lite/-pro) | POST /v1/images/generations async + 任务轮询 + 退避重试 |
前端下拉 10 个模型带中文特点说明,默认 gpt-image-2-vip。密钥:ARK_API_KEY / DASHSCOPE_API_KEY / RIGHTAPI_API_KEY / DEEPSEEK_API_KEY(.env,Phase B 接入本仓 settings)。
6. 风格与要求
- 5 套风格(北欧极简/清新明亮/高级感深色/暖调生活/纯净棚拍)+ 每套默认提示词;风格提示词可改写(按风格 id 记忆,切风格不丢,可恢复默认)。
- 「生图要求」文本域:最高优先级强制约束,服务端置于 prompt 最前并声明覆盖一切冲突指令。
- 水印选项(Popover):开关 + 类型(图片徽章/文字)+ 水印文字 + 不透明度(默认关、
xiongmaoyx、30%);随生成请求下发,关闭时不带字段;位置右下角;重新生成后生效。
7. 单张 AI 生图(V2.1 新增)
交互(前端已实现,AiImageGenModal.tsx):
采集图/生成图单元格 → 「AI生图」按钮
→ 弹窗:左侧原图预览;右侧要求文本域(必填)+ 模型下拉(同上 10 个)+ 生成按钮
→ POST /api/suite/image-edit { product_id, image_url, prompt, model, append: true }
→ 返回 { url },弹窗内展示结果,可下载/打开原图
→ 服务端把结果追加为 product_assets(group_key='generated', variant_name=null)
- 与「智能修图」页(
/ai-image,wanx 注解编辑)并存:本入口是轻量单张再生成(选模型 + 一句话要求),不做标注/遮罩。 - 服务端实现 = 统一模型路由的单张调用(复用 §5 provider 层 + 参考图即传入的单图 + prompt = 用户要求 + Ozon 平台规格),生成后落 storage 并回写素材;
append=false时不回写。
8. 展示与防盗链
- 素材展示优先
stored_url(服务端已转存,本地/media/...或七牛),缺失时回退source_url; 源站防盗链导致破图时走GET /api/proxy-image?url=(Phase B 提供,ISS 同款)。 - 预览用 antd
Image.PreviewGroup画廊( ← → / Esc 与 ISS 行为一致)。
9. 导出
- 导出 ZIP(生成结果):
GET /api/suites/{id}/zip,文件名cleanFilename(标题).zip; - 下载采集图片:
POST /api/export/images {title, images:[{url, groupName, variantName, key}]},按分组建文件夹打包; - 前端经 blob +
<a download>落盘(非扩展环境没有 chrome.downloads)。