关于 nano-banana
nano-banana 是使用 Google Gemini 图像模型生成和编辑图像的技能,涵盖文本生成图像、图像编辑、多图合成和多轮对话式调整。
主要功能
- 01根据文本生成图像
- 02按文本指令编辑图像
- 03合成多张输入图像
- 04多轮对话式调整图像
- 05控制宽高比和图像尺寸
适用场景
- 01根据文字描述创建图像
- 02按指令修改现有图像
- 03将产品图合成到场景中
- 04通过多轮对话迭代图像
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ okou-ai/ okou-skills --skill nano-banana安装后在 Claude Code 中输入/nano-banana确认已加载。
详细介绍
Nano Banana(Gemini 图像生成)
使用 Google 的 Gemini 原生图像模型生成和编辑图像。通过标准的 generateContent 端点支持文本生成图像、图像编辑和多图合成。
官方文档:
https://ai.google.dev/gemini-api/docs/generate-content/image-generation
使用场景
在以下情况下使用此技能:
- 根据文本提示词生成图像
- 使用文本指令编辑现有图像(局部重绘 / 更改风格 / 添加或移除内容)
- 将多张输入图像合成为一张输出图像(例如,将产品放入场景中)
- 以对话形式迭代调整图像,并进行精细控制
前提条件
在 app.okou.ai/connectors 连接 Nano Banana 连接器。启用连接器后会配置 NANO_BANANA_TOKEN,无需 Google Cloud 账号或用户提供密钥。
故障排查: 如果请求失败,请运行
okou doctor check-connector --env-name NANO_BANANA_TOKEN或okou doctor check-connector --url https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image:generateContent --method POST
使用方法
所有调用都会向 POST https://generativelanguage.googleapis.com/v1beta/models/<model>:generateContent 发送请求,并附带请求头 x-goog-api-key: $NANO_BANANA_TOKEN。输出图像会以 Base64 编码的形式返回在 candidates[0].content.parts[*].inline_data.data 中——如何选取正确的部分,请参见第 3 节。
1. 文本生成图像(Flash — 快速、通用的默认选项)
写入 /tmp/nano_banana_request.json:
{
"contents": [
{
"parts": [
{ "text": "A golden retriever puppy wearing a tiny chef hat, studio lighting, photorealistic" }
]
}
]
}
curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image:generateContent" --header "x-goog-api-key: $NANO_BANANA_TOKEN" --header "Content-Type: application/json" -d @/tmp/nano_banana_request.json > /tmp/nano_banana_response.json
2. 文本生成图像(Pro — 最高质量)
curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image:generateContent" --header "x-goog-api-key: $NANO_BANANA_TOKEN" --header "Content-Type: application/json" -d @/tmp/nano_banana_request.json > /tmp/nano_banana_response.json
3. 提取并保存图像
Gemini 3 图像模型会在回答前进行思考,思考内容会以内联形式返回:最多会有两张标记为 "thought": true 的中间图像,随后才是最终渲染结果。请选取最后一个非思考图像部分——选取所有图像部分会把中间帧拼接起来,生成损坏的文件。
jq -r '[ .candidates[0].content.parts[]
| select((.thought // false) | not)
| (.inlineData // .inline_data)
| select(. != null) ]
| last | .data // empty' /tmp/nano_banana_response.json | base64 -d > /tmp/nano_banana_output.png
如果生成请求被拒绝或被安全机制拦截,则不会返回任何图像部分,上述命令会写入空文件。使用输出前请检查文件大小,并读取 candidates[0].finishReason 和文本部分,了解原因。
4. 编辑现有图像(图像到图像)
将输入图像作为第二部分传入。使用本地文件或 URL → Base64:
base64 -w0 /path/to/input.jpg > /tmp/nano_banana_input_b64.txt
写入 /tmp/nano_banana_request.json:
{
"contents": [
{
"parts": [
{ "text": "Replace the background with a snowy mountain range at sunset. Keep the subject unchanged." },
{
"inline_data": {
"mime_type": "image/jpeg",
"data": "<PASTE_CONTENTS_OF_/tmp/nano_banana_input_b64.txt>"
}
}
]
}
]
}
或者使用 jq 构建 JSON,避免手动粘贴:
jq -n --rawfile img /tmp/nano_banana_input_b64.txt '{
contents: [{
parts: [
{ text: "Replace the background with a snowy mountain range at sunset. Keep the subject unchanged." },
{ inline_data: { mime_type: "image/jpeg", data: $img } }
]
}]
}' > /tmp/nano_banana_request.json
curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image:generateContent" --header "x-goog-api-key: $NANO_BANANA_TOKEN" --header "Content-Type: application/json" -d @/tmp/nano_banana_request.json > /tmp/nano_banana_response.json
5. 多图合成
将多张输入图像合成为一张输出图像——例如,将产品(图像 A)放入场景(图像 B):
jq -n \
--rawfile a /tmp/product_b64.txt \
--rawfile b /tmp/scene_b64.txt \
'{
contents: [{
parts: [
{ text: "Place the product from the first image onto the wooden table in the second image. Match the lighting and shadows." },
{ inline_data: { mime_type: "image/png", data: $a } },
{ inline_data: { mime_type: "image/jpeg", data: $b } }
]
}]
}' > /tmp/nano_banana_request.json
curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image:generateContent" --header "x-goog-api-key: $NANO_BANANA_TOKEN" --header "Content-Type: application/json" -d @/tmp/nano_banana_request.json > /tmp/nano_banana_response.json
Gemini 3 模型最多可混合 14 张参考图像,但各模型针对不同角色的数量上限有所不同:
| 参考图像角色 | gemini-3.1-flash-lite-image | gemini-3.1-flash-image | gemini-3-pro-image |
|---|---|---|---|
| 物体(高保真度) | 14 | 10 | 6 |
| 角色(一致性) | — | 4 | 5 |
| 风格参考 | — | — | 3 |
6. 控制输出模态和宽高比
Gemini 可以在返回图像的同时返回文本。若要请求仅输出图像并指定宽高比,请添加 generationConfig:
{
"contents": [
{ "parts": [{ "text": "A minimalist poster for a jazz festival" }] }
],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {
"aspectRatio": "16:9",
"imageSize": "2K"
}
}
}
curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image:generateContent" --header "x-goog-api-key: $NANO_BANANA_TOKEN" --header "Content-Type: application/json" -d @/tmp/nano_banana_request.json > /tmp/nano_banana_response.json
7. 对话式编辑(多轮优化)
追加上一轮模型回复和新的用户消息,即可继续优化。重复使用模型返回的 Base64 图像,无需重新上传——请传回最终图像,而非中间思考帧:
PREV_IMG=$(jq -r '[ .candidates[0].content.parts[]
| select((.thought // false) | not)
| (.inlineData // .inline_data)
| select(. != null) ]
| last | .data // empty' /tmp/nano_banana_response.json)
jq -n --arg img "$PREV_IMG" '{
contents: [
{ role: "user", parts: [{ text: "A minimalist poster for a jazz festival" }] },
{ role: "model", parts: [{ inline_data: { mime_type: "image/png", data: $img } }] },
{ role: "user", parts: [{ text: "Make the typography bolder and shift the palette to deep blue and gold." }] }
]
}' > /tmp/nano_banana_request.json
curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image:generateContent" --header "x-goog-api-key: $NANO_BANANA_TOKEN" --header "Content-Type: application/json" -d @/tmp/nano_banana_request.json > /tmp/nano_banana_response.json
gemini-3.1-flash-lite-image 未针对多轮连续编辑或多个参考输入进行优化——第 5 节和第 7 节请使用 Flash 或 Pro。
8. 查看模型返回的文本
模型可能会在图像旁附带简短的文本说明。跳过 thought 部分即可获取说明,而不是模型的推理内容:
jq -r '.candidates[0].content.parts[] | select((.thought // false) | not) | select(.text != null) | .text' /tmp/nano_banana_response.json
若要查看模型生成图像时的推理过程,请改为选取思考部分:
jq -r '.candidates[0].content.parts[] | select(.thought == true) | select(.text != null) | .text' /tmp/nano_banana_response.json
模型参考
| 模型 | 名称 | 等级 | 图片尺寸 | 每张图片的输出价格 |
|---|---|---|---|---|
gemini-3.1-flash-image | Nano Banana 2 | 默认 — 用途广泛的主力模型,文字渲染效果出色 | 512 / 1K / 2K / 4K | $0.045 / $0.067 / $0.101 / $0.151 |
gemini-3-pro-image | Nano Banana Pro | 质量最高,世界知识和品牌一致性最佳 | 1K / 2K / 4K | $0.134 / $0.134 / $0.24 |
gemini-3.1-flash-lite-image | Nano Banana 2 Lite | 价格最低、延迟最低,适合高调用量 | 512 / 1K | 1K 时为 $0.0336 |
以上价格为撰写本文时的标准付费等级价格;如需据此编制预算,请查看 https://ai.google.dev/gemini-api/docs/pricing。
宽高比
gemini-3.1-flash-image 和 gemini-3.1-flash-lite-image 支持全部 14 种宽高比:
1:1、1:4、1:8、2:3、3:2、3:4、4:1、4:3、4:5、5:4、8:1、9:16、16:9、21:9。
gemini-3-pro-image 支持 10 种——四种极端全景宽高比 1:4、4:1、1:8 和 8:1 不可用:
1:1、2:3、3:2、3:4、4:3、4:5、5:4、9:16、16:9、21:9。
如果未指定宽高比,模型会根据提供的参考图片选择;如果没有参考图片,则默认为 1:1。
图片尺寸
generationConfig.imageConfig.imageSize — "512"、"1K"(默认)、"2K"、"4K"。尺寸越大,费用越高,且仅适用于最终渲染;迭代时请保持为 1K。gemini-3-pro-image 不提供 512,而 gemini-3.1-flash-lite-image 的上限为 1K。
响应格式
{
"candidates": [{
"content": {
"parts": [
{ "thought": true, "text": "Considering the composition..." },
{ "thought": true, "inline_data": { "mime_type": "image/png", "data": "<interim base64>" } },
{ "text": "Optional caption..." },
{ "inline_data": { "mime_type": "image/png", "data": "<final base64>" } }
]
},
"finishReason": "STOP"
}]
}
指南
- 端点因模型而异 — URL 以
<model>:generateContent结尾。不要在请求正文中使用model字段并尝试调用/v1beta/models:generateContent;防火墙仅允许调用各模型对应的端点。 - 请求正文请使用 JSON 文件 — 写入
/tmp/nano_banana_*.json,避免长提示词和 Base64 负载引发 shell 引号问题。 - 准备 Linux 图片输入时始终使用
base64 -w0— 不带-w0的base64会插入换行符,导致 JSON 转义出错。 - 输出是 Base64,不是 URL — 解码图片部分的
data,并将字节直接写入磁盘。mime_type会告知文件扩展名(png/jpeg/webp)。 - 取最后一张非思考图片 — Gemini 3 图片模型总是会先进行思考,并最多返回两张中间图片。无法禁用思考。获取第一个图片部分会得到草稿;获取所有图片部分则会生成损坏的文件。
- 迭代时优先使用 Flash,最终成品切换到 Pro — Flash 几秒内即可返回结果;Pro 明显较慢,费用约为 2 倍,但文字、手部和精细细节的效果更好。
- 提示词要具体 — 描述主体、风格、光线、构图和氛围。编辑时,说明要更改的内容和需要保留的内容。
- 输入图片尺寸 — 对非常大的输入图片先进行缩小,再进行 Base64 编码;完整往返的费用会随负载大小增加。