بديل LangGraph
بيئة تشغيل لمسارات الوكلاء، لا مكتبة داخل تطبيقك.
LangGraph طريقة جيدة للتعبير عن رسم بياني للوكلاء داخل الشيفرة. وDagu هو الطبقة التي تشغّله: ملف تنفيذي واحد ذاتي الاستضافة، المسار فيه YAML، والوكلاء خطوات عادية، والجدولة والطوابير وإعادة المحاولة والتعليق الدائم وسجل التشغيل تأتي من المحرك لا من التطبيق الذي تكتبه حوله.
# triage.yaml
schedule: "*/15 * * * *"
max_active_runs: 1
steps:
- id: fetch
run: ./scripts/fetch-new-issues.sh
output: ISSUES
- id: classify
action: harness.run
with:
provider: claude
prompt: Classify each issue in ${ISSUES}. Return JSON.
output_schema: schemas/triage.json
retry_policy:
limit: 3
interval_sec: 30
depends: [fetch]
- id: apply_labels
run: ./scripts/apply-labels.sh
depends: [classify]المسارات مكتوبة بصيغة YAML لا بشيفرة التطبيق
الخطوات عمليات، فتعمل بأي لغة وأي واجهة سطر أوامر
الجدولة والطوابير وإعادة المحاولة والسجل تأتي داخل الملف التنفيذي
التشغيل المنتظر يحرّر العملية ويستأنف لاحقًا
At a glance
LangGraph وDagu من زاوية من يتولى التشغيل
محرك مسارات تشغّله كملف تنفيذي.
مكتبة تُدمج داخل تطبيق Python أو JavaScript.
YAML تعريفي، يُدار إصداره بجوار الشيفرة التي يشغّلها.
بناء الرسم البياني داخل شيفرة التطبيق.
الجدولة والطوابير وإعادة المحاولة والمخرجات وسجل التشغيل تأتي مع المحرك.
تحفظ أدوات checkpointer حالة الرسم البياني، أما الجدولة والإتاحة فمن خدمتك أو من LangGraph Platform.
عملية: أي لغة وأي واجهة سطر أوامر، وداخل حاوية عند الحاجة.
دالة داخل العملية المضيفة.
In depth
Where each tool fits
المكتبة تحتاج تطبيقًا، أما المحرك فلا
يبني LangGraph الرسم البياني. ومع ذلك يظل هناك ما يجب أن يجدوله ويضعه في طابور ويعيد محاولته ويحفظ حالته ويعرض ما جرى. ذلك الشيء إما خدمة تكتبها بنفسك أو LangGraph Platform. وDagu هو تلك الطبقة أصلًا.
- شغّل ملفًا تنفيذيًا واحدًا. لا خدمة ويب تُكتب ولا تجمّع عمال يُصمَّم
- الجدولة والطوابير وإعادة المحاولة وسجل التشغيل قدرات في المحرك لا تكاملات خارجية
- التعريف نفسه يعمل على حاسوب محمول أو خادم افتراضي واحد أو منسّق مع عمال
الخطوات عمليات، فلا يرتبط المسار بلغة بعينها
عقد LangGraph دوال Python أو JavaScript تعمل داخل عمليتك. أما خطوة Dagu فهي أمر، فتصبح وحدة العمل هي ما يعمل في بيئتك أصلًا.
- استدعِ سكربتات shell وملفات تنفيذية وحاويات وأوامر SSH ونقاط HTTP وSQL من مسار واحد
- شغّل وكلاء البرمجة عبر harness.run: Claude أو Codex أو Gemini أو OpenCode أو واجهة داخلية
- امنح أي خطوة حاوية معزولة بنقاط تحميل وسلسلة أدوات وقواعد خروج صريحة
ارسم الرسم البياني حين تستطيع، وسلّم الترتيب حين لا تستطيع
يطلب LangGraph رسم كل مسار، وهذا صحيح إلى أن يصبح الترتيب متوقفًا على ما قاله المراجع. يبقي Dagu على type: graph افتراضيًا ويضيف type: controller للعمل الذي لم يتّسع يومًا لرسم بياني واحد.
- يعلن مسار controller معايير الإنجاز ويترك للنموذج اختيار الإجراء التالي
- لا يختار النموذج إلا من الخطوات المعلنة، فيكون نطاق الأثر هو الملف
- ينتج النوعان التشغيل ذاته، بالسجلات وإعادة المحاولة والمخرجات والتاريخ ذاتها
FAQ
Practical questions before adopting Dagu
هل يحلّ Dagu محل LangGraph مباشرة؟
لا. كلٌّ منهما في طبقة مختلفة. يناسبك LangGraph حين تريد تركيب استدعاءات النموذج في Python أو JavaScript مع تحكم دقيق في حالة الرسم البياني. ويناسبك Dagu أكثر حين يكون العمل مجموعة أوامر وواجهات وكلاء تحتاج جدولة وإعادة محاولة وموافقات وأثرًا للتدقيق.
هل يمكن الاستمرار في استخدام LangGraph داخل Dagu؟
نعم. أبقِ تطبيق LangGraph سكربتًا أو حاوية وشغّله كخطوة واحدة. ويوفّر Dagu حوله الجدولة وسياسة إعادة المحاولة والسجلات والمخرجات وتاريخ التشغيل.
كيف يتعامل Dagu مع تدخّل الإنسان في المسار؟
المهام البشرية، وask_user داخل مسارات controller، تعلّق التشغيل تعليقًا دائمًا. تنتهي العملية ويتحرر مقعد العامل، ثم يستأنف التشغيل على عملية جديدة بمجرد أن يجيب أحدهم.
هل يحتاج Dagu إلى قاعدة بيانات؟
لا. Dagu ملف تنفيذي واحد يخزّن التعريفات وتاريخ التشغيل والسجلات كملفات، فلا قاعدة بيانات وصفية ولا وسيط رسائل يجب تشغيله قبل أول تنفيذ.
Next step
Start with one workflow.
Install Dagu, move one fragile script or agent task into YAML, and decide from a real run history.