如何把 gpt-image-2 电商生图失败做成可观测系统:错误分类、重试和参数治理
如何把 gpt-image-2 电商生图失败做成可观测系统:错误分类、重试和参数治理
适合读者:AI 网关开发、SaaS 平台工程、AIGC 产品后端、运维和稳定性团队。
文章重点:不是教你写一个 prompt,而是讲如何把gpt-image-2电商生图失败从“玄学问题”变成“可观测、可分类、可治理”的工程问题。
背景
电商图片生成失败,最糟糕的处理方式是把所有错误都返回成:
服务暂时不可用,请稍后重试
用户不知道要改提示词、换图片、改尺寸,还是等平台恢复。
平台团队也很难判断:
- 是参数错误?
- 是图片上传错误?
- 是提示词品牌/IP 风险?
- 是上游 5xx?
- 是渠道额度不足?
- 是 endpoint 用错?
所以电商生图产品需要的不是更多泛化错误,而是一套错误分类和观测体系。
1. 用最小实测确定错误边界
我先用 Crazyrouter 对 gpt-image-2 做了一个最小验证:
Base URL: https://cn.crazyrouter.com
Endpoint: POST /v1/images/edits
Model: gpt-image-2
Input: 768x768 demo 商品图
Test date: 2026-07-05
测试结果:
| Case | HTTP | 结论 |
|---|---|---|
model=gpt-image-2, size=auto |
200 | 链路可用,返回 PNG |
size=123x456 |
400 | 参数错误,invalid_request |
不传 model |
400 | 请求构造错误,Model name is required |
这组最小测试的价值不在于生成了什么图,而在于划清了三条边界:
- 图片编辑链路本身可用。
size错误是确定性 400,不应该重试。- 缺
model是请求构造错误,不应该伪装成上游故障。
如果你要复现这组边界测试,可以在本站 Crazyrouter 创建 API Key 后,从下面这条链路开始:
API Base: https://cn.crazyrouter.com/v1
Endpoint: /images/edits
Model: gpt-image-2
入口:
https://crazyrouter.com/register?utm_source=csdn&utm_medium=article&utm_campaign=gpt_image2_ecommerce&utm_content=observability_20260705__setup
工程团队建议把这 3 个 case 固化到图像模型 smoke test 里。上线前跑一次,上线后定时跑一次,能够把“接口不可用”和“业务素材效果不好”先分开。
2. 先建立错误分类
建议把错误至少分成六类:
| 类别 | 示例 | 是否重试 | 谁来修 |
|---|---|---|---|
| 参数错误 | invalid size、缺 model | 否 | 调用方 / 业务后端 |
| 图片输入错误 | 图片缺失、URL 不可访问、格式错误 | 否 | 调用方 / 素材系统 |
| 提示词风险 | 生成 logo、复刻 IP、授权标识 | 通常否 | 业务产品 / prompt 层 |
| endpoint 错误 | 用 chat endpoint 做图片编辑 | 否 | SDK / 网关适配层 |
| 上游临时错误 | 500、502、504、timeout | 是,有限重试 | 平台 / 网关 |
| 额度权限问题 | upstream quota、permission | 否或切渠道 | 平台运维 |
核心原则:
确定性 4xx 不重试;
可恢复 5xx 才重试;
上游额度和权限问题要监控,不要让用户改提示词。
3. 建议记录的日志字段
不要只记录一段错误字符串。至少要记录这些字段:
{
"trace_id": "internal-trace-id",
"account_scope": "anonymous_bucket",
"endpoint": "/v1/images/edits",
"model": "gpt-image-2",
"size": "auto",
"quality": "low",
"n": 1,
"has_image": true,
"image_mime": "image/png",
"image_bytes": 123456,
"prompt_length": 120,
"prompt_risk_flags": ["brand_or_ip"],
"http_status": 400,
"error_code": "invalid_request",
"error_owner": "request_parameter",
"retryable": false,
"elapsed_ms": 160
}
注意:这里不需要把完整 prompt、完整图片、用户隐私内容都打进日志。生产系统更应该记录可诊断的结构化字段,而不是暴露用户原文。
4. 参数治理:size 白名单
size 是电商图像 API 里最容易被误用的字段。
平台最终尺寸和模型参数不是一回事。
错误做法:
运营后台允许手填 800x800、1200x1200、1920x1080、3:4
服务端原样传给模型 API
推荐做法:
ALLOWED_GPT_IMAGE2_SIZES = {
"auto",
"1024x1024",
"2048x1152",
"3840x2160",
}
def normalize_size(user_choice: str) -> str:
mapping = {
"auto": "auto",
"square_main_image": "auto",
"landscape_scene": "2048x1152",
"large_landscape": "3840x2160",
}
size = mapping.get(user_choice, "auto")
if size not in ALLOWED_GPT_IMAGE2_SIZES:
return "auto"
return size
平台尺寸放到后处理:
模型输出 -> 裁剪/扩边 -> 压缩 -> 平台目标尺寸
5. 请求前校验
网关或业务后端应该先拦截确定性错误:
def classify_preflight(payload, image):
if not payload.get("model"):
return {
"ok": False,
"error_owner": "request_parameter",
"error_code": "missing_model",
"message": "model is required",
"retryable": False,
}
if payload.get("model") != "gpt-image-2":
return {
"ok": False,
"error_owner": "request_parameter",
"error_code": "unsupported_model",
"message": "unsupported image edit model",
"retryable": False,
}
if image is None:
return {
"ok": False,
"error_owner": "image_input",
"error_code": "missing_image",
"message": "image is required for image edits",
"retryable": False,
}
if payload.get("size") not in {"auto", "1024x1024", "2048x1152", "3840x2160"}:
return {
"ok": False,
"error_owner": "request_parameter",
"error_code": "invalid_size",
"message": "unsupported size for gpt-image-2",
"retryable": False,
}
return {"ok": True}
这样可以让很多 400 错误在本地返回,减少上游调用,也让用户看到更明确的文案。
6. 提示词风险不是错误,但应该打标
电商 prompt 里常见这些风险词:
logo
品牌
商标
正版授权
版权标注
联名
角色图案
同款风格
补全标识
这些词不一定必然失败,但应该打标。
示例:
RISK_TERMS = ["logo", "品牌", "商标", "正版授权", "版权", "角色", "同款"]
def prompt_risk_flags(prompt: str):
flags = []
if any(term in prompt for term in RISK_TERMS):
flags.append("brand_or_ip")
if "完全不变" in prompt and ("重新打光" in prompt or "透视校正" in prompt):
flags.append("conflicting_edit_goal")
if "卖点文案" in prompt or "主标题" in prompt or "副标题" in prompt:
flags.append("text_rendering_requested")
return flags
风险打标的用途:
- 给用户提示改写建议。
- 做失败率聚合分析。
- 区分参数错误和提示词风险。
- 帮助产品决定是否加模板。
7. 重试策略:不要所有错误都重试
错误重试要非常克制。
推荐策略:
| HTTP / 错误 | 策略 |
|---|---|
| 400 invalid size | 不重试 |
| 400 missing model | 不重试 |
| 图片缺失 / URL 不可访问 | 不重试 |
| 品牌/IP 风险 | 不自动重试,给改写建议 |
| 500 / 502 / 504 | 可重试 1-2 次 |
| timeout | 可重试,带退避 |
| 上游额度不足 | 不重试当前渠道,可切备用渠道 |
伪代码:
def should_retry(error):
if error.http_status in {500, 502, 504}:
return True
if error.code in {"timeout", "bad_response_status_code"}:
return True
return False
确定性参数错误重试只会放大请求量,没有意义。
8. 用户可见文案要分层
不要把所有错误都显示成“服务不可用”。
更好的文案:
| 内部错误 | 用户文案 |
|---|---|
| missing_model | 当前请求缺少模型参数,请检查模型配置 |
| invalid_size | 当前图片尺寸参数不支持,请改用自动尺寸或推荐尺寸 |
| missing_image | 图片编辑需要上传商品图 |
| image_url_unreachable | 图片链接无法访问,请重新上传图片 |
| prompt_brand_or_ip | 提示词包含品牌或授权生成要求,建议改为保留输入图已有内容 |
| upstream_5xx | 上游服务临时异常,请稍后重试 |
| upstream_quota | 当前线路暂不可用,平台正在切换备用线路 |
用户看到准确文案,才知道下一步要做什么。
9. 建议的监控面板
平台可以做一个图像 API 专用面板:
按模型统计:
- 请求数
- 成功率
- 4xx 参数错误率
- 5xx 上游错误率
- 平均耗时
- p95 耗时
按错误类型统计:
- invalid_size
- missing_model
- missing_image
- image_url_unreachable
- brand_or_ip_risk
- upstream_5xx
- upstream_quota
按 endpoint 统计:
- /v1/images/edits
- /v1/images/generations
- /v1/chat/completions
重点不是只看错误量,而是看归因。
如果 invalid_size 高,应该改产品参数白名单。
如果 missing_model 高,应该修 SDK 或任务队列。
如果 upstream_5xx 高,应该看渠道健康和重试。
如果 brand_or_ip_risk 高,应该做 prompt 模板和提示词改写。
10. 本站接入时可以沉淀的基准测试
平台接入 gpt-image-2 时,不建议只看一次成功生成。更实用的是把本站实测沉淀成一张基准测试表:
| 基准项 | 测试方法 | 期望结果 | 用途 |
|---|---|---|---|
| 模型可见性 | 查询模型列表或直接发最小请求 | 模型可用 | 排除 key、权限、模型名问题 |
| 正常图片编辑 | size=auto,上传 demo 商品图 |
HTTP 200,返回图片 URL | 验证基础链路 |
| 错误尺寸 | size=123x456 |
HTTP 400,参数错误 | 验证 4xx 分类和前端白名单 |
| 缺少模型 | 不传 model |
HTTP 400,模型名必填 | 验证 SDK、队列、网关没有丢字段 |
| 大图上传 | 上传接近业务上限的图片 | 可控成功或明确失败 | 验证超时、文件大小、转存策略 |
| 上游异常演练 | 人为模拟 5xx 或 timeout | 有限重试、错误归因正确 | 验证重试和告警 |
这张表可以直接变成 CI、定时任务或运维巡检脚本。只要基准测试是稳定的,业务失败就可以继续向素材质量、提示词风险、后处理和渠道健康拆分,而不是笼统地归因到“模型不稳定”。
本站测试入口:
https://crazyrouter.com/register?utm_source=csdn&utm_medium=article&utm_campaign=gpt_image2_ecommerce&utm_content=observability_20260705__benchmark
11. 一个推荐的服务端流程
1. 接收任务
2. 校验 model / endpoint / size / image
3. 检查素材可访问性和大小
4. 对 prompt 做风险打标和必要改写
5. 发起 images/edits 请求
6. 对 5xx/timeout 做有限重试
7. 下载或转存输出图
8. 后处理平台尺寸和卖点文案
9. 写入结构化日志
10. 对错误做聚合分析
总结
gpt-image-2 电商生图失败,不应该只靠人工看提示词。
这次最小实测说明:
- 正确的
/v1/images/edits请求可以返回 HTTP 200 和可下载 PNG。 - 错误
size会触发 400invalid_request。 - 缺少
model会触发 400Model name is required。
这些都是可以工程化治理的确定性问题。
真正成熟的电商 AI 生图平台,应该把失败拆成:
请求参数问题
图片输入问题
提示词风险问题
endpoint 使用问题
上游渠道问题
后处理问题
如果你的团队正在做电商 AI 生图平台,可以先用本站跑一套 gpt-image-2 基准测试,再把成功率、错误分类、重试和告警接入自己的观测系统:
https://crazyrouter.com/register?utm_source=csdn&utm_medium=article&utm_campaign=gpt_image2_ecommerce&utm_content=observability_20260705__final
然后分别做白名单、预检、打标、错误分类、重试和监控。这样才能把“生图失败”从玄学问题变成可定位、可修复、可规模化的问题。
更多推荐



所有评论(0)