تنسيق متعدد الوكلاء
شغّل وكلاء متعددين، ودع controller يقرر الترتيب.
بعض الأعمال لا يمكن كتابة ترتيبها مسبقًا. اضبط type: controller، وأعلن ما يجب أن يكون صحيحًا عند انتهاء التشغيل، فيدع Dagu النموذج يختار خطوة الوكيل التالية كلما وردت الملاحظات. يبقى كل إجراء خطوة مسار عادية، مع السجلات وإعادة المحاولة والموافقات وسجل التدقيق.
# code-review.yaml
type: controller
llm:
provider: anthropic
model: claude-opus-5
system: |
Get top_n.py past both reviews. When a review fails, pass its finding
to revise, then ask that same reviewer again. A revision made for one
reviewer can break the other.
steps:
- name: review_simplicity
description: Judge simplicity. Prints PASS, or FAIL with what to change.
action: harness.run
with:
provider: opencode
prompt: Read top_n.py. Print "PASS" or "FAIL: <what to change>".
- name: review_correctness
description: Judge correctness. Prints PASS, or FAIL with the bug.
action: harness.run
with:
provider: codex
prompt: Read top_n.py. Print "PASS" or "FAIL: <the bug>".
- name: revise
description: Edit top_n.py to resolve one review finding.
action: dag.run
with: { dag: revise }
tasks:
- name: simplicity_passed
description: The latest simplicity review returned PASS on the current file.
- name: correctness_passed
description: The latest correctness review returned PASS on the current file.أعلن معايير الإنجاز بدل ترتيب الخطوات
كل إجراء هو واجهة وكيل حقيقية: Claude وCodex وGemini وOpenCode
تُحسم كل مهمة بحالة completed أو skipped أو failed
انتظار رد الإنسان لا يترك أي عملية قائمة
At a glance
مسارات controller مقابل أطر الوكلاء
أنت تعلن معايير الإنجاز. ينتهي التشغيل حين لا تبقى مهمة مفتوحة.
إما أن يقرر النموذج بنفسه أنه انتهى، أو تُرسم كل المسارات مسبقًا وتُصان يدويًا.
التشغيل المنتظر ينهي عمليته ويستأنف على عملية أخرى.
الانتظار الطويل يعني عادةً عملية يجب إبقاؤها حية ومخزن حالة يجب تشغيله.
الجدولة والطوابير وإعادة المحاولة والمخرجات وسجل التدقيق تأتي من تشغيل DAG.
يُعاد بناؤها في كل مشروع، أو تُسلَّم إلى مستوى تحكّم مُستضاف.
مجموعة الخطوات المكتوبة في ملف المسار.
كل ما تسمح به تعريفات الأدوات.
In depth
Where each tool fits
الترتيب هو تحديدًا ما لا يمكن كتابته
يستطيع الرسم البياني التفرّع حسب رمز الخروج، لكنه لا يستطيع التفرّع حسب ما قالته المراجعة فعلًا. يبقي مسار controller الإجراءات ثابتة ويسلّم الترتيب وحده.
- تصبح الخطوات فهرس إجراءات، فلا يبقى depends يحتاج صيانة
- تعلن قائمة tasks ما يجب أن يكون صحيحًا عند انتهاء التشغيل
- ينقل controller ملاحظة وكيل إلى معاملات الوكيل التالي
النموذج يختار الترتيب، لا القدرات
يختار controller من الخطوات التي أعلنتها فقط. لا يمكنه اختراع خطوة، ولا كتابة أمر shell خاص به، ولا الوصول إلى ما لا يسمّيه الملف، فيكون نطاق الأثر هو تعريف المسار نفسه.
- شغّل كل وكيل على المضيف أو داخل حاوية معزولة بنقاط تحميل وقواعد خروج صريحة
- امنح كل دور مزوّده ونموذجه، حتى لا يصحّح نموذج واحد عمله بنفسه
- ما تثق به مع الوقت ينتقل إلى مسار فرعي فيتوقف عن كونه قرارًا
ضوابط الإنتاج تأتي من التشغيل لا من إطار عمل
تشغيل controller هو تشغيل DAG. تنطبق الجدولة والطوابير وإعادة المحاولة والمخرجات وسجل التدقيق كما هي، وحدود إنفاق الوكيل إعدادات في المحرك لا تعليمات في الموجّه.
- يعلّق ask_user التشغيل تعليقًا دائمًا: تنتهي العملية ويتحرر مقعد العامل
- يجيب شخص ما بعد ساعات فيستأنف التشغيل على عملية جديدة
- حدود الجولات ومحاولات الإجراء والأسئلة تُفشل التشغيل بدل الإنفاق بلا سقف
يمكن إعادة بناء أي تشغيل لاحقًا
لا توجد في controller حواف اعتماد، لذا يُعرض التشغيل بوصفه تسلسل القرارات التي اتُّخذت فعلًا لا بوصفه رسمًا بيانيًا.
- خط زمني للقرارات: سطر لكل جولة، مع عدد المحاولات والمدة ورابط التشغيل الفرعي الناتج
- عرض للمهام يبيّن سبب حسم controller لكل هدف
- النص الكامل للجلسة، بما في ذلك كل نتيجة أداة رآها النموذج
FAQ
Practical questions before adopting Dagu
بم يختلف مسار controller عن حلقة وكيل؟
الحلقة المجردة تترك للنموذج تقرير متى انتهى. أما controller فيحتفظ بالحلقة ويستعيد شرط التوقف: أنت تعلن المهام ومعنى الإنجاز، وينتهي التشغيل حين لا تبقى مهمة مفتوحة.
ماذا يحدث إذا تبيّن أن مهمة ما غير ضرورية؟
يعلّمها controller بحالة skipped ويسجّل السبب، ويبقى التشغيل ناجحًا. skipped وfailed حالتان منفصلتان لأن «لم يكن هناك ما يُعمل» و«تعذّر تنفيذه» نتيجتان مختلفتان في سجل التدقيق.
هل يمكن أن تستخدم الخطوات المختلفة نماذج مختلفة؟
نعم. كل خطوة Agent Harness تسمّي مزوّدها ونموذجها، ونموذج controller نفسه يُضبط على حدة، فيمكن لنموذج رخيص أن يقود متخصصين مكلفين، أو لمزوّدَين أن يتحققا من بعضهما.
كيف أمنع التشغيل من الإنفاق بلا حدود؟
المحرك هو من يفرض الحدود. يُنفَّذ الإجراء خمس مرات كحد أقصى في التشغيل الواحد، ويُطرح خمسة أسئلة كحد أقصى، وحد الجولات خمسون افتراضيًا ويمكن خفضه. بلوغ أي حد يُفشل التشغيل ويسمّي ما بقي مفتوحًا.
متى يبقى الرسم البياني العادي هو الخيار الصحيح؟
إن كان بإمكانك رسم الرسم البياني فارسمه. يبقى type: graph هو الافتراضي لأنه أسرع وأرخص وقابل لإعادة الإنتاج. لا تلجأ إلى controller إلا حين يتوقف الترتيب فعلًا على ما أنتجته الخطوات السابقة.
Next step
Start with one workflow.
Install Dagu, move one fragile script or agent task into YAML, and decide from a real run history.