はじめに
ADK(Agent Development Kit)を使った、ルートエージェントと複数のサブエージェントで構成されるマルチエージェントを構築中に、サブエージェントから異なる種類のツールを使用すると、「400 INVALID_ARGUMENT」エラーが発生しました。
その対処方法と、Sub Agent と AgentTool の違いを整理したいと思います。
具体的な事象
上記構成の中で、あるサブエージェントにツールとして”VertexAiSearchTool”を使用した場合に、「400 INVALID_ARGUMENT」エラーが発生しました。
(https://github.com/google/adk-python/issues/899 と同じ事象)
その際、以下のようなエラーログが出力されました。
{‘error’: {‘code’: 400, ‘message’: ‘Multiple tools are supported only when they are all search tools.’, ‘status’: ‘INVALID_ARGUMENT’}}
SDKの制限として、組み込みツール(Built-in tools:Google SearchやVertex AI Searchなど)とカスタム関数(FunctionDeclaration tools)が共存できない問題があるということでした。
対処方法
“VertexAiSearchTool”を使ったサブエージェントを”AgentTool()”関数を使ってTool化することで、問題が解決しました。
ただし弊害として、AgentTool化することにより ADK Webを使った Event 情報の確認ができなくなります。(こちらはプロンプトの出力の調整で、一部は確認できるようになります)
ADK における Sub Agent と AgentTool の違い
Sub Agent と AgentTool は、どちらも「あるエージェントが別のエージェントに仕事を依頼する」仕組みであり、メインのエージェントが解決できないタスクを別のエージェントに委譲し、解決するために使います。
一方、「連携の深さ」と「コンテキスト(文脈)の共有」に違いがあります。
特徴について、簡単にまとめます。
| 特徴 | Sub Agent | AgentTool |
|---|---|---|
| 役割のイメージ | チームメンバー、部下 | 外部の専門家(外部ツール) |
| コンテキスト | 親エージェントと履歴や状態を共有する | 独立したセッションで実行される(渡された情報だけで動く) |
| ステート | ステートフル | ステートレス |
| 結合度 | 密結合 | 疎結合 |
| 主な用途 | 複雑な会話、一連の推論が必要なタスク | 明確なタスク実行、単発の計算、検索 |
使い分けのポイント
ざっくりとですが、使い分けのポイントをまとめます。
Sub Agent
- 「会話の続き」として処理したい
ユーザーとの対話の文脈(以前の発言内容など)を知っている必要がある場合。 - 複雑な手順を丸投げしたい
単なる入出力だけでなく、そのエージェント自身がさらにユーザーに質問を返したり、思考プロセスを回したりする必要がある場合
AgentTool
- 機能としてカプセル化したい
「入力」さえあれば、誰から呼ばれても同じ仕事ができる場合。 - 副作用を閉じ込めたい
親エージェントの会話履歴への影響を与えず、結果だけが欲しい場合。 - 他のツールと同じように扱いたい
LLMに「道具」として選ばせたい場合。
さいごに
今回は AgentTool で目的の機能を作ることができましたが、ユースケースによっては難しい課題かもしれません。ただし、今回発生したエラー事象は、将来的には改修される可能性はありますので、最新情報をご確認いただければと思います。