[Bug] Images API 忽略最终图片 result,无预览时返回 502

Author: LooKengCreated Sep 8, 2026Updated Sep 8, 2026

环境与现象

CRS v1.1.314,官方 main 提交 8479c7ce358b6bfd6a06287812c786f9533d27a4

ChatImg 0.1.5 使用 CRS API Key 调用 POST /openai/v1/images/generations,参数为 model=gpt-image-2quality=mediumsize=1536x1024n=1,返回:

json
{"error":{"message":"no image produced by upstream","type":"upstream_error"}}

同一 Key 随后通过 /openai/v1/responsesgpt-5.5 + image_generation 成功生成并验证 PNG。最终图在 response.output_item.done.item.result,终态 response.completedstatus=completedoutput=[]

**证据边界:**原失败请求的内部 SSE 未保存;成功请求与 Images bridge 的 carrier/payload 不同,不将它们当作严格 A/B,也不声称原失败请求已经完成出图。以下解析缺陷通过原样源码离线重放单独验证。

已复现的解析缺陷

handleImages 只用顶层 partial_image_b64 填充结果,忽略最终 image_generation_call.result;处理 response.completed 时也只读取 metadata/model/usage。

源码: https://github.com/Wei-Shaw/claude-relay-service/blob/8479c7ce358b6bfd6a06287812c786f9533d27a4/src/routes/openaiRoutes.js#L1183-L1243

将保存的成功 SSE 喂给该版本未修改的解析代码:

离线输入 实际行为 期望
真实完整流:preview + final item + terminal success 200,但返回 preview 字节 返回 final 图片
仅移除上述流的 preview 事件,保留 final item 和成功终态的派生 fixture 502,no image produced by upstream 200,返回 final 图片
只有 preview、无成功终态的派生 fixture 200,返回 preview 不得当作完整生成成功

preview 与 final PNG 的字节哈希不同。派生 fixture 是离线测试输入,不是新的上游响应。

请求构造器没有设置 partial_images,因此不能把预览事件作为唯一图片来源。另有 carrier 硬编码为 gpt-5.4-mini 的差异,本 issue 不将模型选择单独归因为本次失败: https://github.com/Wei-Shaw/claude-relay-service/blob/8479c7ce358b6bfd6a06287812c786f9533d27a4/src/routes/openaiRoutes.js#L1027-L1061

建议修复与回归

  • 读取 response.output_item.done.item.result,只接受 type=image_generation_call 的最终结果。
  • 同时兼容 response.completed.response.output[] 中的最终结果,按输出项身份去重。
  • preview 与 final 分开保存;不能按 base64 长度选“最终图”,preview 可能更大。
  • 要求成功终态,并正确处理 error / response.failed / response.incomplete;截断流或只有 preview 不能返回成功。
  • 覆盖 final-only、completed-output、preview+final、preview-only/truncated、image item 后失败等回归。

此前 #1239 是添加接口的功能请求,#1240 是已合并的实现。本 issue 是该实现的结果提取错误,非重复请求新增接口。

OpenAI 关于预览与最终结果的参考: https://developers.openai.com/api/docs/guides/tools-image-generation#streaming

Source: Wei-Shaw/claude-relay-service