Nano Banana(gemini-2.5-flash-image-preview) APIを試す。
はじめに
Nano Banana(gemini-2.5-flash-image-preview) APIをLangChainやGoogle Gen AI SDKから利用してみたのでまとめます。
なお、今回はVertex AIのNano Banana(gemini-2.5-flash-image-preview)モデルを利用します。
つまり、Google CloudのVertex AIが利用できることを大前提とします。
もし、Gemini APIのモデルを利用したい場合は、下記の記事を参考に、認証部分とモデル定義の部分を変更すれば、ほぼ同様に利用できると思います。
なお、普通に試すだけであればGoogle AI Studioから試すことをお勧めします。
ただ、APIから試すことで、同じ画像編集プロンプトで複数の画像を同時に取得できたりするので、使い道はあるかと思います。
なお、Google Gen AI SDKでの利用は、下記のVertex AIのModel Gardenのドキュメントを参考にしています。
LangChainでの使い方は、過去に書いた下記の記事の通り、画像生成に関してはドキュメントを、画像編集に関しては参考文献なしで記載しています。
したがって、誤りなどあればこっそり教えていただけますと幸いです。
リポジトリ
下記のリポジトリをご覧ください。
準備
リポジトリをクローンする
下記コマンドでリポジトリをクローンしてください。
git clone https://github.com/personabb/langchain_asap_sample.git
この記事では、リポジトリ内の下記フォルダを利用します。
cd langchain_asap_sample/gemini2.5_image_generation
環境変数
まずはリポジトリ内の、.env.example
ファイルを.env
にリネームします。
その後、Google Cloudのサービスアカウントでの認証用JSONを作成し、.env
ファイルに記載されているパスauth_json/auth.json
にリネームして保存します
サービスアカウントの認証用JSONキーの取得方法は下記の記事などを参照してください
なお、下記のコマンドにて一時的な認証情報を取得しても良いです。
この場合は、JSONキーは不要になります
gcloud auth application-default login
仮想環境の構築
下記のコマンドで環境を構築してください
pip install -r requirements.txt
uv使っている方は下記でおそらく仮想環境は構築できます。
uv sync
実行
画像生成
Google Gen AI SDK
パラメータ
コード内の下記の箇所を修正することで、作成する画像や、何回APIを叩くかを設定できます。
MODEL_ID = "gemini-2.5-flash-image-preview"
# ========== 一度に生成する生成枚数の指定 ==========
generate_images = 1
# ========== 生成内容の指定 ==========
query = "家のPCデスクの実写画像を作成してください。机の上にはノートPCとコーヒーカップを置いてください。机の色は黒色でお願いします。そのほかは一般的な部屋の様子でいい感じに作ってください。"
# =================================
実行コマンド
下記コマンドで実行ができます。
python vertexai_image_generation_api.py
LangChain
パラメータ
コード内の下記の箇所を修正することで、作成する画像や、何回APIを叩くかを設定できます。
model = ChatVertexAI(
model_name="gemini-2.5-flash-image-preview",
credentials=credentials,
project=project_id,
location="global",
temperature=0.7,
response_modalities=[Modality.IMAGE, Modality.TEXT]
)
・・・・・・
# ========== 一度に生成する生成枚数の指定 ==========
generate_images = 1
# ========== 生成内容の指定 ==========
query = "家のPCデスクの実写画像を作成してください。机の上にはノートPCとコーヒーカップを置いてください。机の色は黒色でお願いします。そのほかは一般的な部屋の様子でいい感じに作ってください。"
# =================================
実行コマンド
下記コマンドで実行ができます。
python vertexai_image_generation_langchain.py
画像編集
Google Gen AI SDK
パラメータ
コード内の下記の箇所を修正することで、作成する画像や、参照させる画像、何回APIを叩くかを設定できます。
参照させる画像は、ローカルに置かれている画像を利用します。(githubにも格納済みです)
今回は、base64に画像をエンコードして、モデルに入力します。
MODEL_ID = "gemini-2.5-flash-image-preview"
# ========== 一度に生成する生成枚数の指定 ==========
generate_images = 1
# ========== 読み込む画像のパス ==========
file_path = "inputs/images3.png"
# ========== 編集内容の指定 ==========
query = "リアルな3dフィギュアにしてください。ただしポーズをもっとかっこいい女の子のポーズにしてください。"
# =================================
実行コマンド
下記コマンドで実行ができます。
python vertexai_image_editing_api.py
LangChain
パラメータ
コード内の下記の箇所を修正することで、作成する画像や、参照させる画像、何回APIを叩くかを設定できます。
参照させる画像は、ローカルに置かれている画像を利用します。(githubにも格納済みです)
今回は、base64に画像をエンコードして、モデルに入力します。
model = ChatVertexAI(
model_name="gemini-2.5-flash-image-preview",
credentials=credentials,
project=project_id,
location="global",
temperature=0.7,
response_modalities=[Modality.IMAGE, Modality.TEXT]
)
・・・・・・
# ========== 一度に生成する生成枚数の指定 ==========
generate_images = 1
# ========== 読み込む画像のパス ==========
file_path = "inputs/images3.png"
# ========== 編集内容の指定 ==========
query = "3dフィギュアにしてください。ただしポーズをもっとかっこいい女の子のポーズにしてください。"
# =================================
実行コマンド
下記コマンドで実行ができます。
python vertexai_image_editing_langchain.py
結果
そんなにまだ試せていないですが、画像編集の結果をいくつか提示いたします。
やはり、ここで言及するまでもなく精度は高いですね。
入力画像
自分のキャラクターです。
編集済み画像1
プロンプト:「画像に写っている女の子を元にした漫画を作成してください。4コマ漫画で、楽しそうに友達と遊んでいるところがいいです。」
編集済み画像2
プロンプト:「3dフィギュアにしてください。ただしポーズをもっとかっこいい女の子のポーズにしてください。」
うまく行っていないところ
これはコードの問題なのか、APIの問題なのかわからないですが、30%-80%くらいの頻度で生成画像が返ってこないことがあります。(プロンプトによって返ってこない確率が変わります。)
Nano Bananaでは、画像編集を依頼した場合、最初にテキストが出力され、その後画像が生成されます。(これは、gemini-2.0-flash-preview-image-generationの時から同じでした)
ここで、テキストだけが出力され、画像が出力されないことが高頻度で発生します。
おそらく、システムプロンプトなどで確率を上げれるかもですが、ベストプラクティスなどあれば、ぜひ教えていただきたいです・・・
プロンプトを英語に設定することで、100%画像を取得できるようになりました。
日本語のプロンプトでも画像は返ってきますが、システムに導入する場合は英語で導入することをお勧めします!
(ちなみに、生成される画像の品質自体は、プロンプトが日本語でも英語でも大きく変わらない印象です)
もちろん、私が試した範囲では100%だったと言うだけなので、別プロンプトなどではうまくいかないかもです。うまくいかないプロンプトなどあれば教えて欲しいです!
まとめ
読んでくださってありがとうございます!
(この記事は人力で書いております)
Discussion