💻

Nano Banana (gemini-2.5-flash-image-preview)APIを無料で使う方法

に公開

はじめに

どうやらOpenRouterにて、Nano Banana (gemini-2.5-flash-image-preview)APIがFreeで利用できるようになっていましたので、使い方をまとめたいと思います。

https://openrouter.ai/google/gemini-2.5-flash-image-preview:free

OpenRouterのモデルは基本的にはOpenAI API形式で利用することができますが、画像生成、画像編集モデルも同様に利用できるのかを試していきます!

ちなみにVertex AIから利用する場合は先日記載した下記の記事をご覧ください。
https://zenn.dev/asap/articles/8d5af79e40fa4d

なお、OpenRouterについては下記の記事をご覧ください。
https://zenn.dev/asap/articles/5cda4576fbe7cb

リポジトリ

下記のリポジトリをご覧ください。
https://github.com/personabb/langchain_asap_sample/tree/main/gemini_image_generation

準備

リポジトリをクローンする

下記コマンドでリポジトリをクローンしてください。

git clone https://github.com/personabb/langchain_asap_sample.git

この記事では、リポジトリ内の下記フォルダを利用します。

 cd langchain_asap_sample/gemini2.5_image_generation

環境変数

OpenRouterのAPIを取得します。下記の記事を参考に取得してください。
https://zenn.dev/asap/articles/5cda4576fbe7cb#api-keyの取得

その後、リポジトリ内の、.env.exampleファイルを.envにリネームし、OPENROUTER_API_KEYに取得したAPI情報を入力します。

仮想環境の構築

下記のコマンドで環境を構築してください

pip install -r requirements.txt

uv使っている方は下記でおそらく仮想環境は構築できます。

uv sync

実行

パラメータ

コード内の下記の箇所を修正することで、作成する画像や、参照画像のパス、何回APIを叩くかを設定できます。

openrouter_image_editing_api_eng.py
    # ========== 一度に生成する生成枚数の指定 ==========
    generate_images = 5

    # ========== 読み込む画像のパス ==========
    file_path = "inputs/images3.png"

    # ========== 編集内容の指定 ==========
    query = "Turn it into a 3D figure. However, make the pose a cooler, more stylish girl's pose."

    # =================================

実行コマンド

下記コマンドで実行ができます。

./langchain_asap_sample/gemini2.5_image_generation
python openrouter_image_editing_api_eng.py

OpenRouterでのNano Bananaの呼び出し方

openrouter_image_editing_api_eng.py

API_KEY = os.getenv("OPENROUTER_API_KEY", "")
ENDPOINT = "https://openrouter.ai/api/v1"

def call_openrouter_api(system_prompt, user_query, image_base64, api_key, endpoint, temperature=0.7):
    """
    OpenRouter APIを直接呼び出す関数
    """
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    }
    
    payload = {
        "model": "google/gemini-2.5-flash-image-preview:free",
        "messages": [
            {
                "role": "system",
                "content": system_prompt
            },
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": user_query
                    },
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/png;base64,{image_base64}"
                        }
                    }
                ]
            }
        ],
        "temperature": temperature,
        # 画像生成を有効にする - OpenRouterの形式に従う
        "modalities": ["image", "text"]
    }
    
    try:
        response = requests.post(
            f"{endpoint}/chat/completions",
            headers=headers,
            json=payload,
            timeout=60  # タイムアウト設定
        )
        
        # JSONレスポンスを返す
        result = response.json()
        
        return result

下記のページを参考にしています。
https://openrouter.ai/docs/features/multimodal/image-generation

本当はLangChainからも実行したかったですが、どうやらChatOpenAIクラスが画像出力にはうまく動作せず断念しました。
(サーバから画像データは帰ってきているようだが、LangChainがうまくその情報をReturnできない)

まとめ

Gemini APIもVertex AIも、Nano Bananaを利用する場合は有料なので、gemini-2.0-flash-exp-image-generationのように無料で使えないのかあ・・・と思っておりましたが、さすがOpenRouterですね!!!

なお、下記の記事でも記載していますが、プロンプトは英語で書きましょう!
日本語だとテキストのみが出力されて、画像が出力されないことがあります!

https://zenn.dev/asap/articles/8d5af79e40fa4d

Discussion