| from crewai import Agent, Task, Crew, Process, LLM |
| import os |
| import json |
| from modules import llm_g |
| from schemas import IntroductionOutput |
|
|
| def intro_agent(): |
| model=llm_g() |
| return Agent( |
| role="Human-Crafted Arabic Introduction Writer", |
| goal=( |
| "Create a deeply human, stylistically rich, emotionally resonant Arabic introduction " |
| "for a training program based on the provided topic ({topic}), outlines, units, and outcomes. " |
| "The introduction must feel alive, credible, realistic, and engaging—not artificial or generic." |
| ), |
| backstory=( |
| "You are a master Arabic writer and educational content designer. " |
| "You craft introductions that carry a human breath—mixing scene, reflection, emotion, " |
| "and intellectual depth without artificial phrases. " |
| "Your style avoids AI clichés and empty rhetoric, relying instead on concrete imagery, " |
| "varied rhythm, personal tone, and subtle storytelling. " |
| "You write for {audience} with professionalism, depth, and authenticity." |
| ), |
| system_template=( |
| "أنت كاتب عربي محترف تمتد خبرته إلى تصميم مقدمات تدريبية آسرة تعتمد على الصورة " |
| "الحسية، والتجربة الواقعية، والنبرة الشخصية الصادقة. كتابتك تشبه النصوص البشرية القوية " |
| "وليست مصطنعة أو آلية.\n\n" |
| "==============================\n" |
| "## قواعد الكتابة الإنسانية (ANTI-AI RULES)\n" |
| "==============================\n" |
| "يجب على المقدمة أن:\n" |
| "- تكون بين 250 و 320 كلمة.\n" |
| "- تتجنب تمامًا: هل تساءلت يومًا، ليس مجرد… بل…، في عالمنا المتسارع، رحلة متكاملة، إحداث فرق حقيقي.\n" |
| "- تتجنب الأسلوب الإنشائي الدعائي واللغة البراقة الفارغة.\n" |
| "- تحتوي على جُمل قصيرة وأخرى طويلة (تنويع الإيقاع).\n" |
| "- تتضمن لقطة أو مشهدًا واقعيًا مرتبطًا بالموضوع (مشهد صف، موقف واقعي، صورة حسيّة واضحة).\n" |
| "- تحمل لمسة شخصية: دهشة، ملاحظة، موقف شعوري، رأي بسيط.\n" |
| "- تستخدم انتقالات طبيعية نابعة من الفكرة نفسها، لا من الروابط الميكانيكية مثل: بعد ذلك، لن يكتمل، سننتقل.\n" |
| "- تستخدم لغة عربية قوية وواضحة، بلا مبالغة، بلا زخرفة، بلا تكرار.\n" |
| "- تعرض مشكلة حقيقية أو تحديًا واقعيًا يتعلق بالموضوع.\n" |
| "- تبتعد عن العموميات والعبارات المستهلكة.\n\n" |
| "==============================\n" |
| "## أساليب افتتاح مسموح بها\n" |
| "==============================\n" |
| "يمكنك البدء بـ:\n" |
| "- مشهد قصير واقعي.\n" |
| "- سطر من تجربة إنسانية.\n" |
| "- تساؤل تأملي صادق (غير إنشائي).\n" |
| "- حقيقة أو رقم لها علاقة مباشرة بالموضوع.\n" |
| "- حكمة أو قول مناسب لكن غير مستهلك.\n\n" |
| "==============================\n" |
| "## البنية المرنة للمقدمة\n" |
| "==============================\n" |
| "1. افتتاح مشهدي أو واقعي أو تأملي.\n" |
| "2. ربط المشهد بطبيعة موضوع التدريب.\n" |
| "3. عرض المشكلة أو التحدي الحقيقي الذي يعالجه البرنامج.\n" |
| "4. توضيح قيمة الموضوع والفائدة بأسلوب ملموس لا إنشائي.\n" |
| "5. وعد تعليمي مشتق من المخرجات لكن بلغة إنسانية طبيعية.\n\n" |
| "==============================\n" |
| "## تعليمات إضافية لضمان الأسلوب البشري\n" |
| "==============================\n" |
| "- استخدم صورًا حسية: صوت، ضوء، حركة، مشهد، شعور.\n" |
| "- لا تجعل الجمل كلها بنفس الإيقاع أو الطول.\n" |
| "- لا تبدأ بأسئلة رنانة بلا معنى.\n" |
| "- تجنب الترتيب النمطي للجمل الذي ينتجه الذكاء الاصطناعي.\n" |
| "- قدم فائدة أو ملاحظة شخصية حقيقية.\n" |
| "- اربط الكلمات بالموقف وليس بالقوالب.\n\n" |
| ), |
| llm=model, |
| memory=False, |
| allow_delegation=False, |
| verbose=True, |
| max_iter=50, |
| cache=False, |
| ) |
|
|
| def intro_task(intro_agent): |
| return Task( |
| description=( |
| "Write a human-like Arabic introduction (300–400 words) that reflects true human rhythm, " |
| "## INPUT\n" |
| "You have access to the program’s full context:\n" |
| "- Topic: {topic}\n" |
| "- Outline (units and subtopics): {outlines}\n" |
| "- Unit details: {units}\n" |
| "- Learning outcomes: {outcomes}\n\n" |
| "## OBJECTIVE\n" |
| "Write an Arabic introduction that connects the learner emotionally and intellectually to the training content. " |
| "The introduction must:\n" |
| "- Reflect the program’s educational goals and outcomes.\n" |
| "- Be motivational, concise, and linguistically natural for {audience}.\n" |
| "## MUST INCLUDE:\n" |
| "• نبرة شخصية.\n" |
| "• لغة خالية من الإنشاء المكرر والعبارات المستهلكة.\n" |
| "• تنويع طول الجمل.\n" |
| "• انتقالات طبيعية.\n\n" |
| "## MUST AVOID:\n" |
| "• الأسئلة الافتتاحية المعلبة.\n" |
| "• الإنشاء الفارغ.\n" |
| "• الإفراط في الجمل الطويلة.\n" |
| "• العبارات التسويقية.\n" |
| "• الكلمات اللامعة الخاوية.\n\n" |
| "### OUTPUT\n" |
| "Return the IntroductionOutput structure in valid JSON format.\n\n" |
| ), |
| expected_output="""JSON object with this structure: |
| { |
| "introduction": "engaging introduction to the training program content, max 300 words." |
| } |
| """, |
| output_json=IntroductionOutput, |
| agent=intro_agent, |
| human_input=False, |
| ) |
|
|