الانتقال إلى المحتوى الرئيسي
الـ Checkpointing يحفظ لقطة من حالة التنفيذ أثناء التشغيل بحيث يمكن لطاقم أو تدفق أو وكيل الاستئناف بعد الفشل أو التفرع إلى فرع بديل.

الشرح

كيف يعمل الـ Checkpointing: الأحداث والتخزين والوراثة.

درس تطبيقي

دليل 5 دقائق: تشغيل، إيقاف، استئناف.

ادلة عملية

وصفات مركزة على المهام لسير العمل الشائع.

المرجع

CheckpointConfig والأحداث والمزودات وسطر الأوامر.

الشرح

ما هي نقطة الحفظ

تلتقط نقطة الحفظ الحالة التي يحتاجها CrewAI لإعادة إنشاء تشغيل أثناء سيره: الحالة الكاملة للطاقم أو التدفق أو الوكيل — التكوين، وذاكرة الوكلاء ومصادر المعرفة، وتقدم المهام، والمخرجات الوسيطة، والحالة الداخلية والسمات — إلى جانب مدخلات الـ kickoff، وسجل الأحداث حتى تلك النقطة، ومعرف نسب يربط نقطة الحفظ بالتشغيل الذي جاءت منه. تحفظ دوال الاستدعاء (callbacks) كمراجع إلى دوال مسماة فقط؛ راجع ما لا تعيده الاستعادة. الاستعادة تعيد بناء تلك الحالة وتستمر. تتخطى المهام المكتملة، وتعاد ترطيب الذاكرة والمعرفة، ويعمل العمل التابع على نفس المخرجات التي أنتجها التشغيل الأصلي. التفرع يجري نفس الاستعادة تحت نسب جديد، بحيث يكتب الفرع الجديد والتشغيل الأصلي نقاط الحفظ جنبا إلى جنب دون أن يطمس أحدهما الآخر.

متى تكتب نقاط الحفظ

الـ Checkpointing مدفوع بالأحداث. يشترك وقت التشغيل في الأحداث التي تحددها عبر on_events ويكتب نقطة حفظ عند إطلاق أحدها. الافتراضي task_completed ينتج نقطة حفظ لكل مهمة منتهية — توازن معقول بين الدقة واستخدام القرص. الأحداث عالية التردد مثل llm_call_completed متاحة للاستعادة الدقيقة لكنها تكتب ملفات أكثر بكثير.

التخزين

يتضمن CrewAI مزودين:
  • JsonProvider يكتب ملفا لكل نقطة حفظ. قابل للقراءة وسهل التفقد.
  • SqliteProvider يكتب إلى قاعدة بيانات SQLite واحدة. أفضل لنقاط الحفظ عالية التردد.
كلاهما يحذف أقدم نقاط الحفظ عند تحديد max_checkpoints.
كتابة نقاط الحفظ بأفضل جهد. فشل نقطة حفظ يسجل لكنه لا يقاطع التشغيل.

نموذج الوراثة

Crew وFlow وAgent كلها تقبل وسيط checkpoint. يرث الأبناء من الأب ما لم يحددوا قيمتهم الخاصة أو يمرروا False للانسحاب. فعل الـ Checkpointing مرة واحدة على الطاقم وتشارك كل الوكلاء، أو استبعد وكيلا واحدا بشكل انتقائي.

ما لا تعيده الاستعادة

تبني الاستعادة الطاقم أو التدفق أو الوكيل من ملف نقطة الحفظ، وليس من الكائن الذي تستدعي عليه kickoff(). يشغّل crew.kickoff(from_checkpoint=...) الطاقم المخزن في الملف، لذلك لا تنسخ الكائنات القابلة للاستدعاء التي عيّنتها على crew. تحفظ نقطة الحفظ دالة الاستدعاء كمسار منقط لدالة على مستوى الوحدة، مثل "my_project.hooks.on_task_done"، ثم تستوردها مجددا عند الاستعادة. نقطة الحفظ بيانات، لذلك لا يستورد CrewAI هذه المسارات إلا عند تعيين متغير البيئة CREWAI_DESERIALIZE_CALLBACKS=1. بدونه، تؤدي استعادة نقطة حفظ تسمي دالة استدعاء إلى ValueError. عيّنه فقط لملفات نقاط الحفظ التي تثق بها. لا تحفظ العناصر التالية ولا تعمل بعد الاستعادة:
  • دوال lambda، والـ closures، والدوال المرتبطة مثل notifier.on_task_done، وكائنات functools.partial، والكائنات القابلة للاستدعاء. يعرض CrewAI التحذير A ... callback cannot be saved in a checkpoint عند تمرير أي منها إلى Task أو Agent أو Crew أو أداة؛ أما تعيين الخاصية لاحقا فلا يعرض تحذيرا. تُستعاد دالة cache_function لأداة من هذا النوع كدالة لا تخزن أي نتيجة مؤقتا.
  • الـ guardrails القابلة للاستدعاء. يعرض CrewAI تحذيرا عند كتابة نقطة الحفظ. تحفظ الـ guardrails النصية.
  • خطافات @before_kickoff و@after_kickoff في فئة @CrewBase.
