Skip to content

GPT 生图接口 ​

MoaCode 提供两种 GPT 生图调用方式:

  1. Codex Pro 渠道:由 gpt-5.5 调用 gpt-image-2 生图工具
  2. GPT-IMAGE-2 渠道:直接使用 gpt-image-2 模型生成图片

两种方式都调用 Responses API(/v1/responses),并通过 SSE 流式响应返回 Base64 编码的 PNG 图片。

不想写代码?

AI Chat 里点一下 Image 按钮即可生图。另有 Google 系生图模型见 Nano Banana 生图(支持直接指定尺寸与比例)。

使用前准备 ​

1. 设置 API Key ​

2. 安装命令行工具 ​

示例命令需要:

  • curl — 发送 HTTP 请求
  • jq — 解析 SSE 中的 JSON 数据
  • base64 — 把返回的 Base64 数据解码为图片

下文的完整管道命令适用于 Linux、macOS、WSL 或 Git Bash。

方式一:Codex Pro 渠道 ​

以 gpt-5.5 作为主模型,并明确要求它调用 gpt-image-2 图像生成工具。

适用场景:

  • 希望由主模型理解、优化生图意图后调用图像工具
  • 后续可能在同一个 Responses 请求中组合文本推理和工具调用
  • 当前渠道选择的是 Codex Pro

完整调用示例 ​

bash
curl -sS -N https://moacode.org/v1/responses \
  -H "Authorization: Bearer $MOACODE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -H "OpenAI-Beta: responses=experimental" \
  -d '{
    "model": "gpt-5.5",
    "input": [{
      "type": "message",
      "role": "user",
      "content": [{
        "type": "input_text",
        "text": "一只三花猫"
      }]
    }],
    "tools": [{
      "type": "image_generation",
      "model": "gpt-image-2",
      "size": "1024x1024",
      "quality": "high",
      "output_format": "png"
    }],
    "tool_choice": {
      "type": "image_generation"
    },
    "stream": true,
    "store": false
  }' |
tee response.sse |
sed -n 's/^data: //p' |
grep -v '^\[DONE\]$' |
jq -r '
  if .type == "response.output_item.done"
     and .item.type == "image_generation_call"
  then .item.result
  elif .type == "response.completed"
  then .response.output[]?
       | select(.type == "image_generation_call")
       | .result
  else empty
  end
' |
head -n 1 |
base64 -d > image.png

执行完成后:

  • 原始 SSE 响应保存在 response.sse
  • 解码后的图片保存在 image.png

size 参数不生效

实测本接口不支持通过 size 参数指定尺寸(传任意值均不生效、也不报错),示例中的 size 仅为官方格式示意。尺寸与比例的实际控制方法见下文尺寸与宽高比控制。

方式二:GPT-IMAGE-2 渠道 ​

直接把 gpt-image-2 设置为顶层模型,不再声明 image_generation 工具。

适用场景:

  • 只需要生成图片,不需要主模型参与工具编排
  • 希望请求结构更简单
  • 当前渠道选择的是 GPT-IMAGE-2

完整调用示例 ​

bash
curl -sS -N https://moacode.org/v1/responses \
  -H "Authorization: Bearer $MOACODE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
    "model": "gpt-image-2",
    "input": [{
      "type": "message",
      "role": "user",
      "content": [{
        "type": "input_text",
        "text": "一只三花猫"
      }]
    }],
    "stream": true,
    "store": false
  }' |
tee response.sse |
sed -n 's/^data: //p' |
grep -v '^\[DONE\]$' |
jq -r '
  if .type == "response.output_item.done"
     and .item.type == "image_generation_call"
  then .item.result
  else empty
  end
' |
head -n 1 |
base64 -d > image.png

两种方式的主要区别 ​

项目Codex ProGPT-IMAGE-2
顶层 modelgpt-5.5gpt-image-2
是否声明生图工具是否
是否设置 tool_choice是否
生图参数位置tools 数组中由图像模型接口或渠道默认配置决定
请求结构较完整,支持模型调用工具较简单,直接生成图片
对应渠道Codex ProGPT-IMAGE-2

请根据所选渠道使用对应请求格式,不要把两种格式混合——直接调用 gpt-image-2 时通常不需要再声明 image_generation 工具。

尺寸与宽高比控制 ​

以下均为实测结论:

  1. 接口不支持 size 参数——传任意值均不生效(也不会报错),各种调用形式(直连 / gpt-5.5 托管 / tool_choice)行为一致
  2. GPT-IMAGE 的模型固定输出约 150 万像素(1,572,864),无法通过参数提高;需要更大尺寸请取图后自行放大
  3. 宽高比有两个可靠的控制方式:
    • 提示词写明比例:一只三花猫,16:9 构图 → 精确生效
    • 附参考图(垫图):content 里附一张目标比例的图(纯色即可),输出跟随其比例
  4. 比例支持范围为 5:2 ~ 2:5,超出范围时模型会自行调整,结果不保证
  5. 流式响应偶尔会提前结束(HTTP 仍为 200 但收不到最终图),建议解析 partial_image_b64 作为兜底并配合重试

比例 → 实际尺寸对照 ​

公式:宽 = √(1572864 × r),高 = √(1572864 ÷ r)(r = 宽/高,误差 ±1 像素)

