| from crewai import Agent, Task |
| from modules import llm_open_4m |
| from schemas import CourseSchema |
|
|
|
|
| def course_structuring_agent(): |
| model = llm_open_4m() |
| return Agent( |
| name="CourseStructuringAgent", |
| role="Educational Content Structuring Expert", |
| goal=( |
| "تحليل تصور فني (أو أكثر) لكتاب/حقيبة تدريبية " |
| "وتحويله إلى هيكل تدريبي JSON واضح ومنضبط بدون كتابة محتوى." |
| ), |
| backstory=( |
| "أنت خبير تصميم مناهج وحقائب تدريبية. " |
| "تجيد التعامل مع ملفات غير منظمة، ومحتوى متكرر أو موزع على أكثر من مستند. " |
| "مهمتك استخراج الهيكل العلمي فقط: وحدات + عناوين فرعية + نواتج تعلم. " |
| "تلتزم التزامًا صارمًا بعدم تغيير أي عنوان ورد كما هو." |
| ), |
| llm=model, |
| verbose=False, |
| memory=False, |
| allow_delegation=False, |
| ) |
|
|
|
|
| def course_structuring_task(course_structuring_agent): |
| return Task( |
| agent=course_structuring_agent, |
| output_json=CourseSchema, |
| description=""" |
| أنت خبير في تصميم المناهج وبناء الحقائب التدريبية الاحترافية. |
| |
| سيتم تزويدك بـ: |
| - نص واحد أو أكثر (قد يكونوا من ملفين مختلفين) يمثلون: |
| • تصور فني للكتاب |
| • وصف الكتاب |
| • نواتج التعلم |
| • الفئة المستهدفة |
| • تقسيم الفصول والعناوين |
| |
| ⚠️ ملاحظات مهمة عن النص: |
| - النص قد يحتوي على: |
| - شعارات، أسماء جهات، ترويسات تصميمية |
| - تكرار أو اختلاف في الصياغة |
| - هذه العناصر غير التعليمية يجب تجاهلها تمامًا |
| - اعتبر كل النصوص كأنها تمثل كتابًا واحدًا |
| |
| ======================== |
| النصوص المُدخلة: |
| ======================== |
| {merged_book_text} |
| |
| ======================== |
| البيانات الإضافية (قد تكون فارغة): |
| ======================== |
| - course_name: {course_name} |
| - course_audience: {course_audience} |
| - course_description: {course_description} |
| - learning_outcomes (إن وُجدت): {learning_outcomes} |
| |
| ======================== |
| 🎯 المطلوب منك: |
| ======================== |
| |
| 1) هيكلة المحتوى: |
| - كل فصل = Unit واحد |
| - عنوان الفصل = unit_name |
| - العناوين أو النقاط داخل الفصل = topics |
| - تجاهل المقدمة والخاتمة ككيانات مستقلة |
| - ❗ يُمنع منعًا باتًا: |
| - إعادة صياغة العناوين |
| - تحسين لغوي |
| - دمج أو تقسيم العناوين |
| |
| 2) Learning Outcomes: |
| - استخدم learning_outcomes المُدخلة كما هي إن وُجدت |
| - إذا لم تكن موجودة: |
| - أنشئ Learning Outcomes عامة للكورس |
| - بصياغة تعليمية احترافية (يكون المتدرب قادرًا على...) |
| - لا تكرر عناوين الوحدات حرفيًا |
| |
| 3) course_description: |
| - إذا كانت موجودة → لا تغيّرها |
| - إذا كانت فارغة → أنشئ وصفًا احترافيًا بناءً على المحتوى |
| |
| 4) course_audience: |
| - إذا كانت موجودة → لا تغيّرها |
| - إذا كانت فارغة → استنتج الفئة الأنسب بدقة |
| |
| 5) وحدات التدريب: |
| - لكل Unit: |
| - unit_name: اسم الفصل كما ورد |
| - topics: قائمة بالعناوين الفرعية فقط |
| - outcome: ناتج تعلم خاص بهذه الوحدة (جملة واحدة) |
| |
| ======================== |
| 📦 الإخراج النهائي: |
| ======================== |
| - JSON فقط |
| - مطابق تمامًا لـ CourseSchema |
| - بدون أي شرح أو نص خارج JSON |
| |
| ⚠️ أي حقل غير موجود في الـ Schema = مرفوض |
| """, |
| expected_output="Strict JSON matching CourseSchema schema.", |
| async_execution=False, |
| ) |
|
|