builder.ai / crew_manager.py
1Egyb's picture
Update crew_manager.py
3dbc4c4 verified
"""
نظام إدارة المشاريع باستخدام CrewAI
مدير ذكي يتواصل مع المستخدم ويدير فريق من الوكلاء المتخصصين
"""
import os
from typing import List, Dict, Any, Optional
from crewai import Agent, Task, Crew, Process
from crewai_tools import (
FileReadTool,
DirectorySearchTool,
CodeDocsSearchTool
)
from langchain_openai import ChatOpenAI
import json
class ProjectManagerCrew:
"""فريق الوكلاء المتكامل لإدارة المشاريع الذكية"""
def __init__(self, project_path: str):
self.project_path = project_path
self.conversation_history: List[Dict] = []
self.setup_tools()
self.setup_llm()
self.setup_agents()
def setup_tools(self):
"""إعداد أدوات الوكلاء"""
self.project_analyzer = DirectorySearchTool(
root_dir=self.project_path,
description="تحليل بنية المشروع والملفات"
)
self.code_reader = FileReadTool(
root_dir=self.project_path,
description="قراءة وتحليل ملفات الكود"
)
self.docs_searcher = CodeDocsSearchTool(
root_dir=self.project_path,
description="البحث في توثيق الكود"
)
def setup_llm(self):
"""إعداد النماذج اللغوية باستخدام Hugging Face فقط"""
hf_token = os.getenv("HF_TOKEN")
if not hf_token:
raise ValueError("❌ HF_TOKEN غير موجود. يرجى إضافته في إعدادات السرية (Secrets).")
# نستخدم ChatOpenAI مع قاعدة Hugging Face
self.llm = ChatOpenAI(
model="Qwen/Qwen2.5-Coder-32B-Instruct",
temperature=0.7,
openai_api_key=hf_token,
openai_api_base="https://router.huggingface.co/hf-inference/v1",
max_tokens=2048,
)
def setup_agents(self):
"""إعداد فريق الوكلاء"""
# أدوات المدير
manager_tools = [self.project_analyzer, self.code_reader]
# 1. الوكيل الرئيسي (المتحدث مع المستخدم)
self.project_manager = Agent(
role="مدير المشروع والمتحدث الرئيسي",
goal="التواصل مع المستخدم وفهم احتياجاته، ثم توجيه الفريق لتحقيق الأهداف",
backstory="""
أنا المدير المسؤول عن الفريق. خبرتي تمتد لأكثر من 10 سنوات في إدارة مشاريع البرمجيات.
مهمتي الأساسية هي فهم متطلبات المستخدم بدقة، تحليلها، وتحويلها إلى خطة عمل واضحة.
أتحدث بلغة واضحة مع المستخدم وأوجه الفريق لتنفيذ المهام بفعالية.
""",
tools=manager_tools,
verbose=True,
allow_delegation=True,
max_iter=10,
llm=self.llm
)
# 2. وكيل التخطيط التقني
self.technical_planner = Agent(
role="المخطط التقني",
goal="تحليل المشروع الحالي وتصميم خطة تطوير تقنية متكاملة",
backstory="""
أنا خبير في تحليل أنظمة البرمجيات وأصولها. حاصل على درجة الماجستير في هندسة البرمجيات.
أقوم بدراسة المشروع الحالي، تحديد نقاط القوة والضعف، وتصميم خطة تطوير تقنية مفصلة.
أهتم بالمعمارية البرمجية وقابلية التوسع والأداء.
""",
tools=[self.project_analyzer, self.code_reader, self.docs_searcher],
verbose=True,
llm=self.llm
)
# 3. وكيل البرمجة
self.coder = Agent(
role="المبرمج الرئيسي",
goal="تنفيذ التغييرات المطلوبة على الكود بجودة عالية",
backstory="""
أنا مبرمج محترف متخصص في تطوير البرمجيات مع خبرة 8 سنوات.
أتبع أفضل الممارسات (best practices) وأكتب كوداً نظيفاً وفعالاً وقابلاً للصيانة.
أتقن العديد من لغات البرمجة وأطر العمل الحديثة.
""",
tools=[self.code_reader, self.docs_searcher],
verbose=True,
llm=self.llm
)
# 4. وكيل المراجعة والجودة
self.reviewer = Agent(
role="مراجع الجودة",
goal="مراجعة العمل وضمان الجودة والامتثال للمعايير",
backstory="""
أنا مراجع دقيق مع خبرة 7 سنوات في ضمان جودة البرمجيات.
أحرص على ضمان جودة العمل المنجز واكتشاف الأخطاء مبكراً.
أهتم بالأمان، الأداء، وقابلية الاستخدام.
""",
tools=[self.code_reader],
verbose=True,
llm=self.llm
)
def add_to_history(self, role: str, content: str):
"""إضافة رسالة إلى سجل المحادثة"""
self.conversation_history.append({
"role": role,
"content": content,
"timestamp": json.dumps({"time": "now"})
})
def create_development_plan(self, user_request: str):
"""إنشاء خطة تطوير بناءً على طلب المستخدم"""
# إضافة طلب المستخدم إلى السجل
self.add_to_history("user", user_request)
# المهمة 1: فهم وتحليل الطلب
analysis_task = Task(
description=f"""
## طلب المستخدم:
{user_request}
## المطلوب:
1. تحليل المتطلبات الأساسية والمقاصد الخفية
2. تحديد الأولويات والمواعيد النهائية المتوقعة
3. تحليل التحديات والمخاطر المحتملة
4. تقدير الموارد والتكاليف المطلوبة
5. تحديد المعايير اللازمة لنجاح المشروع
## تعليمات:
- كن دقيقاً وشاملاً في التحليل
- اطرح أسئلة توضيحية إذا لزم الأمر
- قم بتقسيم المشكلة إلى أجزاء صغيرة
- ضع في الاعتبار القيود التقنية للمشروع الحالي
""",
agent=self.project_manager,
expected_output="تقرير تحليل متطلبات المستخدم مع خطة أولية"
)
# المهمة 2: تخطيط تقني
planning_task = Task(
description="""
## المطلوب:
بناءً على تحليل المدير، قم بـ:
1. دراسة المشروع الحالي وتحليله (الهيكل، التقنيات، الاعتمادات)
2. تصميم خطة تقنية مفصلة للتنفيذ
3. تحديد المهام التقنية المطلوبة وترتيب أولوياتها
4. تقدير الوقت والجهود المطلوبة لكل مهمة
5. تحديد المتطلبات التقنية الجديدة (مكتبات، واجهات برمجة، إلخ)
## تعليمات:
- ركز على الجانب التقني العملي
- اقترح بدائل وحلول تقنية
- ضع خطة للمراحل (Milestones)
- حدد نقاط المراجعة والاختبار
""",
agent=self.technical_planner,
expected_output="خطة تطوير تقنية مفصلة مع جدول زمني",
context=[analysis_task]
)
# المهمة 3: التنفيذ
execution_task = Task(
description="""
## المطلوب:
بناءً على الخطة التقنية، قم بـ:
1. تنفيذ التغييرات المطلوبة على الكود
2. كتابة الكود الجديد مع اتباع أفضل الممارسات
3. تعديل الملفات الحالية بعناية
4. كتابة اختبارات للكود الجديد
5. التأكد من توافق التغييرات مع النظام الحالي
## تعليمات:
- استخدم تعليقات توضيحية في الكود
- اتبع معايير الترميز للمشروع
- ركز على الكفاءة والأمان
- تأكد من عدم كسر أي وظائف موجودة
""",
agent=self.coder,
expected_output="كود مطور مع شرح التغييرات ونتائج الاختبارات",
context=[planning_task]
)
# المهمة 4: المراجعة
review_task = Task(
description="""
## المطلوب:
مراجعة العمل المنجز من المبرمج:
1. تحقق من جودة الكود واتباع المعايير
2. اكتشف الأخطاء والمشاكل المحتملة
3. اختبار الوظائف والتأكد من عملها بشكل صحيح
4. اقترح تحسينات للأداء والأمان
5. تأكد من تحقيق جميع المتطلبات
## تعليمات:
- كن دقيقاً في المراجعة
- ابحث عن الثغرات الأمنية المحتملة
- تحقق من قابلية التوسع والصيانة
- قدم تقريراً مفصلاً عن النتائج
""",
agent=self.reviewer,
expected_output="تقرير مراجعة شامل مع قائمة التحسينات",
context=[execution_task]
)
# إنشاء الفريق وتشغيله
crew = Crew(
agents=[
self.project_manager,
self.technical_planner,
self.coder,
self.reviewer
],
tasks=[
analysis_task,
planning_task,
execution_task,
review_task
],
process=Process.sequential,
verbose=True,
memory=True
)
result = crew.kickoff()
# إضافة النتيجة إلى السجل
self.add_to_history("system", str(result))
return result
def chat_with_manager(self, message: str, conversation_history: Optional[List[Dict]] = None):
"""الدردشة مع المدير الرئيسي"""
# استخدام السجل المقدم أو السجل الداخلي
history_to_use = conversation_history if conversation_history else self.conversation_history
# إضافة رسالة المستخدم إلى السجل
self.add_to_history("user", message)
chat_task = Task(
description=f"""
## تاريخ المحادثة (آخر 5 رسائل):
{json.dumps(history_to_use[-5:], ensure_ascii=False) if history_to_use else 'بداية المحادثة'}
## رسالة المستخدم الجديدة:
{message}
## تعليمات:
1. رد بطريقة ودية واحترافية كمشرف مشروع
2. كن مفيداً ودقيقاً في الإجابة
3. إذا كان السؤال يحتاج إلى تحليل المشروع، استخدم الأدوات المتاحة
4. اطرح أسئلة توضيحية إذا كان الطلب غير واضح
5. قدم اقتراحات عملية وقابلة للتنفيذ
## معلومات المشروع:
- المسار: {self.project_path}
- عدد الرسائل السابقة: {len(history_to_use)}
""",
agent=self.project_manager,
expected_output="رد مفصل وواضح ومفيد للمستخدم"
)
crew = Crew(
agents=[self.project_manager],
tasks=[chat_task],
process=Process.sequential,
verbose=False,
memory=True
)
response = crew.kickoff()
# إضافة رد المدير إلى السجل
self.add_to_history("manager", str(response))
return response