图工作流(超审查)
对于超出单个 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 是完整的
CodingAgents(读/写/bash)。 - 每个 reviewer 是只读的
LlmAgent,它检查代码并返回一个VERDICT: approve或VERDICT: changes并附带注释。 - synthesize 聚合判决并路由到
revise或finalize,受限于轮次上限 + 图递归限制。
扇出/扇入在 adk-graph
两个 adk-graph 能力使其正确:
- Parallel fan-out — 从一个上游节点可达的多个节点在同一个超级步骤中并发运行。
- Fan-in barrier — 一个用
add_deferred_node_fn声明的节点只运行一次,仅在其所有上游路径完成后(而不是每个上游路径一次)。
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可以声明一个延迟节点。没有它,具有多个上游边的聚合器会在第一个分支完成时立即触发。
每个节点都是一个 async 闭包,它运行一个 agent 并将其结果写入图状态;条件边读取 decision 以进行循环或完成。请参阅 coding_graph example 中的完整可运行实现和 Graph Agents 参考资料中的通用 API。
何时使用图与线束
- 单个 agent,线性/迭代工作 → 仅使用
CodingAgent(code/goal命令)。 - 并行专家、多阶段审查、对抗性驳斥、群体 → 一个
adk-graph工作流(ultracode命令)。
下一步:Examples →