python 使用 gpt-image-2.6 创建编辑图片(含 SVG / GIF 输出)
适用模型:gpt-image-2.6-flare(快速迭代)、gpt-image-2.6-sunburst(精细视觉作业)。
接口:POST /v1/images/generations(文生图)、POST /v1/images/edits(编辑),请求体与官方 OpenAI Images API 兼容。
from openai import OpenAI
import base64
client = OpenAI(
base_url="https://4zapi.com/v1",
api_key="sk-xxx",
)
1. 文生图(最简)
result = client.images.generate(
model="gpt-image-2.6-flare",
prompt="产品静物:哑光黑机械键盘,影棚灯光,无文字",
n=1,
size="1536x1024",
)
with open("keyboard.png", "wb") as f:
f.write(base64.b64decode(result.data[0].b64_json))
2. complexity 复杂度(2.6 新增)
complexity 控制渲染前的规划强度,与 quality(画质)相互独立,不另收费。省略时默认 high。
result = client.images.generate(
model="gpt-image-2.6-sunburst",
prompt="儿童绘本插画:纸雕风格足球夺冠场景,看台上有 CHAMPIONS 横幅",
complexity="medium", # low / medium / high
quality="medium",
)
low:适合换背景、改招牌这类局部修改,延迟低、少改动;high:适合密集文字、复杂布局与物体关系,延迟更高,也可能引入多余改动。
3. SVG 矢量输出(2.6 新增)
output_format="svg",仅文生图接口且 n=1;必须携带 svg 对象指定作者模型。
result = client.images.generate(
model="gpt-image-2.6-sunburst",
prompt="面包店标志:金色麦穗与手写店名,扁平矢量风",
output_format="svg",
n=1,
quality="medium",
extra_body={
"svg": {
"model": "gpt-6-luna",
"reasoning": {"effort": "low"},
}
},
)
with open("logo.svg", "wb") as f:
f.write(base64.b64decode(result.data[0].b64_json)) # 解码后为 UTF-8 XML
JSON 请求体也可以直接写:
{
"model": "gpt-image-2.6-sunburst",
"prompt": "面包店标志:金色麦穗与手写店名,扁平矢量风",
"output_format": "svg",
"n": 1,
"svg": { "model": "gpt-6-luna", "reasoning": { "effort": "low" } }
}
- 计费 = 参考图按图像模型费率 + SVG tokens 按作者模型费率;响应
svg_usage汇报作者模型用量。 - SVG 不支持流式、partial_images、prompt_rewriter、output_compression;编辑接口不支持 SVG。
- 若报错
SVG generation requires '***.model':说明svg对象未携带或未被中转透传,请补上svg.model后重试;仍报错请联系支持确认透传状态。
4. GIF 动图输出(2.6 新增)
output_format="gif",仅文生图接口。在 prompt 里写明主体、运动与循环方式。
result = client.images.generate(
model="gpt-image-2.6-sunburst",
prompt="一只猴子在雪夜小屋前举起灯笼,眨眼后回到起始姿势,无缝循环",
output_format="gif",
n=1,
size="1024x1024",
frame_count=9, # 2-16,默认 9
frame_duration_ms=200, # 每帧毫秒,默认 200,最小 20
)
with open("monkey.gif", "wb") as f:
f.write(base64.b64decode(result.data[0].b64_json))
size描述每一帧的尺寸;帧数 × 帧尺寸 × n 超出像素预算时会失败,减小frame_count、帧尺寸或n。- GIF 不支持 mask、流式、partial_images、自定义 output_compression。
5. 标注引导编辑(markup,2.6 新增)
在透明 PNG 上圈出要修改的区域,改什么写在 prompt 里。标注层需与首图同宽高(方向对齐后),必须含透明像素。
result = client.images.edit(
model="gpt-image-2.6-flare",
image=open("kitchen.webp", "rb"),
markup=open("markup-vase.png", "rb"),
quality="medium",
prompt=(
"把红圈内的花瓶改成钴蓝色陶瓷。"
"保留它的形状、干花和其余画面不变,去掉红圈。"
),
)
with open("vase.png", "wb") as f:
f.write(base64.b64decode(result.data[0].b64_json))
等价 curl(multipart):
curl https://4zapi.com/v1/images/edits \
-H "Authorization: Bearer $API_KEY" \
-F model=gpt-image-2.6-flare \
-F image=@kitchen.webp \
-F markup=@markup-vase.png \
-F quality=medium \
-F 'prompt=把红圈内的花瓶改成钴蓝色陶瓷。保留它的形状、干花和其余画面不变,去掉红圈。' \
| jq -r '.data[0].b64_json' | base64 --decode > vase.png
markup只作用于第一张输入图,其余图作参考图;标注文件不超过 16,777,216 像素、50MB。markup不可与mask或prompt_rewriter同用。- 编辑接口不支持 SVG 输出。
常见报错
| 报错 | 原因与处理 |
|---|---|
SVG generation requires '***.model' |
SVG 输出缺 svg.model(或未被中转透传),补上 svg 对象后重试 |
| GIF / SVG 参数不生效 | frame_count / frame_duration_ms 仅 output_format=gif 可用;svg 对象仅 output_format=svg 可用 |
编辑接口传 output_format=svg 被拒 |
SVG 仅支持 POST /v1/images/generations |