Workflows de Graph (ultra-revue)

Pour tout ce qui dĂ©passe une boucle d'agent unique — relecteurs parallĂšles, vĂ©rifications contradictoires, pipelines multi-Ă©tapes — orchestrez les agents de codage comme un adk-graph StateGraph. C'est ainsi que fonctionnent la commande ultracode et l'exemple coding_graph.

Le modĂšle "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)
  • implĂ©menter / rĂ©viser sont des CodingAgents complets (lecture/Ă©criture/bash).
  • chaque relecteur est un LlmAgent en lecture seule qui inspecte le code et retourne un VERDICT: approve ou VERDICT: changes avec des notes.
  • synthĂ©tiser agrĂšge les verdicts et les achemine vers revise ou finalize, bornĂ© par un plafond de tours + la limite de rĂ©cursion du graphe.

Fan-out / fan-in dans adk-graph

Deux capacités de adk-graph rendent cela correct :

  • Fan-out parallĂšle — plusieurs nƓuds atteignables depuis un nƓud amont s'exĂ©cutent simultanĂ©ment dans la mĂȘme super-Ă©tape.
  • BarriĂšre de fan-in — un nƓud dĂ©clarĂ© avec add_deferred_node_fn s'exĂ©cute exactement une fois, seulement aprĂšs que tous ses chemins amont sont terminĂ©s (pas une fois par amont).
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 (et mark_deferred pour les nƓuds personnalisĂ©s) apporte le fan-in au constructeur de base StateGraph — auparavant, seul le GraphAgentBuilder de niveau supĂ©rieur pouvait dĂ©clarer un nƓud diffĂ©rĂ©. Sans cela, un agrĂ©gateur avec plusieurs arĂȘtes amont se dĂ©clencherait dĂšs que la premiĂšre branche serait terminĂ©e.

Chaque nƓud est une async fermeture qui exĂ©cute un Agent et Ă©crit son rĂ©sultat dans l'Ă©tat du graphe ; l'arĂȘte conditionnelle lit decision pour boucler ou terminer. Voir l'implĂ©mentation complĂšte et exĂ©cutable dans l'exemple coding_graph et la rĂ©fĂ©rence Graph Agents pour l'API gĂ©nĂ©rale.

Quand utiliser un graphe par rapport au harnais

  • Travail d'Agent unique, linĂ©aire/itĂ©ratif → juste un CodingAgent (les commandes code / goal).
  • SpĂ©cialistes parallĂšles, rĂ©vision multi-Ă©tapes, rĂ©futation contradictoire, essaims → un adk-graph flux de travail (la commande ultracode).

Suivant : Exemples →

Workflows de Graph (ultra-revue) - Documentation ADK-Rust | ADK-Rust