Nano Banana 2(Gemini 3.1 Flash Image)
Nano Banana 2 API 调用文档:使用 Google 的 generateContent 请求体,通过一个异步端点完成图像生成与编辑,最高 4K 输出,最多 14 张参考图。
Nano Banana 2 是 Google 的 Gemini 3.1 Flash Image 模型。发送 Google 的 generateContent 请求体并附上 model 字段,保存返回的任务 ID,然后查询该任务以获取生成完成的图像。参考图以 fileData URL 的形式放在 contents 中。
模型 ID
| 模型 ID | 渠道 | 计费方式 |
|---|---|---|
gemini-3.1-flash-image | Standard | 每交付一张图收一个固定价 |
gemini-3.1-flash-image-official | Official | 输入、文本/思考输出和图像输出分别按 token 费率计费 |
两个 ID 接受相同的参数。当前价格见模型页。
快速示例
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-image",
"contents": [{"parts": [{"text": "A ceramic teapot on a linen tablecloth, soft window light"}]}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {"aspectRatio": "16:9", "imageSize": "2K"}
}
}'端点
POST https://api.seedrouter.ai/v1/images/generations| 请求头 | 值 |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
请求体就是 Google 的 generateContent 请求,只多了一个 model 字段,因为本端点的路径中不包含模型名。响应返回的是任务 ID,而不是生成完成的图像。请把 API Key 保存在服务端代码中。不支持直接调用 /v1beta/models/...:generateContent,请使用本端点。
参数
| 名称 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
model | string | 是 | — | 上面两个模型 ID 之一。 |
contents | Content[] | 是 | — | 1–32 轮。每轮包含 parts 和可选的 role(user 或 model);最后一轮必须是 user。 |
contents[].parts[].text | string | — | — | 文本 part。至少需要一个文本 part。 |
contents[].parts[].fileData | object | 否 | — | {"mimeType": "...", "fileUri": "https://..."};图像、视频或 PDF 引用。总共最多 14 个。 |
systemInstruction | object | 否 | — | {"parts": [{"text": "..."}]}。 |
safetySettings | object[] | 否 | — | {"category", "threshold"} 组合;见下文。 |
generationConfig.responseModalities | enum[] | 否 | 文本和图像 | ["IMAGE"] 表示只返回图像,或 ["TEXT", "IMAGE"]。 |
generationConfig.imageConfig.aspectRatio | enum | 否 | 输入图像的比例,否则为 1:1 | 1:1、1:4、4:1、1:8、8:1、2:3、3:2、3:4、4:3、4:5、5:4、9:16、16:9、21:9。 |
generationConfig.imageConfig.imageSize | enum | 否 | 1K | 512、1K、2K、4K。K 须大写。 |
generationConfig.candidateCount | integer | 否 | 1 | 只能为 1。一次请求返回一张图像。 |
generationConfig.temperature | number | 否 | 模型默认值 | 0–2。 |
generationConfig.topP | number | 否 | 模型默认值 | 0–1。 |
generationConfig.topK | integer | 否 | 模型默认值 | 1 或以上。 |
generationConfig.seed | integer | 否 | — | 32 位整数。 |
generationConfig.maxOutputTokens | integer | 否 | 模型默认值 | 1–32,768。 |
generationConfig.stopSequences | string[] | 否 | — | 最多 5 个。 |
generationConfig.mediaResolution | enum | 否 | 模型默认值 | MEDIA_RESOLUTION_LOW、MEDIA_RESOLUTION_MEDIUM、MEDIA_RESOLUTION_HIGH。决定输入媒体占用多少 token。 |
generationConfig.thinkingConfig.includeThoughts | boolean | 否 | false | 以 output.thoughts 返回模型的思考摘要。 |
generationConfig.responseFormat.image | object | 否 | — | mimeType:IMAGE_JPEG;delivery:INLINE;aspectRatio 和 imageSize 使用 Google 的枚举值,如 ASPECT_RATIO_SIXTEEN_BY_NINE 和 IMAGE_SIZE_TWO_K,可选比例与尺寸与 imageConfig 相同。 |
安全类别:HARM_CATEGORY_HARASSMENT、HARM_CATEGORY_HATE_SPEECH、HARM_CATEGORY_SEXUALLY_EXPLICIT、HARM_CATEGORY_DANGEROUS_CONTENT。阈值:BLOCK_NONE、BLOCK_ONLY_HIGH、BLOCK_MEDIUM_AND_ABOVE、BLOCK_LOW_AND_ABOVE、OFF。
未知字段会被拒绝。暂不支持:Google Search grounding(tools)和缓存内容;此模型的文档中没有 thinkingLevel。不接受 inlineData,请以 fileData URL 传入媒体。responseFormat.image.delivery 只接受 INLINE:生成完成的图像始终以托管 URL 返回。
输出尺寸
imageSize | 1:1 输出 | 图像 token |
|---|---|---|
512 | 512×512 | 747 |
1K | 1024×1024 | 1,120 |
2K | 2048×2048 | 1,680 |
4K | 4096×4096 | 2,520 |
其他宽高比的 token 数相同;例如 1K 下的 16:9 为 1376×768。
模式
没有单独的模式参数,也没有单独的编辑端点。
| 操作 | 参数 |
|---|---|
| 文生图 | 一个文本 part |
| 编辑或合成 | 文本 part + 一个或多个 fileData part |
| 多轮编辑 | 之前的 user 与 model 轮次,再加一个新的 user 轮次(见下方说明) |
要继续一段对话,请按顺序用上一个任务的 output.parts 重建 model 轮次:文本 part 写成 {"text": ..., "thoughtSignature": ...},图像 part 写成 {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}。每个 thoughtSignature 都要原样保留:它是我们为你保存的签名的 URL(一张 4K 图像的签名有好几 MB),我们会在请求到达模型之前把它还原。只接受你自己任务结果中的签名。
用参考图编辑
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-image",
"contents": [{
"role": "user",
"parts": [
{"text": "Turn this photo into a watercolor painting. Keep the composition."},
{"fileData": {"mimeType": "image/jpeg", "fileUri": "https://example.com/photo.jpg"}}
]
}]
}'请把示例 URL 替换成你自己的、可访问的图像。
媒体输入
本 API 只接受 URL 引用。不接受 base64 inlineData、data: URL 和 multipart 上传。Playground 会先把所选文件上传到存储,再提交其 URL。
引用必须是公开可访问的 HTTP(S) URL,单个文件小于 50 MB,总计不超过 100 MB:图像(image/png、image/jpeg、image/webp、image/heic、image/heif)、视频(video/mp4、video/mpeg、video/mov、video/avi、video/x-flv、video/mpg、video/webm、video/wmv、video/3gpp)或 PDF 文档(application/pdf)。mimeType 必须与文件一致。URL 在处理过程中才会被拉取;图像无法访问会导致任务失败,失败的任务不计费。
计费维度
当前费率请查看模型定价部分。gemini-3.1-flash-image 每交付一张图收一个固定价,与尺寸和提示词无关。gemini-3.1-flash-image-official 按用量计费:输入 token(文本和参考图)、文本与思考输出 token、图像输出 token,各按各自的费率。图像尺寸是主要因素,见上表。
最终扣费请在账号的用量记录中查看。失败的任务不计费。
输出结构
提交后返回一个任务引用:
{
"id": "task_...",
"model": "gemini-3.1-flash-image",
"status": "processing",
"created_at": 1790310979
}轮询任务
curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"每隔几秒轮询一次,直到 status 变为 completed 或 failed。轮询过程中出现网络超时,并不意味着生成失败:请保留任务 ID 并继续查询。不要为了查看进度而再创建一个任务。
完整轮询示例
请在上面的 Python 提交示例之后运行这段代码。
import time
deadline = time.monotonic() + 600
while time.monotonic() < deadline:
result = requests.get(
f"https://api.seedrouter.ai/v1/tasks/{task_id}",
headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
timeout=30,
)
result.raise_for_status()
task = result.json()
if task["status"] == "completed":
for image in task["output"]["data"]:
print(image["url"])
break
if task["status"] == "failed":
raise RuntimeError(task["error"]["message"])
time.sleep(3)
else:
raise TimeoutError(f"Still waiting. Resume polling task {task_id}.")已完成的任务
{
"id": "task_...",
"model": "gemini-3.1-flash-image",
"status": "completed",
"created_at": 1790310979,
"finished_at": 1790311001,
"output": {
"created": 1790310999,
"data": [{"url": "https://static.seedrouter.ai/media/tasks/task_example/0.jpg"}],
"output_format": "jpeg",
"usage": {
"input_tokens": 27,
"output_tokens": 1525,
"total_tokens": 1552,
"output_tokens_details": {"image_tokens": 1120, "text_tokens": 405, "reasoning_tokens": 0}
}
}
}| 字段 | 含义 |
|---|---|
id | 请保留该 ID 用于后续查询。 |
status | processing、completed 或 failed。 |
created_at、finished_at | 以秒为单位的 Unix 时间戳。 |
output.data[].url | 生成的图像 URL。 |
output.text | 当 responseModalities 包含 TEXT 时,模型随图像返回的文本。不含思考内容。 |
output.thoughts | 当 includeThoughts 为 true 时,模型的思考摘要。模型在思考过程中绘制的中间图像不会交付。 |
output.output_format | 实际图像格式。 |
output.parts | 按顺序排列的最终响应 part,用于多轮编辑:{"text", "thoughtSignature"} 或 {"image": <index into data>, "thoughtSignature"}。thoughtSignature 是一个 URL,请原样传回。 |
output.usage | token 用量。output_tokens 计入文本、思考和图像输出;output_tokens_details.image_tokens 是其中的图像部分。 |
error | 任务失败时的结构化错误。 |
不支持流式输出(streamGenerateContent);结果通过任务交付。
错误
在任务创建之前被拒绝的请求,会返回 HTTP 错误状态码和一个 error 对象。受理之后才失败的任务,在查询时返回 HTTP 200,并带有 status: "failed" 和一个 error 对象。图像被模型的安全过滤器拦截时以 content_policy_violation 失败;响应中没有图像时以 no_output 失败。
错误码、HTTP 状态码和重试建议请参见公共错误目录。
{
"id": "task_...",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}如果提交本身超时,请先检查你的任务历史再重新提交:第一次请求有可能已经被受理。
实用建议
- 用完整的句子描述主体、场景、光线和风格。
- 做编辑时,既要说明要改什么,也要说明哪些必须保持不变。
- 草稿用
512或1K,最终素材用2K或4K。 - 需要长期保存时,请把返回的图像保存到你自己的存储中。
