--- title: Checkpointing description: حفظ حالة التنفيذ تلقائيا حتى تتمكن الطواقم والتدفقات والوكلاء من الاستئناف بعد الفشل. icon: floppy-disk mode: "wide" --- الـ Checkpointing يحفظ لقطة من حالة التنفيذ اثناء التشغيل بحيث يمكن لطاقم او تدفق او وكيل الاستئناف بعد الفشل او التفرع الى فرع بديل. كيف يعمل الـ Checkpointing: الاحداث والتخزين والوراثة. دليل 5 دقائق: تشغيل، ايقاف، استئناف. وصفات مركزة على المهام لسير العمل الشائع. `CheckpointConfig` والاحداث والمزودات وسطر الاوامر. ## الشرح ### ما هي نقطة الحفظ نقطة الحفظ هي لقطة متسلسلة من `RuntimeState` تكتب في نقطة معينة من التنفيذ. تسجل اي المهام اكتملت ومخرجاتها والمدخلات الحالية ومعرف نسب يحدد التشغيل. عند الاستعادة من نقطة حفظ، يعيد CrewAI بناء تلك الحالة ويتخطى العمل المكتمل ويستمر. عند التفرع، يستعيد CrewAI الحالة تحت نسب جديد بحيث لا يتداخل الفرع الجديد مع التشغيل الاصلي. ### متى تكتب نقاط الحفظ الـ Checkpointing مدفوع بالاحداث. يشترك وقت التشغيل في الاحداث التي تحددها عبر `on_events` ويكتب نقطة حفظ عند اطلاق احدها. الافتراضي `task_completed` ينتج نقطة حفظ لكل مهمة منتهية — توازن معقول بين الدقة واستخدام القرص. الاحداث عالية التردد مثل `llm_call_completed` متاحة للاستعادة الدقيقة لكنها تكتب ملفات اكثر بكثير. ### التخزين يتضمن CrewAI مزودين: - `JsonProvider` يكتب ملفا لكل نقطة حفظ. قابل للقراءة وسهل التفقد. - `SqliteProvider` يكتب الى قاعدة بيانات SQLite واحدة. افضل لنقاط الحفظ عالية التردد. كلاهما يحذف اقدم نقاط الحفظ عند تحديد `max_checkpoints`. كتابة نقاط الحفظ بافضل جهد. فشل نقطة حفظ يسجل لكنه لا يقاطع التشغيل. ### نموذج الوراثة `Crew` و`Flow` و`Agent` كلها تقبل وسيط `checkpoint`. يرث الابناء من الاب ما لم يحددوا قيمتهم الخاصة او يمرروا `False` للانسحاب. فعل الـ Checkpointing مرة واحدة على الطاقم وتشارك كل الوكلاء، او استبعد وكيلا واحدا بشكل انتقائي. ## درس تطبيقي: استئناف طاقم فاشل هذا الدليل يستغرق حوالي 5 دقائق. ستشغل طاقما بمهمتين، توقفه في المنتصف، ثم تستأنف من نقطة الحفظ المحفوظة. ```python from crewai import Agent, Crew, Task researcher = Agent(role="Researcher", goal="Research", backstory="Expert") writer = Agent(role="Writer", goal="Write", backstory="Expert") crew = Crew( agents=[researcher, writer], tasks=[ Task(description="Research AI trends", agent=researcher, expected_output="bullets"), Task(description="Write a summary", agent=writer, expected_output="paragraph"), ], checkpoint=True, ) ``` ```python result = crew.kickoff() ``` اضغط `Ctrl+C` بعد انتهاء المهمة الاولى. في `./.checkpoints/`، الملف بصيغة `_.json` هو نقطة الحفظ. ```python from crewai import CheckpointConfig result = crew.kickoff( from_checkpoint=CheckpointConfig( restore_from="./.checkpoints/_.json", ), ) ``` يتم تخطي مهمة البحث، ويعمل الكاتب على مخرجات البحث المحفوظة، وينتهي الطاقم. ## ادلة عملية ```python crew = Crew(agents=[...], tasks=[...], checkpoint=True) ``` يكتب الى `./.checkpoints/` عند كل `task_completed`. ```python from crewai import Crew, CheckpointConfig crew = Crew( agents=[...], tasks=[...], checkpoint=CheckpointConfig( location="./my_checkpoints", on_events=["task_completed", "crew_kickoff_completed"], max_checkpoints=5, ), ) ``` ```python JsonProvider from crewai import Crew, CheckpointConfig from crewai.state import JsonProvider crew = Crew( agents=[...], tasks=[...], checkpoint=CheckpointConfig( location="./my_checkpoints", provider=JsonProvider(), max_checkpoints=5, ), ) ``` ```python SqliteProvider from crewai import Crew, CheckpointConfig from crewai.state import SqliteProvider crew = Crew( agents=[...], tasks=[...], checkpoint=CheckpointConfig( location="./.checkpoints.db", provider=SqliteProvider(), max_checkpoints=50, ), ) ``` SQLite يفعل وضع journal WAL للقراءات المتزامنة. يفضل لنقاط الحفظ عالية التردد. ```python crew = Crew( agents=[ Agent(role="Researcher", ...), Agent(role="Writer", ..., checkpoint=False), ], tasks=[...], checkpoint=True, ) ``` ```python config = CheckpointConfig(restore_from="./my_checkpoints/.json") crew = Crew.from_checkpoint(config) result = crew.kickoff() ``` `fork()` يستعيد نقطة حفظ تحت نسب جديد بحيث لا يتصادم التشغيل الجديد مع الاصلي. ```python config = CheckpointConfig(restore_from="./my_checkpoints/.json") crew = Crew.fork(config, branch="experiment-a") result = crew.kickoff(inputs={"strategy": "aggressive"}) ``` تسمية `branch` اختيارية؛ يتم انشاء واحدة اذا اغفلت. ```python crew = Crew( agents=[researcher, writer], tasks=[research_task, write_task, review_task], checkpoint=CheckpointConfig(location="./crew_cp"), ) ``` المشغل الافتراضي: `task_completed`. ```python from crewai.flow.flow import Flow, start, listen from crewai import CheckpointConfig class MyFlow(Flow): @start() def step_one(self): return "data" @listen(step_one) def step_two(self, data): return process(data) flow = MyFlow( checkpoint=CheckpointConfig( location="./flow_cp", on_events=["method_execution_finished"], ), ) result = flow.kickoff() config = CheckpointConfig(restore_from="./flow_cp/.json") flow = MyFlow.from_checkpoint(config) result = flow.kickoff() ``` ```python agent = Agent( role="Researcher", goal="Research topics", backstory="Expert researcher", checkpoint=CheckpointConfig( location="./agent_cp", on_events=["lite_agent_execution_completed"], ), ) result = agent.kickoff(messages=[{"role": "user", "content": "Research AI trends"}]) ``` سجل معالجا على اي حدث واستدع `state.checkpoint()`. ```python Sync from crewai.events.event_bus import crewai_event_bus from crewai.events.types.llm_events import LLMCallCompletedEvent @crewai_event_bus.on(LLMCallCompletedEvent) def on_llm_done(source, event, state): path = state.checkpoint("./my_checkpoints") print(f"تم حفظ نقطة الحفظ: {path}") ``` ```python Async from crewai.events.event_bus import crewai_event_bus from crewai.events.types.llm_events import LLMCallCompletedEvent @crewai_event_bus.on(LLMCallCompletedEvent) async def on_llm_done_async(source, event, state): path = await state.acheckpoint("./my_checkpoints") print(f"تم حفظ نقطة الحفظ: {path}") ``` يتم تمرير وسيط `state` تلقائيا عندما يقبل المعالج ثلاثة معاملات. راجع [Event Listeners](/ar/concepts/event-listener) لقائمة الاحداث الكاملة. ```bash crewai checkpoint # كشف تلقائي لـ .checkpoints/ او .checkpoints.db crewai checkpoint --location ./my_checkpoints crewai checkpoint --location ./.checkpoints.db ``` Checkpoint TUI اللوحة اليسرى تجمع نقاط الحفظ حسب الفرع؛ التفرعات تتداخل تحت ابيها. اختيار نقطة حفظ يعرض بياناتها الوصفية وحالة الكيان وتقدم المهام. **Resume** يكمل التشغيل؛ **Fork** يبدا فرعا جديدا. لوحة التفاصيل تعرض منطقتين قابلتين للتحرير: - **Inputs** — مدخلات الـ kickoff الاصلية، معبأة مسبقا وقابلة للتحرير. - **مخرجات المهام** — مخرجات المهام المكتملة. تحرير مخرج والضغط على **Fork** يبطل المهام التابعة لتعاد بالسياق المعدل. مفيد لاستكشاف "ماذا لو": تفرع، عدل، راقب. ```bash crewai checkpoint list ./my_checkpoints crewai checkpoint info ./my_checkpoints/.json crewai checkpoint info ./.checkpoints.db ``` ## المرجع ### `CheckpointConfig` وجهة التخزين. مجلد لـ `JsonProvider`، مسار ملف قاعدة بيانات لـ `SqliteProvider`. انواع الاحداث التي تطلق نقطة حفظ. راجع [انواع الاحداث](#انواع-الاحداث). واجهة التخزين. `JsonProvider` او `SqliteProvider`. الحد الاقصى لنقاط الحفظ المحتفظ بها. الاقدم تحذف بعد كل كتابة. نقطة الحفظ المراد استعادتها عند تمريرها عبر `from_checkpoint`. ### قيم حقل `checkpoint` مقبولة في `Crew` و`Flow` و`Agent`. يرث من الاب. تفعيل بالاعدادات الافتراضية. انسحاب صريح. يوقف الوراثة. اعدادات مخصصة. ### انواع الاحداث قيم شائعة لـ `on_events`: | حالة الاستخدام | الاحداث | |:---------------|:--------| | بعد كل مهمة | `["task_completed"]` | | بعد كل طريقة في التدفق | `["method_execution_finished"]` | | بعد تنفيذ الوكيل | `["agent_execution_completed"]`, `["lite_agent_execution_completed"]` | | عند اكتمال الطاقم فقط | `["crew_kickoff_completed"]` | | بعد كل استدعاء LLM | `["llm_call_completed"]` | | كل شيء | `["*"]` | `["*"]` والاحداث عالية التردد مثل `llm_call_completed` تكتب نقاط حفظ كثيرة وقد تضر بالاداء. استخدمها مع `max_checkpoints`. ### مزودات التخزين ملف واحد لكل نقطة حفظ بصيغة `_.json` داخل `location`. ملف قاعدة بيانات واحد في `location` مع journaling WAL. ### سطر الاوامر | الامر | الغرض | |:------|:------| | `crewai checkpoint` | تشغيل TUI؛ كشف التخزين تلقائيا. | | `crewai checkpoint --location ` | تشغيل TUI على موقع محدد. | | `crewai checkpoint list ` | سرد نقاط الحفظ. | | `crewai checkpoint info ` | تفقد ملف نقطة حفظ او اخر مدخل في قاعدة بيانات SQLite. |