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
使用する場面
次のような場合に、このスキルを使用します。
- テキストプロンプトから画像を生成する
- テキストの指示で既存の画像を編集する(インペイント/スタイル変更/追加・削除)
- 複数の入力画像を1つの出力画像に合成する(例:商品をシーンに配置する)
- 細かく制御しながら、会話形式で画像を調整する
前提条件
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を実行してください。
使用方法
すべての呼び出しは、ヘッダー x-goog-api-key: $NANO_BANANA_TOKEN を付けて POST https://generativelanguage.googleapis.com/v1beta/models/<model>:generateContent に送信します。出力画像は Base64 エンコードされ、candidates[0].content.parts[*].inline_data.data に返されます。適切な part の選び方については、セクション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 の画像モデルは回答前に思考し、その内容がインラインで返されます。中間画像は最大2枚返され、"thought": true の part として示された後に、最終的な画像が返されます。thought ではない最後の画像 part を使用してください。 すべての画像 part を選択すると、中間フレームが連結されて破損したファイルになります。
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
生成が拒否された場合、または安全性の理由でブロックされた場合、画像 part は返されず、上記のコマンドは空のファイルを書き込みます。出力を使用する前にファイルサイズを確認し、candidates[0].finishReason とテキスト part を読んで理由を確認してください。
4. 既存の画像を編集(画像から画像を生成)
入力画像を2つ目の part として渡します。ローカルファイルまたは 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. 複数画像の合成
複数の入力画像を1つの出力画像に合成します。たとえば、商品(画像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 part を除外します。
jq -r '.candidates[0].content.parts[] | select((.thought // false) | not) | select(.text != null) | .text' /tmp/nano_banana_response.json
画像に至った推論を読むには、代わりに thought part を選択します。
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 の4種類には対応していません。
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 ファイルを使用してください — 長いプロンプトや Base64 ペイロードのシェルでの引用符の問題を避けるため、
/tmp/nano_banana_*.jsonに書き込んでください。 - Linux の画像入力を準備する際は、必ず
base64 -w0を使用してください —-w0を付けずにbase64を実行すると改行が挿入され、JSON のエスケープが壊れます。 - 出力は常に Base64 で、URL ではありません — 画像パートの
dataをデコードし、バイト列を直接ディスクに書き込んでください。拡張子(png/jpeg/webp)はmime_typeで確認できます。 - 思考以外の最後の画像を使用してください — Gemini 3 の画像モデルは常に思考し、最初に中間画像を最大2枚返します。思考は無効にできません。最初の画像パートを取得するとドラフトになり、すべて取得するとファイルが破損します。
- 反復作業にはFlash を優先し、最終版には Pro に切り替えてください — Flash は数秒で処理が完了します。Pro は明らかに遅く、コストはおよそ2倍ですが、テキスト、手、細部の表現に優れています。
- 具体的なプロンプトを作成してください — 被写体、スタイル、照明、構図、雰囲気を説明してください。編集の場合は、変更する点と維持する点を伝えてください。
- 入力画像のサイズ — 非常に大きな入力画像は Base64 にエンコードする前に縮小してください。往復処理全体のコストはペイロードのサイズに応じて増加します。