图工作流(超审查)

对于超出单个 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: approveVERDICT: changes 并附带注释。
  • synthesize 聚合判决并路由到 revisefinalize,受限于轮次上限 + 图递归限制。

扇出/扇入在 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,线性/迭代工作 → 仅使用 CodingAgentcode / goal 命令)。
  • 并行专家、多阶段审查、对抗性驳斥、群体 → 一个 adk-graph 工作流(ultracode 命令)。

下一步:Examples →