Spaces:
Build error
Build error
File size: 8,183 Bytes
555501d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 | """
وظائف مساعدة للتعامل مع APIs (Hugging Face و Supabase)
"""
import requests
import json
from typing import Dict, List, Optional
import config
def call_hf_api(prompt: str, max_tokens: int = 500, temperature: float = 0.7) -> Optional[str]:
"""
استدعاء Hugging Face Inference API
Args:
prompt: النص المُدخل للنموذج
max_tokens: الحد الأقصى للـ tokens في الرد
temperature: درجة العشوائية (0-1)
Returns:
النص المُولّد أو None في حالة الخطأ
"""
if not config.HF_API_TOKEN:
return None
headers = {
"Authorization": f"Bearer {config.HF_API_TOKEN}",
"Content-Type": "application/json"
}
payload = {
"inputs": prompt,
"parameters": {
"max_new_tokens": max_tokens,
"temperature": temperature,
"top_p": 0.9,
"return_full_text": False
}
}
try:
response = requests.post(
config.HF_API_URL,
headers=headers,
json=payload,
timeout=30
)
if response.status_code == 200:
result = response.json()
if isinstance(result, list) and len(result) > 0:
return result[0].get("generated_text", "")
return result.get("generated_text", "")
else:
print(f"خطأ في API: {response.status_code} - {response.text}")
return None
except Exception as e:
print(f"خطأ في استدعاء HF API: {str(e)}")
return None
def generate_curriculum(user_profile: Dict, hub_id: str) -> Optional[Dict]:
"""
توليد منهج مخصص بناءً على ملف المستخدم
Args:
user_profile: بيانات المستخدم
hub_id: معرف المحور المختار
Returns:
المنهج المُولّد أو None
"""
hub = config.LEARNING_HUBS.get(hub_id, {})
prompt = f"""أنت مصمم مناهج تعليمية خبير. مهمتك توليد خطة تعلم لمدة {config.PLAN_DURATION_WEEKS} أسبوعاً.
معلومات المستخدم:
- الاسم: {user_profile.get('name', 'غير محدد')}
- المستوى: {user_profile.get('level', 'مبتدئ')}
- الوقت المتاح أسبوعياً: {user_profile.get('available_hours', 10)} ساعات
- أسلوب التعلم المفضل: {user_profile.get('learning_style', 'مختلط')}
المحور المطلوب: {hub.get('name', 'غير محدد')}
ولّد خطة تعلم بصيغة JSON تحتوي على 12 وحدة أسبوعية. كل وحدة يجب أن تحتوي على:
- week: رقم الأسبوع
- unit_title: عنوان الوحدة
- estimated_time_mins: الوقت المقدر بالدقائق
- lessons: قائمة بالدروس (كل درس له: title, duration_mins, type, description)
- experiment: تجربة عملية (title, description, deliverable)
مثال على البنية:
{{
"curriculum": [
{{
"week": 1,
"unit_title": "...",
"estimated_time_mins": 600,
"lessons": [...],
"experiment": {{...}}
}}
]
}}
ردّ فقط بصيغة JSON بدون أي نص إضافي."""
# محاولة استدعاء API
response = call_hf_api(prompt, max_tokens=2000, temperature=0.7)
if response:
try:
# محاولة استخراج JSON من الرد
json_start = response.find("{")
json_end = response.rfind("}") + 1
if json_start != -1 and json_end > json_start:
json_str = response[json_start:json_end]
return json.loads(json_str)
except:
pass
# في حالة الفشل، إرجاع منهج افتراضي
return generate_default_curriculum(hub_id)
def generate_default_curriculum(hub_id: str) -> Dict:
"""
توليد منهج افتراضي في حالة عدم توفر API
"""
hub = config.LEARNING_HUBS.get(hub_id, config.LEARNING_HUBS["ai_intro"])
curriculum = []
for week in range(1, 13):
unit = {
"week": week,
"unit_title": f"الوحدة {week}: {hub['name']} - جزء {week}",
"estimated_time_mins": 480,
"lessons": [
{
"title": f"درس {week}.1: المفاهيم الأساسية",
"duration_mins": 120,
"type": "concept",
"description": f"شرح المفاهيم الأساسية في الأسبوع {week}"
},
{
"title": f"درس {week}.2: التطبيق العملي",
"duration_mins": 180,
"type": "practical",
"description": f"تطبيق عملي على ما تم تعلمه"
}
],
"experiment": {
"title": f"تجربة الأسبوع {week}",
"description": f"مشروع تطبيقي لتعزيز الفهم",
"deliverable": "ملف أو تقرير"
}
}
curriculum.append(unit)
return {"curriculum": curriculum}
def generate_lesson_content(lesson_title: str, user_context: Dict) -> str:
"""
توليد محتوى درس مفصل
"""
prompt = f"""أنت مدرس متخصص. اكتب درساً تعليمياً قصيراً (5-10 دقائق قراءة) عن:
{lesson_title}
الدرس يجب أن يتضمن:
1. الفكرة المركزية (ملخص في سطرين)
2. شرح مبسط مع أمثلة واقعية
3. نقاط رئيسية (3-5 نقاط)
4. سؤال للتفكير
5. مصادر للمتابعة (اختياري)
اكتب بأسلوب واضح ومشجع."""
response = call_hf_api(prompt, max_tokens=800)
if response:
return response
# محتوى افتراضي
return f"""# {lesson_title}
## الفكرة المركزية 💡
هذا درس تعليمي يهدف إلى تعريفك بالمفهوم الأساسي وتطبيقاته العملية.
## الشرح 📖
سنستكشف معاً هذا الموضوع المهم من خلال أمثلة واقعية وتطبيقات عملية تساعدك على الفهم العميق.
## النقاط الرئيسية ⭐
1. المفهوم الأساسي وأهميته
2. التطبيقات العملية في الحياة اليومية
3. خطوات التنفيذ والممارسة
4. الأخطاء الشائعة وكيفية تجنبها
5. الخطوات التالية للتعمق
## سؤال للتفكير 🤔
كيف يمكنك تطبيق ما تعلمته اليوم في مشروعك الشخصي أو عملك؟
## للمتابعة 📚
- ابحث عن أمثلة إضافية في مجالك
- مارس التطبيق العملي بشكل يومي
- شارك ما تعلمته مع الآخرين
"""
# دوال Supabase (اختيارية - يمكن استبدالها بملفات JSON محلية)
def init_supabase():
"""تهيئة اتصال Supabase"""
if not config.USE_SUPABASE:
return None
try:
from supabase import create_client
return create_client(config.SUPABASE_URL, config.SUPABASE_KEY)
except:
return None
def save_profile_to_supabase(profile: Dict) -> bool:
"""حفظ ملف تعريفي في Supabase"""
client = init_supabase()
if not client:
return False
try:
client.table("profiles").insert(profile).execute()
return True
except:
return False
def get_profile_from_supabase(user_id: str) -> Optional[Dict]:
"""جلب ملف تعريفي من Supabase"""
client = init_supabase()
if not client:
return None
try:
response = client.table("profiles").select("*").eq("user_id", user_id).execute()
if response.data:
return response.data[0]
except:
pass
return None
|