fix: fail fast on gpt-image-2 timeouts

This commit is contained in:
2026-05-19 21:58:59 +08:00
parent 00df9d01fe
commit fd794e3e30
5 changed files with 102 additions and 21 deletions

View File

@@ -986,7 +986,7 @@ ProductRefStateItem {
<tr><td>应用清洗</td><td><code>POST /cleanup/apply</code></td><td><code>applyCleanedFrame</code></td><td>物理覆盖 frames/{idx}.jpg并备份原图。</td></tr>
<tr><td>元素增改删</td><td><code>POST/PATCH/DELETE /elements</code></td><td><code>addElement/updateElement/deleteElement</code></td><td>让用户修正 Vision 错误,避免候选结果锁死。</td></tr>
<tr><td>元素提取</td><td><code>POST /elements/{element_id}/cutout</code></td><td><code>cutoutElement</code></td><td>调用图像模型生成独立白底素材图,每次累积一张 cutout。</td></tr>
<tr><td>主体资产包</td><td><code>POST /elements/{element_id}/subject-assets</code><br><code>DELETE /elements/{element_id}/subject-assets/{asset_id}</code></td><td><code>generateSubjectAssets</code><br><code>deleteSubjectAsset</code></td><td>根据转换层里的参考帧重新绘制一个统一主体资产包;前端按真人重构、卡通重构、元素重构、自主描述四个方向分别管理 <code>source_frame_indices</code>,每个方向最多 3 张参考帧,固定请求 <code>front</code><code>three_quarter_left</code><code>left</code><code>back</code><code>right</code><code>three_quarter_right</code> 六个视图,不再暴露完整 10 / 常用 4 选择。当前源视频工作区使用 <code>subject_style=source_actor</code> 承接真人、元素和自主描述,使用 <code>subject_style=cartoon_subject</code> 承接卡通重构;旧 <code>transparent_human</code> 仍为兼容类型但不是当前转换层默认入口。<code>reconstruction_mode=similar</code> 是创新路径:后端先用 <code>VISION_MODEL</code> 把关键帧反推成非身份化文字 brief再调用 <code>gpt-image-2</code><code>/images/generations</code> 文字生图,日志会显示 <code>image_refs=0</code>;这里是参考重构生成套图,不是抠图、复制或 image-edit 复刻。卡通重构在后端额外加入原创卡通/插画主体约束,明确不输出真实人物复制 likeness。生成完成后后端会把生成视图反推/写入 <code>KeyElement.subject_consensus_brief</code>,作为后续首尾帧的唯一主体身份文字依据。<code>reconstruction_mode=same</code> 仍保留旧 image-edit 路径,用于确实需要精确复刻且有授权的场景。每个 <code>view</code> 单独调用一次生图明确禁止多视图拼图、contact sheet、多主体、多面板、标签或对比排版。后端不再要求整包全成功才写入单个视图失败时会保留已成功生成的主体图返回“部分生成完成”只有一张都没生成出来才返回错误。<code>replace_views=true</code> 时会替换同一视角旧图;删除接口会移除对应 subject asset 记录并删除本地 jpg 文件。</td></tr>
<tr><td>主体资产包</td><td><code>POST /elements/{element_id}/subject-assets</code><br><code>DELETE /elements/{element_id}/subject-assets/{asset_id}</code></td><td><code>generateSubjectAssets</code><br><code>deleteSubjectAsset</code></td><td>根据转换层里的参考帧重新绘制一个统一主体资产包;前端按真人重构、卡通重构、元素重构、自主描述四个方向分别管理 <code>source_frame_indices</code>,每个方向最多 3 张参考帧,固定请求 <code>front</code><code>three_quarter_left</code><code>left</code><code>back</code><code>right</code><code>three_quarter_right</code> 六个视图,不再暴露完整 10 / 常用 4 选择。当前源视频工作区使用 <code>subject_style=source_actor</code> 承接真人、元素和自主描述,使用 <code>subject_style=cartoon_subject</code> 承接卡通重构;旧 <code>transparent_human</code> 仍为兼容类型但不是当前转换层默认入口。<code>reconstruction_mode=similar</code> 是创新路径:后端先用 <code>VISION_MODEL</code> 把关键帧反推成非身份化文字 brief再调用 <code>gpt-image-2</code><code>/images/generations</code> 文字生图,日志会显示 <code>image_refs=0</code>;这里是参考重构生成套图,不是抠图、复制或 image-edit 复刻。卡通重构在后端额外加入原创卡通/插画主体约束,明确不输出真实人物复制 likeness。生成完成后后端会把生成视图反推/写入 <code>KeyElement.subject_consensus_brief</code>,作为后续首尾帧的唯一主体身份文字依据。<code>reconstruction_mode=same</code> 仍保留旧 image-edit 路径,用于确实需要精确复刻且有授权的场景。每个 <code>view</code> 单独调用一次生图明确禁止多视图拼图、contact sheet、多主体、多面板、标签或对比排版。单次图片请求受 <code>IMAGE_REQUEST_TIMEOUT_SECONDS</code> 控制,默认 60 秒超时、DNS 或连接失败会让当前视图标失败并继续后续视图。后端不再要求整包全成功才写入:单个视图失败时会保留已成功生成的主体图,返回“部分生成完成”,只有一张都没生成出来才返回错误。<code>replace_views=true</code> 时会替换同一视角旧图;删除接口会移除对应 subject asset 记录并删除本地 jpg 文件。</td></tr>
<tr><td>主体套图状态</td><td><code>SubjectAsset.status</code><br><code>pack_id</code></td><td><code>web/app/page.tsx</code><br><code>SourceSubjectPipeline</code></td><td><code>generateSubjectAssets</code> 现在先写入同一个 <code>pack_id</code> 下的 queued 占位卡并立即返回,后台按视角逐张生成,单张完成就把该占位替换成 completed 图片。前端轮询会把 queued / in_progress 主体资产纳入运行状态;主体元素区按 pack 显示套图文件夹,点击某个文件夹后展开该套图,其他套图顺位进入下方可滚动列表。</td></tr>
<tr><td>首尾帧资产</td><td><code>POST /frames/{idx}/scene-asset</code></td><td><code>generateSceneAsset</code></td><td>同一接口兼容旧场景图和新首尾帧;当前信息流复刻流程传 <code>asset_role=first_frame/last_frame</code><code>subject_brief</code> 和最多 1-2 张 <code>product_images</code>。首尾帧不再传主体图、不再把主体图和产品图拼成 contact sheet主体只走文字 brief允许新动作、新景别、新表情和新环境。若本条需要产品后端只把产品参考图作为 <code>gpt-image-2</code> image-edit 的硬视觉真源;若不需要产品,则走纯文字生图。关键帧只作为行数据承载位置。生成结果保存在 <code>scene_assets</code>,前端再写入 <code>StoryboardScene.first_image/last_image</code></td></tr>
<tr><td>产品图库</td><td><code>GET /product-library/skg</code></td><td><code>listProductLibrary</code></td><td>读取内置 SKG 白底图库 manifest返回产品标题、品类、尺寸、白底评分和预览图 URL。</td></tr>
@@ -1062,7 +1062,7 @@ ProductRefStateItem {
<li>主体候选确认、改名、删除和主体资产包生成能力保留在底层旧面板和接口中,当前第一步主界面不主动展示。</li>
<li>分镜工作台 4 图槽和改造说明自动保存。</li>
<li>音频文案轨:点击开始或提取音频后提取原文案、中文翻译、讲话人、语速节奏、背景音乐/环境声/音效;结果集中在右侧工作表展示。</li>
<li>GPT Image 生图;当前 <code>IMAGE_MODEL</code> 和主体 6 视图链路默认使用 <code>gpt-image-2</code></li>
<li>GPT Image 生图;当前 <code>IMAGE_MODEL</code> 和主体 6 视图链路默认使用 <code>gpt-image-2</code>,单次图片网关请求默认 60 秒超时,超时后该视图标失败并继续后续视图</li>
<li>三字段分镜候选生成:默认行左侧露文案、场景一句话、人物+产品+动作,右侧直接展示横向视频轨;中文镜像失焦后会自动优化英文主值;支持 AI 改写预览、单条选择数量生成、追加生成、选中候选和整片按行排队提交。</li>
<li>全局资源中心:提示词库和素材库可从顶部“资源库”打开;提示词可复制并计数,素材应用到 job 时会复制成本 job 内普通 asset。</li>
</ul>
@@ -1113,6 +1113,19 @@ ProductRefStateItem {
<h2>变更记录</h2>
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
<div class="changelog">
<article class="change">
<header>
<h3>2026-05-19 · gpt-image-2 请求超时改为快速失败</h3>
<span class="tag violet">API</span>
<span class="tag amber">Reliability</span>
<span class="tag rose">Config</span>
</header>
<div class="body">
<p><strong>问题:</strong><code>gpt-image-2</code> 上游图片网关无响应时,文字生图仍通过 SDK 默认等待,编辑生图也按 120 秒重复尝试;主体 6 视图第一张卡住后,用户侧长时间看不到逐张失败或后续进度。</p>
<p><strong>改动:</strong><code>api/main.py</code> 新增 <code>IMAGE_REQUEST_TIMEOUT_SECONDS</code>,默认 60 秒;<code>_image_text_call</code> 统一改为直接调用 <code>/images/generations</code><code>_image_edit_call</code> 和旧分镜生图也复用同一超时。超时、DNS、连接失败这类传输错误不再盲目重试三轮会把当前视图标失败并继续处理后续视图。<code>/health</code> 回传当前图片超时配置。</p>
<p><strong>影响:</strong>这次不改模型,所有图片入口仍固定只使用 <code>gpt-image-2</code>;如果继续失败,错误会明确指向当前 <code>IMAGE_BASE_URL</code> 上的 <code>gpt-image-2</code> 通道超时或不可用。</p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-19 · 主体元素改为套图文件夹并逐张回填</h3>