如何把 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

这组最小测试的价值不在于生成了什么图,而在于划清了三条边界:

  1. 图片编辑链路本身可用。
  2. size 错误是确定性 400,不应该重试。
  3. 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 会触发 400 invalid_request
  • 缺少 model 会触发 400 Model 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

然后分别做白名单、预检、打标、错误分类、重试和监控。这样才能把“生图失败”从玄学问题变成可定位、可修复、可规模化的问题。

更多推荐