ADKでGemini Live APIを使う時のハマりどころ3選

に公開

最近Agent Development Kit(ADK)でLive APIを使う機会があり、ハマりどころがいくつかあったので共有です。
なお内容は記事執筆時点の情報になります。

  • 執筆日:2026/05/09
  • Python:3.14
  • ADK:1.32.0

1. 3.1 Flash Liveを使う場合はGemini API経由にする

ADKに限った話ではないのですが、3.1 Flash Liveは現時点ではAgent Platform(旧Vertex AI)では提供されていません[1]
Gemini APIでは提供されているのでこちらを使います[2]

基準は分かりませんが他にもこういうモデルはあるようです(例えばRobotics-ER 1.6)。

2. 非同期関数呼び出しではなくStreaming toolsを使う

Live APIは非同期関数呼び出しという仕組みを持っており[3]、ツール呼び出しの結果を待たずに会話を継続することができます。
ただしこの機能はtool_callイベントを受け取った側がハンドリングする必要があり、ADKは現時点では対応していません。

https://github.com/google/adk-python/blob/release/v1.32.0/src/google/adk/flows/llm_flows/base_llm_flow.py#L1081-L1085

一方でADKのLive API ToolkitにはStreaming toolsという仕組みがあり、会話をブロックせずにツールの結果をLive APIにストリーミングすることができます[4]
関数をStreaming toolsにするには以下の条件を満たせば良いです。

  • async関数であること
  • 返り値の型がAsyncGeneratorであること

ストリーミングではなくただの非同期ツールにしたい場合は最後にまとめてyieldすれば良いです。

2-a. Streaming toolsを停止したい場合はstop_streamingというツールを渡す

以下のような関数をツールとして渡すと、エージェントが停止してくれます。

def stop_streaming(function_name: str):
  """Stop the streaming

  Args:
    function_name: The name of the streaming function to stop.
  """
  pass

注意点として関数名と引数名は上記と同じである必要があります。
これはADKが内部的にstop_streamingという名前のツールが呼ばれた時にfunction_nameという名前の引数に入っているツールを止める実装になっているためです。

https://github.com/google/adk-python/blob/release/v1.32.0/src/google/adk/flows/llm_flows/functions.py#L846-L850

3. Otelは手動計装が必要

ADKは基本的にOtelには対応しています。例えば

  • ログ:プロンプト、ツール名など[5]
  • トレース:エージェント呼び出し、ツール呼び出し、生成AI呼び出しのスパンなど[6]

を取得することができます。
ただしLive API Toolkitは非対応で手動計装が必要です。

実装例

async def downstream_task() -> None:
    """Receives Events from run_live() and sends to WebSocket."""
+    with tracer.start_as_current_span("invocation"):
        async for event in runner.run_live(
            user_id=user_id,
            session_id=session_id,
            live_request_queue=live_request_queue,
            run_config=run_config
        ):
            # Send event as JSON to WebSocket
            await websocket.send_text(
                event.model_dump_json(exclude_none=True, by_alias=True)
            )

またadk webadk api_serverではrunner.run_liveはADK側がやる処理であり、手動計装できないのでスパンも取れません。

脚注
  1. https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models ↩︎

  2. https://ai.google.dev/gemini-api/docs/models ↩︎

  3. https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/live-api/asynchronous-function-calling ↩︎

  4. https://adk.dev/streaming/streaming-tools/ ↩︎

  5. https://adk.dev/observability/logging/ ↩︎

  6. https://adk.dev/observability/traces/ ↩︎

Discussion