GPT 生图接口
MoaCode 提供两种 GPT 生图调用方式:
- Codex Pro 渠道:由
gpt-5.5调用gpt-image-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
完整调用示例
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
完整调用示例
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 Pro | GPT-IMAGE-2 |
|---|---|---|
顶层 model | gpt-5.5 | gpt-image-2 |
| 是否声明生图工具 | 是 | 否 |
是否设置 tool_choice | 是 | 否 |
| 生图参数位置 | tools 数组中 | 由图像模型接口或渠道默认配置决定 |
| 请求结构 | 较完整,支持模型调用工具 | 较简单,直接生成图片 |
| 对应渠道 | Codex Pro | GPT-IMAGE-2 |
请根据所选渠道使用对应请求格式,不要把两种格式混合——直接调用 gpt-image-2 时通常不需要再声明 image_generation 工具。
尺寸与宽高比控制
以下均为实测结论:
- 接口不支持
size参数——传任意值均不生效(也不会报错),各种调用形式(直连 / gpt-5.5 托管 / tool_choice)行为一致 - GPT-IMAGE 的模型固定输出约 150 万像素(1,572,864),无法通过参数提高;需要更大尺寸请取图后自行放大
- 宽高比有两个可靠的控制方式:
- 提示词写明比例:
一只三花猫,16:9 构图→ 精确生效 - 附参考图(垫图):content 里附一张目标比例的图(纯色即可),输出跟随其比例
- 提示词写明比例:
- 比例支持范围为 5:2 ~ 2:5,超出范围时模型会自行调整,结果不保证
- 流式响应偶尔会提前结束(HTTP 仍为 200 但收不到最终图),建议解析
partial_image_b64作为兜底并配合重试
比例 → 实际尺寸对照
公式:宽 = √(1572864 × r),高 = √(1572864 ÷ r)(r = 宽/高,误差 ±1 像素)
| 提示词写 | 返回尺寸 | 提示词写 | 返回尺寸 | |
|---|---|---|---|---|
1:1 | 1254 × 1254 | 16:9 | 1672 × 941 | |
3:2 | 1536 × 1024 | 9:16 | 941 × 1672 | |
2:3 | 1024 × 1536 | 2:1 | 1774 × 887 | |
4:3 | 1448 × 1086 | 5:2(最宽) | 1983 × 793 | |
3:4 | 1086 × 1448 | 2: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 的选档功能不可用,比例改由提示词或参考图控制。
推荐取图写法(含兜底)
文生图(提示词控制比例)
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垫图(比例跟随参考图,提示词不写比例)
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 缺失、无效或格式错误。请求头必须是:
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,需要先过滤:
grep -v '^\[DONE\]$'base64: invalid input
说明没有提取到纯 Base64 图片数据。先运行请求并检查 response.sse,确认事件结构和 result 字段与示例一致。
Windows PowerShell 无法直接执行完整命令
管道里用了 sed、grep、jq、base64 -d。Windows 用户建议在 WSL 或 Git Bash 中运行;也可以只用 PowerShell 发请求,但 SSE 解析和解码需自行改写。