尧图精选

从DALL·E到gpt-image-1:图像生成API迁移与蒙版实战

🕒 发布时间:2026/10/1 6:38:47 📁 来源:尧图网络
gpt-image-1 这个接口出来之后我第一时间就在项目里接进去试了一遍前后折腾了大概两周中间踩了不少坑尤其是蒙版和 Alpha 通道这两块文档写得不算复杂但实际操作起来完全不是一回事。这篇文章把我从请求格式、蒙版参数、透明通道处理到生产环境落地过程中遇到的问题和最终方案完整写出来希望能帮到准备接入或者已经在接入这个 API 的团队。1. gpt-image-1 到底改了什么从 DALL·E 到多轮编辑的 API 演进先说结论gpt-image-1 不是 DALL·E 3 的小修小补它在 API 层面做了比较大的重构。如果你之前用的是 DALL·E 系列直接改个模型名就切过来是不行的请求格式、参数语义、响应处理方式都不一样。团队上个版本还在用 DALL·E 3 做商品图生成这次升级到 gpt-image-1迁移过程比预想中复杂。1.1 为什么团队从 DALL·E 迁移过来核心驱动是两个。一是 gpt-image-1 的原生多轮编辑能力同一张图可以基于自然语言持续修改局部内容比如把商品图中的瓶身换成红色然后又说把背景改成海边连续指令在上下文里执行DALL·E 3 做不到这点。二是它支持蒙版输入可以精确控制重绘区域这对电商场景太重要了我们经常需要只改商品细节而不动背景。另外 gpt-image-1 生成图的整体质感有提升尤其是光影和材质细节用户侧反馈明显。这里多说一句不要拿 OpenAI 的官方示例图来评估效果它的示例都选了效果最好的图我们在实际业务里跑成功率大概在 85% 左右剩下的 15% 需要判断是重试还是降级处理。1.2 请求格式发生了哪些根本性变化DALL·E 3 时代用的是images/generations端点参数是prompt、n、size、response_format这几个。gpt-image-1 需要改用images:generate端点这个冒号在 REST 风格里不太常见不少同事第一次写都会写成斜杠然后 404。还有一个关键变化是gpt-image-1 不支持多个返回值n参数被移除了一次调用只生成一张图。想要多张候选图就得多发起几次请求这对需要批量生成后挑选的业务流程是个不小的调整。开发排期时要把这部分算进去并发量会因此上升很多。请求体的另一个变化是新增了mask参数用于传入需要保留的区域信息。这个参数的格式和语义有一些隐藏规则后面我会单独用一整节来讲这是整个接口里最容易翻车的部分。1.3 响应与成本结构的变化响应结构上gpt-image-1 支持b64_json和url两种返回格式默认是url。但这里有个文档里不会强调的差异如果你传了quality: low返回的图会降到 1024x1024 以下比如我们测试时得到过 768x768 的图并且无论你请求多大的尺寸都不会变。成本结构也变了gpt-image-1 按生成图的尺寸和质量三档计费低质量、中等质量、高质量价格差别不小。我们统计过低频次的内部测试用 low 档没问题但对外提供服务的核心业务必须用 medium 以上否则图片质量撑不住品牌方的要求。关于成本估算的具体计算方式我会在第 5 节里详细展开。我的建议是正式切换前先用 100 张左右的实际业务图跑一遍分别统计 low 和 medium 的生成效果、失败率、平均耗时再做上线决定。我们从测试数据里发现 low 档的失败率比 medium 高出一个百分点别小看这个差距放大到每天几万次调用对总体成本的影响非常可观。2. 请求结构拆解认证、参数与响应体最容易翻车的地方这一节把请求的每个环节拆开来过一次。之所以单独拿出来写是因为我们小组在接入初期几乎每天都有同事因为参数细节踩坑错误码五花八门排查起来相当费时间。2.1 认证方式与 401 的坑认证头是常见的Authorization: Bearer sk-xxx格式。但实际开发中401 是出现频率最高的错误之一我们被卡了两天才发现是环境变量配置的问题。当时的情况是这样的本地开发环境里.env文件中的OPENAI_API_KEY被一个旧的、已经失效的 key 覆盖了而 CI/CD 流水线里密钥是通过密钥管理服务注入的本地无法读取。两边配置不一致导致本地跑任何请求都是 401。我们做的第一件事是写了个简单的连通性测试脚本先验证 key 是否有效再查其他参数import os import requests key os.environ.get(OPENAI_API_KEY) url https://api.openai.com/v1/images/generate headers { Authorization: fBearer {key}, Content-Type: application/json, } body { prompt: A simple red apple on white background, model: gpt-image-1, quality: low, response_format: b64_json, } resp requests.post(url, headersheaders, jsonbody, timeout30) if resp.status_code 401: print(API key invalid:, key[:6], ****) else: print(resp.status_code, resp.text[:500])这个脚本后来被保留成了每次环境配置检查的第一步。生产环境务必用密钥管理服务不要把 key 明文写在代码仓库里。另外OpenAI 服务端只会在响应里返回 key 的前缀比如sk-svcac****不会告诉你错在哪个字符排查起来全靠自己缩小区间。2.2 核心参数逐个过一遍请求体是 JSON 格式常用参数有这么几个model必须是gpt-image-1这个不用多说。但从 DALL·E 3 迁移时我们遇到过一个诡异的 404排查半天发现是模型名写成了gpt-image-1-2025-xx官方文档里提到旧版本支持日期后缀但当时的最新版本不接受这种写法建议直接用不带日期的模型名避免踩这个坑。prompt是自然语言指令。gpt-image-1 对 prompt 的语义理解比 DALL·E 3 强得多但描述复杂场景时最好写成结构化的文本。我们用过两种写法对比简单版A blue bottle on a wooden table结构化版Product photo: blue glass bottle, centered on a rustic wooden table, soft daylight from the left, shallow depth of field, no text, no watermark实测结构化版生成结果的满意率高出不少。这背后的逻辑是模型在长 prompt 里的注意力贡献更分散结构化的描述有助于它按顺序解析各个属性。size支持 3 个档位1024x1024、1536x1024、1024x1536。注意没有 2048 档位如果你的业务需要更大分辨率的图只能生成后再用传统方式放大。官方 promise square 之外可以传auto让模型按场景自动决定横竖版。竖版商品场景用自动模式效果出乎意料地好值得试一下。quality支持三档low、medium、high。low是快速草图用于测试或预览medium是我们生产环境的主力质量和速度的平衡点high是最精细档单张耗时明显拉长我们只在特殊品牌大图场景才用。实际测试中low 档偶尔会出现水印残留或文字乱码生产环境的对外图片一律至少 medium。response_format支持url和b64_json。url返回一个临时链接有效期约 1 小时b64_json返回图片的 Base64 字符串。链接方式方便查看但生产环境建议直接用b64_json省的再下载一次。后面我会详细解释为什么。输出图片默认是 PNG 格式。官方还提供一个transparency参数用在一些需要透明背景的场景这个参数和 Alpha 通道的坑绑定得很深我留到第 4 节一次性讲清楚。2.3 响应解析b64_json 还是 url各自适合什么场景先说结论生产环境用b64_json本地调试用url。理由有三点。第一url下的临时链接是异步场景里的一个变量如果链接过期下游拿到的就是死链。第二直接用b64_json可以把图片持久化并分发到 CDN响应体里直接给 Base64 字符串后续处理链路完全可控。第三有些网关或代理会拦截未经检查的外部 URL导致内网环境拿到链接也无法下载。处理 b64_json 的代码很简单从响应体里取出b64_json字段再base64.b64decode写入文件即可。写入前一定要做完整性检查我们遇到过响应体被截断的情况Base64 的长度不是 4 的倍数解码直接抛了 binascii.Error。建议代码如下import base64 import requests import os def generate_image(prompt, size1024x1024, qualitymedium): headers { Authorization: fBearer {os.environ[OPENAI_API_KEY]}, Content-Type: application/json, } body { model: gpt-image-1, prompt: prompt, size: size, quality: quality, response_format: b64_json, } resp requests.post( https://api.openai.com/v1/images/generate, headersheaders, jsonbody, timeout60, ) resp.raise_for_status() data resp.json() # 校验 base64 是否有有效填充 b64 data[data][0][b64_json] if len(b64) % 4 ! 0: b64 * (4 - len(b64) % 4) image_bytes base64.b64decode(b64) return image_bytes if __name__ __main__: img generate_image(A cat sitting on a red chair) with open(output.png, wb) as f: f.write(img)resp.raise_for_status()会抛 HTTPError但生产环境的错误种类远不止 4xx我建议后续在异常分支里做更细的错误分类和重试逻辑这部分内容在第 5 节展开。注意同一个 b64_json 对应的图片不同尺寸会得到完全不同的字节数尤其是透明通道模式。我们对比过一次同一 prompt 在 1024x1024 和 1536x1024 两种尺寸下输出 PNG 的大小相差约 30%。设计存储时预留点冗余空间别按固定大小预算。3. mask 最重要局部重绘边界、尺寸对齐与抠图替代方案蒙版是这个接口最灵活也最坑的部分。我们最初以为只要传一个和图片等大的掩码图就行结果发现模型对 mask 的解读方式比 Bálint? 预想复杂得多对输入图的尺寸也有严苛要求没对齐就会导致输出结果出现奇怪的错位或边缘残留。3.1 mask 的格式要求和内存陷阱mask 参数需要传一张与原始图完全等宽等高的图格式要求 PNG 或 JPEG。如果是 PNG带 Alpha 通道的图会被当作标准 RGBA 处理。OpenAI 对 mask 的解释是白色区域将被编辑黑色区域将被保留不变。也就是说你要在 prompt 里改变的东西对应在 mask 图上涂白你绝对不想被模型碰到的区域涂黑。这个规则很直接但工程实现上容易出错原始图是用户上传的任意尺寸而 API 限定尺寸只有那几个1024x1024、1536x1024、1024x1536。如果直接把用户裁剪到这些尺寸再生成等大的 mask往往会把主体拉伸变形。不能先缩放原图、再用生成后的尺寸去生成 mask 再缩放回来这样会导致 mask 和原图不对齐。正确做法是先把原图放在一个透明或白色画布上用 letterbox 方式扩边保持主体不变形同时生成 mask 时用相同的位置和尺寸。例如原图是 800x600目标是 1024x1024。我们做的第一步是新建 1024x1024 白色背景图然后把原图以 800x600 原尺寸粘贴到画布中心左上角为 (112, 212) 这个位置再在同样的画布上画 mask需要编辑的区域在对应坐标涂白。这样提交给 API 的图是 1024x1024mask 也是 1024x1024模型看到的构图和用户原图一致。这个过程里最隐蔽的一个坑是白色背景会把不想要的区域定格为“白色语义”模型很可能把白边也当成场景的一部分输出图片里出现明显的白色边框。为此我们后来改成了透明背景画布也就是在原图下方铺一张 1024x1024 的 RGBA 透明底图再贴原图。这样在输入给模型后透明底在模型内部由 API 先做白底融合但我们实测的输出结果不会出现硬白边因为模型处理透明底的方式和直接给白色底图不同。3.2 重绘时为什么会把不要的区域也改了这是我们在电商换色场景里遇到的高频问题只想把衣服从红色换成蓝色结果模型把背景里的窗帘也改成蓝了。排查下来两个原因对半开。第一mask 白区过于靠近黑区边界边缘只要有一两个像素的误差模型在语义切分时会把相邻的语义段也拉进来。它不是关注每个像素而是根据整体语义推理补全局。解法是刻意放大 mask 边缘的羽化值让白色区域比目标对象略小一圈也就是向内收缩把边缘留给模型自己推理反而更稳。第二prompt 里写得太泛。例如你只说“把衣服颜色改成蓝色”模型会“发挥”出改变其他蓝色物品的冲动。正确姿势反而要写得特别保守明确指示“仅修改 mask 白区内容其他区域保持完全不变”。我们后来把 prompt 改为如下模板效果稳定了很多Change only the color of the subject in the mask area to {color}. Do NOT change the background, lighting, composition, or any other objects. Keep everything outside the mask identical.注意即使你用了 mask模型也可能超出 mask 区域来做光影调整它会假设只有 mask 区域是编辑焦点但为了光影一致会微调周围环境。如果完全不允许任何周边变化需要额外加一句话“Maintain the same lighting and shadows for the unchanged areas.”3.3 用 mask 代替传统抠图的场景边界我们当时还评估过能不能直接让模型输出一张带透明背景的图代替传统抠图这是个诱惑力极大的方向省掉一大笔人工修图成本。实测结果总体可行但有几个前提要注意前景必须边缘清晰毛发、半透明的物体比如纱巾、玻璃杯效果会明显退化。复杂的多主体场景会存在部分边缘抠不干净的问题模型会把主体和背景黏连。模型输出的透明背景图如果带 Alpha 通道生成过程本身就要消耗更多时间。所以我们的评估结论是mask 编辑模式适合电商换色、局部修改、元素替换若要做高质量抠图还是走专用抠图模型稳妥最后再用 gpt-image-1 做背景重绘合成。这个组合我们在生产环境跑了一个月成功率和整体质量都比单用 gpt-image-1 高很多。实测一个细节mask 用纯黑 纯白 中度灰色来表达“部分保留”是完全无效的。OpenAI 的 mask 解读是二值化的它只认纯白为编辑区其他非白区域都视为保留。所以不要在 mask 上做太复杂的灰度渐变灰度值会被忽略或产生不可预测的边缘处理。4. Alpha 通道的真相透明背景不是简单加个参数这一节讲的透明背景应该是 gpt-image-1 最被低估的切入点。你需要先有一个心理预期gpt-image-1 的输出是否带透明背景、怎么带透明背景和 prompt 语言几乎没有关系而完全取决于请求参数设置。4.1 transparency 参数与三步生成透明图流程如果你直接传一个“请生成透明背景的图”的 prompt模型大概率会给你一张纯黑背景的图并解释成“透明背景已经生成”。这是因为模型理解的“透明”是语义概念而不是实际像素里的 Alpha 通道。正确做法是请求时设置transparency: true然后配合output_format指定为 PNG。官方的解释是仅当透明度开关打开时模型才可能输出透明背景的图片。没有这个参数用任何 prompt 技巧都无法获得真正透明的 PNG。我们整理出的生产流程分三步生成透明图设置transparency: trueprompt 写明主体完整、背景透明输出b64_json。检查 Alpha 通道读取图片后用代码检查 Alpha 通道是否真的为 0防止模型输出一个不带 Alpha 的 JPEG或 Alpha 通道全为 255。合成场景如果需要放在真实场景里展示再把透明 PNG 和背景图用 PIL 合成。检查代码大概是这样的from PIL import Image import base64 import io # image_bytes 是上面通过 b64_json 获得的字节 img Image.open(io.BytesIO(image_bytes)).convert(RGBA) alpha img.getchannel(A) # 统计完全透明的像素比例 alpha_data alpha.getdata() transparent_count sum(1 for x in alpha_data if x 0) total len(alpha_data) print(fTransparent pixel ratio: {transparent_count/total*100:.2f}%) # 检查是否有半透明像素边缘抗锯齿 semi_transparent sum(1 for x in alpha_data if 0 x 255) print(fSemi-transparent pixel ratio: {semi_transparent/total*100:.2f}%)如果透明像素占比低于 5%说明模型根本没有正确生成透明背景这时候应该判定调用失败并重试或更换方式。另一个注意点transparency: true时输出格式如果不是 PNG某些情况下 API 可能会把透明区域全部变成纯黑。这个坑我们遇到过一次后来固化了参数校验透明模式必须用output_format: png。4.2 透明区域变黑/变白的经典故障透明区域变黑或变白是透明通道处理里最常见的两类问题。变黑的情况上面已经说过是未设置transparency: true模型在内部渲染时把无信息区域用黑色填充。如果你拿到了黑色的图别抱着“把黑色当透明键去除”的侥幸心理黑色区域里可能有极其细微的暗部细节阴影、反光一旦当作透明处理会把主体削掉一圈。变白的情况则发生在后期处理阶段。比如用 PIL 把透明 PNG 转换成 RGB 时默认会把 Alpha 通道丢掉不带 Alpha 的 JPEG 会用白色填充透明区域。如果你的下游是 JPEG改成 PNG 格式是必须的或者在合成时用黑色作为背景色再映射成透明。调试技巧拿一张图先做一次“保存为透明 PNG → 重新打开 → 查看 RGB 和 Alpha 分通道”的测试确认链路里没有某个环节偷偷把通道数据弄丢。我们团队踩过一次某个内部图片处理库在“无损”转存时说支持透明实际上把 Alpha 通道降成了 1 位二进制0 和 255半透明边缘全部变成硬边或黑边真用起来结果全糊了。4.3 输出格式与压缩的取舍gpt-image-1 支持png、jpeg、webp三种输出格式。PNG 无压缩、支持透明适合保真度要求高的场景JPEG 体积小但不支持透明适合不需要透明通道的场景WebP 支持透明且体积相对小但兼容性要看下游用户的使用环境。我们生产环境的经验是需要透明通道时必须用 PNG不需要透明通道时JPEG 质量设为 85 以上比较平衡。WebP 我们评估后没有用因为电商后台的低版本浏览器对 WebP 的兼容性不够稳定还有一堆图片处理库对 WebP 的 CMYK 色域支持有问题。如果你把透明 PNG 直接转成 JPEG 作为缩略图会看到透明区域变成了黑色。这是由颜色空间转换规则决定的。正确做法是先合成到业务背景图上再转 JPEG。缩略图链路同理。注意:透明 PNG 的加载耗时要明显高于同尺寸 JPEGCDN 和图片存储的带宽费用也会高不少。建议小图直接生成 JPEG 版本主图保留透明 PNG两方面同时满足性能和成本。最后透明 PNG 在移动端的预览里几乎总是呈现为黑色背景这在电商 App 的商品详情页是个巨大的事故现场。你永远应该先给用户一个带背景的预览图透明原图只作为“可下载素材”存在而不是直接在主界面展示。5. 生产落地错误重试、消息队列、缓存与成本控制前面讲的是接口本身怎么调通现在讲的是真正上线后怎么稳住。这部分我们是从每天几十次调用扩展到几万次后沉淀出来的经验。5.1 生产环境必须处理的错误码清单做生产环境错误码处理是第一优先级。我把我们遇到的、以及文档里提示的错误码分成三类表格如下状态码含义处理策略401API key 无效或过期检查环境变量告警并暂停该服务400prompt 过长、参数非法、图像格式错误检查请求体不要把原始用户输入直接透传429触达速率限制或配额耗尽指数退避重试同时降级为备用模型404端点地址写错或模型名错误检查 URL 和模型名的拼写500服务端错误重试连续失败则熔断并告警503服务暂时不可用延时重试间隔可以放宽到 20 秒重点说 429。OpenAI 的限速方式是动态的而且会按项目维度计算。我们测试时 10 并发都会触发 429但稳定运行一段时间后20 并发也几乎没有触发过说明配额与账号历史消费和并发曲线有关。如果你收到 429第一反应不是怀疑账号设置错而是把并发降下去冷却 1 分钟再逐步拉上来。我们固定的重试策略如下import time import requests def generate_with_retry(body, headers, max_retries3): for attempt in range(max_retries): try: resp requests.post( https://api.openai.com/v1/images/generate, headersheaders, jsonbody, timeout60, ) if resp.status_code 429: wait float(resp.headers.get(retry-after, 2 ** attempt)) time.sleep(wait) continue resp.raise_for_status() return resp.json() except requests.exceptions.Timeout: time.sleep(2 ** attempt) if attempt max_retries - 1: raise except requests.exceptions.ConnectionError: time.sleep(2 ** attempt) if attempt max_retries - 1: raise raise RuntimeError(max retries exceeded)重试要考虑一个核心问题幂等性。OpenAI 的图片生成接口不是幂等的相同 prompt 重试会生成不同的图所以不能单纯作为“成功就返回、失败就重发”。如果业务需要固定效果必须把第一次成功的结果缓存下来后续请求命中缓存直接返回不再调模型。5.2 同步调用改异步的改造方案图片生成不是瞬时动作实际耗时通常在 20 到 60 秒之间。如果前端同步等待用户体验极差而且网关超时也会砍掉慢请求。我们的改造思路是三步请求进来后先生成一个任务 ID存入 Redis状态置为 pending。后台 worker 轮询 Redis 拿任务调 gpt-image-1 接口生成完成后把结果写入对象存储和 CDN更新任务状态为 done。前端轮询任务状态接口拿到 done 后展示图片。这套方案的要点是任务状态与图片内容分开存储互相不阻塞。图片内容上传 CDN 后任务状态里只需要存一个 CDN URL。状态查询接口负载极低可以扛住高并发轮询。消息队列是另一个选择。用 RabbitMQ 或 Kafka 把任务和结果解耦worker 可以横向扩展。但我们目前业务体量下 Redis worker 足够没上 MQ省掉一套中间件的运维压力。5.3 成本估算与缓存策略按 OpenAI 公布的计价规则gpt-image-1 以生成的图片质量档位和数量计费比如low 档约 $0.01/张1024x1024medium 档约 $0.08/张1024x1024high 档约 $0.24/张1024x1024不同尺寸价格一致但 1536x1024 和 1024x1536 是横向竖向的不同切分不额外加价但模型实际计算量更大消耗的算力更强是否计费不同需要看始皇官方的价格文档为准上线前务必确认账单。我们一个月的成本模型如下以 5 万次调用、30% medium、70% low 估算50000 次 * (0.3 * $0.08 0.7 * $0.01) 50000 * $0.031 $1550但注意这还没算网络传输、对象存储、CDN 流量的费用。图片平均 1MB单次调用存储和流量成本约 $0.002总共再增加 $100 左右。这些钱最终会转嫁到业务毛利率上前期就要算清楚。缓存策略上我们按业务维度做了一层 Redis 缓存同一个商品、同一个操作类型换色、改背景放一个 key有效期 7 到 30 天。实测命中率约 55%直接把整体 API 调用量砍了一半成本降低明显。建议给缓存加上trace_id方便后续排查具体生成记录。我们出现过一次缓存 key 冲突导致 A 商品的图返回给了 B 商品排查时就是靠 trace_id 定位到缓存层的 bug。5.4 并发控制和限频的取舍并发控制的目标不是“越高越好”而是“在不触发 429 的前提下尽量高”。官方文档没有给精确的速率限制但实测下来单个账号每分钟 500 张左右比较稳妥取决于账号等级。我们设计了一个简单的令牌桶组件import time import threading class RateLimiter: def __init__(self, rate_per_minute): self.rate rate_per_minute self.lock threading.Lock() self.last_reset time.time() self.count 0 def wait_if_needed(self): with self.lock: now time.time() if now - self.last_reset 60: self.count 0 self.last_reset now if self.count self.rate: wait_time 60 - (now - self.last_reset) time.sleep(wait_time 0.1) self.count 1用这个限速器包一层再配合第 5.1 节的重试机制连续两周了我们没有再触发 429。记住429 出现时硬扛只会让情况更糟慢下反而更稳。6. 我在实际项目中踩过的一组坑与最终稳定方案最后一部分聊点不写在文档里的经验。我们这段时间真正踩到并被按在地上摩擦的问题以及对应的稳定方案一并整理出来。6.1 数据校验和请求前的自检在调 API 之前先在发送端做数据自检可以拦截掉大部分无意义的错误请求。我们写了一个请求前校验函数检查 prompt 是否为空、长度是否超过 1000 字符、mask 是否存在且尺寸正确、输出格式是否为合法枚举、API key 是否配置。这只是基础真正有效的一步是如果一张图片已经缓存过直接返回缓存根本不发 API 请求。还有一次事故某次发版不小心把整个请求体重置为默认配置导致线上所有请求都变成了 low 质量。数据自检里加入quality的比对规则后这类问题再没发生过。6.2 灰度发布与 A/B 比较新模型上线灰度是必要的。我们是按用户 ID 哈希取模 10% 流量切到 gpt-image-1 的剩下的继续走 DALL·E 3。对两边的输出做以下几个指标对比无内容违规率、用户主动删除/举报率、平均生成耗时、重试次数。跑了一周后我们发现 gpt-image-1 的生成耗时比 DALL·E 3 高了约 18%但用户留下的图片数量也提升了 12%净收益是正的才逐步扩大到全量。灰度期间最重要的是把两套代码路径分离干净不要在一个函数里写死模型名。我们用环境变量控制模型选择发一条配置就能切换不需要发版。6.3 混合调用策略小图用别的模型敏感场景本地兜底不是所有图都要用到 gpt-image-1那样成本会爆炸。我们的分类逻辑是这样的缩略图、小尺寸图标、纯文字图直接用传统图片处理管线生成或者用本地模型只有需要智能编辑、局部重绘、抠图合成的大图才走 gpt-image-1。这样一年下来API 调用量比全部走大模型少了 65% 左右。另外遇到 gpt-image-1 连续失败的情况我们会退回本地预留的兜底模板图保证用户端有一个可用结果而不是直接抛错。兜底方案虽然效果平庸但稳定性大幅提高。我最初接入 gpt-image-1 的时候一直以为“能调通”就是最大的门槛后来才发现真正的门槛在“稳定地、便宜地、不出错地调通”。接口能力再强没有配套的工程化防护线上就是事故现场。如果你也正在做类似的项目建议按上面这 6 节的顺序走一遍先把 mask 和 Alpha 通道的坑避开再考虑上量。祝你顺利。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →