🤖

[ADK] 1.16.0の新機能: LLMコンテキスト圧縮と呼び出しの停止・再開サポート

に公開

こんにちは、サントリーこと大橋です。

2025/10/10にAgent Development Kit(以降ADK) 1.16.0がリリースされました。

https://github.com/google/adk-python/releases/tag/v1.16.0

今回のリリースでは、プレフィックスキャッシュやセマンティックキャッシュの導入など、パフォーマンスに関する大きな機能追加があったわけではありませんが、いくつかの興味深い機能が追加されています。

この記事では、その中からいくつかのリリースについてピックアップして説明していきます。

対象

  • ADKを触ったことがあるPythonユーザー
  • AIエージェント向けのUIを作成したいと思っている開発者

なお本記事中ではADKのAgentを「Agent」、それ以外のAIエージェントを「エージェント」と表記します。

What's new in 1.16.0

まずは1.16.0のリリースノートを見てみましょう。

機能 (Features)

  • [コア]
    • LLMコンテキスト圧縮の実装 (e0dd06f)
    • ADKでの呼び出しの停止と再開をサポート (ce9c39f,他)
  • [モデル]
    • LlmResponsecitation_metadataを追加 (3f28e30)
    • Gemini API経由でのGemmaモデルのサポートを追加 (2b5acb9)
  • [ツール]
    • BigQuery execute_sqlツールにdry_run機能を追加 (960eda3)
    • BigQuery analyze_contributionツールを追加 (4bb089d)
    • Spanner ADKツールセットがカスタマイズ可能なテンプレートSQLとパラメータ化SQLをサポート (da62700)
    • Oauth2クライアント認証情報グラントタイプをサポート (5c6cdcd)
    • ツールエラー時にエラーから学習し、異なる引数で再試行するReflectRetryToolPluginを追加 (e55b894)
    • 同一エージェント内でVertexAiSearchTool組み込みツールと他のツールの併用をサポート (4485379)
    • 同一エージェント内でGoogle検索組み込みツールと他のツールの併用をサポート (d3148da)
  • [評価]
    • HallucinationsV1評価メトリクスを追加 (8c73d29)
    • ルーブリックベースのツール使用メトリクスを追加 (c984b9e)
  • [UI]
    • カスタムロゴ用のadk webオプションを追加 (822efe0)
  • [可観測性]
    • otel: CloudTraceSpanExporterをtelemetry.googleapis.comに切り替え (bd76b46)

今回はこの中で、以下の3つをピックアップして説明します。

  • LLMコンテキスト圧縮の実装
  • ADKでの呼び出しの停止と再開をサポート
  • CloudTraceSpanExporterをtelemetry.googleapis.comに切り替え

LLMコンテキスト圧縮の実装

エージェントとの対話セッションが長くなると、過去のやり取りが積み重なり、LLMに渡すコンテキストが肥大化してパフォーマンスが劣化するという課題がありました。
この課題を解決するため、LLMコンテキストを効率的に圧縮する方法が提供されました。

ADKのAppクラスに対してEventsCompactionConfigを設定できるようになり、これによりコンテキストの圧縮タイミングや方法を細かく制御できます。

以前の記事([ADK] 1.15.0のContextFilterPluginで長大な会話履歴をフィルタリングしパフォーマンスを改善する https://zenn.dev/soundtricker/articles/3e9ea6f0617daa )で紹介したContextFilterPluginは単純に古い履歴を削除するだけでしたが、今回のEventsCompactionConfigは履歴を要約・圧縮することで、情報を失わずにトークン量を削減することを目指すものです。

これにより開発者はLLMの応答・品質のパフォーマンスを維持しつつ、コンテキストを圧縮することができるようになります。

ADK RunnerはEventsCompactionConfigで設定されたcompaction_intervaloverlap_sizeを使用して、圧縮を実行するタイミングと、圧縮するイベントを決定し、summarizer(BaseEventsSummarizer)を利用してイベントの圧縮を行います。

  • compaction_interval: 圧縮を実行するトリガーとなる、ユーザーが開始した新しい呼び出しの数。
  • overlap_size: 連続する要約間のコンテキストを維持するため、前回の圧縮範囲の末尾から含める呼び出しの数。例えば、イベント[1, 2, 3, 4, 5]があった場合、[1, 2]と[3, 4]で要約すると文脈が途切れる可能性があります。そこで、[1, 2]、[2, 3]のようにオーバーラップ部分を作ることで、文脈の連続性を保ちます。

EventsSummarizerの具体的な実装としてLlmEventSummarizerが提供されており、EventsCompactionConfigsummarizerが指定されていない場合は、このクラスがデフォルトで利用されます。LlmEventSummarizerは、その名の通りLLMを利用して過去のコンテキストを要約・圧縮します。

実装例

agent.py
import datetime
from google.adk.agents.llm_agent import Agent
from google.adk.apps import App
from google.adk.apps.app import EventsCompactionConfig
from google.adk.apps.llm_event_summarizer import LlmEventSummarizer


async def now_tool():
    """
    Return the current date time.
    """
    return datetime.datetime.now(tz=datetime.timezone.utc).isoformat()

root_agent = Agent(
    model='gemini-2.5-flash',
    name='root_agent',
    description='The Clock Agent',
    instruction="""
    You are clock agent. Your task is return current time using `now_tool`.

    [Output Format]
    JSON Object

    [出力スキーマ]
    time: string iso 8601 
    Example: {"time": "2022-09-04T16:07:48.53+0000"}
    """,
    tools=[now_tool]
)

app = App(
    name='time_app',
    root_agent=root_agent,
    events_compaction_config=EventsCompactionConfig(
        compaction_interval=5,
        overlap_size=1,
        # 以下は指定しなくても良い 要約する際のモデルを変えたい場合や、要約するためのLLMへの指示を変更したい場合に指定する
        summarizer=LlmEventSummarizer(llm=root_agent.canonical_model)
    )
)

ADKでの呼び出しの停止と再開をサポート

Appに対してResumabilityConfigを設定できるようになりました。
この設定には、呼び出しの再開(レジューム)が可能かどうかを示すis_resumableフラグが含まれています。

app = App(
    name='resumable_app',
    root_agent=root_agent,
    resumability_config=ResumabilityConfig(
        is_resumable=True
    )
)

ただ、サンプルコードなどを見ても、この設定を有効にすると具体的にどのような挙動になるのか、まだ著者が完全に把握できていません。Human-in-the-Loop(HIL)のような、一度処理を中断して外部からの入力を待つようなシナリオで活用されるものと推測されます。こちらについては、理解が深まり次第、また別の記事で詳しく解説したいと思います。

以下が対象のCommitや利用しているサンプルコードです。ご興味がある方は参照してみてください。

CloudTraceSpanExporterを OTLP(telemetry.googleapis.com)に切り替え

これまで、adk deployコマンドで--trace_to_cloudオプションを指定すると、ADK Agentのトレース情報がCloud Traceに送信されていました。

この際、内部的に利用されていたCloudTraceSpanExporterはCloud Trace APIを利用していましたが、このAPIには送信可能なスパン(トレース情報の1単位)のサイズに制限がありました。そのため、LLMのように大量のテキストデータを扱うAgentでは、情報が途中で切り捨てられてしまうという課題がありました。

今回のアップデートで、トレース情報の送信先が、従来のCloud Trace APIエンドポイントから、OTLP (OpenTelemetry Protocol) に準拠したtelemetry.googleapis.comエンドポイントに変更されました。

これにより、サイズ制限が緩和され、ADK Agentのより詳細な情報を欠損なくCloud Traceで確認できるようになりました。

まとめ

今回はADK 1.16.0で追加されたいくつかの機能について解説しました。
コンテキスト圧縮や停止・再開のサポートは、より複雑で長時間のタスクを実行するAgentを構築するための重要な基盤となります。また、Observabilityの改善は、Agentの挙動をより深く理解し、デバッグやパフォーマンスチューニングを行う上で大きな助けになりますね。

そして、ADK初となるCommunity Callが日本時間 2025/10/16(木) 1:30am にオンラインで開催されることになりました!

https://github.com/google/adk-python/issues/3134

ADKのロードマップなどについて、開発者から直接説明が聞ける貴重な機会です。深夜帯なので日本の開発者には少し参加しづらい時間ですが、セッションはレコーディングされるとのことです。日本にも多くのADKユーザーがいることをアピールするためにも、ぜひ参加登録してみてはいかがでしょうか。

お知らせ/宣伝

ADK開発者が集う日本語のDiscordコミュニティがあります。ADKに関する情報交換や議論に興味がある方は、ぜひご参加ください!

https://discord.gg/BKpGRzjtqZ

また、ADKの最新のコミットログやリリースノートを分かりやすく解説するPodcastを、月・水・金に配信しています。ADKの動向を追いかけたい方は、ぜひ聴いてみてください。

https://www.youtube.com/playlist?list=PL0Zc2RFDZsM_MkHOzWNJpaT4EH5fQxA8n

Discussion