做业务系统时经常遇到一个尴尬:图片生成需求今天用 Gemini、明天想试 FLUX、后天又要接即梦,每家 SDK 和字段都不一样。其实四家图片生成模型的接入形态高度一致——都暴露成 OpenAI 兼容的 images 接口。本文给出四家图片 API 的能力对照、一份可运行的统一调用封装,并说明如何用统一端点把它们收敛到一处管理。
一、为什么图片生成 API 值得统一接入
文本模型是「一个 prompt 进去、一段文本出来」,图片模型却有三个让工程复杂度陡增的特点:
- 模型多且迭代快:同一需求,Gemini、即梦、FLUX、通义万相各有擅长,今天用 A、明天可能换 B。
- 参数命名不统一:尺寸有人叫 size、有人叫 resolution;数量有人叫 n、有人叫 count。
- 成本和画风差异大:同一句 prompt,不同模型单价和出片质量可能差出好几倍,需要能横向比、能降级。
也正因为各家接口形态一致(都是提交 prompt、拿图片 URL),把多个图片模型收敛到一个兼容端点的收益比文本模型更明显——你只需要维护一套调用和错误处理逻辑。
二、四家主流图片模型能力对照
Gemini Nano Banana(gemini-2.5-flash-image)
- 文生图:支持
- 图生图 / 局部编辑:支持,理解力强
- 中文与多模态理解:强
- 适合:需要语义理解、图文混合、带编辑需求的场景
即梦 Seedance(jimeng-seedance-image)
- 文生图:支持
- 国风、电商素材:表现好
- 中文 prompt:友好
- 适合:国内内容批量生产、电商主图
FLUX(flux-1.1-pro)
- 文生图:支持
- 质感与写实:强
- 西文排版、细节:表现突出
- 适合:写实人像、产品质感图、西文海报
通义万相(wanx2.1)
- 文生图:支持
- 阿里生态集成:好
- 中文场景:友好
- 适合:已有阿里云链路的团队
各家字段命名和可选值迭代很快,以上是接入形态层面的对照,具体模型名与参数请以官方最新文档为准。
三、OpenAI 兼容调用范式
无论哪家,核心请求都长这样:
- 方法:POST /v1/images/generations
- 关键字段:model(模型名)、prompt(提示词)、size(尺寸)、n(数量)
- 返回:图片 URL 或 base64 列表
这意味着你不需要为每个厂商写一套客户端,差异收敛到「模型名加透传参数」即可。
四、统一调用封装(Python)
下面这段代码把图片生成封装成一个函数,用 OpenAI 兼容端点做统一入口,切换模型只改 model 参数。
import os
import requests
BASE_URL = os.getenv("IMAGE_BASE_URL", "https://easy88ai.com/v1")
API_KEY = os.getenv("IMAGE_API_KEY")
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
def generate_image(prompt: str,
model: str = "gemini-2.5-flash-image",
size: str = "1024x1024",
n: int = 1) -> list:
"""调用图片生成接口,返回图片 URL 列表"""
payload = {
"model": model,
"prompt": prompt,
"size": size,
"n": n,
}
r = requests.post(f"{BASE_URL}/images/generations",
headers=HEADERS, json=payload, timeout=60)
r.raise_for_status()
return [item["url"] for item in r.json()["data"]]
if __name__ == "__main__":
urls = generate_image(
prompt="雨后青石板路,暖黄路灯光晕,电影感,柔焦",
model="gemini-2.5-flash-image", # 换成 flux-1.1-pro / jimeng-seedance / wanx2.1 即可切换
size="1024x1024",
)
for u in urls:
print("image_url:", u)
几个细节值得注意:
- timeout=60 是合理的图片生成等待上限;个别复杂请求更久,可按需放宽,但不要不设超时。
- 返回结构不同服务商略有差异,上面取 data[].url 是最常见的形态;若返回 base64,按 b64_json 字段处理即可。
- model 参数就是切换模型的唯一开关,主流程不用为每家写分支。
五、踩坑清单
1. 尺寸组合不被支持
不是所有「宽乘以高」都合法。有的模型只支持 1024x1024、1024x1792、1792x1024 三档,传 800x600 会直接 400。接入前把常用尺寸跑一遍摸底。
2. 内容审核拦截
图片模型大多带安全策略,某些 prompt(暴力、敏感人物、特定品牌标识)会被拦截并返回 400 或特定错误码。生产环境建议把这类错误单独归类,返回友好的「内容未通过」提示,而不是直接抛异常。
3. 中文 prompt 的编码
长中文描述先做清洗和必要截断,避免提交时直接 400。部分服务商对 prompt 长度有上限,超长会被静默截断或拒绝。
4. 超时与重试
图片生成耗时从几秒到几十秒不等。超时要单独设,不要和文本请求共用一个值。网络类超时(连接重置、5xx)可重试;参数类(400/422)不要重试,重试只会重复失败。
5. 一家排队或失败时降级
统一端点最大的价值是降级:某家排队过长或临时不可用时,换个 model 参数就能切到备用模型,业务代码零改动。建议提前配好主备模型列表。
六、统一端点带来的实际收益
把多家图片模型收敛到一个兼容地址后,业务侧的变化是:
- 一套调用逻辑:不用为每个厂商写一套客户端。
- 一个 Key 管多家:密钥轮换、额度监控集中在一处。
- 失败可降级:某家异常时切到备用模型,业务无感。
- 成本可横向对比:同样的 prompt,不同模型的实际消耗能放在一起看,方便选型。
对刚起步的团队,建议先用兼容端点把流程跑通,等业务量上来、对某个模型形成强依赖后,再考虑是否直连官方。
七、小结
图片生成 API 的接入难点不在「怎么发请求」,而在模型选择、参数兼容和失败降级这三件事上。先把统一调用和错误分类的骨架搭稳,后面加新模型就只是加一个模型名、补几条透传参数而已。
