图像生成与编辑
文生图与图像编辑接口,OpenAI Images 兼容,覆盖尺寸约束、返回形式与多图输入。
积木的图像接口与 OpenAI Images API 兼容,支持文生图(generations)与图像编辑(edits)。
鉴权见 鉴权与令牌(统一使用 Authorization: Bearer <令牌>),
通用错误码见 错误处理与请求追踪。
端点总览
| 方法 | 路径 | 说明 |
|---|---|---|
POST | /v1/images/generations | 文生图 |
POST | /v1/images/edits | 图像编辑(multipart 上传参考图) |
POST | /v1/edits | 图像编辑的等价别名,与 /v1/images/edits 同一处理链路 |
调用协议与响应形态
图像生成不止 Images 这一个入口。同一个模型可能被配置为接受下列请求协议之一, 而返回结果只有两种形态。协议决定你往哪个路径发请求,形态决定你从哪里取图。
| 请求协议 | 入口路径 | 响应形态 |
|---|---|---|
| Images 官方格式 | /v1/images/generations、/v1/images/edits、/v1/edits | OpenAI Images 结构 |
| 对话兼容格式 | /v1/chat/completions、/v1/completions | chat.completion,图片以 Markdown 内嵌 |
| Gemini 原生格式 | /v1beta/models/{模型}:generateContent(及 :streamGenerateContent) | Gemini 原生结构,图片在 inlineData |
两种响应形态的取图方式:
- OpenAI Images 结构:
data[].url或data[].b64_json,详见下文返回形式。 Gemini 的imagen系列虽然上游走原生协议,但从/v1/images/generations调用时 网关会把结果转成这个结构(固定填b64_json),调用方无需感知差异。 - 对话兼容格式:图片写在
choices[].message.content里,形如或,需要自行从 Markdown 中解析。 即梦 jimeng 系列、部分 Flux 与 Cloudflare 模型走这条链路。
candidates[].content.parts[].inlineData(含 mimeType 与 base64 data),
与文本段 text 混在同一个 parts 数组里,需要按 part 类型分别处理。
请求侧要拿到图片,generationConfig.responseModalities 需包含 "IMAGE",
字段说明见 Gemini 原生协议。provider 声明的那一种协议(openai 或 gemini),
用错协议会被拒绝。判断方式见 媒体 Schema 机制。g-image-2)必须在请求中携带 jimu_media_tool sidecar
及正确的 revision,缺少时返回 HTTP 400。未配置 Schema 的模型则照常调用、不需要 sidecar。
判断依据与用法见 媒体 Schema 机制。
注意 sidecar 仅支持 JSON 请求体入口:multipart 的 /v1/images/edits 不接受 jimu_media_tool,
因此已配置 Schema 的模型当前无法通过 edits 端点调用(generations 正常)。文生图
/v1/images/generations请求参数
modelstring必填图像模型 ID,如 gpt-image-2、dall-e-3、flux 系列
promptstring图像描述文本。模型无 media Schema 时必填;配置了 Schema 时以 input_schema.required 为准
ninteger生成数量。省略或传 0 均归一为 1;n > 10 本地返回 400。流式模式下仅允许 n=1
sizestring输出尺寸,合法取值随模型而异(见下文)
qualitystring画质。gpt-image 系列 low / medium / high / auto;dall-e-3 standard / hd
response_formatstring兼容值 url / b64_json,但不限于此——平台不统一拒绝未知值,实际以模型 Schema 与上游为准。仅 dall-e 系列支持;gpt-image 系列始终返回 b64_json
styleJSON 值本地不做类型与枚举校验(通常为 string),是否下发取决于 adaptor。vivid / natural 是 dall-e-3 常用值;实际以模型 Schema 与上游为准
backgroundstringgpt-image 系列
transparent · opaque · autooutput_formatstringgpt-image 系列
png · jpeg · webpoutput_compressioninteger0–100,仅 jpeg / webp 输出时生效
moderationstringgpt-image 系列
low · autostreamboolean流式生成(SSE),仅部分模型支持,且必须 n=1
partial_imagesinteger流式过程中的中间图数量,0–3,仅 stream=true 时生效
watermarkboolean是否添加水印(取决于上游模型)
未列出的额外字段不保证透传给上游,请以上表字段与 媒体 Schema 声明的参数为准。
尺寸约束
size 的合法取值由模型决定,传错会被上游拒绝:
| 模型 | 合法尺寸 |
|---|---|
dall-e-2 | 256x256、512x512、1024x1024 |
dall-e-3 | 1024x1024、1024x1792、1792x1024 |
gpt-image-2 | auto 或 宽x高。宽高均须被 16 整除,宽高比在 1:3 到 3:1 之间,最大 3840x2160;高于 2560x1440 为实验性 |
返回形式
响应为 OpenAI Images 结构,data 数组长度与 n 一致:
{
"created": 1753700000,
"data": [
{
"url": "https://.../image.png",
"b64_json": "",
"revised_prompt": ""
}
]
}
- dall-e 系列可通过
response_format选择url(临时链接,会过期)或b64_json - gpt-image 系列始终返回
b64_json,不设response_format - 拿到
url形式的结果请尽快下载转存,临时链接有时效 - 响应结构以服务端实现为准:网关按 OpenAI Images 兼容结构返回,不同上游模型对
url/b64_json/revised_prompt三个字段的填充情况可能不同,以实际返回为准
请求示例
curl https://api.jimu.chat/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JIMU_API_KEY" \
-d '{
"model": "gpt-image-2",
"prompt": "一只在月球上喝茶的橘猫,水彩风格",
"size": "1024x1024",
"quality": "low",
"n": 1
}'
图像编辑
/v1/images/edits与 generations 的 JSON 请求不同,edits 使用 multipart/form-data 上传参考图:
imagefile | file[]必填参考图文件。多张图时重复提交 image 字段(OpenAI SDK 传数组)
promptstring必填编辑指令,如「把背景换成海边」
modelstring必填图像模型 ID
maskfile蒙版 PNG,透明区域为待编辑部分(dall-e-2)
ninteger生成数量。省略或传 0 均归一为 1;n > 10 本地返回 400
sizestring输出尺寸,规则同 generations
qualitystring画质,规则同 generations
input_fidelitystringgpt-image 系列,控制对原图的保真程度
high · low多图输入上限由模型决定。以 gpt-image-2 为例,其媒体 Schema 声明 image_uris 最多 10 张参考图;
其他模型请以 媒体 Schema 返回的实时定义为准。
curl https://api.jimu.chat/v1/images/edits \
-H "Authorization: Bearer $JIMU_API_KEY" \
-F "model=gpt-image-2" \
-F "prompt=把照片中的人物换成卡通风格" \
-F "image=@./photo.png" \
-F "size=1024x1024"
对话兼容格式
/v1/chat/completions部分图像模型(即梦 jimeng 系列、部分 Flux 与 Cloudflare 模型)不走 Images 端点, 而是从对话接口进入。请求体就是标准的 Chat Completions 结构, 网关负责把消息内容翻译成上游的图像请求。
请求参数
modelstring必填模型 ID
messagesarray必填标准对话消息数组。提示词与参考图都从这里提取,规则见下文
streamboolean是否流式返回。上游一次性出图,因此流式也只会收到一个完整 chunk 后结束
提示词与参考图的提取规则:
- 提示词取最后一条
role: "user"消息的文本内容;若没有任何 user 消息, 则退回到最后一条含文本的消息。找不到任何文本时请求被拒绝。 - 多模态消息只取其中的
text片段作为提示词,不会把图片描述拼进去。 - 参考图扫描全部消息中的
image_url片段并按出现顺序去重收集, 不限于最后一条消息。这与提示词只看最后一条的规则不同,注意区分。 - 图像相关的额外参数(如尺寸、画质)可直接写在请求体顶层,会被合并后透传给上游。
{
"model": "jimeng-3.0",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "把这张图改成水彩风格" },
{ "type": "image_url", "image_url": { "url": "https://example.com/ref.png" } }
]
}
]
}
返回形式
响应是标准 chat.completion 结构,图片以 Markdown 内嵌在
choices[0].message.content 里,需要自行解析:
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1753700000,
"model": "jimeng-3.0",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": ""
},
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 1, "completion_tokens": 1, "total_tokens": 2 }
}
- 上游返回链接时内嵌形式为
;返回 base64 时为。两种都可能出现,解析时都要覆盖。 - 多张图时以换行分隔,
content中会出现多个。 finish_reason固定为stop。usage中的 token 数不是真实用量。 图像按张计费,这里的数值只是占位, 不要用它做成本估算——实际扣费以控制台账单为准。
请求示例
curl https://api.jimu.chat/v1/chat/completions \
-H "Authorization: Bearer $JIMU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jimeng-3.0",
"messages": [{ "role": "user", "content": "一只戴墨镜的柴犬,赛博朋克风格" }]
}'
Gemini 原生格式
/v1beta/models/{模型}:generateContentGemini 系图像模型可以走原生协议。这条链路的响应是上游原始结构,网关不做改写, 因此取图方式与前两种格式完全不同。完整的请求体字段说明见 Gemini 原生协议,本节只讲图像相关部分。
请求参数
要让模型输出图片,generationConfig.responseModalities 需包含 "IMAGE":
{
"contents": [
{
"role": "user",
"parts": [
{ "text": "一只戴墨镜的柴犬,赛博朋克风格" }
]
}
],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": { "aspectRatio": "16:9" }
}
}
generationConfig.responseModalitiesstring[]输出模态。含 "IMAGE" 时返回图片;通常写 ["TEXT","IMAGE"]
generationConfig.imageConfig.aspectRatiostring画面比例,如 1:1、16:9、9:16
generationConfig.imageConfig.imageSizestring图像尺寸档位,如 1K、2K(可用范围以模型为准)
contents[].parts[].inlineDataobject参考图输入,含 mimeType(如 image/jpeg)与 base64 data 两个字段。也接受 snake_case 写法 inline_data
上表字段名写 camelCase 或 snake_case 都可以:responseModalities / response_modalities、
imageConfig / image_config、inlineData / inline_data、mimeType / mime_type
都会被正确解析。两种写法混用也不会出错。
extra_body.google 传入,但字段名必须是 snake_case:
extra_body.google.response_modalities、extra_body.google.image_config.aspect_ratio、
extra_body.google.image_config.image_size。写成 camelCase 会被明确拒绝并提示正确写法。返回形式
图片位于 candidates[].content.parts[].inlineData,与文本段 text混在同一个 parts 数组里,需要按 part 类型分别处理:
{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{ "text": "这是为你生成的图片:" },
{
"inlineData": {
"mimeType": "image/png",
"data": "iVBORw0KGgoAAAANSUhEUg..."
}
}
]
},
"finishReason": "STOP",
"index": 0
}
],
"usageMetadata": {
"promptTokenCount": 8,
"candidatesTokenCount": 1290,
"totalTokenCount": 1298
}
}
parts中同时含文本与图片是常态,不要假设只有一个元素。data为 base64,需配合mimeType自行解码落盘。- 流式请求走
:streamGenerateContent?alt=sse,图片同样出现在增量事件的parts[].inlineData中。 - 上游因安全策略拦截时可能返回空
candidates并带promptFeedback.blockReason。
imagen 系列是例外。 它在上游走的是 :predict 而非 :generateContent,
返回结构也不是 candidates。用 /v1/images/generations 调用时网关会把结果
转成 OpenAI Images 结构(固定填 b64_json),这是推荐用法。请求示例
curl "https://api.jimu.chat/v1beta/models/gemini-2.0-flash-exp:generateContent" \
-H "x-goog-api-key: $JIMU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{ "role": "user", "parts": [{ "text": "一只戴墨镜的柴犬" }] }],
"generationConfig": { "responseModalities": ["TEXT", "IMAGE"] }
}'
流式生成
gpt-image 系列支持 stream: true,响应为 SSE 事件流:
- 过程事件携带
b64_json中间图(数量由partial_images控制,0–3) - 结束事件包含最终图片与用量
- 流式模式必须
n=1,网关会在请求上游前拒绝stream=true, n>1的请求
计费提示
图像按张计费,尺寸与画质影响单价。以 dall-e 系列为例的计费倍率:
1024x1024 为基准 1 倍,256x256 为 0.4 倍,512x512 为 0.45 倍,
1024x1792 / 1792x1024 为 2 倍;dall-e-3 选 hd 画质时方图再乘 2,
长图(1024x1792 / 1792x1024)画质因子乘 1.5(与尺寸倍率叠加后总倍率 3)。
各模型的实际价格见控制台定价页。