للاحتفاظ بدالة استدعاء لا يمكن حفظها، استعد باستخدام Crew.from_checkpoint() وعيّنها مجددا قبل kickoff():

درس تطبيقي: استئناف طاقم فاشل

هذا الدليل يستغرق حوالي 5 دقائق. ستشغل طاقما بمهمتين، توقفه في المنتصف، ثم تستأنف من نقطة الحفظ المحفوظة.
1

أنشئ الطاقم مع تفعيل الـ Checkpointing

2

شغله وأوقفه بعد المهمة الأولى

اضغط Ctrl+C بعد انتهاء المهمة الأولى. في ./.checkpoints/، الملف بصيغة <timestamp>_<uuid>.json هو نقطة الحفظ.
3

استأنف من نقطة الحفظ

يتم تخطي مهمة البحث، ويعمل الكاتب على مخرجات البحث المحفوظة، وينتهي الطاقم.
يبنى الطاقم المستأنف من ملف نقطة الحفظ، وليس من crew. إذا كانت مهامك تستخدم دوال استدعاء، فاقرأ ما لا تعيده الاستعادة.

ادلة عملية

يكتب إلى ./.checkpoints/ عند كل task_completed.
SQLite يفعل وضع journal WAL للقراءات المتزامنة. يفضل لنقاط الحفظ عالية التردد.
fork() يستعيد نقطة حفظ تحت نسب جديد بحيث لا يتصادم التشغيل الجديد مع الأصلي.
تسمية branch اختيارية؛ يتم إنشاء واحدة إذا أغفلت.
المشغل الافتراضي: task_completed.
سجل معالجا على أي حدث واستدع state.checkpoint().
يتم تمرير وسيط state تلقائيا عندما يقبل المعالج ثلاثة معاملات. راجع Event Listeners لقائمة الأحداث الكاملة.
Checkpoint TUI tree view

شجرة نقاط الحفظ — الفروع والتفرعات تتداخل تحت أبيها.

اللوحة اليسرى تجمع نقاط الحفظ حسب الفرع؛ التفرعات تتداخل تحت أبيها. اختيار نقطة حفظ يفتح لوحة التفاصيل مع بياناتها الوصفية وحالة الكيان وتقدم المهام. Resume يكمل التشغيل؛ Fork يبدأ فرعا جديدا.
Checkpoint detail overview tab

تبويب النظرة العامة — البيانات الوصفية وحالة الكيان وملخص التشغيل.

لوحة التفاصيل تعرض منطقتين قابلتين للتحرير:
  • Inputs — مدخلات الـ kickoff الأصلية، معبأة مسبقا وقابلة للتحرير.
    Editable kickoff inputs
  • مخرجات المهام — مخرجات المهام المكتملة. تحرير مخرج والضغط على Fork يبطل المهام التابعة لتعاد بالسياق المعدل.
    Editable task outputs
Fork confirmation panel

عرض التفرع — تأكيد فرع جديد من نقطة الحفظ المختارة.

مفيد لاستكشاف “ماذا لو”: تفرع، عدل، راقب.

المرجع

CheckpointConfig

str
افتراضي:"\"./.checkpoints\""
وجهة التخزين. مجلد لـ JsonProvider، مسار ملف قاعدة بيانات لـ SqliteProvider.
list[CheckpointEventType | Literal["*"]]
افتراضي:"[\"task_completed\"]"
أنواع الأحداث التي تطلق نقطة حفظ. CheckpointEventType هو Literal — مدقق الأنواع يكمل تلقائيا ويرفض القيم غير المدعومة. راجع أنواع الأحداث للقائمة الكاملة.
BaseProvider
افتراضي:"JsonProvider()"
واجهة التخزين. JsonProvider أو SqliteProvider.
int | None
افتراضي:"None"
الحد الاقصى لنقاط الحفظ المحتفظ بها. الأقدم تحذف بعد كل كتابة.
Path | str | None
افتراضي:"None"
نقطة الحفظ المراد استعادتها عند تمريرها عبر from_checkpoint.

قيم حقل checkpoint

مقبولة في Crew وFlow وAgent.
افتراضي
يرث من الأب.
bool
تفعيل بالإعدادات الافتراضية.
bool
انسحاب صريح. يوقف الوراثة.
CheckpointConfig
إعدادات مخصصة.

أنواع الأحداث

يقبل on_events أي مجموعة من قيم CheckpointEventType. الافتراضي ["task_completed"] يكتب نقطة حفظ لكل مهمة منتهية، و["*"] يطابق جميع الأحداث.
["*"] والأحداث عالية التردد مثل llm_call_completed تكتب نقاط حفظ كثيرة وقد تضر بالاداء. استخدمها مع max_checkpoints.

مزودات التخزين

provider
ملف واحد لكل نقطة حفظ بصيغة <timestamp>_<uuid>.json داخل location.
provider
ملف قاعدة بيانات واحد في location مع journaling WAL.

سطر الأوامر