# ADK 2.0の便利だけど知られていない機能
🌍 実行中のエージェントを途中で安全にキャンセルし、それまでの処理結果は保持できたら理想的だと思いませんか?
ADK 2.0のキャンセル機能は、AbortController/AbortSignalを使ってエージェントの実行をグレースフルに中断する仕組みです。キャンセルシグナルはRunner、LlmAgent、Models、Toolsへと伝播し、コミット済みのイベントは保持されます。
📌 タイトル:エージェント実行のキャンセル
🔗 URL:
🧩 概要
エージェント実行のキャンセルは、AbortControllerとAbortSignalのパターンで実現されます。AbortControllerからシグナルを発行すると、Runner→LlmAgent→Models→Toolsの順にキャンセルが伝播します。重要な点として、キャンセル時点ですでにコミットされたイベントは保持され、例外をスローせずグレースフルに完了します。AbortSignal.timeout()を使えばタイムアウトベースの自動キャンセルも可能で、AbortSignal.any()で複数のシグナルを組み合わせることもできます。
🛠 使い方
AbortControllerを作成し、そのシグナルをRunnerに渡します。
```python
from adk import App, AbortController, AbortSignal
app = App(agent=my_agent)
# 手動キャンセル
controller = AbortController()
task = "long task", signal=controller.signal)
# 必要なタイミングでキャンセル
controller.abort()
# タイムアウトベースの自動キャンセル(2秒)
signal = AbortSignal.timeout(2000)
result = await "time-limited task", signal=signal)
# 複数シグナルの組み合わせ
combined = AbortSignal.any([
AbortSignal.timeout(5000),
user_cancel_signal
])
result = await "task", signal=combined)
```
🏗 本番システムへの組み込み方
・ユーザー操作(キャンセルボタン)と連動したAbortControllerを実装し、UIからのキャンセルを可能にする
・AbortSignal.timeout()でAPI呼び出しの最大実行時間を制限し、リソースの無駄遣いを防ぐ
・AbortSignal.any()でユーザーキャンセルとタイムアウトの両方に対応する
・キャンセル後のコミット済みイベントを活用し、部分的な結果を返却する設計にする
💡 ユースケース
⏱ LLM呼び出しにタイムアウトを設定し、応答が遅い場合に自動キャンセル
🖱 ユーザーがUIのキャンセルボタンを押した際にエージェント実行を即座に中断
🔀 複数のエージェントを並列実行し、最初に完了したもの以外をキャンセル
💰 コスト上限に達した時点でLLM呼び出しを打ち切る
⚠️ 注意点
キャンセルはグレースフルに完了するため、abort()を呼んだ瞬間に即座に停止するわけではありません。現在実行中のオペレーション(LLM推論やツール実行)が完了するまで若干の遅延が生じる場合があります。また、コミット済みのイベントは保持されるため、キャンセル後の状態が中途半端にならないよう、ワークフロー設計時にキャンセルポイントを意識することを推奨します。ツール内部でシグナルを監視して早期リターンする実装も有効です。
✨ キャンセル機能により、エージェント実行のライフサイクルを安全にコントロールできます。タイムアウトと組み合わせることで、本番環境での予測可能性が大きく向上します。
#
ADK# #
AIAgent#