سير عمل الرسوم البيانية (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_fnmark_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).

التالي: أمثلة ←