# ADKの便利で実践的な使い方
🔧 標準ワークフローでは実現できない独自のオーケストレーションロジックが必要な場面、ありますよね。ADKのCustom Agentsなら、`BaseAgent`を継承して自由自在に制御フローを組み立てられます!
📌 タイトル:Custom Agents — BaseAgent継承による自由な制御フロー設計
🔗 URL:
🧩 概要
Custom Agentsは、`google.adk.agents.BaseAgent`を継承し、`_run_async_impl`メソッドを実装することで、任意のオーケストレーションロジックを構築できる仕組みです。SequentialAgentやParallelAgentなどの定型パターンでは対応できない、条件分岐・ループ・外部状態同期といった高度なワークフローを実現します。サブエージェントの呼び出し、セッション状態の共有、イベントの伝播がフレームワーク標準で管理されます。
🛠 使い方
Custom Agentの基本構造は以下のとおりです。
`google.adk.agents.BaseAgent` を継承して `MyCustomAgent` クラスを定義します。フィールドとして `story_generator`、`critic_agent`、`tone_checker` の3つの `LlmAgent` を宣言します。`_run_async_impl` メソッド内で、まず `self.story_generator.run_async(ctx)` でストーリーを生成し、次に `self.critic_agent.run_async(ctx)` を `for i in range(2)` で最大2回ループして批評・修正を行います。最後に `self.tone_checker.run_async(ctx)` でトーンを確認し、`ctx.session.state.get("tone_result")` が `"negative"` の場合は `self.story_generator.run_async(ctx)` で再生成する条件分岐を行います。各サブエージェントの実行は `async for event in ... yield event` パターンでイベントを伝播します。
サブエージェント間のデータ共有には`ctx.session.state`を使います。
エージェントAが `ctx.session.state["analysis_result"] = result` で結果を書き込み、エージェントBが `ctx.session.state.get("analysis_result")` でそれを読み取ります。
🏗 実践的な使い方
**レガシーステートマシンの再現**: 既存の状態遷移ロジックをCustom Agentに移植できます。`_run_async_impl`内でPythonの標準的な制御構文(if/elif/while/try-except)を使い、状態ごとに異なるサブエージェントを呼び分けます。
`_run_async_impl` 内で `state = "INIT"` から開始し、`while state != "DONE"` でステートマシンを実装します。`"INIT"` 状態では `self.init_agent.run_async(ctx)` を実行し、`ctx.session.state.get("next_state", "PROCESS")` で次の状態を決定します。`"PROCESS"` 状態では `self.process_agent.run_async(ctx)` を実行後 `"REVIEW"` に遷移します。`"REVIEW"` 状態では ` を実行し、`ctx.session.state.get("approved")` が真なら `"DONE"` に、偽なら `"PROCESS"` に戻ります。
**外部状態との同期**: データベースやAPIから取得した状態に基づいて実行パスを動的に切り替えられます。例えば、外部システムのステータスを確認してから次のエージェントを選択するパターンが実現可能です。
💡 ユースケース
🔄 レガシーシステムの状態遷移ロジックをAIエージェントとして再実装
🔀 中間結果に基づく条件分岐ワークフロー(品質チェック → 不合格なら再生成)
🔗 外部API/DBの状態に応じたエージェント選択
🔁 批評・修正の反復ループ(最大N回で打ち切り)
⚠️ 注意点
- `sub_agents`リストには、`_run_async_impl`内で直接呼び出すすべてのサブエージェントを含める必要があります。含めないとフレームワークのライフサイクル管理が正しく動作しません。
- `ctx.session.state`は全サブエージェント間で共有されるため、キー名の衝突に注意してください。プレフィックスをつけるなどの規約を決めておくと安全です。
- 無限ループを防ぐため、ループ処理には必ず最大回数や終了条件を設けてください。
✨ Custom Agentsは、定型パターンでは収まらない独自のビジネスロジックをエージェントに組み込むための最も柔軟な手段です。ステートマシンの移行や複雑な条件分岐が必要な場面で、ぜひ活用してみてください!
#
ADK# #
AIAgent#