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
LlmAgenten lecture seule qui inspecte le code et retourne unVERDICT: approveouVERDICT: changesavec des notes. - synthétiser agrÚge les verdicts et les achemine vers
reviseoufinalize, 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_fns'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(etmark_deferredpour les nĆuds personnalisĂ©s) apporte le fan-in au constructeur de baseStateGraphâ auparavant, seul leGraphAgentBuilderde 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 commandescode/goal). - SpĂ©cialistes parallĂšles, rĂ©vision multi-Ă©tapes, rĂ©futation contradictoire, essaims â un
adk-graphflux de travail (la commandeultracode).
Suivant : Exemples â