بديل 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 من زاوية من يتولى التشغيل

الشكل
Dagu

محرك مسارات تشغّله كملف تنفيذي.

LangGraph

مكتبة تُدمج داخل تطبيق Python أو JavaScript.

التعريف
Dagu

YAML تعريفي، يُدار إصداره بجوار الشيفرة التي يشغّلها.

LangGraph

بناء الرسم البياني داخل شيفرة التطبيق.

التشغيل والصيانة
Dagu

الجدولة والطوابير وإعادة المحاولة والمخرجات وسجل التشغيل تأتي مع المحرك.

LangGraph

تحفظ أدوات checkpointer حالة الرسم البياني، أما الجدولة والإتاحة فمن خدمتك أو من LangGraph Platform.

وحدة العمل
Dagu

عملية: أي لغة وأي واجهة سطر أوامر، وداخل حاوية عند الحاجة.

LangGraph

دالة داخل العملية المضيفة.

In depth

Where each tool fits

01

المكتبة تحتاج تطبيقًا، أما المحرك فلا

يبني LangGraph الرسم البياني. ومع ذلك يظل هناك ما يجب أن يجدوله ويضعه في طابور ويعيد محاولته ويحفظ حالته ويعرض ما جرى. ذلك الشيء إما خدمة تكتبها بنفسك أو LangGraph Platform. وDagu هو تلك الطبقة أصلًا.

  • شغّل ملفًا تنفيذيًا واحدًا. لا خدمة ويب تُكتب ولا تجمّع عمال يُصمَّم
  • الجدولة والطوابير وإعادة المحاولة وسجل التشغيل قدرات في المحرك لا تكاملات خارجية
  • التعريف نفسه يعمل على حاسوب محمول أو خادم افتراضي واحد أو منسّق مع عمال
02

الخطوات عمليات، فلا يرتبط المسار بلغة بعينها

عقد LangGraph دوال Python أو JavaScript تعمل داخل عمليتك. أما خطوة Dagu فهي أمر، فتصبح وحدة العمل هي ما يعمل في بيئتك أصلًا.

  • استدعِ سكربتات shell وملفات تنفيذية وحاويات وأوامر SSH ونقاط HTTP وSQL من مسار واحد
  • شغّل وكلاء البرمجة عبر harness.run: Claude أو Codex أو Gemini أو OpenCode أو واجهة داخلية
  • امنح أي خطوة حاوية معزولة بنقاط تحميل وسلسلة أدوات وقواعد خروج صريحة
03

ارسم الرسم البياني حين تستطيع، وسلّم الترتيب حين لا تستطيع

يطلب 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.