[Bug] Images API 忽略最终图片 result,无预览时返回 502
环境与现象
CRS v1.1.314,官方 main 提交 8479c7ce358b6bfd6a06287812c786f9533d27a4。
ChatImg 0.1.5 使用 CRS API Key 调用 POST /openai/v1/images/generations,参数为 model=gpt-image-2、quality=medium、size=1536x1024、n=1,返回:
{"error":{"message":"no image produced by upstream","type":"upstream_error"}}同一 Key 随后通过 /openai/v1/responses、gpt-5.5 + image_generation 成功生成并验证 PNG。最终图在 response.output_item.done.item.result,终态 response.completed 的 status=completed、output=[]。
**证据边界:**原失败请求的内部 SSE 未保存;成功请求与 Images bridge 的 carrier/payload 不同,不将它们当作严格 A/B,也不声称原失败请求已经完成出图。以下解析缺陷通过原样源码离线重放单独验证。
已复现的解析缺陷
handleImages 只用顶层 partial_image_b64 填充结果,忽略最终 image_generation_call.result;处理 response.completed 时也只读取 metadata/model/usage。
将保存的成功 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