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は現時点では対応していません。
一方で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という名前の引数に入っているツールを止める実装になっているためです。
3. Otelは手動計装が必要
ADKは基本的にOtelには対応しています。例えば
を取得することができます。
ただし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 webやadk api_serverではrunner.run_liveはADK側がやる処理であり、手動計装できないのでスパンも取れません。
Discussion