Gemini Nano Banana / FLUX 图片生成 API 接入实战

做业务系统时经常遇到一个尴尬:图片生成需求今天用 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)

几个细节值得注意:

  1. timeout=60 是合理的图片生成等待上限;个别复杂请求更久,可按需放宽,但不要不设超时。
  2. 返回结构不同服务商略有差异,上面取 data[].url 是最常见的形态;若返回 base64,按 b64_json 字段处理即可。
  3. model 参数就是切换模型的唯一开关,主流程不用为每家写分支。

五、踩坑清单

1. 尺寸组合不被支持

不是所有「宽乘以高」都合法。有的模型只支持 1024x1024、1024x1792、1792x1024 三档,传 800x600 会直接 400。接入前把常用尺寸跑一遍摸底。

2. 内容审核拦截

图片模型大多带安全策略,某些 prompt(暴力、敏感人物、特定品牌标识)会被拦截并返回 400 或特定错误码。生产环境建议把这类错误单独归类,返回友好的「内容未通过」提示,而不是直接抛异常。

3. 中文 prompt 的编码

长中文描述先做清洗和必要截断,避免提交时直接 400。部分服务商对 prompt 长度有上限,超长会被静默截断或拒绝。

4. 超时与重试

图片生成耗时从几秒到几十秒不等。超时要单独设,不要和文本请求共用一个值。网络类超时(连接重置、5xx)可重试;参数类(400/422)不要重试,重试只会重复失败。

5. 一家排队或失败时降级

统一端点最大的价值是降级:某家排队过长或临时不可用时,换个 model 参数就能切到备用模型,业务代码零改动。建议提前配好主备模型列表。

六、统一端点带来的实际收益

把多家图片模型收敛到一个兼容地址后,业务侧的变化是:

  • 一套调用逻辑:不用为每个厂商写一套客户端。
  • 一个 Key 管多家:密钥轮换、额度监控集中在一处。
  • 失败可降级:某家异常时切到备用模型,业务无感。
  • 成本可横向对比:同样的 prompt,不同模型的实际消耗能放在一起看,方便选型。

对刚起步的团队,建议先用兼容端点把流程跑通,等业务量上来、对某个模型形成强依赖后,再考虑是否直连官方。

七、小结

图片生成 API 的接入难点不在「怎么发请求」,而在模型选择、参数兼容和失败降级这三件事上。先把统一调用和错误分类的骨架搭稳,后面加新模型就只是加一个模型名、补几条透传参数而已。

0
0
0
0
评论
未登录
暂无评论