グラフワークフロー (超レビュー)
単一の agent ループを超えるもの — 並列レビューア、敵対的チェック、多段階パイプライン — の場合、コーディング agent を adk-graph StateGraph としてオーケストレーションします。これは ultracode コマンドと coding_graph example が機能する方法です。
「ultra」パターン
START → implement ──┬─▶ review:correctness ─┐
├─▶ review:edge-cases ─┤ (parallel, real agents)
└─▶ review:style ─┤
▼
synthesize ← deferred fan-in (runs once)
│
decision ──────────┤
┌── "revise" ◀──────────┘
▼ └──▶ "finalize" → END
revise ─▶ (back to the reviewers)
- implement / revise は完全な
CodingAgent(読み取り/書き込み/bash) です。 - 各 reviewer は読み取り専用の
LlmAgentで、コードを検査し、メモ付きのVERDICT: approveまたはVERDICT: changesを返します。 - synthesize は評決を集約し、
reviseまたはfinalizeにルーティングします。これはラウンドキャップとグラフの再帰制限によって制限されます。
adk-graph におけるファンアウト / ファンイン
2つの adk-graph 機能がこれを正しく機能させます。
- 並列ファンアウト — 1つのアップストリームノードから到達可能な複数のノードが、同じスーパーステップで並行して実行されます。
- ファンインバリア —
add_deferred_node_fnで宣言されたノードは、すべてのアップストリームパスが完了した後にのみ(アップストリームごとに1回ではなく)、正確に1回実行されます。
use adk_graph::graph::StateGraph;
use adk_graph::{DeferredNodeConfig, MergeStrategy};
use adk_graph::edge::{START, END};
let graph = StateGraph::with_channels(&["task", "round", "decision", "notes",
"rev_correctness", "rev_edge-cases", "rev_style"])
.add_node_fn("implement", /* coding agent */)
.add_node_fn("review_correctness", /* read-only reviewer */)
.add_node_fn("review_edge-cases", /* … */)
.add_node_fn("review_style", /* … */)
// fan-in: runs once, after all three reviewers finish
.add_deferred_node_fn("synthesize", /* aggregate verdicts */,
DeferredNodeConfig { merge_strategy: MergeStrategy::Collect, fan_in_timeout: None })
.add_node_fn("revise", /* coding agent applies notes */)
.add_node_fn("finalize", /* done */)
.add_edge(START, "implement")
.add_edge("implement", "review_correctness")
.add_edge("implement", "review_edge-cases")
.add_edge("implement", "review_style")
.add_edge("revise", "review_correctness") // loop fans out again
.add_edge("revise", "review_edge-cases")
.add_edge("revise", "review_style")
.add_edge("review_correctness", "synthesize") // fan-in
.add_edge("review_edge-cases", "synthesize")
.add_edge("review_style", "synthesize")
.add_conditional_edges("synthesize",
|s| s.get("decision").and_then(|v| v.as_str()).unwrap_or("finalize").to_string(),
[("revise", "revise"), ("finalize", "finalize")])
.add_edge("finalize", END)
.compile()?
.with_recursion_limit(16);
add_deferred_node_fn(およびカスタムノード用のmark_deferred) は、コアStateGraphビルダーにファンインをもたらします — 以前は、より高レベルのGraphAgentBuilderのみが遅延ノードを宣言できました。これがないと、複数のアップストリームエッジを持つアグリゲーターは、最初のブランチが完了するとすぐに起動してしまいます。
各ノードは、agent を実行し、その結果をグラフの状態に書き込む async クロージャです。条件付きエッジは、ループまたは終了するために decision を読み取ります。完全で実行可能な実装は、coding_graph example と、一般的な API については Graph Agents リファレンスを参照してください。
グラフとハーネスの使い分け
- 単一 agent、線形/反復作業 → 単に
CodingAgent(code/goalコマンド)。 - 並列スペシャリスト、多段階レビュー、敵対的反論、スウォーム →
adk-graphワークフロー (ultracodeコマンド)。
次へ: 例 →