Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,596 +2,156 @@ import gradio as gr
|
|
| 2 |
import random
|
| 3 |
import json
|
| 4 |
from datetime import datetime
|
| 5 |
-
from
|
| 6 |
-
import os
|
| 7 |
-
from dotenv import load_dotenv
|
| 8 |
|
| 9 |
-
#
|
| 10 |
-
|
|
|
|
| 11 |
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
# تهيئة العميل (النسخة الجديدة)
|
| 17 |
-
client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
| 18 |
-
|
| 19 |
-
# أو يمكنك وضع الـ API key مباشرة (غير موصى به للبيئة الإنتاجية)
|
| 20 |
-
# client = openai.OpenAI(api_key="your-api-key-here")
|
| 21 |
-
|
| 22 |
-
OPENAI_AVAILABLE = True
|
| 23 |
-
print("✅ OpenAI API متوفر وجاهز للاستخدام")
|
| 24 |
-
except ImportError:
|
| 25 |
-
print("❌ لم يتم تثبيت مكتبة openai")
|
| 26 |
-
OPENAI_AVAILABLE = False
|
| 27 |
-
except Exception as e:
|
| 28 |
-
print(f"❌ خطأ في تهيئة OpenAI: {e}")
|
| 29 |
-
OPENAI_AVAILABLE = False
|
| 30 |
-
|
| 31 |
-
# ===== محاكاة احتياطية إذا لم يكن OpenAI متاحاً =====
|
| 32 |
-
class AIModelSimulator:
|
| 33 |
-
def __init__(self):
|
| 34 |
-
self.responses = {
|
| 35 |
-
"مختصر": [
|
| 36 |
-
"الذكاء الاصطناعي هو محاكاة الذكاء البشري في الآلات.",
|
| 37 |
-
"بايثون لغة برمجة سهلة للمبتدئين.",
|
| 38 |
-
"القصة تحتاج عناصر: شخصيات، أحداث، خاتمة.",
|
| 39 |
-
],
|
| 40 |
-
"متوسط": [
|
| 41 |
-
"الذكاء الاصطناعي التوليدي يستطيع إنشاء نصوص وصور بناءً على تعلمه من بيانات سابقة.",
|
| 42 |
-
"تعلم بايثون يتضمن أساسيات البرمجة ثم المكتبات المتخصصة.",
|
| 43 |
-
"القصة الجيدة تحتوي على مقدمة مشوقة وتصاعد درامي ونهاية مرضية.",
|
| 44 |
-
],
|
| 45 |
-
"مفصل جدًا": [
|
| 46 |
-
"""الذكاء الاصطناعي التوليدي هو فرع من فروع الذكاء الاصطناعي يركز على إنشاء محتوى جديد.
|
| 47 |
-
|
| 48 |
-
المزايا:
|
| 49 |
-
1. الإبداع الآلي
|
| 50 |
-
2. توفير الوقت
|
| 51 |
-
3. تنوع المحتوى
|
| 52 |
-
|
| 53 |
-
للحصول على أفضل النتائج، قدم برومبت واضح ومحدد.""",
|
| 54 |
-
"""خطة تعلم Python لمدة 3 أشهر:
|
| 55 |
-
|
| 56 |
-
الشهر الأول: الأساسيات
|
| 57 |
-
- المتغيرات وأنواع البيانات
|
| 58 |
-
- الشروط والحلقات
|
| 59 |
-
- الدوال الأساسية
|
| 60 |
-
|
| 61 |
-
الشهر الثاني: المفاهيم المتقدمة
|
| 62 |
-
- القوائم والقواميس
|
| 63 |
-
- المكتبات القياسية
|
| 64 |
-
- معالجة الأخطاء
|
| 65 |
-
|
| 66 |
-
الشهر الثالث: مشاريع تطبيقية""",
|
| 67 |
-
"""قصة خيالية عن رحلة إلى المريخ:
|
| 68 |
-
|
| 69 |
-
في عام 2050، انطلق الطفلان ليان ونورا في رحلة مدرسية إلى المريخ.
|
| 70 |
-
|
| 71 |
-
اكتشفا كائناً فضائياً صغيراً اسمه "زورب" يحتاج للمساعدة.
|
| 72 |
-
|
| 73 |
-
باستخدام معرفتهم المدرسية، ساعداه في إصلاح مركبته.
|
| 74 |
-
|
| 75 |
-
العبرة: التعاون والصدق يساعدان في تخطي الصعاب."""
|
| 76 |
-
]
|
| 77 |
-
}
|
| 78 |
-
|
| 79 |
-
def generate(self, prompt):
|
| 80 |
-
if "ذكاء اصطناعي" in prompt:
|
| 81 |
-
topic_idx = 0
|
| 82 |
-
elif "بايثون" in prompt or "برمجة" in prompt:
|
| 83 |
-
topic_idx = 1
|
| 84 |
-
else:
|
| 85 |
-
topic_idx = 2
|
| 86 |
-
|
| 87 |
-
if "قصير" in prompt or "مختصر" in prompt:
|
| 88 |
-
length = "مختصر"
|
| 89 |
-
elif "مفصل" in prompt:
|
| 90 |
-
length = "مفصل جدًا"
|
| 91 |
-
else:
|
| 92 |
-
length = "متوسط"
|
| 93 |
-
|
| 94 |
-
response = self.responses[length][topic_idx]
|
| 95 |
-
|
| 96 |
-
# إضافة نبرة بناءً على البرومبت
|
| 97 |
-
if "حماسي" in prompt:
|
| 98 |
-
return f"🚀 مثير! إليك الإجابة:\n\n{response}"
|
| 99 |
-
elif "هادئ" in prompt:
|
| 100 |
-
return f"🌙 دعنا نستكشف هذا بهدوء:\n\n{response}"
|
| 101 |
-
else:
|
| 102 |
-
return f"📘 وفقاً للمعلومات:\n\n{response}"
|
| 103 |
-
|
| 104 |
-
# تهيئة المحاكي الاحتياطي
|
| 105 |
-
simulator = AIModelSimulator()
|
| 106 |
-
|
| 107 |
-
# ===== دالة التوليد باستخدام OpenAI API =====
|
| 108 |
-
def generate_with_openai(prompt: str, max_tokens: int = 500, temperature: float = 0.7) -> str:
|
| 109 |
-
"""
|
| 110 |
-
توليد رد باستخدام OpenAI API
|
| 111 |
-
"""
|
| 112 |
-
if not OPENAI_AVAILABLE:
|
| 113 |
-
return simulator.generate(prompt)
|
| 114 |
|
| 115 |
try:
|
| 116 |
response = client.chat.completions.create(
|
| 117 |
-
model="gpt-3.5-turbo",
|
| 118 |
messages=[
|
| 119 |
-
{"role": "system", "content":
|
| 120 |
{"role": "user", "content": prompt}
|
| 121 |
],
|
| 122 |
-
|
| 123 |
-
temperature=temperature,
|
| 124 |
-
top_p=0.9,
|
| 125 |
-
frequency_penalty=0.2,
|
| 126 |
-
presence_penalty=0.2
|
| 127 |
)
|
| 128 |
-
|
| 129 |
-
return response.choices[0].message.content.strip()
|
| 130 |
-
|
| 131 |
-
except openai.RateLimitError:
|
| 132 |
-
return "⚠️ تجاوزت الحد المسموح من الطلبات. يرجى الانتظار قليلاً."
|
| 133 |
-
except openai.APIConnectionError:
|
| 134 |
-
return "⚠️ مشكلة في الاتصال بالإنترنت. جرب مرة أخرى."
|
| 135 |
-
except openai.AuthenticationError:
|
| 136 |
-
return "🔑 خطأ في المصادقة. تأكد من صحة مفتاح API."
|
| 137 |
except Exception as e:
|
| 138 |
-
return f"⚠️ خطأ في الت
|
| 139 |
|
| 140 |
-
# =====
|
| 141 |
game_state = {
|
| 142 |
"score": 0,
|
| 143 |
"attempts": 0,
|
| 144 |
-
"current_mission": None,
|
| 145 |
-
"prompt_history": [],
|
| 146 |
"perfect_orbits": 0,
|
| 147 |
-
"
|
| 148 |
-
"
|
| 149 |
}
|
| 150 |
|
| 151 |
-
# ===== المهام القمرية =====
|
| 152 |
MOON_MISSIONS = [
|
| 153 |
{
|
| 154 |
"id": "mission_1",
|
| 155 |
"name": "مهمة شرح مفهوم",
|
| 156 |
"bad_prompt": "اشرح لي الذكاء الاصطناعي",
|
| 157 |
"target": "شرح مفهوم الذكاء الاصطناعي التوليدي لطالب في الصف السادس",
|
| 158 |
-
"hints": ["حدد الفئة العمرية", "استخدم أمثلة
|
| 159 |
},
|
| 160 |
{
|
| 161 |
"id": "mission_2",
|
| 162 |
-
"name": "مهمة كتابة قصة",
|
| 163 |
-
"bad_prompt": "اكتب قصة",
|
| 164 |
-
"target": "اكتب قصة خيالية قصيرة عن رحلة إلى المريخ مناسبة للأطفال",
|
| 165 |
-
"hints": ["حدد الجمهور", "أضف عناصر التشويق", "اختر أسماء جذابة"]
|
| 166 |
-
},
|
| 167 |
-
{
|
| 168 |
-
"id": "mission_3",
|
| 169 |
"name": "مهمة حل مشكلة",
|
| 170 |
"bad_prompt": "كيف أتعلم البرمجة",
|
| 171 |
-
"target": "
|
| 172 |
-
"hints": ["حدد المدة", "
|
| 173 |
}
|
| 174 |
]
|
| 175 |
|
| 176 |
-
# =====
|
| 177 |
-
def analyze_prompt(prompt
|
| 178 |
-
"""تحليل جودة البرومبت"""
|
| 179 |
score = 100
|
| 180 |
feedback = []
|
| 181 |
|
| 182 |
-
# تحليل الطول
|
| 183 |
word_count = len(prompt.split())
|
| 184 |
-
if word_count <
|
| 185 |
-
score -= 40
|
| 186 |
-
feedback.append("📉 قصير جداً، أضف تفاصيل")
|
| 187 |
-
elif word_count > 150:
|
| 188 |
-
score -= 10
|
| 189 |
-
feedback.append("📈 طويل، يمكن تبسيطه")
|
| 190 |
-
else:
|
| 191 |
-
feedback.append(f"📏 طول مناسب: {word_count} كلمة")
|
| 192 |
-
|
| 193 |
-
# تحليل الوضوح
|
| 194 |
-
clarity_words = ["اشرح", "كيف", "ما هو", "اكتب", "صمم", "خطط"]
|
| 195 |
-
has_clarity = any(word in prompt for word in clarity_words)
|
| 196 |
-
if not has_clarity:
|
| 197 |
-
score -= 20
|
| 198 |
-
feedback.append("❓ غير واضح، استخدم أفعال محددة")
|
| 199 |
-
else:
|
| 200 |
-
feedback.append("✅ طلب واضح")
|
| 201 |
-
|
| 202 |
-
# تحليل العناصر
|
| 203 |
-
elements_found = []
|
| 204 |
-
if any(role in prompt for role in ["خبير", "كاتب", "معلم", "مدرب"]):
|
| 205 |
-
elements_found.append("الدور")
|
| 206 |
-
if any(length in prompt for length in ["قصير", "طويل", "مفصل", "مختصر"]):
|
| 207 |
-
elements_found.append("الطول")
|
| 208 |
-
if any(tone in prompt for tone in ["رسمي", "حماسي", "هادئ"]):
|
| 209 |
-
elements_found.append("النبرة")
|
| 210 |
-
if any(audience in prompt for audience in ["للأطفال", "للمبتدئين", "للمحترفين"]):
|
| 211 |
-
elements_found.append("الجمهور")
|
| 212 |
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
|
| 217 |
-
# تطابق مع الهدف
|
| 218 |
if target:
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
matches = len(target_words.intersection(prompt_words))
|
| 222 |
-
target_score = min(matches * 8, 40)
|
| 223 |
-
score += target_score
|
| 224 |
-
feedback.append(f"🎯 تطابق مع الهدف: {matches} كلمة")
|
| 225 |
-
|
| 226 |
-
# التقييم النهائي
|
| 227 |
-
score = max(0, min(score, 100))
|
| 228 |
-
|
| 229 |
-
if score >= 90:
|
| 230 |
-
grade = "⭐ مدار مثالي"
|
| 231 |
-
grade_emoji = "🌟"
|
| 232 |
-
elif score >= 70:
|
| 233 |
-
grade = "✅ مدار مستقر"
|
| 234 |
-
grade_emoji = "✅"
|
| 235 |
-
elif score >= 50:
|
| 236 |
-
grade = "⚠️ مدار غير مستقر"
|
| 237 |
-
grade_emoji = "⚠️"
|
| 238 |
-
else:
|
| 239 |
-
grade = "🚨 خطر الخروج عن المدار"
|
| 240 |
-
grade_emoji = "🚨"
|
| 241 |
-
|
| 242 |
-
return {
|
| 243 |
-
"score": score,
|
| 244 |
-
"grade": grade,
|
| 245 |
-
"grade_emoji": grade_emoji,
|
| 246 |
-
"word_count": word_count,
|
| 247 |
-
"elements_found": elements_found,
|
| 248 |
-
"feedback": feedback
|
| 249 |
-
}
|
| 250 |
-
|
| 251 |
-
# ===== دالة إطلاق المهمة =====
|
| 252 |
-
def launch_mission(commander: str, destination: str, thrust: str, tone: str,
|
| 253 |
-
mission_mode: bool = False, target_prompt: Optional[str] = None):
|
| 254 |
-
"""تنفيذ إطلاق المركبة (معالجة البرومبت)"""
|
| 255 |
-
|
| 256 |
-
# بناء البرومبت النهائي
|
| 257 |
-
detail_map = {
|
| 258 |
-
"مختصر": "بإجابة قصيرة جداً (جملة أو جملتين)",
|
| 259 |
-
"متوسط": "بإجابة متوسطة الطول مع شرح واضح",
|
| 260 |
-
"مفصل جدًا": "بإجابة مفصلة مع أمثلة وشروحات كاملة"
|
| 261 |
-
}
|
| 262 |
-
|
| 263 |
-
role_map = {
|
| 264 |
-
"خبير تقني": "خبير تقني متخصص في الذكاء الاصطناعي",
|
| 265 |
-
"كاتب إبداعي": "كاتب إبداعي محترف",
|
| 266 |
-
"مدرب شخصي": "مدرب تنمية بشرية",
|
| 267 |
-
"معلم": "معلم متمرس في شرح المفاهيم",
|
| 268 |
-
"عالم فضاء": "عالم فضاء يشرح المفاهيم العلمية"
|
| 269 |
-
}
|
| 270 |
-
|
| 271 |
-
tone_map = {
|
| 272 |
-
"حماسية": "بنبرة حماسية ومتحمسة",
|
| 273 |
-
"رسمية": "بنبرة رسمية وأكاديمية",
|
| 274 |
-
"هادئة": "بنبرة هادئة وواضحة"
|
| 275 |
-
}
|
| 276 |
-
|
| 277 |
-
system_message = f"""أنت {role_map.get(commander, 'خبير')}
|
| 278 |
-
تتحدث {tone_map.get(tone, 'بأسلوب واضح')}
|
| 279 |
-
قدم الإجابة {detail_map.get(thrust, 'بإجابة متوسطة')}"""
|
| 280 |
-
|
| 281 |
-
user_message = destination
|
| 282 |
-
|
| 283 |
-
# برومبت كامل لإرساله لـ OpenAI
|
| 284 |
-
full_prompt = f"""{system_message}
|
| 285 |
-
|
| 286 |
-
المهمة:
|
| 287 |
-
{user_message}
|
| 288 |
-
|
| 289 |
-
الرجاء تقديم الإجابة:"""
|
| 290 |
-
|
| 291 |
-
# توليد الاستجابة
|
| 292 |
-
try:
|
| 293 |
-
if OPENAI_AVAILABLE:
|
| 294 |
-
response = generate_with_openai(full_prompt)
|
| 295 |
-
game_state["total_tokens_used"] += len(response.split()) # تقدير تقريبي
|
| 296 |
-
else:
|
| 297 |
-
response = simulator.generate(full_prompt)
|
| 298 |
-
except Exception as e:
|
| 299 |
-
response = f"⚠️ خطأ في التوليد: {str(e)}"
|
| 300 |
-
|
| 301 |
-
# تحليل البرومبت
|
| 302 |
-
analysis = analyze_prompt(full_prompt, target_prompt)
|
| 303 |
-
|
| 304 |
-
# تحديث حالة اللعبة
|
| 305 |
-
game_state["attempts"] += 1
|
| 306 |
-
timestamp = datetime.now().strftime("%H:%M:%S")
|
| 307 |
-
|
| 308 |
-
if mission_mode and analysis["score"] >= 90:
|
| 309 |
-
game_state["score"] += 100
|
| 310 |
-
game_state["perfect_orbits"] += 1
|
| 311 |
-
elif mission_mode:
|
| 312 |
-
game_state["score"] += analysis["score"]
|
| 313 |
-
|
| 314 |
-
# حفظ في التاريخ
|
| 315 |
-
history_entry = {
|
| 316 |
-
"timestamp": timestamp,
|
| 317 |
-
"prompt": destination[:80] + ("..." if len(destination) > 80 else ""),
|
| 318 |
-
"score": analysis["score"],
|
| 319 |
-
"grade": analysis["grade"],
|
| 320 |
-
"analysis": analysis
|
| 321 |
-
}
|
| 322 |
-
|
| 323 |
-
game_state["history"].append(history_entry)
|
| 324 |
-
game_state["prompt_history"].append(history_entry)
|
| 325 |
-
|
| 326 |
-
return full_prompt.strip(), response.strip(), analysis
|
| 327 |
-
|
| 328 |
-
# ===== دوال الألعاب المساعدة =====
|
| 329 |
-
def start_moon_mission(mission_name: str):
|
| 330 |
-
"""بدء مهمة قمرية جديدة"""
|
| 331 |
-
mission = next((m for m in MOON_MISSIONS if m["name"] == mission_name), MOON_MISSIONS[0])
|
| 332 |
-
game_state["current_mission"] = mission
|
| 333 |
-
game_state["attempts"] = 0
|
| 334 |
-
|
| 335 |
-
return (
|
| 336 |
-
mission["bad_prompt"],
|
| 337 |
-
"معلم",
|
| 338 |
-
"متوسط",
|
| 339 |
-
"رسمية",
|
| 340 |
-
f"### 🎯 {mission['name']}",
|
| 341 |
-
mission["target"],
|
| 342 |
-
"\n".join([f"💡 {hint}" for hint in mission["hints"]])
|
| 343 |
-
)
|
| 344 |
-
|
| 345 |
-
def black_hole_challenge():
|
| 346 |
-
"""تحدي الثقب الأسود"""
|
| 347 |
-
challenges = [
|
| 348 |
-
{
|
| 349 |
-
"prompt": "اكتب قصيدة عن برمجة الكمبيوتر بلغة وهمية غير موجودة",
|
| 350 |
-
"explanation": "❌ طلب مستحيل: لغة غير موجودة",
|
| 351 |
-
"response": "🪐 سأخترع لغة 'الزولونية' وأكتب قصيدة خيالية..."
|
| 352 |
-
},
|
| 353 |
-
{
|
| 354 |
-
"prompt": "أخبرني عن الأحداث التاريخية التي ستحدث في عام 3024",
|
| 355 |
-
"explanation": "❌ مستحيل: لا يمكن التنبؤ بالمستقبل البعيد",
|
| 356 |
-
"response": "📜 سأقدم تخمينات خيالية عن أحداث وهمية..."
|
| 357 |
-
}
|
| 358 |
-
]
|
| 359 |
-
|
| 360 |
-
selected = random.choice(challenges)
|
| 361 |
-
if OPENAI_AVAILABLE:
|
| 362 |
-
response = generate_with_openai(selected["prompt"], temperature=0.9)
|
| 363 |
-
else:
|
| 364 |
-
response = selected["response"]
|
| 365 |
-
|
| 366 |
-
return selected["prompt"], response, selected["explanation"]
|
| 367 |
-
|
| 368 |
-
def reentry_simulation(original_response: str, refinement: str):
|
| 369 |
-
"""محاكاة إعادة الدخول والتحسين"""
|
| 370 |
-
if OPENAI_AVAILABLE:
|
| 371 |
-
improvement_prompt = f"""بناءً على الإجابة التالية:
|
| 372 |
-
{original_response[:200]}...
|
| 373 |
-
|
| 374 |
-
الرجاء تعديلها كما يلي: {refinement}"""
|
| 375 |
|
| 376 |
-
|
| 377 |
-
else
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
"لأطفال": "👦 إليك النسخة المبسطة للأطفال...",
|
| 381 |
-
"أكثر تفصيلاً": "📊 إليك النسخة المفصلة..."
|
| 382 |
-
}
|
| 383 |
-
return improvements.get(refinement, f"🔄 التعديل: {refinement}")
|
| 384 |
|
| 385 |
-
# =====
|
| 386 |
css = """
|
| 387 |
-
.gradio-container {
|
| 388 |
-
|
| 389 |
-
min-height: 100vh;
|
| 390 |
-
}
|
| 391 |
-
|
| 392 |
-
.stars-bg {
|
| 393 |
-
position: fixed;
|
| 394 |
-
top: 0;
|
| 395 |
-
left: 0;
|
| 396 |
-
width: 100%;
|
| 397 |
-
height: 100%;
|
| 398 |
-
background-image:
|
| 399 |
-
radial-gradient(2px 2px at 20px 30px, #eee, transparent),
|
| 400 |
-
radial-gradient(1px 1px at 40px 70px, #fff, transparent);
|
| 401 |
-
animation: twinkle 3s infinite;
|
| 402 |
-
z-index: 0;
|
| 403 |
-
}
|
| 404 |
-
|
| 405 |
-
@keyframes twinkle {
|
| 406 |
-
0%, 100% { opacity: 0.7; }
|
| 407 |
-
50% { opacity: 1; }
|
| 408 |
-
}
|
| 409 |
-
|
| 410 |
-
.control-panel {
|
| 411 |
-
background: rgba(0, 30, 50, 0.9);
|
| 412 |
-
border: 2px solid #00ff88;
|
| 413 |
-
border-radius: 15px;
|
| 414 |
-
padding: 20px;
|
| 415 |
-
margin: 15px 0;
|
| 416 |
-
}
|
| 417 |
-
|
| 418 |
-
.mission-card {
|
| 419 |
-
background: rgba(0, 40, 60, 0.9);
|
| 420 |
-
border: 2px solid #0088ff;
|
| 421 |
-
border-radius: 15px;
|
| 422 |
-
padding: 20px;
|
| 423 |
-
margin: 15px 0;
|
| 424 |
-
}
|
| 425 |
-
|
| 426 |
-
.gr-button-primary {
|
| 427 |
-
background: linear-gradient(135deg, #00ff88, #00a86b);
|
| 428 |
-
border: none;
|
| 429 |
-
border-radius: 25px;
|
| 430 |
-
color: #002b1a;
|
| 431 |
-
font-weight: bold;
|
| 432 |
-
}
|
| 433 |
-
|
| 434 |
-
.gr-button-primary:hover {
|
| 435 |
-
background: linear-gradient(135deg, #00ffa2, #00cc88);
|
| 436 |
-
box-shadow: 0 0 20px #00ff88;
|
| 437 |
-
}
|
| 438 |
"""
|
| 439 |
|
| 440 |
-
|
| 441 |
-
|
| 442 |
-
|
| 443 |
-
# خلفية النجوم
|
| 444 |
-
gr.HTML("""<div class="stars-bg"></div>""")
|
| 445 |
-
|
| 446 |
-
gr.Markdown("# 🚀 محاكاة إطلاق البرومبت الفضائي")
|
| 447 |
-
|
| 448 |
-
# معلومات الاتصال بـ OpenAI
|
| 449 |
-
if OPENAI_AVAILABLE:
|
| 450 |
-
status = "🟢 متصل بـ OpenAI API"
|
| 451 |
-
else:
|
| 452 |
-
status = "⚠️ وضع المحاكاة (تثبيت openai وضبط API key)"
|
| 453 |
-
|
| 454 |
-
gr.Markdown(f"### حالة النظام: {status}")
|
| 455 |
|
|
|
|
|
|
|
|
|
|
| 456 |
with gr.Tabs():
|
| 457 |
-
#
|
| 458 |
-
with gr.Tab("🌕
|
| 459 |
with gr.Row():
|
| 460 |
with gr.Column(scale=1):
|
| 461 |
-
mission_selector = gr.Dropdown(
|
| 462 |
-
|
| 463 |
-
|
| 464 |
-
)
|
| 465 |
-
start_btn = gr.Button("🚀 بدء المهمة")
|
| 466 |
|
| 467 |
-
with gr.Group(elem_classes="mission-card"):
|
| 468 |
-
mission_info = gr.Markdown("### اختر مهمة للبدء")
|
| 469 |
-
target_display = gr.Textbox(label="الهدف النهائي", interactive=False)
|
| 470 |
-
hints_display = gr.Markdown("### 💡 التلميحات ستظهر هنا")
|
| 471 |
-
|
| 472 |
with gr.Column(scale=2):
|
| 473 |
-
|
| 474 |
-
|
| 475 |
-
|
| 476 |
-
|
| 477 |
-
)
|
| 478 |
-
|
| 479 |
-
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
| 484 |
-
|
| 485 |
-
|
| 486 |
-
|
| 487 |
-
|
| 488 |
-
|
| 489 |
-
|
| 490 |
-
|
| 491 |
-
|
| 492 |
-
|
| 493 |
-
|
| 494 |
-
|
| 495 |
-
|
| 496 |
-
|
| 497 |
-
|
| 498 |
-
|
| 499 |
-
|
| 500 |
-
|
| 501 |
-
|
| 502 |
-
launch_btn.click(
|
| 503 |
-
handle_launch,
|
| 504 |
-
inputs=[commander, destination, thrust, tone],
|
| 505 |
-
outputs=[prompt_display, response_display, analysis_display]
|
| 506 |
-
)
|
| 507 |
|
| 508 |
-
#
|
| 509 |
-
|
| 510 |
-
|
| 511 |
-
gr.Markdown("### 🚨 منطقة الخطر: الثقب الأسود")
|
| 512 |
-
bh_prompt = gr.Textbox(label="البرومبت المدمر", interactive=False)
|
| 513 |
-
bh_explain = gr.Markdown("### 📖 شرح المشكلة")
|
| 514 |
-
bh_btn = gr.Button("🌀 تفعيل الثقب الأسود", variant="stop")
|
| 515 |
-
bh_output = gr.Textbox(label="💥 نتيجة الهلوسة", lines=6)
|
| 516 |
-
|
| 517 |
-
bh_btn.click(
|
| 518 |
-
black_hole_challenge,
|
| 519 |
-
outputs=[bh_prompt, bh_output, bh_explain]
|
| 520 |
-
)
|
| 521 |
|
| 522 |
-
#
|
| 523 |
-
|
| 524 |
-
|
| 525 |
-
|
| 526 |
-
original_input = gr.Textbox(
|
| 527 |
-
label="البرومبت الأصلي",
|
| 528 |
-
value="اشرح مفهوم الذكاء الاصطناعي"
|
| 529 |
-
)
|
| 530 |
-
first_launch = gr.Button("🚀 الإطلاق الأول")
|
| 531 |
-
initial_response = gr.Textbox(label="الإجابة الأولية", lines=6)
|
| 532 |
-
|
| 533 |
-
with gr.Column():
|
| 534 |
-
refinement = gr.Radio(
|
| 535 |
-
["أقصر", "لأطفال", "أكثر تفصيلاً", "رسمي أكثر"],
|
| 536 |
-
label="نوع التحسين"
|
| 537 |
-
)
|
| 538 |
-
refine_btn = gr.Button("🔄 تطبيق التحسين")
|
| 539 |
-
improved_response = gr.Textbox(label="الإجابة المحسنة", lines=6)
|
| 540 |
-
|
| 541 |
-
def handle_refine(original, refine_type):
|
| 542 |
-
if not original:
|
| 543 |
-
return "⚠️ أطلق أولاً للحصول على إجابة"
|
| 544 |
-
return reentry_simulation(original, refine_type)
|
| 545 |
-
|
| 546 |
-
first_launch.click(
|
| 547 |
-
lambda p: launch_mission("خبير", p, "متوسط", "رسمية")[1],
|
| 548 |
-
inputs=[original_input],
|
| 549 |
-
outputs=[initial_response]
|
| 550 |
-
)
|
| 551 |
-
|
| 552 |
-
refine_btn.click(
|
| 553 |
-
handle_refine,
|
| 554 |
-
inputs=[initial_response, refinement],
|
| 555 |
-
outputs=[improved_response]
|
| 556 |
-
)
|
| 557 |
|
| 558 |
-
|
| 559 |
-
|
| 560 |
-
|
| 561 |
-
|
| 562 |
-
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
|
| 566 |
-
|
| 567 |
-
|
| 568 |
-
|
| 569 |
-
|
| 570 |
-
|
| 571 |
-
|
| 572 |
-
|
| 573 |
-
|
| 574 |
-
|
| 575 |
-
|
| 576 |
-
|
| 577 |
-
interactive=False
|
| 578 |
-
)
|
| 579 |
-
|
| 580 |
-
export_btn = gr.Button("📥 تصدير التقرير")
|
| 581 |
-
report_output = gr.Textbox(label="التقرير الكامل", visible=False)
|
| 582 |
-
|
| 583 |
-
def generate_report():
|
| 584 |
-
report = f"""تقرير أداء البرومبتات
|
| 585 |
-
{'='*40}
|
| 586 |
-
المدارات المثالية: {game_state['perfect_orbits']}
|
| 587 |
-
إجمالي النقاط: {game_state['score']}
|
| 588 |
-
عدد المحاولات: {game_state['attempts']}
|
| 589 |
-
آخر تحديث: {datetime.now().strftime('%Y-%m-%d %H:%M')}
|
| 590 |
-
"""
|
| 591 |
-
return report, gr.update(visible=True)
|
| 592 |
-
|
| 593 |
-
export_btn.click(
|
| 594 |
-
generate_report,
|
| 595 |
-
outputs=[report_output, report_output]
|
| 596 |
-
)
|
| 597 |
|
|
|
|
|
|
|
|
|
| 2 |
import random
|
| 3 |
import json
|
| 4 |
from datetime import datetime
|
| 5 |
+
from openai import OpenAI
|
|
|
|
|
|
|
| 6 |
|
| 7 |
+
# ===== إعدادات OpenAI =====
|
| 8 |
+
# استبدل 'YOUR_API_KEY' بمفتاحك الخاص أو اجعله كمدخل في الواجهة
|
| 9 |
+
client = OpenAI(api_key="YOUR_API_KEY")
|
| 10 |
|
| 11 |
+
def get_ai_response(prompt, tone, length):
|
| 12 |
+
"""جلب الاستجابة الحقيقية من OpenAI"""
|
| 13 |
+
system_message = f"أنت مساعد ذكاء اصطناعي بنبرة {tone}. يرجى تقديم إجابة بمستوى تفصيل {length}."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
|
| 15 |
try:
|
| 16 |
response = client.chat.completions.create(
|
| 17 |
+
model="gpt-3.5-turbo", # أو gpt-4
|
| 18 |
messages=[
|
| 19 |
+
{"role": "system", "content": system_message},
|
| 20 |
{"role": "user", "content": prompt}
|
| 21 |
],
|
| 22 |
+
temperature=0.7
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
)
|
| 24 |
+
return response.choices[0].message.content
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
except Exception as e:
|
| 26 |
+
return f"⚠️ خطأ في الاتصال بـ OpenAI: {str(e)}"
|
| 27 |
|
| 28 |
+
# ===== منطق اللعبة والحالة =====
|
| 29 |
game_state = {
|
| 30 |
"score": 0,
|
| 31 |
"attempts": 0,
|
|
|
|
|
|
|
| 32 |
"perfect_orbits": 0,
|
| 33 |
+
"history": [],
|
| 34 |
+
"current_mission": None
|
| 35 |
}
|
| 36 |
|
|
|
|
| 37 |
MOON_MISSIONS = [
|
| 38 |
{
|
| 39 |
"id": "mission_1",
|
| 40 |
"name": "مهمة شرح مفهوم",
|
| 41 |
"bad_prompt": "اشرح لي الذكاء الاصطناعي",
|
| 42 |
"target": "شرح مفهوم الذكاء الاصطناعي التوليدي لطالب في الصف السادس",
|
| 43 |
+
"hints": ["حدد الفئة العمرية", "استخدم أمثلة بسيطة", "حدد نوع الذكاء"]
|
| 44 |
},
|
| 45 |
{
|
| 46 |
"id": "mission_2",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
"name": "مهمة حل مشكلة",
|
| 48 |
"bad_prompt": "كيف أتعلم البرمجة",
|
| 49 |
+
"target": "خطة تعلم بايثون للمبتدئين في 3 أشهر مع مشاريع",
|
| 50 |
+
"hints": ["حدد المدة", "اذكر المستوى", "اطلب مشاريع عملية"]
|
| 51 |
}
|
| 52 |
]
|
| 53 |
|
| 54 |
+
# ===== دالة تحليل البرومبت (الرادار) =====
|
| 55 |
+
def analyze_prompt(prompt, target=None):
|
|
|
|
| 56 |
score = 100
|
| 57 |
feedback = []
|
| 58 |
|
|
|
|
| 59 |
word_count = len(prompt.split())
|
| 60 |
+
if word_count < 10: score -= 30; feedback.append("📉 الب��ومبت قصير جداً")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
|
| 62 |
+
elements = ["كـ", "دور", "سياق", "مثال", "جمهور", "هدف"]
|
| 63 |
+
found = [e for e in elements if e in prompt]
|
| 64 |
+
score += len(found) * 10
|
| 65 |
|
|
|
|
| 66 |
if target:
|
| 67 |
+
matches = sum(1 for word in target.split()[:5] if word in prompt)
|
| 68 |
+
score += matches * 5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
|
| 70 |
+
score = min(max(score, 0), 100)
|
| 71 |
+
grade = "🌟 مدار مثالي" if score >= 90 else "✅ مدار مستقر" if score >= 70 else "🚨 خطر"
|
| 72 |
+
|
| 73 |
+
return {"score": score, "grade": grade, "feedback": feedback, "word_count": word_count}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
|
| 75 |
+
# ===== واجهة Gradio =====
|
| 76 |
css = """
|
| 77 |
+
.gradio-container { background: #0a0e2a !important; color: white !important; }
|
| 78 |
+
.score-display { border: 2px solid #00ff88; padding: 15px; border-radius: 10px; text-align: center; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
"""
|
| 80 |
|
| 81 |
+
with gr.Blocks(css=css, theme=gr.themes.Soft()) as demo:
|
| 82 |
+
gr.Markdown("# 🚀 منصة إطلاق البرومبت الفضائية (Powered by OpenAI)")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
|
| 84 |
+
with gr.Row():
|
| 85 |
+
score_display = gr.Markdown(f"### 📊 النقاط: 0 | 🌟 المدارات: 0", elem_classes="score-display")
|
| 86 |
+
|
| 87 |
with gr.Tabs():
|
| 88 |
+
# --- تبويب المهمة ---
|
| 89 |
+
with gr.Tab("🌕 مهمة القمر"):
|
| 90 |
with gr.Row():
|
| 91 |
with gr.Column(scale=1):
|
| 92 |
+
mission_selector = gr.Dropdown(choices=[m["name"] for m in MOON_MISSIONS], label="اختر المهمة")
|
| 93 |
+
start_btn = gr.Button("🚀 ابدأ الرحلة")
|
| 94 |
+
mission_desc = gr.Markdown("### 🎯 الهدف: اختر مهمة للبدء")
|
| 95 |
+
target_prompt_hidden = gr.State("")
|
|
|
|
| 96 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
with gr.Column(scale=2):
|
| 98 |
+
commander = gr.Dropdown(["خبير", "معلم", "رائد فضاء"], label="👨🚀 القائد")
|
| 99 |
+
user_input = gr.Textbox(label="✍️ اكتب البرومبت المحسن هنا", lines=3)
|
| 100 |
+
with gr.Row():
|
| 101 |
+
thrust = gr.Radio(["مختصر", "متوسط", "مفصل"], label="⚡ قوة الدفع (الطول)", value="متوسط")
|
| 102 |
+
tone = gr.Radio(["رسمية", "حماسية", "ودية"], label="🎵 النبرة", value="رسمية")
|
| 103 |
+
launch_btn = gr.Button("🔥 إطلاق!", variant="primary")
|
| 104 |
+
|
| 105 |
+
with gr.Row():
|
| 106 |
+
ai_res = gr.Textbox(label="📡 استجابة الذكاء الاصطناعي (من المدار)", lines=5)
|
| 107 |
+
analysis_res = gr.JSON(label="📊 تحليل الرادار")
|
| 108 |
+
|
| 109 |
+
# --- تبويب التحليل والتقرير ---
|
| 110 |
+
with gr.Tab("📊 شاشة التحكم والتقارير"):
|
| 111 |
+
gr.Markdown("### 📜 سجل الرحلات الأخيرة")
|
| 112 |
+
history_table = gr.Dataframe(headers=["الوقت", "النقاط", "التقييم"], datasize=5)
|
| 113 |
+
report_btn = gr.Button("📄 إصدار تقرير المهمة النهائي")
|
| 114 |
+
report_out = gr.Textbox(label="التقرير", visible=False)
|
| 115 |
+
|
| 116 |
+
# ===== المنطق التشغيلي =====
|
| 117 |
+
def start_mission_logic(name):
|
| 118 |
+
mission = next(m for m in MOON_MISSIONS if m["name"] == name)
|
| 119 |
+
return f"### 🎯 الهدف: {mission['target']}\n\n**💡 تلميحات:** {', '.join(mission['hints'])}", mission['target']
|
| 120 |
+
|
| 121 |
+
start_btn.click(start_mission_logic, [mission_selector], [mission_desc, target_prompt_hidden])
|
| 122 |
+
|
| 123 |
+
def launch_logic(cmd, prompt, thr, ton, target):
|
| 124 |
+
# 1. تحليل
|
| 125 |
+
analysis = analyze_prompt(prompt, target)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
|
| 127 |
+
# 2. جلب إجابة حقيقية من OpenAI
|
| 128 |
+
full_prompt = f"بصفتك {cmd}، {prompt}"
|
| 129 |
+
response = get_ai_response(full_prompt, ton, thr)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
|
| 131 |
+
# 3. تحديث الحالة
|
| 132 |
+
game_state["attempts"] += 1
|
| 133 |
+
game_state["score"] += analysis["score"]
|
| 134 |
+
if analysis["score"] >= 90: game_state["perfect_orbits"] += 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
|
| 136 |
+
now = datetime.now().strftime("%H:%M")
|
| 137 |
+
game_state["history"].append([now, analysis["score"], analysis["grade"]])
|
| 138 |
+
|
| 139 |
+
score_txt = f"### 📊 النقاط: {game_state['score']} | 🌟 المدارات: {game_state['perfect_orbits']}"
|
| 140 |
+
|
| 141 |
+
return response, analysis, score_txt, game_state["history"][-5:]
|
| 142 |
+
|
| 143 |
+
launch_btn.click(
|
| 144 |
+
launch_logic,
|
| 145 |
+
[commander, user_input, thrust, tone, target_prompt_hidden],
|
| 146 |
+
[ai_res, analysis_res, score_display, history_table]
|
| 147 |
+
)
|
| 148 |
+
|
| 149 |
+
def make_report():
|
| 150 |
+
rep = f"تقرير المهمة الفضائية\n{'='*20}\n"
|
| 151 |
+
rep += f"إجمالي المحاولات: {game_state['attempts']}\nالمدارات المثالية: {game_state['perfect_orbits']}"
|
| 152 |
+
return rep, gr.update(visible=True)
|
| 153 |
+
|
| 154 |
+
report_btn.click(make_report, None, [report_out, report_out])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
|
| 156 |
+
if __name__ == "__main__":
|
| 157 |
+
demo.launch()
|