はじめに
Agent Development Kit(ADK)の2.0が、Python版は2026年5月19日、Go版は2026年6月30日にGAしています。
2.0について今までちゃんと触れてきていなかったので、新機能を一通り触ってみようと思います。
今回のゴールは、グラフワークフローの基本であるノード・エッジ・条件分岐を理解し、最小構成を実際に動かしてみることです。
1. ADK 1.x時代の課題
これまでのADKにはSequentialAgentやParallelAgentといった、決まったパターンの組み合わせしかありませんでした。単純な直列・並列処理なら問題ないのですが、
- 「Aの結果によってBに進むかCに進むか」を分けたい
- 「条件を満たすまでBを繰り返したい」
といった柔軟な制御をしようとすると、長大なプロンプトの中に条件分岐のロジックを書き込むしかなく、思った通りに動いてくれない・デバッグしづらい、という課題がありました。
2. ADK 2.0のグラフワークフローとは
ADK 2.0では、Workflowクラスを使って処理の流れをグラフとして明示的に定義できます。
- ノード(Node):Agent(LLM)、Tool、あるいは単なるPython関数
- エッジ(Edge):ノード同士のつながり、条件による分岐
AIによる非決定的な推論(Agent)と、コードによる決定的な処理(関数)を、同じグラフの中で自由に組み合わせられるのがポイントです。
3. 最小構成のワークフローを作る
AIブログ執筆エージェントというお題で実際にエージェントを実装していこうと思います。
まずは「トピックを渡すと、ブログ記事の下書きを1つ返す」だけの、ノード1つのワークフローを作ります。
from google.adk import Agent
from google.adk import Workflow
draft_agent = Agent(
name="draft_agent",
model="gemini-3.6-flash",
instruction="""あなたはブログ記事のライターです。
与えられたトピックについて、800字程度の日本語のブログ記事の下書きを書いてください。
本文のみを出力し、前置きや後書きは不要です。""",
output_schema=str,
)
root_agent = Workflow(
name="blog_writer_workflow",
edges=[
("START", draft_agent),
],
)
edgesに("START", draft_agent)と書くだけで、「開始したらdraft_agentを実行する」という最小のワークフローが完成します。この時点ではまだ1ノードだけのシンプルな構成です。
4. 条件分岐を追加する
ここからが本題です。
下書きの文字数をチェックする関数ノードを追加し、
- 十分な文字数があれば →
finalize_agentで記事を仕上げる - 文字数が足りなければ →
request_more_contentで追記を依頼する
という条件分岐を実装します。
from google.adk import Agent
from google.adk import Workflow
from google.adk import Event
draft_agent = Agent(
name="draft_agent",
model="gemini-3.6-flash",
instruction="""あなたはブログ記事のライターです。
与えられたトピックについて、800字程度の日本語のブログ記事の下書きを書いてください。
本文のみを出力し、前置きや後書きは不要です。""",
output_schema=str,
)
def check_length(node_input: str):
"""下書きの文字数をチェックし、次に進むルートを決める"""
if len(node_input) < 600:
return Event(route=["TOO_SHORT"])
return Event(route=["OK"])
finalize_agent = Agent(
name="finalize_agent",
model="gemini-3.6-flash",
instruction="""渡された下書きに、タイトルと簡単な導入文を追加して、
ブログ記事として仕上げてください。""",
output_schema=str,
)
def request_more_content(node_input: str):
return f"文字数が不足しています。下書きに具体例を1つ追加してください:\n\n{node_input}"
root_agent = Workflow(
name="blog_writer_workflow",
edges=[
("START", draft_agent, check_length),
(check_length, {
"OK": finalize_agent,
"TOO_SHORT": request_more_content,
}),
],
)
ポイントは2つです。
-
check_lengthのようなルーティング用の関数は、Event(route=[...])を返すことで「次にどのルートに進むか」を宣言する -
edgesの中で(check_length, {"OK": finalize_agent, "TOO_SHORT": request_more_content})のように辞書形式で書くと、ルートの値に応じて実行するノードを振り分けられる
これだけで、「AIエージェント(draft_agent)→ コードによる判定(check_length)→ 条件によって異なるAIエージェント(finalize_agent / request_more_content)」という、AIと決定的なロジックが混在するワークフローが組めました。
例えば、「BigQueryに関する初心者向けの記事を書いて」と指示した場合
下書きに対して文字数チェックが走る→OK判定となり、最終記事として出力されていることが分かりますね。(finalize_agentではdraft_agentと同じ文章が出力)
5. 触ってみた所感
ADK 1.xでSequential/Parallelを組み合わせていた頃と比べて、一番違うと感じたのは処理の流れがコードとして目に見えるようになった点です。
「Aの後にBかCのどちらに進むか」というロジックが、プロンプトの中の自然言語ではなく、edgesの定義として明示的にコードに現れるので、自分で読み返したときの見通しがかなり良くなったと感じました。
まだ最小構成しか試していませんが、これだけでも「グラフで書く」ことによる、1.xと2.0の考え方の違いは十分に感じられました。
まとめ
ADK 2.0の目玉機能であるグラフベースのワークフローについて、以下簡単に実践してみました。
- ノード(Agent・関数)とエッジで処理の流れを定義する基本
- ルーティング用の関数と辞書形式のエッジで条件分岐を実装する方法
次回は、この下書きを複数のレビュアーで並列チェックし、指摘があれば下書きに差し戻すループを組み込む形に拡張してみます。
