Skip to content

图片生成与编辑

primerouter 提供与 OpenAI 兼容的两个图片端点:

端点用途请求格式
POST /v1/images/generations文生图JSON
POST /v1/images/edits图生图、多张参考图multipart/form-data

可用的图片模型与价格见 定价页 的「图片模型」分区。目前有 gpt-image-2grok-imagine-image 两类,参数写法相同,但 size 是否生效、返回的是什么两者不一样,见下文各自的小节。

文生图

bash
curl https://primerouter.ai/v1/images/generations \
  -H "Authorization: Bearer $PRIMEROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2",
    "prompt": "一只橘猫坐在窗台上,柔和的晨光",
    "output_format": "png",
    "response_format": "b64_json"
  }'

图片在 data[].b64_json 里,是 base64 字符串。

response_format=url 拿到的是 data: 内联 URL,不是可以直接下载的 http 链接

图生图与多张参考图

图生图走 /v1/images/edits,必须用 表单(multipart/form-data,不能发 JSON。

多张参考图就重复写 image[],想传几张写几个:

bash
curl https://primerouter.ai/v1/images/edits \
  -H "Authorization: Bearer $PRIMEROUTER_API_KEY" \
  -F model=gpt-image-2 \
  -F "image[]=@版式参考.png" \
  -F "image[]=@产品照片.png" \
  -F prompt="把第二张的产品放进第一张的版式里,注意保留版式中的所有宣传文字" \
  -F output_format=png

用 OpenAI SDK 也一样:

python
from openai import OpenAI

client = OpenAI(base_url="https://primerouter.ai/v1", api_key="sk-...")
result = client.images.edit(
    model="gpt-image-2",
    image=[open("版式参考.png", "rb"), open("产品照片.png", "rb")],
    prompt="把第二张的产品放进第一张的版式里,注意保留版式中的所有宣传文字",
)

几点说明:

  • 字段名 imageimage[]image[0]/image[1] 都认,顺序按你给的顺序转发
  • 参考图张数网关侧不限,上限由上游决定;单个请求体默认最大 32MB
  • mask 可选,字段名 mask,只取第一个文件
  • 表单里的其他字段(backgroundoutput_formatoutput_compressionmoderation 等)会原样转发。但走 /v1/images/generations 的 JSON 时,只有标准字段会被转发

提示词要把要求写全

图生图是按提示词重新绘制,不是在原图上做局部编辑。参考图里的元素,没写进提示词的就不保证保留

比如想保留第一张图里的标题、卖点文案、角标,就要明确写出来:

把第二张的产品放进第一张的版式里,注意保留版式中的所有宣传文字

少了「注意保留……文字」这半句,出来的图往往只剩主标题,其余版式元素会丢。这不是参考图没被读取——两张图都送到了模型,只是没被要求保留。

gpt-image-2 的尺寸与品质限制

请先读这一节

gpt-image-2 目前无法控制输出分辨率。这是上游图像接口的限制,不是参数写法问题。

具体表现:

  • size 不决定分辨率。 无论传 512x5121024x1024 还是 3840x2160,输出都是约 157 万像素
  • size 只在文生图里影响比例,而且只支持有限几种(1:1、3:2、2:3、3:4、16:9)。超出范围、或请求像素数过小(约 0.69MP 以下),会回落成 1:1
  • 图生图里 size 基本不起作用,画幅由模型根据提示词和参考图判断
  • quality 完全不生效。 low / medium / high 传了没有区别,上游会归一成 auto
  • 在提示词里要求分辨率同样无效

实测输出尺寸:

请求 size实际输出像素数
512×5121254×12541.57MP
1024×10241254×12541.57MP
600×8001254×12541.57MP
3840×21601672×9411.57MP
1536×10241536×10241.57MP

如果你需要精确像素,只能拿到图之后自己缩放。

Grok Imagine(grok-imagine-image)

grok-imagine-image 走同样的两个端点,请求写法与上面一致,把 model 换掉即可:

bash
curl https://primerouter.ai/v1/images/generations \
  -H "Authorization: Bearer $PRIMEROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-imagine-image",
    "prompt": "一只橘猫坐在窗台上,柔和的晨光",
    "size": "2048x1152"
  }'

gpt-image-2 最大的区别:size 是生效的

尺寸怎么定

Grok 只有 1K 和 2K 两档分辨率,没有 4K。size 里的宽高会被换算成「分辨率 + 比例」再发给模型:

  • 长边 ≤ 1024 → 1K,否则 → 2K。Grok 没有 4K,传 4K 尺寸出的也是 2K 图
  • 比例取最接近的一个:1:1、16:9、9:16、4:3、3:4、3:2、2:3、2:1、1:2、19.5:9、9:19.5、20:9、9:20
  • 实际像素是该档位下这个比例的固定值,不会精确等于你传的宽高
  • 也可以直接传 size=1k / size=2k,只定分辨率,比例由模型定
  • 不传 size 按 2K 出图

实测:

请求 size文生图实际输出图生图实际输出
不传2K,比例由模型定(实测 2496×1664)2K,跟参考图比例(实测 2048×2048)
1024×10241024×10241024×1024
2048×11522816×15842816×1584
3840×21602816×15842816×1584

quality 对这个模型不生效。

返回格式

  • 文生图:response_format 默认 url,返回的是可以直接下载的 https 链接(和 gpt-image-2data: 内联 URL 不同)。这是临时地址,拿到后请及时保存。传 b64_json 也可以
  • 图生图:始终返回链接,response_format 不生效
  • 图片可能是 JPEG,也可能是 PNG

只认这几个参数

文生图只转发 modelpromptnsizeresponse_format;图生图再加 image / image[](最多 3 张参考图)。output_formatbackgroundmoderation 这些字段对 Grok 不起作用。

计费

按请求的 size 所在档位计费,档位表见下文「计费」一节;不传 size 按 2K。各档单价见 定价页

计费

图片模型按 张数 × 尺寸档位 计费,不按 token。

档位看输出图的长边

长边像素档位
≤ 10241K
1025 ~ 20482K
> 20484K

各档单价见 定价页

三条容易被误会的口径:

  1. 按实际出的图算,不是按你请求的尺寸。 请求 4K、上游给了 2K 的图,按 2K 收。Grok 例外,按请求的 size 档位计,见上一节
  2. 出几张收几张的钱,按上游实际返回的张数,不是请求的 n
  3. 不乘分组倍率,管理员配多少就是多少

gpt-image-2 恒为 2K

上一节说过 gpt-image-2 固定输出约 157 万像素。这意味着它的长边最小也有 1254(正方形时),永远够不到 1K 档,也几乎到不了 4K 档

所以 gpt-image-2 实际恒按 2K 计费。传小尺寸、在提示词里要求小图,都不会降价。

排查

后台 日志 → 详情 里能看到这次请求算的是哪档:

大小 600x800, 请求品质 medium, 生成数量 1, 图片档位 2K(来源:输出尺寸,实际尺寸 1254x1254)
  • 大小请求品质你传了什么,不代表上游实际采纳
  • 实际尺寸 是从返回的图片字节里解出来的真值,计费按它
  • 来源 为「默认」说明请求和响应都判不出尺寸,此时会按 2K 计费

对不上账时,先看 图片档位生成数量 这两项。