◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/高度な活用
⬡ 高度な活用/2026-07-03上級

ツール結果が会話を静かに食いつぶす — Gemini Function Calling の巨大レスポンスをハンドル渡しで軽くする設計

Function Calling のツール結果が会話履歴に滞留し、入力トークンを複利で膨らませる問題を分解します。トークン予算つき圧縮とハンドル渡しの2実装で、実測で入力を約1/8に抑えた手順と落とし穴をまとめます。

Gemini API248Function Calling17エージェント16コンテキスト管理コスト最適化25

✦ プレミアム記事

エージェントに 312 件のアプリレビューを分析させたら、3 ターン目から急に遅くなりました。最初のターンは 2 秒台で返っていた応答が、ループの後半では 10 秒を超え、月末の請求もこのジョブだけ不自然に膨らんでいました。

私自身、個人開発で運営しているアプリのレビューを Gemini の Function Calling で分類・集計するエージェントを毎晩回しています。fetch_reviews ツールが返す JSON をそのまま functionResponse に詰めて返す素朴な実装で、件数が少ないうちは何の問題もありませんでした。ところがレビューが溜まった月に挙動が一変し、調べてみると原因は生成の出力側ではなく、ツールが返した巨大な JSON が会話履歴に残り続け、以降の全ターンで毎回「入力」として再送されていたことでした。

Function Calling のループでは、モデルの関数呼び出し(functionCall)とその実行結果(functionResponse)を contents に積み上げて次のリクエストを投げます。つまりツールが一度返した 48,000 トークンの JSON は、ループが 6 ターン続けば残り 5 ターンぶん繰り返し課金されます。出力トークンばかり監視していると、この入力側の複利にはなかなか気づけません。

ターンごとの入力トークンを測る — 犯人は「滞留」

対策の前に、まず現状を数字にします。エージェントループの各ターンで、送信直前の contents 全体を count_tokens に通すだけです。

# turn_meter.py — エージェントループの入力トークン推移を計測する
# 何を解決するか: 「なぜか後半のターンだけ遅い」を感覚ではなく数字にする
from google import genai
 
client = genai.Client()  # APIキーは環境変数 GEMINI_API_KEY から
MODEL = "gemini-flash-latest"
 
def log_turn_tokens(turn: int, contents: list) -> int:
    """送信直前の contents 全体のトークン数を記録する"""
    result = client.models.count_tokens(model=MODEL, contents=contents)
    print(f"turn={turn} input_tokens={result.total_tokens}")
    return result.total_tokens

計測は無料枠で回せるうえ、ループに 1 行足すだけです。私のレビュー分析エージェント(2 ストア分のレビューを取得して分類・集計する 6 ターン構成)では、導入前はこう推移していました。

ターン内容入力トークン(実測)
1指示のみ1,240
2+ fetch_reviews 結果(ストアA・312件)49,800
3+ 分類の中間出力52,300
4+ fetch_reviews 結果(ストアB・287件)101,900
5+ 集計の中間出力104,500
6最終レポート生成105,100

1 回の実行で合計約 41 万トークンを「入力」に使っていました。うちレビュー JSON の再送分がおよそ 8 割です。生成物の品質にはまったく寄与しない再送に、実行時間と費用の大半を払っていたことになります。

渡し方は 3 つある — 全文・要約・ハンドル

ツール結果をモデルにどう見せるかは、実際には設計の選択です。私はこの 3 択で整理するようになりました。

方式モデルに渡すもの向いている場面リスク
全文渡しツール結果の JSON 全体結果が小さい(目安 2,000 トークン未満)履歴滞留で入力が複利増加
予算つき圧縮優先フィールドだけ残した縮約版結果の一部フィールドしか使わない落としたフィールドが後で必要になる
ハンドル渡し件数・スキーマ・要約+参照ID結果が大きく、詳細参照が稀詳細が要るたびに追加ターンが発生

判断基準はシンプルで、**「モデルがこの結果の全文を本当に読む必要があるか」**です。レビュー分類のように「1 件ずつ処理するが、処理後は二度と見ない」データは、全文を履歴に置いておく理由がありません。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦ターンを重ねるほど遅く・高くなる自作エージェントの原因を「ツール結果の履歴滞留」として特定し、countTokens でターン毎の入力トークン推移を計測できるようになる
✦トークン予算つきコンパクタとハンドル渡し(参照渡し)の2実装をコピペで導入し、レビュー分析エージェントの入力トークンを実測で約1/8に抑えられる
✦thought signature を壊さない履歴の畳み方や、圧縮しすぎによる再取得ループなど、コンテキスト圧縮で踏みやすい落とし穴を先回りして避けられる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 高度な活用2026-09-05
長い動画を Gemini に辿らせるとき、見つける問いと「無い」を確かめる問いは別々に投げています
9月1日に来たエージェント的動画理解では、どこを観るかをモデル自身が決めます。見つける問いには効きますが、映り込みが無いことの確認には被覆の保証がありません。問いの形で処理モードを分ける判断と、被覆を自分で担保する実装を書き残します。
⬡ 高度な活用2026-09-24
Gemini に「合っていますか」と聞くのをやめ、答えを伏せたまま分類し直してもらう設計に変えました
自分で付けたラベルの確認を Gemini に頼むと、頷く答えが返りがちです。確認型・反論指示型・伏せ型の三つを比べて伏せ型を選んだ理由と、答えが漏れる経路の塞ぎ方、食い違いだけを人が見る振り分けのコードまで書き残します。
⬡ 高度な活用2026-09-14
BLOCK_NONE を入れても結果が変わらないとき — Gemini のブロックを閾値で動かせるかどうかの見分け方
安全フィルタで止まったとき、閾値を緩めて直る場合と、何をしても直らない場合があります。返ってきたレスポンスのどこを見て、その境目を先に判定するかをまとめました。