图像生成与编辑

文生图与图像编辑接口,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/editsOpenAI Images 结构
对话兼容格式/v1/chat/completions/v1/completionschat.completion,图片以 Markdown 内嵌
Gemini 原生格式/v1beta/models/{模型}:generateContent(及 :streamGenerateContentGemini 原生结构,图片在 inlineData

两种响应形态的取图方式:

  • OpenAI Images 结构data[].urldata[].b64_json,详见下文返回形式。 Gemini 的 imagen 系列虽然上游走原生协议,但从 /v1/images/generations 调用时 网关会把结果转成这个结构(固定填 b64_json),调用方无需感知差异。
  • 对话兼容格式:图片写在 choices[].message.content 里,形如 ![image](https://...)![image](data:image/png;base64,...),需要自行从 Markdown 中解析。 即梦 jimeng 系列、部分 Flux 与 Cloudflare 模型走这条链路。
Gemini 原生格式返回的是上游原始结构,网关不做改写。 图片位于 candidates[].content.parts[].inlineData(含 mimeType 与 base64 data), 与文本段 text 混在同一个 parts 数组里,需要按 part 类型分别处理。 请求侧要拿到图片,generationConfig.responseModalities 需包含 "IMAGE", 字段说明见 Gemini 原生协议
一个模型支持哪种协议不是任选的,由该模型的能力标签与媒体 Schema 配置共同决定: 配了 Schema 的模型只接受其 provider 声明的那一种协议(openaigemini), 用错协议会被拒绝。判断方式见 媒体 Schema 机制
已配置媒体 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 正常)。

文生图

POST/v1/images/generations

请求参数

modelstring必填

图像模型 ID,如 gpt-image-2dall-e-3flux 系列

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 与上游为准

backgroundstring

gpt-image 系列

transparent · opaque · auto
output_formatstring

gpt-image 系列

png · jpeg · webp
output_compressioninteger

0–100,仅 jpeg / webp 输出时生效

moderationstring

gpt-image 系列

low · auto
streamboolean

流式生成(SSE),仅部分模型支持,且必须 n=1

partial_imagesinteger

流式过程中的中间图数量,0–3,仅 stream=true 时生效

watermarkboolean

是否添加水印(取决于上游模型)

未列出的额外字段不保证透传给上游,请以上表字段与 媒体 Schema 声明的参数为准。

尺寸约束

size 的合法取值由模型决定,传错会被上游拒绝:

模型合法尺寸
dall-e-2256x256512x5121024x1024
dall-e-31024x10241024x17921792x1024
gpt-image-2auto宽x高。宽高均须被 16 整除,宽高比在 1:3 到 3:1 之间,最大 3840x2160;高于 2560x1440 为实验性
尺寸只是请求值,部分渠道不保证输出像素与请求完全一致。需要精确尺寸的模型约束, 建议通过 媒体 Schema 读取该模型的实时参数定义。

返回形式

响应为 OpenAI Images 结构,data 数组长度与 n 一致:

响应200
{
  "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
  }'

图像编辑

POST/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_fidelitystring

gpt-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"

对话兼容格式

POST/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,需要自行解析:

响应200
{
  "id": "chatcmpl-...",
  "object": "chat.completion",
  "created": 1753700000,
  "model": "jimeng-3.0",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "![image](https://.../result.png)"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 1, "completion_tokens": 1, "total_tokens": 2 }
}
  • 上游返回链接时内嵌形式为 ![image](https://...);返回 base64 时为 ![image](data:image/png;base64,...)。两种都可能出现,解析时都要覆盖。
  • 多张图时以换行分隔,content 中会出现多个 ![image](...)
  • 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 原生格式

POST/v1beta/models/{模型}:generateContent

Gemini 系图像模型可以走原生协议。这条链路的响应是上游原始结构,网关不做改写, 因此取图方式与前两种格式完全不同。完整的请求体字段说明见 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:116:99:16

generationConfig.imageConfig.imageSizestring

图像尺寸档位,如 1K2K(可用范围以模型为准)

contents[].parts[].inlineDataobject

参考图输入,含 mimeType(如 image/jpeg)与 base64 data 两个字段。也接受 snake_case 写法 inline_data

上表字段名写 camelCase 或 snake_case 都可以:responseModalities / response_modalitiesimageConfig / image_configinlineData / inline_datamimeType / mime_type 都会被正确解析。两种写法混用也不会出错。

从 OpenAI 兼容端点调用 Gemini 图像模型时,这两个参数也可以通过 extra_body.google 传入,但字段名必须是 snake_case: extra_body.google.response_modalitiesextra_body.google.image_config.aspect_ratioextra_body.google.image_config.image_size。写成 camelCase 会被明确拒绝并提示正确写法。

返回形式

图片位于 candidates[].content.parts[].inlineData,与文本段 text混在同一个 parts 数组里,需要按 part 类型分别处理:

响应200
{
  "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 的请求
并非所有渠道都真正实现了 Images SSE。渠道不支持流式时网关会返回 502 且不计费, 不会把不完整的结果伪装成成功。生产环境建议默认非流式。

计费提示

图像按张计费,尺寸与画质影响单价。以 dall-e 系列为例的计费倍率: 1024x1024 为基准 1 倍,256x256 为 0.4 倍,512x512 为 0.45 倍, 1024x1792 / 1792x1024 为 2 倍;dall-e-3hd 画质时方图再乘 2, 长图(1024x1792 / 1792x1024)画质因子乘 1.5(与尺寸倍率叠加后总倍率 3)。 各模型的实际价格见控制台定价页。