图片生成与编辑
primerouter 提供与 OpenAI 兼容的两个图片端点:
| 端点 | 用途 | 请求格式 |
|---|---|---|
POST /v1/images/generations | 文生图 | JSON |
POST /v1/images/edits | 图生图、多张参考图 | multipart/form-data |
可用的图片模型与价格见 定价页 的「图片模型」分区。目前有 gpt-image-2 和 grok-imagine-image 两类,参数写法相同,但 size 是否生效、返回的是什么两者不一样,见下文各自的小节。
文生图
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[],想传几张写几个:
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 也一样:
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="把第二张的产品放进第一张的版式里,注意保留版式中的所有宣传文字",
)几点说明:
- 字段名
image、image[]、image[0]/image[1]都认,顺序按你给的顺序转发 - 参考图张数网关侧不限,上限由上游决定;单个请求体默认最大 32MB
mask可选,字段名mask,只取第一个文件- 表单里的其他字段(
background、output_format、output_compression、moderation等)会原样转发。但走/v1/images/generations的 JSON 时,只有标准字段会被转发
提示词要把要求写全
图生图是按提示词重新绘制,不是在原图上做局部编辑。参考图里的元素,没写进提示词的就不保证保留。
比如想保留第一张图里的标题、卖点文案、角标,就要明确写出来:
把第二张的产品放进第一张的版式里,注意保留版式中的所有宣传文字少了「注意保留……文字」这半句,出来的图往往只剩主标题,其余版式元素会丢。这不是参考图没被读取——两张图都送到了模型,只是没被要求保留。
gpt-image-2 的尺寸与品质限制
请先读这一节
gpt-image-2 目前无法控制输出分辨率。这是上游图像接口的限制,不是参数写法问题。
具体表现:
size不决定分辨率。 无论传512x512、1024x1024还是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×512 | 1254×1254 | 1.57MP |
| 1024×1024 | 1254×1254 | 1.57MP |
| 600×800 | 1254×1254 | 1.57MP |
| 3840×2160 | 1672×941 | 1.57MP |
| 1536×1024 | 1536×1024 | 1.57MP |
如果你需要精确像素,只能拿到图之后自己缩放。
Grok Imagine(grok-imagine-image)
grok-imagine-image 走同样的两个端点,请求写法与上面一致,把 model 换掉即可:
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×1024 | 1024×1024 | 1024×1024 |
| 2048×1152 | 2816×1584 | 2816×1584 |
| 3840×2160 | 2816×1584 | 2816×1584 |
quality 对这个模型不生效。
返回格式
- 文生图:
response_format默认url,返回的是可以直接下载的 https 链接(和gpt-image-2的data:内联 URL 不同)。这是临时地址,拿到后请及时保存。传b64_json也可以 - 图生图:始终返回链接,
response_format不生效 - 图片可能是 JPEG,也可能是 PNG
只认这几个参数
文生图只转发 model、prompt、n、size、response_format;图生图再加 image / image[](最多 3 张参考图)。output_format、background、moderation 这些字段对 Grok 不起作用。
计费
按请求的 size 所在档位计费,档位表见下文「计费」一节;不传 size 按 2K。各档单价见 定价页。
计费
图片模型按 张数 × 尺寸档位 计费,不按 token。
档位看输出图的长边:
| 长边像素 | 档位 |
|---|---|
| ≤ 1024 | 1K |
| 1025 ~ 2048 | 2K |
| > 2048 | 4K |
各档单价见 定价页。
三条容易被误会的口径:
- 按实际出的图算,不是按你请求的尺寸。 请求 4K、上游给了 2K 的图,按 2K 收。Grok 例外,按请求的
size档位计,见上一节 - 出几张收几张的钱,按上游实际返回的张数,不是请求的
n - 不乘分组倍率,管理员配多少就是多少
gpt-image-2 恒为 2K
上一节说过 gpt-image-2 固定输出约 157 万像素。这意味着它的长边最小也有 1254(正方形时),永远够不到 1K 档,也几乎到不了 4K 档。
所以 gpt-image-2 实际恒按 2K 计费。传小尺寸、在提示词里要求小图,都不会降价。
排查
后台 日志 → 详情 里能看到这次请求算的是哪档:
大小 600x800, 请求品质 medium, 生成数量 1, 图片档位 2K(来源:输出尺寸,实际尺寸 1254x1254)大小和请求品质是你传了什么,不代表上游实际采纳实际尺寸是从返回的图片字节里解出来的真值,计费按它来源为「默认」说明请求和响应都判不出尺寸,此时会按 2K 计费
对不上账时,先看 图片档位 和 生成数量 这两项。