提示词写返回尺寸提示词写返回尺寸
1:11254 × 125416:91672 × 941
3:21536 × 10249:16941 × 1672
2:31024 × 15362:11774 × 887
4:31448 × 10865:2(最宽)1983 × 793
3:41086 × 14482:5(最窄)793 × 1983

不写比例时由模型自行决定构图(多为竖版),每次可能不同。建议始终写明比例。

尺寸限制(OpenAI 官方口径 vs 本接口) ​

OpenAI 官方 image_generation 工具的 size 只有 4 个合法值,本接口的像素预算与官方最大档一致:

项目OpenAI 官方本接口实际
size 合法值1024x1024 / 1536x1024 / 1024x1536 / auto传任意值均不生效,等同 auto
最大像素1536×1024 = 1,572,864恒为 ≈1,572,864(与官方最大档相同)
可选比例1:1 / 3:2 / 2:3 三档通过提示词连续可调,范围 5:2 ~ 2:5
更大尺寸(2K/4K)不支持不支持,需取图后自行放大

即:上游始终按官方最大像素档出图,size 的选档功能不可用,比例改由提示词或参考图控制。

推荐取图写法(含兜底) ​

文生图(提示词控制比例) ​

bash
KEY="你的APIKey"

curl -sS -N https://moacode.org/v1/responses \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
    "model": "gpt-image-2",
    "input": [{
      "type": "message", "role": "user",
      "content": [{"type": "input_text", "text": "一只三花猫,16:9 构图"}]
    }],
    "stream": true, "store": false
  }' > response.sse

# 1) 优先取最终图
img=$(sed -n 's/^data: //p' response.sse | grep -v '^\[DONE\]$' |
  jq -r 'select(.type == "response.output_item.done"
                and .item.type == "image_generation_call") | .item.result // empty' |
  head -n 1)

# 2) 流提前结束时,退回 partial_image(完整可用,画质略低)
if [ -z "$img" ]; then
  img=$(sed -n 's/^data: //p' response.sse | grep -v '^\[DONE\]$' |
    jq -r 'select(.type == "response.image_generation_call.partial_image")
           | .partial_image_b64 // empty' |
    tail -n 1)
fi

if [ -n "$img" ]; then
  printf '%s' "$img" | base64 -d > image.png   # → 1672x941
else
  echo "本次未取到图,请重试"
fi

垫图(比例跟随参考图,提示词不写比例) ​

bash
REF=$(base64 -w0 ref_16x9.png)   # macOS 用: base64 -i ref_16x9.png

curl -sS -N https://moacode.org/v1/responses \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d @- <<REQBODY > response.sse
{
  "model": "gpt-image-2",
  "input": [{
    "type": "message", "role": "user",
    "content": [
      {"type": "input_text",  "text": "在这张画布上画一只三花猫"},
      {"type": "input_image", "image_url": "data:image/png;base64,${REF}"}
    ]
  }],
  "stream": true, "store": false
}
REQBODY
# 取图步骤同上

两步取图缺一不可

提取依赖 jq;final → partial 兜底两步都要做,只解析 final 会丢掉相当一部分成功结果。

其他要点 ​

  • key 与 model 需匹配:不同 key 开通的模型范围不同(有的支持 gpt-image-2 直连,有的支持 gpt-5.5 托管),不匹配时返回 403。两条链路后端为同一引擎,生图行为一致
  • 图像生成仅支持 /v1/responses 端点,/v1/images/generations 未开放
  • quality(low/high)参数有效,但只影响画质、不影响尺寸;默认传入的 quality 为 low。目前按请求计费(每次请求固定价,见模型目录与价格),暂未开放按指定质量的动态计费模式。单次生成约 35~66 秒
  • 需要精确到像素的尺寸(如正好 1024×1024):请在取图后自行 resize / 裁剪

常见问题 ​

返回 401 Unauthorized ​

API Key 缺失、无效或格式错误。请求头必须是:

text
Authorization: Bearer 你的APIKey

返回 400 Bad Request ​

重点检查:

  • 当前渠道是否与请求格式匹配
  • 模型名称是否正确
  • JSON 是否包含多余逗号、错误引号或缺失括号
  • tools 和 tool_choice 是否只用于 Codex Pro 方式

请求显示 200,但没有生成图片 ​

HTTP 200 只表示服务器接受了请求,不代表管道成功提取到图片。查看 response.sse:

  • 是否出现 image_generation_call
  • 对应事件是否包含非空的 result
  • 是否返回了文本形式的错误信息

流式偶尔会提前结束导致收不到最终图——按推荐取图写法解析 partial_image_b64 兜底并重试即可。

jq 报解析错误 ​

SSE 的结束标记 [DONE] 不是 JSON,需要先过滤:

bash
grep -v '^\[DONE\]$'

base64: invalid input ​

说明没有提取到纯 Base64 图片数据。先运行请求并检查 response.sse,确认事件结构和 result 字段与示例一致。

Windows PowerShell 无法直接执行完整命令 ​

管道里用了 sed、grep、jq、base64 -d。Windows 用户建议在 WSL 或 Git Bash 中运行;也可以只用 PowerShell 发请求,但 SSE 解析和解码需自行改写。

MoaCode — One key. Every coding agent.