はじめに
本記事は、ADK2.0の新機能を、実際に手を動かして検証した結果をまとめています。
前回までで、下書き生成から編集長の承認まで一連のグラフワークフローができあがりました。
今回は、このワークフローをユーザーとチャットするコーディネーターの裏側で動かしてみます。
前回までの部分と、今回追加する部分を図にすると以下のようになります。
※濃いグレーが今回追加するコーディネーター部分、薄いグレーが前回まで(1〜3本目)に作ったワークフロー。
前回までのグラフワークフロー(下書き→並列レビュー→差し戻し→編集長承認→公開)はそのまま活かしつつ、その手前にユーザーと会話するコーディネーターを追加する、というのが今回のポイントです。
過去の記事はこちら↓
| 記事 | 内容 |
|---|---|
| 【ADK2.0】実践① Google ADKで構築するグラフ構造のAIエージェント | 下書き生成→文字数チェック(グラフワークフローの基本) |
| 【ADK2.0】実践② Google ADKで複数レビュアーを並列実行(Fan-out / Fan-in) | 並列レビュー+差し戻しループ |
| 【ADK2.0】実践③ Google ADKでAIエージェントに承認処理を挟む(Human-in-the-Loop) | 編集長の承認(HITL) |
1. Chat/Task/SingleTurnモードとは
ADK 2.0では、LLMエージェントに3つの役割モードが導入されました。
- Chat:ユーザーと複数ターンの会話をする。サブエージェントとして使う場合のデフォルトで、呼び出し元への制御の返却には明示的な操作(transfer_to_agent)が必要
- Task:ユーザーと会話しながらタスクを進めるが、完了すると自動的に呼び出し元へ制御が戻る
- SingleTurn:ユーザーと会話せず、1回のやり取りでタスクを完結する。ワークフロー内のノードとして使う場合のデフォルト
公式ドキュメントには、旅行プランナーを題材にしたこんな例が載っていました。
from google.adk import Agent
# SingleTurnモード:ユーザーとは会話せず、1回のやり取りでタスクを完結
weather_agent = Agent(
name="weather_checker",
mode="single_turn",
tools=[get_weather],
)
# Taskモード:質問しながら進められ、完了したら自動でコーディネーターに戻る
flight_agent = Agent(
name="flight_booker",
mode="task",
tools=[search_flights, book_flight],
)
# コーディネーター(Chatモード:sub_agentを持つ場合のデフォルト)
travel_planner = Agent(
name="travel_planner",
# 委譲用ツールが自動生成
sub_agents=[weather_agent, flight_agent],
)
sub_agentsに指定すると、それぞれのエージェント名に対応した委譲用ツールが自動生成される、というのも地味に便利なポイントですね。
2. コーディネーターにワークフローを組み込む
このパターンを、これまで作ってきたブログ執筆ワークフローに当てはめてみます。
Workflowはsub_agentsに渡せない
公式サンプルではsub_agentsに個別のAgentを渡していましたが、これまで作ってきたblog_writer_workflowは複数ノードから成るWorkflowオブジェクトです。
WorkflowはBaseAgentではなくBaseNodeを継承したクラスのため、sub_agents(BaseAgentを期待する)には直接渡せません。
同様にAgentToolで包む方法も、BaseAgentを前提としているため使えません。
そこで、コーディネーターを外側の別エージェントにするのではなく、同じグラフの最初のノードとして組み込む形にしました。
from google.adk import Agent
from google.adk import Workflow
# ユーザーと会話してトピックを聞き出すコーディネーター
# mode="task" にすることで、会話が完了すると自動的に次のノードへ進む
coordinator = Agent(
name="coordinator",
model="gemini-3.6-flash",
mode="task",
instruction="""あなたはブログ編集部の窓口です。
ユーザーと会話して、書いてほしい記事のトピックを聞き出してください。
トピックが決まったら会話を終えてください。
レビューや承認待ちで時間がかかる場合があることを、あらかじめユーザーに伝えてください。""",
)
# draft_agent, grammar_reviewer, ... など、それ以外のノード定義は前回記事と同じものを使用
root_agent = Workflow(
name="blog_writer_workflow",
edges=[
# coordinatorがユーザーとやり取りしてトピックを固め、
# 完了したらdraft_agentに処理を渡す
("START", coordinator, draft_agent),
# ===================================================
# 前回記事までに作成したワークフローを埋め込む(そのまま)
# ===================================================
],
)
mode="task"を指定することで、コーディネーターはユーザーと複数ターンやり取りしながらトピックを固め、完了すると自動的にdraft_agentに処理が進む、という挙動を意図しています。
委譲先が単体のAgentではなくWorkflowの場合は、sub_agentsではなくグラフのノードとして直接組み込む必要あり。
3. 動かしてみる
コーディネーターに話しかけると、トピックについて何度かやり取りがあり、決まったところでdraft_agentに処理が進みました。
その後は裏側で下書き生成・並列レビュー・差し戻し・編集長承認の一連の流れがそのまま機能しました。
4. 触ってみた所感
「コーディネーターの裏でグラフ全体を動かす」というのは、sub_agentsではなく「グラフの最初のノードとしてコーディネーターを組み込む」形で実現することになりました。
1つのグラフの中に、ユーザーと会話するノードと、会話せず黙々と処理するノードが混在できるのが良かったです。
一方で、複数ノードから成るWorkflowを、さらに大きな構成にどう組み込むかという点は、公式ドキュメントのサンプルだけではカバーしきれていない部分もありそうで、今後も新しいパターンが出てくるかもしれません。
まとめ
4本にわたって、ADK 2.0の新機能を「ブログ執筆エージェント」というお題で検証してきました。
- 実践①:グラフワークフローの基本(ノード・エッジ・条件分岐)
- 実践②:Fan-out/Fan-inによる並列レビューと、差し戻しループ
-
実践③:Human-in-the-Loop(
RequestInputによる承認フロー) - 実践④(本記事):Chat/Task/SingleTurnモードによるコーディネーター×サブエージェント構成
通して触ってみて感じたのは、ADK 2.0は「AIの柔軟さ」と「コードによる確実な制御」を、グラフという1つの表現方法の中でうまく共存させている、というところです。
1.x時代に感じていた「プロンプトに頼らざるを得ない曖昧さ」が、随所で解消されており、フローの制御ができるようになったことで、より複雑な処理をエージェントに任せることができるようになるのではと感じました。

