EngReem85 commited on
Commit
688c308
·
verified ·
1 Parent(s): c19b483

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +100 -540
app.py CHANGED
@@ -2,596 +2,156 @@ import gradio as gr
2
  import random
3
  import json
4
  from datetime import datetime
5
- from typing import Optional, Dict, List
6
- import os
7
- from dotenv import load_dotenv
8
 
9
- # تحميل متغيرات البيئة (لتخزين API Key بأمان)
10
- load_dotenv()
 
11
 
12
- # ===== تهيئة OpenAI API =====
13
- try:
14
- import openai
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", # يمكنك استخدام gpt-4 إذا كان متاحاً
118
  messages=[
119
- {"role": "system", "content": "أنت مساعد ذكي يتحدث العربية بطلاقة. قدم إجابات مفيدة وواضحة."},
120
  {"role": "user", "content": prompt}
121
  ],
122
- max_tokens=max_tokens,
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"⚠️ خطأ في التوليد: {str(e)[:100]}"
139
 
140
- # ===== حالة اللعبة =====
141
  game_state = {
142
  "score": 0,
143
  "attempts": 0,
144
- "current_mission": None,
145
- "prompt_history": [],
146
  "perfect_orbits": 0,
147
- "total_tokens_used": 0,
148
- "history": []
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": "صمم خطة تعلم برمجة Python لمدة 3 أشهر لشخص لا خبرة سابقة",
172
- "hints": ["حدد المدة", "ضع خطة زمنية", "أضف مشاريع عملية"]
173
  }
174
  ]
175
 
176
- # ===== نظام تحليل البرومبت =====
177
- def analyze_prompt(prompt: str, target: Optional[str] = None) -> Dict:
178
- """تحليل جودة البرومبت"""
179
  score = 100
180
  feedback = []
181
 
182
- # تحليل الطول
183
  word_count = len(prompt.split())
184
- if word_count < 5:
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
- element_score = len(elements_found) * 15
214
- score += element_score
215
- feedback.append(f"⚙️ عناصر: {len(elements_found)}/4 ({', '.join(elements_found)})")
216
 
217
- # تطابق مع الهدف
218
  if target:
219
- target_words = set(word for word in target.split() if len(word) > 2)
220
- prompt_words = set(prompt.split())
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
- return generate_with_openai(improvement_prompt)
377
- else:
378
- improvements = {
379
- "أقصر": "🔄 إليك النسخة المختصرة...",
380
- "لأطفال": "👦 إليك النسخة المبسطة للأطفال...",
381
- "أكثر تفصيلاً": "📊 إليك النسخة المفصلة..."
382
- }
383
- return improvements.get(refinement, f"🔄 التعديل: {refinement}")
384
 
385
- # ===== CSS =====
386
  css = """
387
- .gradio-container {
388
- background: linear-gradient(135deg, #0a0e2a 0%, #000510 100%);
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
- # ===== واجهة Gradio =====
441
- with gr.Blocks(css=css, title="🚀 محاكاة البرومبت الفضائية") as demo:
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
- # === تبويب 1: لعبة المهمة القمرية ===
458
- with gr.Tab("🌕 لعبة المهمة القمرية"):
459
  with gr.Row():
460
  with gr.Column(scale=1):
461
- mission_selector = gr.Dropdown(
462
- choices=[m["name"] for m in MOON_MISSIONS],
463
- label="اختر المهمة"
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
- with gr.Group(elem_classes="control-panel"):
474
- commander = gr.Dropdown(
475
- ["خبير تقني", "كاتب إبداعي", "مدرب شخصي", "معلم", "عالم فضاء"],
476
- label="👨‍🚀 قائد الرحلة"
477
- )
478
- destination = gr.Textbox(label="🎯 الوجهة", lines=3)
479
- thrust = gr.Radio(["مختصر", "متوسط", "مفصل جدًا"], label="⚡ قوة الدفع")
480
- tone = gr.Radio(["حماسية", "رسمية", "هادئة"], label="🎵 نبرة الصوت")
481
- launch_btn = gr.Button("🚀 إطلاق المركبة", variant="primary")
482
-
483
- with gr.Tabs():
484
- with gr.Tab("البرومبت"):
485
- prompt_display = gr.Textbox(label=لإحداثيات النهائية", lines=4)
486
- with gr.Tab("الإجابة"):
487
- response_display = gr.Textbox(label="المدار النهائي", lines=8)
488
- with gr.Tab("التحليل"):
489
- analysis_display = gr.JSON(label="تحليل المدار")
490
-
491
- # أحداث لعبة المهمة القمرية
492
- start_btn.click(
493
- start_moon_mission,
494
- inputs=[mission_selector],
495
- outputs=[destination, commander, thrust, tone, mission_info, target_display, hints_display]
496
- )
497
-
498
- def handle_launch(cmd, dest, thr, ton):
499
- prompt, response, analysis = launch_mission(cmd, dest, thr, ton, True)
500
- return prompt, response, analysis
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
- # === تبويب 2: تحدي الثقب الأسود ===
509
- with gr.Tab("🕳️ تحدي الثقب الأسود"):
510
- with gr.Group():
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
- # === تبويب 3: إعادة الدخول ===
523
- with gr.Tab("🔥 إعادة الدخول"):
524
- with gr.Row():
525
- with gr.Column():
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
- # === تبويب 4: التحليلات ===
559
- with gr.Tab("📊 التحليلات"):
560
- with gr.Row():
561
- with gr.Column():
562
- stats = gr.JSON(
563
- label="📈 إحصائيات اللعبة",
564
- value={
565
- "النقاط": game_state["score"],
566
- "المحاولات": game_state["attempts"],
567
- "المدارات المثالية": game_state["perfect_orbits"],
568
- "الرموز المستخدمة": game_state["total_tokens_used"]
569
- }
570
- )
571
-
572
- with gr.Column():
573
- history = gr.Dataframe(
574
- headers=["الوقت", "البرومبت", "النقاط", "التقييم"],
575
- value=[[h["timestamp"], h["prompt"], h["score"], h["grade"]]
576
- for h in game_state["history"][-10:]],
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()