图片生成
在 Nano Banana、GPT-Image、Seedream、Wan 2.7 模型系列上,通过文本提示词和参考图同步或异步生成图片。
图片生成把文本提示词——可选地由参考图引导——转化为一张或多张图片。四个系列共九个模型共用同一套请求
schema 和同一组接口;用 model 字段选择模型。
你可以用三种方式调用:
- 同步 ——
POST /v1/images/generation阻塞到图片就绪,并在响应体中返回模型原始输出 (base64 图片数据)。 - 异步 ——
POST /v1/images/generation/async立即返回taskId,随后轮询GET /v1/images/generation/tasks/{taskId}获取托管图片 URL。 - 先预估 ——
POST /v1/images/generation/estimate-credits返回积分成本以及账户是否可生成, 不消耗任何额度。
本页所有接口都使用 OpenAPI Base URL https://api.marswave.ai/openapi,并通过
Authorization: Bearer $LISTENHUB_API_KEY 请求头用 API Key 鉴权。在
listenhub.ai/settings/api-keys 创建密钥。
选择模型
先用下表挑选模型,再打开对应系列页面查看精确限制、注意事项和示例。
| 模型 | 系列 | 适用场景 | 尺寸 | 宽高比 | 参考图上限 |
|---|---|---|---|---|---|
gpt-image-2 (默认) | GPT-Image | 提示词遵循能力强,按尺寸固定计价 | 1K, 2K, 4K | 10 种标准比例 | 4 |
gpt-image-2.5-flare | GPT-Image | 第二种 GPT-Image 风格,价格与限制相同 | 1K, 2K, 4K | 10 种标准比例 | 4 |
gpt-image-2.5-sunburst | GPT-Image | 第三种 GPT-Image 风格,价格与限制相同 | 1K, 2K, 4K | 10 种标准比例 | 4 |
gpt-image-2-official | GPT-Image | 唯一会遵循 quality 的模型;按 token 计价 | 1K, 2K, 4K | 10 种标准比例 | 4 |
gemini-3-pro-image | Nano Banana | 输出细节最丰富;Nano Banana Pro | 1K, 2K, 4K | 10 种标准比例 | 14 |
gemini-3.1-flash-image | Nano Banana | 生成更快更便宜;Nano Banana 系列中唯一接受 1:4 / 4:1 / 1:8 / 8:1 的档位 | 1K, 2K, 4K | 全部 14 种 | 14 |
seedream-5-0-pro | Seedream | 按坐标和色号做精准区域编辑 | 1K, 2K | 全部 14 种 | 10 |
wan2.7-image | Wan 2.7 | 在五种常见比例上的低成本生成 | 1K, 2K | 5 种比例 | 9 |
wan2.7-image-pro | Wan 2.7 | 同样的五种比例,支持 4K 输出 | 1K, 2K, 4K | 5 种比例 | 9 |
省略 model 时默认使用 gpt-image-2。10 种标准比例指 1:1、2:3、3:2、3:4、4:3、
4:5、5:4、9:16、16:9 和 21:9 —— 即除四种极端比例外的全部比例。完整规则见
宽高比。
Nano Banana
gemini-3-pro-image 与 gemini-3.1-flash-image:Google 主打细节和主打速度的两个模型,以及四种极端比例。
GPT-Image
gpt-image-2、2.5 Flare 与 Sunburst 变体,以及 GPT-Image-2 Pro —— 唯一会遵循 quality 的模型。
Seedream
seedream-5-0-pro:把坐标写进 prompt,编辑已有图片中指定的区域。
Wan 2.7
wan2.7-image 与 wan2.7-image-pro:五种比例,严格校验,Pro 档支持 4K。
调用流程
预估花费
用你打算生成时使用的同一份请求体调用 POST /v1/images/generation/estimate-credits。它返回
credits 和 canGenerate,不消耗任何额度。积分成本随模型和尺寸变化 —— 请从这个接口读取,
不要写死。
生成
调用 POST /v1/images/generation 阻塞到图片就绪,或调用
POST /v1/images/generation/async 立即拿到 taskId。
获取结果
同步接口在响应体中返回 base64 图片数据。异步接口会替你存储图片 —— 轮询
GET /v1/images/generation/tasks/{taskId} 直到 status 为 success,再读取托管的
images[].url。
请求参数
以下参数适用于 POST /v1/images/generation、POST /v1/images/generation/async 和
POST /v1/images/generation/estimate-credits —— 这三个接口共用同一套请求 schema。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
provider | string | 是¹ | 模型厂商:google、openai、bytedance、alibaba 或 quotaflow |
model | string | 否 | 模型名。默认 gpt-image-2。旧版 preview ID 会归一化为对应的 GA ID。详见 选择模型 |
prompt | string | 是² | 待生成图片的文本描述 |
referenceImages | array | 否 | 用于引导生成的参考图。详见 参考图 |
referenceImages[].fileData | object | 否 | 以 URL 形式提供的参考图 |
referenceImages[].fileData.fileUri | string | 是 | 图片 URL —— scheme 必须为 http、https 或 gs |
referenceImages[].fileData.mimeType | string | 是 | MIME 类型:image/png、image/jpeg、image/webp、image/heic 或 image/heif |
referenceImages[].inlineData | object | 否 | 以 base64 编码数据形式提供的参考图 |
referenceImages[].inlineData.data | string | 是 | base64 编码的图片数据 |
referenceImages[].inlineData.mimeType | string | 是 | MIME 类型:与 fileData.mimeType 相同的五个取值 |
imageConfig | object | 否 | 图片输出配置。默认 { "imageSize": "2K" } |
imageConfig.imageSize | string | 否 | 输出分辨率:1K、2K(默认)或 4K,受各模型限制约束 |
imageConfig.aspectRatio | string | 否 | 宽高比。各系列的默认规则见 宽高比 |
imageConfig.quality | string | 否 | low、medium 或 high。仅 gpt-image-2-official 会遵循;其他模型一律忽略 |
¹ provider 在两个生成接口上必填,在 estimate-credits 上可选。
² prompt 在两个生成接口上必填;在 estimate-credits 上可为空或省略(它只影响输入 token
预估)。
referenceImages 中的每一项必须至少带上 fileData 或 inlineData 之一。请只发送其中一个
—— 校验允许一项同时带两者,但此时行为未定义。
provider 会被校验,但不用于路由 —— 上游完全由 model 决定。请像本组页面的所有示例那样,
发送与模型匹配的厂商值,让请求保持可读;但填得不匹配也不会改变实际运行的模型。
向 gpt-image-2、gpt-image-2.5-flare 或 gpt-image-2.5-sunburst 传 quality 不会报错
—— 该值会被丢弃,estimate-credits 返回警告 quality_ignored_for_gpt_image_2_lite。
只有 gpt-image-2-official 会按请求的质量渲染。详见
GPT-Image。
宽高比
整个模型目录共有 14 种比例。其中 10 种是标准比例,大多数模型都接受;4 种是极端比例,
仅 gemini-3.1-flash-image 和 seedream-5-0-pro 接受。
| 比例 | 说明 | 类别 |
|---|---|---|
1:1 | 正方形 | 标准 |
2:3 | 竖向 | 标准 |
3:2 | 横向 | 标准 |
3:4 | 竖向 | 标准 |
4:3 | 横向 | 标准 |
4:5 | 竖向 | 标准 |
5:4 | 横向 | 标准 |
9:16 | 竖屏 / 移动端 | 标准 |
16:9 | 宽屏 | 标准 |
21:9 | 超宽屏 | 标准 |
1:4 | 窄竖向 | 极端 |
4:1 | 宽横向 | 极端 |
1:8 | 极窄竖向 | 极端 |
8:1 | 全景 | 极端 |
imageConfig.aspectRatio 在 schema 层带有默认值 1:1。只要你发送了 imageConfig 对象却不带
aspectRatio,任何模型都会给你一张正方形图片 —— 下面的分系列行为只在你完全省略
imageConfig 时才生效,因为它自身的对象默认值是 { "imageSize": "2K" },不会设置比例。
在上面的 schema 默认值没有替你填上比例的前提下,aspectRatio 的解析方式如下:
| 系列 | 仍未设置时 | 不支持时 |
|---|---|---|
| Nano Banana | 解析为 1:1 | 400,code: 29003 |
| GPT-Image | 不设置 —— 由模型按提示词选择比例 | 400,code: 26019,消息中给出支持的比例列表 |
| Seedream | 不设置 | 接受 —— Seedream 校验的是尺寸,不是比例 |
| Wan 2.7 | 不设置 | 400,code: 26019,消息中给出支持的比例列表 |
图片尺寸
imageConfig.imageSize 接受 1K、2K(默认)和 4K。尺寸越大消耗的积分越多。
| 模型 | 1K | 2K | 4K |
|---|---|---|---|
| 全部 GPT-Image 模型 | 是 | 是 | 是 |
| 两个 Nano Banana 模型 | 是 | 是 | 是 |
seedream-5-0-pro | 是 | 是 | 400 |
wan2.7-image | 是 | 是 | 400 |
wan2.7-image-pro | 是 | 是 | 仅支持文生图 —— 带参考图时返回 400 |
请勿写死积分成本 —— 调用 estimate-credits 获取你所用模型、尺寸和比例的精确数值。
参考图
参考图用于引导生成。每张参考图要么以 URL(fileData)提供,要么以 base64(inlineData)提供,
不能同时给两者,并且数组长度不得超过所选模型的上限。
| 系列 | 参考图上限 |
|---|---|
| Nano Banana | 14(schema 上限) |
| GPT-Image | 4 |
| Seedream | 10 |
| Wan 2.7 | 9 |
schema 对所有模型都将 referenceImages 限制为最多 14 项。上限更严的系列会以 400 拒绝超出的
部分,并在消息中给出该上限。fileData 和 inlineData 接受的 MIME 类型均为 image/png、
image/jpeg、image/webp、image/heic 和 image/heif。
三个图片接口接受的 JSON 请求体上限为 25MB —— 是平台默认值的四倍,因为 base64 inlineData
必须装得进去。base64 会让文件膨胀约三分之一,所以内联图片的原始字节总量请控制在约 18MB 以内,
或者改用 fileData 传 URL。
生成图片(同步)
POST /v1/images/generation
生成图片并阻塞到图片就绪。响应体是模型原始输出 —— 包含 base64 图片数据的 JSON,不是标准的
{ code, message, data } 信封。详见 响应格式。
curl -X POST "https://api.marswave.ai/openapi/v1/images/generation" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "google",
"model": "gemini-3-pro-image",
"prompt": "An astronaut riding a horse on Mars, photorealistic",
"imageConfig": {
"imageSize": "2K",
"aspectRatio": "16:9"
}
}'const response = await fetch(
'https://api.marswave.ai/openapi/v1/images/generation',
{
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.LISTENHUB_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
provider: 'google',
model: 'gemini-3-pro-image',
prompt: 'An astronaut riding a horse on Mars, photorealistic',
imageConfig: { imageSize: '2K', aspectRatio: '16:9' },
}),
},
)
const result = await response.json()
const image = result.candidates[0].content.parts[0].inlineDataimport os
import requests
response = requests.post(
'https://api.marswave.ai/openapi/v1/images/generation',
headers={'Authorization': f'Bearer {os.environ["LISTENHUB_API_KEY"]}'},
json={
'provider': 'google',
'model': 'gemini-3-pro-image',
'prompt': 'An astronaut riding a horse on Mars, photorealistic',
'imageConfig': {'imageSize': '2K', 'aspectRatio': '16:9'},
},
)
result = response.json()
image = result['candidates'][0]['content']['parts'][0]['inlineData']携带参考图
参考图在每个接口上的用法都相同。图片已有托管地址时用 fileData,图片字节在内存中时用
inlineData。
curl -X POST "https://api.marswave.ai/openapi/v1/images/generation" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "google",
"model": "gemini-3-pro-image",
"prompt": "Redraw this character in a watercolor style",
"referenceImages": [
{
"fileData": {
"fileUri": "https://example.com/character.png",
"mimeType": "image/png"
}
}
],
"imageConfig": { "imageSize": "2K", "aspectRatio": "3:4" }
}'curl -X POST "https://api.marswave.ai/openapi/v1/images/generation" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "google",
"model": "gemini-3-pro-image",
"prompt": "Redraw this character in a watercolor style",
"referenceImages": [
{
"inlineData": {
"data": "'"$(base64 -w0 character.png)"'",
"mimeType": "image/png"
}
}
],
"imageConfig": { "imageSize": "2K", "aspectRatio": "3:4" }
}'携带 base64 参考图的请求受一套独立且更严格的限流约束。遇到 429 时,读取 Retry-After
响应头并退避后再重试。
异步生成
对于耗时较长或高分辨率的任务,提交任务后轮询结果,而不是长时间占用一个请求连接。
创建异步任务
POST /v1/images/generation/async
请求体与同步接口相同。立即返回 202 和一个 taskId;生成在后台进行,产出的图片会以托管 URL
形式持久化。
curl -X POST "https://api.marswave.ai/openapi/v1/images/generation/async" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "google",
"model": "gemini-3-pro-image",
"prompt": "An astronaut riding a horse on Mars, photorealistic",
"imageConfig": { "imageSize": "4K", "aspectRatio": "16:9" }
}'响应(202):
{
"code": 0,
"message": "",
"data": { "taskId": "65f0...", "status": "pending" }
}获取单个任务
GET /v1/images/generation/tasks/{taskId}
轮询单个任务的状态和结果。status 取值为 pending、generating、success 或 fail。
成功时 images 中是托管的结果 URL。
curl "https://api.marswave.ai/openapi/v1/images/generation/tasks/65f0abc..." \
-H "Authorization: Bearer $LISTENHUB_API_KEY"{
"code": 0,
"message": "",
"data": {
"taskId": "65f0abc...",
"status": "success",
"images": [{ "url": "https://.../0.png", "mimeType": "image/png" }],
"createdAt": 1750000000000,
"completedAt": 1750000020000
}
}| 字段 | 类型 | 说明 |
|---|---|---|
taskId | string | 任务标识 |
status | string | pending、generating、success 或 fail |
images | array | 成功时返回;每一项为 { url, mimeType } |
failMsg | string | status 为 fail 时的失败信息 |
createdAt | number | 创建时间(epoch 毫秒) |
completedAt | number | 完成时间(epoch 毫秒),任务结束后返回 |
列出任务
GET /v1/images/generation/tasks
列出你的图片任务,最新的在前。
| 查询参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
page | number | 1 | 页码,最小 1 |
pageSize | number | 20 | 每页条数,1–100 |
status | string | — | 按 pending、generating、success 或 fail 过滤 |
curl "https://api.marswave.ai/openapi/v1/images/generation/tasks?page=1&pageSize=20&status=success" \
-H "Authorization: Bearer $LISTENHUB_API_KEY"{
"code": 0,
"message": "",
"data": {
"items": [
{
"taskId": "65f0...",
"status": "success",
"images": [],
"createdAt": 1750000000000,
"completedAt": 1750000020000
}
],
"page": 1,
"pageSize": 20,
"total": 1
}
}后台任务若停留在 pending 或 generating 超过 30 分钟,会被扫描置为 fail 并附带超时
failMsg。对超过该时长仍处于非终态的任务,按失败处理并重试。
预估积分
POST /v1/images/generation/estimate-credits
返回给定配置的积分成本以及账户余额是否足够,不消耗积分、也不调用模型。接受与生成接口相同的
请求体;这里 provider 和 prompt 为可选。
curl -X POST "https://api.marswave.ai/openapi/v1/images/generation/estimate-credits" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"imageConfig": {
"imageSize": "2K",
"aspectRatio": "1:1"
}
}'const response = await fetch(
'https://api.marswave.ai/openapi/v1/images/generation/estimate-credits',
{
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.LISTENHUB_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'gpt-image-2',
imageConfig: { imageSize: '2K', aspectRatio: '1:1' },
}),
},
)
const { data } = await response.json()
console.log(data.credits, data.canGenerate)import os
import requests
response = requests.post(
'https://api.marswave.ai/openapi/v1/images/generation/estimate-credits',
headers={'Authorization': f'Bearer {os.environ["LISTENHUB_API_KEY"]}'},
json={
'model': 'gpt-image-2',
'imageConfig': {'imageSize': '2K', 'aspectRatio': '1:1'},
},
)
data = response.json()['data']
print(data['credits'], data['canGenerate'])预估响应
包裹在标准信封中。data 对象:
| 字段 | 类型 | 说明 |
|---|---|---|
model | string | 用于预估的归一化 GA 模型 ID |
imageSize | string | 解析出的输出尺寸 |
aspectRatio | string | 解析出的宽高比(模型自动选择时不返回) |
quality | string | 解析出的质量(不适用时不返回) |
pixels | object | 解析成功时为 { "width": number, "height": number, "size": "WxH" } |
credits | number | 该配置将消耗的积分 |
canGenerate | boolean | 账户有效积分余额是否足够 |
requiresSubscription | boolean | 仅 gpt-image-2-official 在 4K 或 quality: high 时为 true |
pricing | object | 定价元数据:pricingVersion、mode(token-estimate 或 fixed)及费率输入 |
warnings | array | 提示性字符串,如 quality_ignored_for_gpt_image_2_lite |
{
"code": 0,
"message": "",
"data": {
"model": "gpt-image-2",
"imageSize": "2K",
"aspectRatio": "1:1",
"credits": 6,
"canGenerate": true,
"requiresSubscription": false,
"pricing": { "pricingVersion": "gpt-image-2-lite-fixed-2026-06-15", "mode": "fixed" },
"warnings": []
}
}大多数模型按尺寸固定积分计价(mode: "fixed")。gpt-image-2-official 按预估 token 计价
(mode: "token-estimate"),因此它的成本会随提示词长度、输出尺寸、请求的质量以及参考图
数量变化(通过 API 调用时每张参考图按统一费率计入)。
credits 始终是该配置的积分价格。它不会扣除免费额度 —— 账户仍有额度时,一次 1K 或
2K 请求会按全价预估,实际却不花钱。如果你需要展示账户真正会付的价格,请自己读取
freeUsages。
免费生成额度
API key 调用与 ListenHub、Labnana 应用共享同一个账户级免费额度(freeUsages)余额。你通过注册、
邀请和签到赚取额度,再通过 API 消费。用
GET /v1/user/subscription 查询实时余额,读取其
freeUsages 映射。
当匹配的余额大于 0 时,一次 1K 或 2K 请求会消费一次免费生成而非积分。余额降到 0 后,
同一请求会回退到正常积分计费。
| 免费额度资源 | 覆盖的模型 |
|---|---|
gemini-3-pro-image-relax-1k-2k | gemini-3-pro-image |
gemini-3.1-flash-image | gemini-3.1-flash-image |
gpt-image-2 | gpt-image-2 |
gpt-image-2.5 | gpt-image-2.5-flare、gpt-image-2.5-sunburst |
seedream-5-0-pro | seedream-5-0-pro |
wan2.7-image | wan2.7-image |
免费额度仅适用于 1K 和 2K 尺寸 —— 4K 请求永远不会动用 freeUsages,始终按积分
计费。gpt-image-2-official 和 wan2.7-image-pro 在任何尺寸下都没有免费额度。
gemini-3-pro-image 是唯一的免费额度跑在独立执行通道上的模型,并带有可供分支判断的专属失败
元数据 —— 见
Nano Banana → relax 通道。
响应格式
| 接口 | 是否包裹信封? | 响应体 |
|---|---|---|
POST /v1/images/generation | 否 —— 模型原始 JSON | base64 图片数据(见下) |
POST /v1/images/generation/async | 是 | { taskId, status } |
POST /v1/images/generation/estimate-credits | 是 | 预估对象 |
GET /v1/images/generation/tasks | 是 | 分页 { items, page, pageSize, total } |
GET /v1/images/generation/tasks/{taskId} | 是 | 任务对象 |
同步接口直接返回模型原始输出。成功的响应体以 base64 数据包含生成的图片:
{
"candidates": [
{
"content": {
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": "<BASE64_ENCODED_IMAGE>"
}
}
]
}
}
]
}将 data 字段从 base64 解码即可得到图片文件。异步路径会替你持久化图片,并在任务对象上返回
托管 url —— 无需做 base64 解码。
错误码
错误使用标准信封并带非零 code;对同步接口,则是
免费生成额度 中描述的原始错误体。
这些路由会把所有业务错误归一化为 HTTP 400。积分不足是带 code: 26004 的 400,不是 402
—— 请按信封里的 code 分支判断,而不是 HTTP 状态码。429 是唯一自带含义的状态码。
例外是同步的 free-relax 失败响应体:它是原始格式而非信封,带的是 errno 而不是 code。
| HTTP 状态码 | code | 含义 |
|---|---|---|
400 | 29003 | 参数无效 —— 模型不接受的尺寸或参考图数量,或 Nano Banana 系列不接受的比例 |
400 | 26019 | GPT-Image 或 Wan 2.7 上不支持的宽高比 |
400 | 26004 | 积分不足 |
400 | 23016 | 需要订阅 —— 账户没有生效中的套餐,却用 gpt-image-2-official 请求 4K 或 quality: high。请先看预估结果里的 requiresSubscription |
429 | — | 触发限流或服务繁忙 —— 读取 Retry-After 后退避重试 |
比例被拒绝时返回的错误码并不统一:Nano Banana 抛 29003,GPT-Image 和 Wan 2.7 抛 26019。
如果你要识别「这个模型不支持该比例」,两个码都得判。
两个生成接口都受按用户和全局的限流约束。携带 base64 参考图(inlineData)的请求受一套独立且
更严格的限制,高峰期可能最先被限流。estimate-credits 不受限流约束。