mcpField
N
nano-banana

nano-banana

github.com/okou-ai创意与媒体8146 次安装1 周前更新
代码仓库

关于 nano-banana

nano-banana 是使用 Google Gemini 图像模型生成和编辑图像的技能,涵盖文本生成图像、图像编辑、多图合成和多轮对话式调整。

主要功能

  1. 01根据文本生成图像
  2. 02按文本指令编辑图像
  3. 03合成多张输入图像
  4. 04多轮对话式调整图像
  5. 05控制宽高比和图像尺寸

适用场景

  1. 01根据文字描述创建图像
  2. 02按指令修改现有图像
  3. 03将产品图合成到场景中
  4. 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-imagegemini-3.1-flash-imagegemini-3-pro-image
物体(高保真度)14106
角色(一致性)—45
风格参考——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-imageNano Banana 2默认 — 用途广泛的主力模型,文字渲染效果出色512 / 1K / 2K / 4K$0.045 / $0.067 / $0.101 / $0.151
gemini-3-pro-imageNano Banana Pro质量最高,世界知识和品牌一致性最佳1K / 2K / 4K$0.134 / $0.134 / $0.24
gemini-3.1-flash-lite-imageNano Banana 2 Lite价格最低、延迟最低,适合高调用量512 / 1K1K 时为 $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"
  }]
}

指南

  1. 端点因模型而异 — URL 以 <model>:generateContent 结尾。不要在请求正文中使用 model 字段并尝试调用 /v1beta/models:generateContent;防火墙仅允许调用各模型对应的端点。
  2. 请求正文请使用 JSON 文件 — 写入 /tmp/nano_banana_*.json,避免长提示词和 Base64 负载引发 shell 引号问题。
  3. 准备 Linux 图片输入时始终使用 base64 -w0 — 不带 -w0 的 base64 会插入换行符,导致 JSON 转义出错。
  4. 输出是 Base64,不是 URL — 解码图片部分的 data,并将字节直接写入磁盘。mime_type 会告知文件扩展名(png / jpeg / webp)。
  5. 取最后一张非思考图片 — Gemini 3 图片模型总是会先进行思考,并最多返回两张中间图片。无法禁用思考。获取第一个图片部分会得到草稿;获取所有图片部分则会生成损坏的文件。
  6. 迭代时优先使用 Flash,最终成品切换到 Pro — Flash 几秒内即可返回结果;Pro 明显较慢,费用约为 2 倍,但文字、手部和精细细节的效果更好。
  7. 提示词要具体 — 描述主体、风格、光线、构图和氛围。编辑时,说明要更改的内容和需要保留的内容。
  8. 输入图片尺寸 — 对非常大的输入图片先进行缩小,再进行 Base64 编码;完整往返的费用会随负载大小增加。

评论

支持 Markdown