💭

Gemini-2.5-flash-preview-05-20 APIがMAX_TOKENSとの理由で止まってしまう

に公開

結論を3行で

  • gemini-2.5-flash-preview-05-20」で、検索した情報をまとめさせていたところ、「MAX_TOKENS」となってしまい、正常な応答が得られないケースがあった
  • 調べてみると「Thoughts Token(思考トークン)」の上限に達していた
  • thinkingBudget(思考予算)を設定したところ、設定値は超えるものの、トークン上限に達することが無くなり問題解決

thinkingBudgetについては、以下の公式ドキュメントに記載があります。

https://ai.google.dev/gemini-api/docs/thinking?hl=ja#set-budget

事の経緯

筆者は、Gemini APIを使った自作「Deep Research」みたいな機能を作って運用しています。「Geminiに検索させる→検索した情報をまとめる→ファイル保存」みたいな感じです。

ただ、検索回数を増やすと、検索結果をまとめる部分で、APIの返信が「MAX_TOKENS」となってしまい、レポート応答が得られなくなりました。この記事では起きた事象とその解決に至る話題をまとめようと思います。

タイトルにも記載の通り、使っているモデルは「gemini-2.5-flash-preview-05-20」です。

何が起きたの?

Thoughts Tokenが上限値に達していました。

これまたThoughts Tokenの上限値に関する記述を探すのが一苦労したわけですが、今回は数値を見ればなんとなく上限っぽいことがわかります。

結論としては、公式サイトに記載されているthinkingBudget(思考予算)の設定で問題を解決しました

とりあえずAPIの実行結果を見てみる

以下はthinkingBudget(思考予算)を実装した例で、finish_reasonと使用トークン数が見える関数を挟んで結果を表示させています。

ソースコード例(※thinkingBudget設定済み)

from google import genai
from google.genai import types
from google.colab import userdata

def extract_gemini_api_info(response_object):
    """
    Gemini API 2.5のレスポンスオブジェクトから以下の情報を抽出して表示する

    - finish_reason
    - prompt_token_count
    - thoughts_token_count
    - output_token_count
    - total_token_count

    Args:
        response_object_or_string (google.generativeai.types.GenerateContentResponse):
            Gemini API 2.5からのレスポンスオブジェクト、またはそれをまるごとprintに突っ込んだ文字列
    """

    print("finish_reason:",response_object.candidates[0].finish_reason.value)
    print("prompt_token_count:",response_object.usage_metadata.prompt_token_count)
    print("thoughts_token_count:",response_object.usage_metadata.thoughts_token_count)
    print("output_token_count:",response_object.usage_metadata.candidates_token_count)
    print("total_token_count:",response_object.usage_metadata.total_token_count)  


def gemini_chat_test():
    gemini_api_key = userdata.get("GOOGLE_API_KEY")
    client = genai.Client(api_key=gemini_api_key)

    response = client.models.generate_content(
        model="gemini-2.5-flash-preview-05-20",
        contents = "都市開発で最も重視すべき事柄は",
        config=types.GenerateContentConfig(
            thinking_config=types.ThinkingConfig(thinking_budget=500)
        ),
    )
    extract_gemini_api_info(response)
    print(response.text)

このソースコード例ではthinking_budgetは500としています。ちなみに0にすると、思考プロセスなしに回答が返ってきます。

Gemini APIのことはGeminiに聞いてみる

というわけで、Geminiに「これ知ってる?」と聞いたところ、的確な回答を教えてくれました。

thinkingBudget(思考予算)については、公式ドキュメントでも記載があります。

https://ai.google.dev/gemini-api/docs/thinking?hl=ja#pricing

そこで、実際に上限値を10000に設定して、再度「検索させる→検索した情報をまとめる」をやらせたところ、設定した予算の上限は超えているものの、カンストしてMAX_TOKENSで止まる事象は直りました

公式ドキュメントにも予算を超える場合はあるって書いてありますね。

おまけ

スクショをよくよく見たら、Output Token Count(candidates_token_count)を取得してない!!ってことで、上記ソースコード例ではその点も反映済みです。

Gemini関連の記事

Gemini APIで検索させる話題はこちらでも紹介しています。以下で紹介しているソースコードを複数回呼び出して、その結果をまとめる、みたいな感じでやってます。

https://zenn.dev/mirai_asset/articles/2d813cec0e63fa

また見てね!

また、記事を書くのでフォローしてね!

Xはお金の話中心です
https://x.com/instockexnet

Discussion