# ADK 2.0の便利だけど知られていない機能
🌍 エージェントの実行フロー全体にフックを仕掛けて、監視・介入・拡張できたら便利だと思いませんか?
ADK 2.0のプラグイン機能は、`BasePlugin` を拡張してRunnerに登録することで、エージェントのライフサイクル全体にわたるコールバックをグローバルに適用できる仕組みです。個別エージェントのコールバックとは異なり、全エージェントに横断的に作用します。
📌 タイトル:プラグイン (Plugins)
🔗 URL:
🧩 概要
プラグインは `BasePlugin` を継承して作成し、Runnerに登録します。エージェント個別のコールバックとは異なり、グローバルスコープで全エージェントに適用されます。ライフサイクルフックは多岐にわたり、ユーザーメッセージの受信、Runner開始、エージェント実行、モデル呼び出し、ツール実行、イベント処理、Runner終了の各タイミングに介入できます。動作モードは3種類あり、Observe(監視のみ)、Intervene(処理を変更・中断)、Amend(結果を後から修正)です。プラグインのコールバックはエージェントのコールバックよりも先に実行されます。
🛠 使い方
`BasePlugin` を継承し、必要なライフサイクルフックをオーバーライドします。
```python
from adk.plugins import BasePlugin
class LoggingPlugin(BasePlugin):
def __init__(self):
super().__init__(name="logging_plugin")
async def on_before_model_call(self, callback_context, llm_request):
print(f"Model call: {llm_request.model}")
return None # Noneを返すと通常の処理が続行
async def on_after_tool_call(self, tool_context, tool_response):
print(f"Tool executed: {tool_context.tool_name}")
return None
# Runnerに登録
runner = Runner(
agent=my_agent,
plugins=[LoggingPlugin()]
)
```
Interveneモードではコールバックから値を返すことで処理を置き換え、Amendモードではイベント処理後に結果を修正できます。
🏗 本番システムへの組み込み方
・ログ収集やメトリクス記録をObserveモードのプラグインとして実装し、エージェントコードを汚さない
・ガードレールやコンテンツフィルタリングをInterveneモードで実装し、不適切な入出力をブロックする
・分析用データの収集をAmendモードで後処理として組み込む
・プリビルトプラグイン(Reflect/Retry、BigQuery Analytics、Context Filtering、Global Instructions等)を活用して開発を効率化する
💡 ユースケース
📊 全エージェントのモデル呼び出しとツール実行をBigQueryに記録する
🛡 入力内容のガードレールをプラグインで一元管理し、有害なリクエストをブロックする
🔄 モデル呼び出し失敗時のリトライロジックをReflect/Retryプラグインで実装する
📋 グローバルな指示(コンプライアンスルール等)をGlobal Instructionsプラグインで全エージェントに適用する
⚠️ 注意点
プラグインのコールバックはエージェントのコールバックよりも先に実行されるため、プラグインで処理をブロックするとエージェントのコールバックは呼ばれません。Interveneモードで不適切な値を返すとエージェントの動作が壊れる可能性があるため、返り値の型と意味を正確に理解してから使用してください。また、プラグインの実行順序はRunnerへの登録順に依存します。
✨ プラグインを活用することで、横断的な関心事(ログ、セキュリティ、分析)をエージェントのコアロジックから分離でき、保守性の高いシステムを構築できます。
#
ADK# #
AIAgent#