سير عمل الرسوم البيانية (ultra-review)
لأي شيء يتجاوز حلقة وكيل واحدة — مراجعون متوازون، فحوصات تنافسية، مسارات متعددة المراحل — قم بتنسيق وكلاء الترميز كـ adk-graph StateGraph. هذه هي طريقة عمل الأمر ultracode و مثال coding_graph.
نمط "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، مقيدًا بحد أقصى للجولات + حد تكرار الرسم البياني.
Fan-out / fan-in في adk-graph
هناك قدرتان لـ adk-graph تجعلان هذا صحيحًا:
- Parallel fan-out — عدة عقد يمكن الوصول إليها من عقدة واحدة سابقة تعمل concurrently في نفس الخطوة الفائقة.
- Fan-in barrier — عقدة معلنة بـ
add_deferred_node_fnتعمل exactly once، فقط بعد اكتمال all مساراتها السابقة (وليس مرة واحدة لكل مسار سابق).
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للعقد المخصصة) يجلب fan-in إلى منشئStateGraphالأساسي — في السابق، كانGraphAgentBuilderذو المستوى الأعلى فقط هو من يمكنه الإعلان عن عقدة مؤجلة. بدون ذلك، فإن المجمع الذي يحتوي على حواف سابقة متعددة سينطلق بمجرد انتهاء الفرع الأول.
كل عقدة هي إغلاق async يقوم بتشغيل وكيل ويكتب نتيجته في حالة الرسم البياني؛ الحافة الشرطية تقرأ decision للتكرار أو الإنهاء. راجع التنفيذ الكامل والقابل للتشغيل في مثال coding_graph ومرجع Graph Agents لـ API العام.
متى تستخدم الرسم البياني مقابل الـ harness
- Single agent, linear/iterative work ← مجرد
CodingAgent(أوامرcode/goal). - Parallel specialists, multi-stage review, adversarial refutation, swarms ← سير عمل
adk-graph(أمرultracode).
التالي: أمثلة ←