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, )