fix: use image edits for gpt references

This commit is contained in:
2026-05-18 06:48:19 +08:00
parent a33287f511
commit e07af781a4
2 changed files with 16 additions and 4 deletions

View File

@@ -894,7 +894,7 @@ ProductRefStateItem {
<tr><td>产品图入库到 job</td><td><code>POST /jobs/{id}/assets</code><code>POST /jobs/{id}/assets/product-library</code></td><td><code>uploadStoryboardAsset</code><code>copyProductLibraryAsset</code></td><td>上传产品图或把内置产品图库条目复制为当前 job 的普通 asset。后端统一生成最长边 1600px、JPEG 92 的 AI 工作副本,透明底铺白,过大/过小图片会在 <code>ImageRef.asset_meta</code> 里返回转换动作和风险;黑底/白底背景本身不强行转换。注意该接口只写图片文件,产品素材池列表另由 <code>PUT /jobs/{id}/product-refs</code> 持久化。</td></tr>
<tr><td>产品素材池保存</td><td><code>PUT /jobs/{id}/product-refs</code></td><td><code>saveProductRefs</code></td><td>把当前 job 的产品素材池列表、识别视角、用途标签、方向、结构点、备注、AI 补图和删除结果保存到 <code>Job.product_refs</code> / <code>state.json</code>。前端上传、识别完成、补角度、编辑备注和删除时都会同步保存;刷新页面或热更新后从 job 恢复,不再要求重新上传和重新识别。</td></tr>
<tr><td>产品视角识别</td><td><code>POST /jobs/{id}/assets/product-views/analyze</code></td><td><code>analyzeProductViews</code></td><td>读取同一产品素材池,按批次把多张图一次性提交给视觉模型,不限制只看前 6 张;识别对象被固定为套在脖子上的 U 形肩颈按摩仪。返回 <code>view</code><code>background</code><code>use_tags</code><code>orientation</code><code>landmarks</code>、中文备注、生成风险和置信度;<code>orientation</code> 明确佩戴者左/右、上/下、内外侧和开口方向对应图中哪边,避免把图片左右误当产品左右。前端不再要求用户手动选择视角,也不做不同产品身份判断。</td></tr>
<tr><td>产品缺角度补图</td><td><code>POST /jobs/{id}/assets/product-angle</code></td><td><code>generateProductAngleAsset</code></td><td>用当前产品白底图作为参考,通过图像模型自动补全缺失视角,输出新的 <code>ImageRef(kind="asset")</code>。Prompt 会约束白底产品图、左右非对称、厚度、内侧触点和肩颈真实佩戴比例;前端只在自动补图失败时暴露重试入口。</td></tr>
<tr><td>产品缺角度补图</td><td><code>POST /jobs/{id}/assets/product-angle</code></td><td><code>generateProductAngleAsset</code></td><td>用当前产品白底图作为参考,通过图像模型自动补全缺失视角,输出新的 <code>ImageRef(kind="asset")</code>。Prompt 会约束白底产品图、左右非对称、厚度、内侧触点和肩颈真实佩戴比例;图生图通过 <code>/images/edits</code> multipart 提交参考图,不再把 <code>image</code> 当 JSON 参数塞进 <code>/images/generations</code>;遇到 <code>gpt-image-2</code> 上游 429 / saturated 会按退避节奏重试,最终仍失败时返回 503 和可读提示。前端只在自动补图失败时暴露重试入口。</td></tr>
<tr><td>角色库</td><td><code>GET /character-library/skg</code></td><td><code>listCharacterLibrary</code></td><td>读取内置 5 个透明骨架人角色 manifest每个角色含正面、左右 45 度、侧面、背面、半身近景和背部特写 7 张参考图。</td></tr>
<tr><td>角色图入库到 job</td><td><code>POST /jobs/{id}/assets/character-library</code></td><td><code>copyCharacterLibraryAssets</code></td><td>把所选角色的 7 张参考图复制为当前 job asset返回 <code>subject_images</code>,产品融合生成视频时作为人物身份参考图提交。</td></tr>
<tr><td>产品融合引导图</td><td><code>POST /jobs/{id}/product-fusion/guide</code></td><td><code>createProductFusionGuide</code></td><td>旧流程兼容接口:读取产品图和白底人物图,按 <code>product_region</code> 合成位置引导图。当前内置角色 + 产品 + 描述流程不再主动调用它。</td></tr>
@@ -1004,6 +1004,18 @@ ProductRefStateItem {
<h2>变更记录</h2>
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
<div class="changelog">
<article class="change">
<header>
<h3>2026-05-18 · gpt-image-2 图生图改用 edits 并处理上游饱和</h3>
<span class="tag violet">API</span>
<span class="tag amber">Reliability</span>
</header>
<div class="body">
<p><strong>问题:</strong>产品补角度遇到 <code>gpt-image-2</code> 上游 429 saturated 时,后端只间隔 1 秒重试 3 次,很容易直接失败;相似主体重构还把参考图作为 JSON <code>image</code> 参数提交到 <code>/images/generations</code>,在 GPT 图片接口下会返回 <code>Unknown parameter: 'image'</code></p>
<p><strong>改动:</strong><code>_image_edit_call</code> 和旧分镜图生图入口改为调用 <code>/images/edits</code>,用 multipart <code>image</code> 文件传参考图,继续固定模型 <code>gpt-image-2</code>。图像调用新增 429 / saturated 识别和退避重试;产品补角度单次请求提高到 5 次尝试,耗尽后返回 503 和“上游负载饱和,请稍后重试”的可读错误。<code>web/lib/api.ts</code> 对产品补角度和主体资产接口解析 FastAPI <code>detail</code>,不再把整段 JSON 原样堆进 toast。</p>
<p><strong>影响:</strong><code>api/main.py</code><code>web/lib/api.ts</code><code>docs/source-analysis.html</code>。后续生图仍然只走 <code>gpt-image-2</code>,但图生图必须走 edits 形态,不能再往 generations JSON 里传 <code>image</code></p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-18 · 相似主体缩略图压缩并支持单张重生/删除</h3>
@@ -1052,7 +1064,7 @@ ProductRefStateItem {
</header>
<div class="body">
<p><strong>问题:</strong>之前图片、文本、音频分析共用 <code>LLM_BASE_URL</code>,配音默认仍是 MiniMax视频虽然已接豆包/Seedance但模型标注没有把“生图 GPT / 语音 Azure / 视频 Seedance”三条高优先级链路清楚拆开。</p>
<p><strong>改动:</strong><code>api/main.py</code> 新增 <code>IMAGE_BASE_URL</code><code>IMAGE_API_KEY</code><code>VOICE_PROVIDER</code><code>AZURE_OPENAI_BASE_URL</code><code>AZURE_OPENAI_API_KEY</code><code>AZURE_TTS_MODEL</code> 等配置;所有 <code>/images/generations</code> 调用改走图片专用 OpenAI-compatible client,默认 <code>gpt-image-2</code>TTS 新增 Azure OpenAI 协议 <code>/audio/speech</code> 通道,默认 <code>VOICE_PROVIDER=azure_openai</code><code>GET /health</code> 回传图片、主体、语音和视频的实际模型与 base URL 供前端模型标注使用。</p>
<p><strong>改动:</strong><code>api/main.py</code> 新增 <code>IMAGE_BASE_URL</code><code>IMAGE_API_KEY</code><code>VOICE_PROVIDER</code><code>AZURE_OPENAI_BASE_URL</code><code>AZURE_OPENAI_API_KEY</code><code>AZURE_TTS_MODEL</code> 等配置;图片调用改走图片专用 OpenAI-compatible client文字生图走 <code>/images/generations</code>,图生图后续已收敛到 <code>/images/edits</code>,默认 <code>gpt-image-2</code>TTS 新增 Azure OpenAI 协议 <code>/audio/speech</code> 通道,默认 <code>VOICE_PROVIDER=azure_openai</code><code>GET /health</code> 回传图片、主体、语音和视频的实际模型与 base URL 供前端模型标注使用。</p>
<p><strong>影响:</strong><code>api/main.py</code><code>web/lib/api.ts</code><code>RULES.md</code><code>.project.json</code><code>docs/source-analysis.html</code>。真实 key 仍只写本地 <code>api/.env</code> / 生产环境变量,不能入库。</p>
</div>
</article>