用 GPT Image 2 API 生成和编辑图像
apiToken.sale 上的 GPT Image 2 API 只有两条路由——POST /v1/images/generations 生成新图,POST /v1/images/edits 基于参考图做编辑——它们和 GPT 文本调用共用同一把 Bearer 密钥、同一个预付余额。用量按 token 计费,价格是 OpenAI 官方的一半。本文给出准确的请求写法、SDK 接入方式、真实价格表,以及上线前值得知道的接口限制。
·
一个请求看懂生成路由
GPT Image 2 是通过 OpenAI 兼容接口调用的图像模型:向 /v1/images/generations 发送提示词,model 填 gpt-image-2,带上 Authorization: Bearer 请求头,就能拿回一张 PNG。不需要单独的图像套餐,也不需要第二把密钥——覆盖 GPT、Claude 和 Gemini 调用的同一把 sk-pool 密钥和预付余额,同样结算图像用量。
curl https://router.apitoken.sale/v1/images/generations \
-H "Authorization: Bearer $APITOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"prompt": "A precise technical cutaway of a lunar rover",
"quality": "low"
}'官方 GPT Image 字段会被接受并转换到本池。多余键(user、stream、moderation、style)会被忽略,而不是 400。quality 为 medium/high/auto 时仍按本池 low 档生成。output_format 为 jpeg 或 webp 时会把原生 PNG 本地转码;省略或 png 则保持 PNG。response_format=url 会被忽略,响应始终是 b64_json。n 可为 1–10;每多一张图就是又一次原生调用。background=auto 视为 opaque;transparent 会在提示前加上抠图句并请求真实 PNG alpha——请检查文件;没有 alpha 仍是 HTTP 200,不是 502。size 选择比例,不是像素锁。2048x2048 和 3840x2160 映射到 1:1 和 16:9;PNG 仍约 1.57 百万像素,响应里的 size 是真实 IHDR。
| size | Proportion | Steer target (inspect the PNG) |
|---|---|---|
| omitted or auto | no size steer | typically ~1254×1254; not a lock |
| 1024x1024, 1:1, 2048x2048 | 1:1 | 1254×1254 |
| 1536x1024 or 3:2 | 3:2 landscape | 1536×1024 |
| 1024x1536 or 2:3 | 2:3 portrait | 1024×1536 |
| 4:3 | 4:3 | 1448×1086 |
| 16:9, 2048x1152, 3840x2160 | 16:9 | 1672×941 |
| 9:16, 2160x3840 | 9:16 | 944×1665 |
1024x1024 是正方形档,不是锁定 1024 像素。1536x1024 与 1024x1536 是同一兆像素预算的 3:2 与 2:3 切分。表格是 prompt-steer 目标。若 PNG 头与档位不符,接口仍返回 HTTP 200 和 PNG——在验收关检查 IHDR 和 alpha,不要假定会返回 502。
POST /v1/images/* 每次调用返回一张非流式 PNG。不要围绕该路由构建进度 UI。若需要流式预览帧,使用下方独立的 Responses image_generation 工具并设置 partial_images——简单提示词可能跳过 partials。
用最多五张 PNG、JPEG 或 WebP 参考图编辑现有图像
编辑走的是另一条路由、另一种 content type。向 /v1/images/edits 发送 multipart/form-data,model 同样是 gpt-image-2,附上提示词和一到五张 PNG、JPEG 或 WebP 参考图(每张 ≤50 MB)。参考图用来表达定点修改——重绘这张产品图的风格、换掉这个背景、扩展这条横幅——而不是从零重新生成。
curl https://router.apitoken.sale/v1/images/edits \ -H "Authorization: Bearer $APITOKEN_API_KEY" \ -F "model=gpt-image-2" \ -F "prompt=Replace the backdrop with a seamless light-gray studio sweep" \ -F "image=@packshot.png" \ -F "image=@brand-swatch.png"
- 每张参考图重复字段名 image,或发送 image[]。此路由忽略 multipart mask——局部重绘请用 Responses input_image_mask。
- 参考图为 PNG、JPEG 或 WebP,每张不超过 50 MB。GIF、HEIC 及其他类型会被拒绝。
- 每次调用最多五张参考图——挑那几张真正承载修改意图的,而不是把整个素材库都传上去。
- 每张参考图都按图像输入计费,所以同样的输出,编辑比纯提示词生成更贵。
- 响应结构与生成一致:每次调用返回一张非流式 PNG。
局部重绘与 Responses image_generation
不要把 multipart mask 发到 /v1/images/edits。该字段会被拒绝,ChatGPT 的图像编辑 URL 也会忽略它。若要只改图片的一部分——或从 GPT 文本模型调用 hosted image_generation 工具——请用 POST /v1/responses(Chat Completions 会把同一套 hosted 工具映射到 Responses)。编辑时把源 PNG 放在 input 的 input_image,并添加 tools: [{type:"image_generation", …}]。蒙版用 input_image_mask.image_url 设为 PNG data URL。蒙版中透明像素是要修改的区域,不透明像素保持不变。蒙版须与源图尺寸相同。不支持 file_id——此平面没有 Files API。
import base64, os
from pathlib import Path
from openai import OpenAI
client = OpenAI(
api_key=os.environ["APITOKEN_API_KEY"],
base_url="https://router.apitoken.sale/v1",
)
def png_url(path):
return "data:image/png;base64," + base64.b64encode(Path(path).read_bytes()).decode()
response = client.responses.create(
model="gpt-5.6-sol",
input=[{
"role": "user",
"content": [
{"type": "input_text", "text": "Change only the masked region."},
{"type": "input_image", "image_url": png_url("photo.png")},
],
}],
tools=[{
"type": "image_generation",
"output_format": "webp",
"partial_images": 2,
"input_image_mask": {"image_url": png_url("mask.png")},
}],
)- 在 /v1/responses 或 /v1/chat/completions 上使用 GPT 文本模型(例如 gpt-5.6-sol),不要用 gpt-image-2——该 id 属于 Images 路由。
- 源图和蒙版都必须是 data:image/png;base64,… URL,不能是 https://,也不能是 OpenAI file id。
- Responses image_generation 转发 output_format jpeg 或 webp,以及 partial_images 1..=3;有 partials 时 SSE 发出 response.image_generation_call.partial_image。
- background=transparent 会改写为 opaque,input_fidelity 会被丢弃——这两个字段在该 ChatGPT image tool 上会 400。工具上的 quality/size 仍会 remap;completed item 回显 ChatGPT 返回的内容。
- 蒙版不会作为第二张参考图计费;结算仍按该回合的 image-input 与 image-output token。
- 独立的 POST /v1/images/* 路由仍只接受 PNG 输出且不流式 partials——不要混用两套契约。
用官方 OpenAI SDK 调用
可以继续用官方 OpenAI SDK,但只发送本池允许的字段。base_url 和 api_key 与文本模型相同。不要依赖 SDK 默认值:官方 api.openai.com Images 接受的多余键(user、stream、moderation、style)在这里是 400,response_format=url 也是 400。下面的示例列出了它发送的每一个字段。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["APITOKEN_API_KEY"],
base_url="https://router.apitoken.sale/v1",
)
result = client.images.generate(
model="gpt-image-2",
prompt="A clean isometric diagram of a wind turbine",
quality="low",
size="3:2",
)
png_bytes = result.data[0].b64_json # decode base64 and write to disk编辑场景下,同一个客户端暴露 images.edits,参考文件以二进制模式打开传入。密钥放在服务端环境变量里;图像端点和聊天端点同样敏感,因为它们扣的是同一个余额。
一次生成的真实成本
不存在诚实的「每张图固定价」。GPT Image 2 按 token 计费,拆成四条计费腿——文本输入(你的提示词)、图像输入(编辑时的参考图)、缓存输入和图像输出——一次请求的总价以 API 返回的最终 usage 为准,与 PNG 的字节大小、尺寸无关。
| 计费项 | 官方每 1M token | 本站价格 |
|---|---|---|
| 新鲜文本输入 | $5 | $2.50 |
| 新鲜图像输入 | $8 | $4 |
| 缓存文本输入 | $1.25 | $0.625 |
| 缓存图像输入 | $2 | $1 |
| 图像输出 | $30 | $15 |
- 每条腿都享受统一的 50% B2C 折扣;缓存文本和图像输入在折扣生效之前,就先按普通输入费率的 25% 计费。
- 读取每次响应里的 usage 对象,并把它和资产一起记录——它是计费权威,也是后台账单对账的依据。
- gpt-image-2 是不可变快照 gpt-image-2-2026-04-21 的别名,行为不会在调用之间漂移;想在代码里明确写出这个保证,就直接固定带日期的 ID。
不要拿几张测试渲染图就在自己的定价页面上标一个单图价格。输出用量随资产变化,三个样本推出来的数字到了生产环境一定是错的。用一周的真实 usage 把各条腿加起来,再做决定。
当前图像接口的限制
按这条路由今天可验证的行为做规划,而不是按营销名称想象。已确认的能力组合刻意很窄:
- POST /v1/images/* 每次调用一张 PNG,非流式——批量任务循环调用端点,而不是在一个请求里要 n 张图。n 不是 1 会返回 400。
- 生成 JSON 封闭:只有 model、prompt、n、background、quality、size、output_format、response_format。未知键为 400。openai/gpt-image-2 会被接受为 gpt-image-2。GET /v1/models 列出两个 id 和图像路由,不公布这些字段规则。
- Images HTTP 控制项为 background opaque 或 transparent、quality low(或省略)、output_format png 或省略、response_format b64_json 或省略,以及作为比例预设的 size(auto、1024x1024/1:1、1536x1024/3:2、1024x1536/2:3、4:3、16:9、9:16)。medium/high、background auto、response_format url 与 2K/4K 会被拒绝。
- 已解析的 PNG 且有终态 usage 时为 HTTP 200,即使 size 或 alpha 与 steer 不符。此路由唯一的成功后 502 是 PNG 之后缺少 usage。
- 编辑接受 multipart/form-data 里的一到五张 PNG、JPEG 或 WebP(每张 ≤50 MB)。image[] 等同 image。mask 会被忽略;局部重绘走上面的 Responses image_generation。
- 图像用量和 GPT、Claude、Gemini 调用从同一个预付余额扣费——只需盯一个池子,而不是四个。
如果想换一个图像模型做对比,Gemini 侧的图像路由有并列文档,正面对比指南也覆盖了两者各自擅长的场景。
在共享余额上控制图像开销
图像输出是最贵的一条腿,批量循环又会把它成倍放大,所以给图像 worker 单独发一把 API 密钥,并设置生命周期花费上限。失控的渲染任务会在自己的额度处停下,而不是抽干聊天流量依赖的余额;后台按密钥维度的用量统计也能准确告诉你哪个 worker 花了多少。
- 01在后台为图像流水线创建一把专用密钥,把它的生命周期花费上限设为批量预算。
- 02发送一个有边界的生成请求(上面的 curl),确认返回的 PNG,以及包含预期计费腿的 usage 对象。
- 03用小规模循环跑你的真实提示词集,记录每个资产的最终 usage,并把总数与后台账单对账。
- 04确认无误后再放到完整批量规模,同时让密钥上限始终对准你实际批准的预算。
常见问题
GPT Image 2 API 用哪个端点?
生成新图用 POST /v1/images/generations,参考图编辑用 POST /v1/images/edits,两者都在 OpenAI 兼容基础 URL https://router.apitoken.sale/v1 上,带 Authorization: Bearer 请求头。
GPT Image 2 能编辑现有图像吗?
可以。edits 路由接受 multipart/form-data,包含一到五张 PNG、JPEG 或 WebP(每张 ≤50 MB)和提示词。重复字段名 image,或发送 image[]。multipart mask 会被忽略;局部重绘请用 Responses input_image_mask。
如何只重绘图像的一部分?
对 GPT 文本模型调用 POST /v1/responses,源 PNG 作为 input_image,并使用 tools: [{type:"image_generation", input_image_mask:{image_url:"data:image/png;base64,…"}}]。还可设置 output_format jpeg|webp 与 partial_images 1..=3。蒙版透明像素是修改区域。不要把 mask 发到 /v1/images/edits,也不要使用 file_id。Chat Completions 会把同一 image_generation 工具映射到 Responses。
GPT Image 2 的准确 model ID 是什么?
用 gpt-image-2,它是不可变快照 gpt-image-2-2026-04-21 的别名。想在代码里显式写明快照,就固定带日期的 ID。
GPT Image 2 每张图多少钱?
没有固定的单图价格:计费按最终 usage 计算,覆盖文本输入(官方 $5/M)、图像输入($8/M)、缓存输入(新鲜输入的 25%)和图像输出($30/M),本站每条计费腿统一五折——分别为每 1M $2.50、$4 和 $15。
GPT Image 2 支持透明背景或流式输出吗?
在 POST /v1/images/*:可作为请求支持透明背景,不支持流式——发送 background=transparent 请求带真实 alpha 的 PNG;省略或 opaque 为实心;没有 alpha 仍是 HTTP 200。在 Responses image_generation:background=transparent 会改写为 opaque;要用 SSE 预览请设 partial_images 1..=3(response.image_generation_call.partial_image)。
可以指定图像尺寸吗?
指定的是比例,不是任意像素。省略或 auto 通常约 1254×1254,但不是锁定。1024x1024/1:1、1536x1024/3:2、1024x1536/2:3、4:3、16:9、9:16 分别导向 1254×1254、1536×1024、1024×1536、1448×1086、1672×941、944×1665。若 PNG 头不同,接口仍返回 HTTP 200。2K 与 4K 会被拒绝。
图像生成需要单独的密钥或余额吗?
不需要。它和所有其他受支持模型(包括 GPT、Claude 和 Gemini)共用同一把 Bearer 密钥和预付余额——不过对批量图像 worker 来说,配一把带生命周期花费上限的专用密钥是合理做法。