RS-Studio-FB13 commited on
Commit
f3e35c0
·
verified ·
1 Parent(s): 8dd30de

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -96
app.py CHANGED
@@ -1,38 +1,29 @@
1
  # ==============================================================================
2
  # اسم المشروع: وكيل الأزهريين الذكي (Deputy of Al-Azhar)
3
- # المحرك المدعوم: Google AI Studio (مستقل ومخصص لخدمة الطلاب)
4
- # النموذج المستخدم: Gemini 1.5 Flash (صاحب الذاكرة المليونية والـ 1500 طلب مجاني)
5
  # تـاريخ التحديث الأخير: يونيو 2026
6
  # ==============================================================================
7
 
 
8
  import streamlit as st
9
- import google.generativeai as genai
10
  from pypdf import PdfReader
11
  from gtts import gTTS
12
  import io
13
 
14
  # ------------------------------------------------------------------------------
15
- # 1. نظام الحماية وجلب مفتاح جوجل المشفر (Security & Secrets)
16
  # ------------------------------------------------------------------------------
17
-
18
  try:
19
- # جلب مفتاح Gemini بأمان من الـ Secrets (سواء محلياً أو على Streamlit Cloud)
20
- GEMINI_API_KEY = st.secrets["GEMINI_API_KEY"]
21
- except Exception:
22
- st.error("""
23
- 🔒 **خطأ في منظومة الأمان:** لم يتم العثور على مفتاح جيميناي الآمن.
24
- - **إذا كنت تعمل محلياً:** تأكد من إنشاء مجلد اسمه `.streamlit` وبداخله ملف `secrets.toml` يحتوي على المفتاح باسم `GEMINI_API_KEY`.
25
- - **إذا كنت ترفع التطبيق أونلاين:** تأكد من إضافة المفتاح في خيار `Advanced settings -> Secrets` على منصة الاستضافة.
26
- """)
27
- st.stop()
28
-
29
- # تهيئة وإعداد مكتبة جوجل باستخدام مفتاحك الخاص
30
- genai.configure(api_key=GEMINI_API_KEY)
31
 
32
  # ------------------------------------------------------------------------------
33
  # 2. إعدادات الواجهة الرسومية والهوية البصرية للتطبيق (UI Configuration)
34
  # ------------------------------------------------------------------------------
35
-
36
  st.set_page_config(
37
  page_title="وكيل الأزهريين الذكي",
38
  page_icon="🕌",
@@ -43,7 +34,6 @@ st.set_page_config(
43
  # ------------------------------------------------------------------------------
44
  # 3. صياغة التوجيهات النظامية الصارمة (System Prompt Engineering)
45
  # ------------------------------------------------------------------------------
46
-
47
  SYSTEM_PROMPT = """
48
  أنت الآن الـ AI الملقب بـ "وكيل الأزهريين" (Deputy of Al-Azhar)، خبير تعليمي ومدرس تراثي وعلمي متمكن متخصص في مناهج ومواد الأزهر الشريف بالكامل.
49
  - مهمتك الأساسية والمقدسة: مساعدة الطلاب والمعلمين بناءً على النصوص المرفوعة من كتب المعهد المرفقة.
@@ -54,136 +44,108 @@ SYSTEM_PROMPT = """
54
  """
55
 
56
  # ------------------------------------------------------------------------------
57
- # 4. الدوال البرمجية الخلفية للمشروع باستخدام جيميناي (Gemini Backend Functions)
58
  # ------------------------------------------------------------------------------
59
-
60
- def get_gemini_answer(user_query, text_context, user_mode):
61
  """
62
- هذه الدالة مسؤولة عن إرسال الطلب، النصوص المستخرجة من الكتاب، وسؤال الطالب
63
- إلى سيرفرات Google لتتم معالجتها عبر نموذج Gemini 1.5 Flash الخارق.
64
  """
 
 
 
 
 
 
 
 
 
 
 
65
  try:
66
- # إعداد الموديل مع تمرير التوجيهات النظامية الصارمة كـ System Instruction كما تدعمها جوجل
67
- model = genai.GenerativeModel(
68
- model_name='gemini-1.5-flash',
69
- system_instruction=SYSTEM_PROMPT
70
- )
71
-
72
- # صياغة الرسالة الشاملة التي تدمج السياق والوضع الحالي والسؤال لتوجيه الموديل بدقة
73
- full_user_message = (
74
- f"[بوابة الاستخدام الحالية في المنصة: {user_mode}]\n\n"
75
- f"نص كتاب المعهد الأزهرى المرفوع كـ سياق معتمد:\n{text_context}\n\n"
76
- f"طلب المستخدم وسؤاله الحالي الذي يحتاج إجابة:\n{user_query}"
77
- )
78
-
79
- # ضبط الحرارة لمنع التأليف وضمان الدقة
80
- config = genai.types.GenerationConfig(
81
  temperature=0.4
82
  )
83
-
84
- # توليد المحتوى من السيرفر مباشرة
85
- response = model.generate_content(full_user_message, generation_config=config)
86
- return response.text
87
  except Exception as e:
88
- return f"⚠️ حدث خطأ أثناء الاتصال بسيرفر جيميناي: {str(e)}"
89
-
90
 
91
  def extract_text_from_pdf(pdf_file):
92
- """
93
- مهمة هذه الدالة هي استقبال ملف الـ PDF الحقيقي المرفوع من الطالب أو المعلم،
94
- والدخول إلى أعماقه لاستخراج كافة النصوص والحروف وإعادتها كـ سياق نصي متصل.
95
- """
96
  reader = PdfReader(pdf_file)
97
  extracted_text = ""
98
-
99
- # المرور على كافة صفحات ملف المعهد صفحة تلو الأخرى
100
  for page in reader.pages:
101
  text = page.extract_text()
102
  if text:
103
  extracted_text += text + "\n"
104
-
105
  return extracted_text
106
 
107
-
108
  def text_to_speech_player(text_to_speak):
109
- """
110
- الميزة الأسطورية: استقبال رد الوكيل المكتوب، وتحويله في الذاكرة المؤقتة إلى ملف
111
- صوتي MP3 ناطق بالفصحى وعرض مشغل صوتي تفاعلي يمنع ملل الطلاب أثناء المذاكرة.
112
- """
113
  try:
114
- # توليد الصوت باللغة العربية الفصحى المبسطة وبسرعة عادية واضحة
115
- tts = gTTS(text=text_to_speak, lang='ar', slow=False)
116
-
117
- # إنشاء وعاء في ذاكرة الرام العشوائية (RAM) لحفظ الصوت دون استهلاك مساحة السيرفر
118
  sound_file = io.BytesIO()
119
  tts.write_to_fp(sound_file)
120
-
121
- # عرض مشغل الصوت الأنيق المدمج بخصائص التشغيل والتحكم في الصوت والتمرير
122
  st.audio(sound_file, format='audio/mp3')
123
  except Exception as e:
124
- st.warning("⚠️ مشغل الصوت واجه ضغطاً مؤقتاً، يمكنك قراءة التوضيح المكتوب في الأعلى ببساطة.")
125
 
126
  # ------------------------------------------------------------------------------
127
- # 5. بناء وتصميم الواجهة الأمامية للمستخدم (Frontend & App Layout)
128
  # ------------------------------------------------------------------------------
129
-
130
- # تصميم الهيدر الرئيسي للتطبيق باستخدام كروت جمالية متناسقة
131
  st.markdown("<h1 style='text-align: center; color: #1e4620;'>🕌 وكيل الأزهريين الذكي</h1>", unsafe_allow_html=True)
132
- st.markdown("<p style='text-align: center; color: #555; font-weight: bold; letter-spacing: 1px;'>Deputy of Al-Azhar Engine</p>", unsafe_allow_html=True)
133
- st.markdown("<p style='text-align: center; color: #777; font-size: 14px;'>مشروع خيري مستقل ومؤمن بالكامل لخدمة طلاب ومدرسي الأزهر الشريف عبر طراز Gemini 1.5 Flash</p>", unsafe_allow_html=True)
134
  st.write("---")
135
 
136
- # بناء القائمة الجانبية لإدارة البوابات وتأكيد حالة الاتصال بالسيرفر
137
  with st.sidebar:
138
  st.markdown("<h3 style='text-align: center; color: #1e4620;'>🔐 لوحة التحكم والتوجيه</h3>", unsafe_allow_html=True)
139
 
140
- # صندوق التحديد الذكي للتنقل بين حساب الطالب وحساب المعلم
141
  user_mode = st.selectbox(
142
  "اختر بوابة الدخول الحالية:",
143
  ["👤 بوابة الطالب الأزهري", "👨‍🏫 بوابة معلم أزهري"]
144
  )
145
 
146
  st.write("---")
147
- # إشعار تأكيد الاتصال الآمن بجيميناي ومميزات الخطة
148
- st.success("🔒 اتصال آمن: الخادم متصل بنموذج Gemini 1.5 Flash (1500 طلب مجاني يومياً بذاكرة مليونية).")
149
- st.info("💡 نصيحة: ارفع كتاب المعهد أولاً، ثم تنقل بين الأزرار للحصول على أفضل النتائج.")
150
 
151
- # صندوق رفع ملفات كتب المعهد المشترك في الواجهة الرئيسية
152
  uploaded_file = st.file_uploader(
153
  "قم برفع كتاب المعهد، المذكرة الرسمية، أو مقرر المادة بصيغة (PDF):",
154
  type=["pdf"]
155
  )
156
 
157
- # التحقق من حالة الملف المرفوع وبناء السياق التلقائي
158
  if uploaded_file is not None:
159
  with st.spinner("📄 جاري تشريح صفحات كتاب المعهد واستخراج النصوص بدقة أكاديمية..."):
160
  book_context = extract_text_from_pdf(uploaded_file)
161
- st.toast("تمت قراءة الكتاب وتخزينه في ذاكرة الوكيل المؤقتة بنجاح! 🎉", icon="✅")
162
  else:
163
  book_context = ""
164
 
165
  # ------------------------------------------------------------------------------
166
- # 6. تفعيل البوابات البرمجية والعمليات الذكية بناءً على وضع المستخدم
167
  # ------------------------------------------------------------------------------
168
 
169
- # === أولاً: تشغيل منظومة بوابة الطالب الأزهري ===
170
  if user_mode == "👤 بوابة الطالب الأزهري":
171
  st.subheader("📚 رفيـقك الذكي للمذاكـرة وتوقعـات البوكلـيت")
172
- st.write("مرحباً بك يا غالي في حاسوبك التعليمي. ارفع مقرر درسك، واطلب ما تريد من الوكيل الآن لتجاوز الملل وضمان التفوق:")
173
 
174
- # الصندوق النصي لاستقبال استفسارات الطالب
175
  student_query = st.text_input("اكتب سؤالك الفقهي أو النحوي، أو النقطة الصعبة التي تحتاج شرحها في هذا الدرس:")
176
 
177
- # تقسيم الأزرار التفاعلية إلى عمودين متناسقين هندسياً
178
  col1, col2 = st.columns(2)
179
 
180
  with col1:
181
  if st.button("💡 اشرح لي الدرس ببساطة"):
182
  if book_context and student_query:
183
- with st.spinner("🤖 يقوم الوكيل الآن بصياغة الشرح والتبسيط عبر جيميناي..."):
184
- reply = get_gemini_answer(f"اشرح لي ببساطة الدرس وأجب عن هذا السؤال بالتفصيل: {student_query}", book_context, user_mode)
185
  st.success(reply)
186
-
187
  st.markdown("### 🎧 استمع إلى الشرح الصوتي المباشر للوكيل:")
188
  text_to_speech_player(reply)
189
  else:
@@ -193,32 +155,28 @@ if user_mode == "👤 بوابة الطالب الأزهري":
193
  if st.button("📝 توليد أسئلة بوكليت متوقعة"):
194
  if book_context:
195
  with st.spinner("🤖 جاري قراءة السياق وتوليد أهم أسئلة امتحانات البوكليت المتوقعة..."):
196
- reply = get_gemini_answer("استخرج من هذا النص المرفق 3 أسئلة امتحانات متوقعة بنظام البوكليت الأزهري الرسمي (مثال: ما الحكم مع التعليل، علل لما يأتي، اذكر الدليل الشرعي أو العلمي) متبوعة بالإجابات النموذجية الكاملة والمنظمة لكل سؤال.", book_context, user_mode)
197
  st.info(reply)
198
-
199
  st.markdown("### 🎧 استمع إلى الأسئلة المتوقعة وإجاباتها:")
200
  text_to_speech_player(reply)
201
  else:
202
  st.warning("⚠️ تنبيه: رجاءً ارفع ملف كتاب المعهد (PDF) أولاً لتوليد أسئلة الامتحان منه.")
203
 
204
- # === ثانياً: تشغيل منظومة بوابة المعلم الأزهري ===
205
  elif user_mode == "👨‍🏫 بوابة معلم أزهري":
206
  st.subheader("👨‍🏫 مساعدك التربوي المتقدم لتنظيم المنهج وبنوك الأسئلة")
207
- st.write("أهلاً وسهلاً بمشايخنا وأساتذتنا الأجلاء. هنا أداتك البرمجية لتوفير الوقت والجهد في تحضير الحصص وصياغة الاختبارات التقييمية لطلابكم:")
208
 
209
- # الصندوق النصي لاستقبال توجيهات المدرس
210
- teacher_query = st.text_input("ما الدرس أو الجزئية المحددة التي ترغب في تحضيرها أو توزيعها اليوم يا مولانا؟")
211
 
212
- # تقسيم أزرار المعلم لعمودين متوازيين
213
  col1, col2 = st.columns(2)
214
 
215
  with col1:
216
  if st.button("🗺️ وضع خطة تحضير وتوزيع للدرس"):
217
  if book_context:
218
  with st.spinner("🤖 جاري صياغة خطة التحضير التربوية والوسائل المقترحة..."):
219
- reply = get_gemini_answer("قم بعمل تحضير دراسي نموذجي تربوي مفصل لهذا النص يحتوي على الأهداف السلوكية الثلاثة (معرفية، وجدانية، مهارية)، واقترح وسيلة تعليمية أو فكرة مبتكرة ومبسطة لشرح المعلم الدرس وتوصيل المعلومة بكفاءة لعقول الطلاب.", book_context, user_mode)
220
  st.success(reply)
221
-
222
  st.markdown("### 🎧 استمع إلى التحضير الصوتي التعليمي:")
223
  text_to_speech_player(reply)
224
  else:
@@ -228,9 +186,8 @@ elif user_mode == "👨‍🏫 بوابة معلم أزهري":
228
  if st.button("🔍 ابتكار اختبار شهري للمادة"):
229
  if book_context:
230
  with st.spinner("🤖 جاري صياغة وبناء أسئلة الاختبار الشامل ومفتاح الحل..."):
231
- reply = get_gemini_answer("اصنع اختباراً شهرياً منوعاً وشاملاً لتقييم استيعاب وفهم الطلاب لهذا النص، على أن يكون مقسماً بدقة وبشكل منظم إلى أسئلة مقالية، أسئلة موضوعية (صح وخطأ)، وأسئلة اختيار من متعدد، مع كتابة نموذج الإجابة التفصيلي ومفتاح الحل لكل سؤال لراحة المعلم.", book_context, user_mode)
232
  st.info(reply)
233
-
234
  st.markdown("### 🎧 استمع إلى بنك الأسئلة والاختبار الشهري:")
235
  text_to_speech_player(reply)
236
  else:
 
1
  # ==============================================================================
2
  # اسم المشروع: وكيل الأزهريين الذكي (Deputy of Al-Azhar)
3
+ # المحرك المدعوم: Hugging Face Serverless Inference API (سحابي ومجاني بالكامل)
4
+ # النموذج المستخدم: Qwen 2.5 72B Instruct (التنين الصيني الخارق في الفقه واللغة العربية)
5
  # تـاريخ التحديث الأخير: يونيو 2026
6
  # ==============================================================================
7
 
8
+ import os
9
  import streamlit as st
10
+ from huggingface_hub import InferenceClient
11
  from pypdf import PdfReader
12
  from gtts import gTTS
13
  import io
14
 
15
  # ------------------------------------------------------------------------------
16
+ # 1. تهيئة المحرك السحابي الذكي (Serverless Inference API)
17
  # ------------------------------------------------------------------------------
18
+ # نستخدم أضخم وأقوى نسخة من نموذج Qwen الخارق ليعمل سحابياً بدون استهلاك الرام المحلية
19
  try:
20
+ client = InferenceClient(model="Qwen/Qwen2.5-72B-Instruct")
21
+ except Exception as e:
22
+ st.error(f"⚠️ فشل الاتصال الأولي بالمحرك السحابي: {str(e)}")
 
 
 
 
 
 
 
 
 
23
 
24
  # ------------------------------------------------------------------------------
25
  # 2. إعدادات الواجهة الرسومية والهوية البصرية للتطبيق (UI Configuration)
26
  # ------------------------------------------------------------------------------
 
27
  st.set_page_config(
28
  page_title="وكيل الأزهريين الذكي",
29
  page_icon="🕌",
 
34
  # ------------------------------------------------------------------------------
35
  # 3. صياغة التوجيهات النظامية الصارمة (System Prompt Engineering)
36
  # ------------------------------------------------------------------------------
 
37
  SYSTEM_PROMPT = """
38
  أنت الآن الـ AI الملقب بـ "وكيل الأزهريين" (Deputy of Al-Azhar)، خبير تعليمي ومدرس تراثي وعلمي متمكن متخصص في مناهج ومواد الأزهر الشريف بالكامل.
39
  - مهمتك الأساسية والمقدسة: مساعدة الطلاب والمعلمين بناءً على النصوص المرفوعة من كتب المعهد المرفقة.
 
44
  """
45
 
46
  # ------------------------------------------------------------------------------
47
+ # 4. الدوال البرمجية الخلفية للمشروع السحابي (Cloud Backend Functions)
48
  # ------------------------------------------------------------------------------
49
+ def get_cloud_answer(user_query, text_context, user_mode):
 
50
  """
51
+ هذه الدالة مسؤولة عن صياغة وإرسال الطلب سحابياً وتوليد الإجابات عبر خوادم Hugging Face.
 
52
  """
53
+ full_user_message = (
54
+ f"[بوابة الاستخدام الحالية في المنصة: {user_mode}]\n\n"
55
+ f"نص كتاب المعهد الأزهرى المرفوع كـ سياق معتمد:\n{text_context}\n\n"
56
+ f"طلب المستخدم وسؤاله الحالي الذي يحتاج إجابة:\n{user_query}"
57
+ )
58
+
59
+ messages = [
60
+ {"role": "system", "content": SYSTEM_PROMPT},
61
+ {"role": "user", "content": full_user_message}
62
+ ]
63
+
64
  try:
65
+ completion = client.chat_completion(
66
+ messages=messages,
67
+ max_tokens=1500,
 
 
 
 
 
 
 
 
 
 
 
 
68
  temperature=0.4
69
  )
70
+ return completion.choices[0].message.content
 
 
 
71
  except Exception as e:
72
+ return f"⚠️ حدث خطأ أثناء الاتصال بالسيرفر السحابي لـ Qwen: {str(e)}"
 
73
 
74
  def extract_text_from_pdf(pdf_file):
75
+ """استخراج النصوص من ملف الـ PDF المرفوع"""
 
 
 
76
  reader = PdfReader(pdf_file)
77
  extracted_text = ""
 
 
78
  for page in reader.pages:
79
  text = page.extract_text()
80
  if text:
81
  extracted_text += text + "\n"
 
82
  return extracted_text
83
 
 
84
  def text_to_speech_player(text_to_speak):
85
+ """تحويل النص المكتوب إلى ملف صوتي مسموع في الرام فوراً"""
 
 
 
86
  try:
87
+ # إزالة الرموز التعبيرية ومحددات الماركداون لتنظيف النطق الصوتي
88
+ clean_text = text_to_speak.replace("*", "").replace("#", "")
89
+ tts = gTTS(text=clean_text, lang='ar', slow=False)
 
90
  sound_file = io.BytesIO()
91
  tts.write_to_fp(sound_file)
 
 
92
  st.audio(sound_file, format='audio/mp3')
93
  except Exception as e:
94
+ st.warning("⚠️ مشغل الصوت واجه ضغطاً مؤقتاً، يمكنك قراءة التوضيح المكتوب ببساطة.")
95
 
96
  # ------------------------------------------------------------------------------
97
+ # 5. بناء وتصميم الواجهة الأمامية للمخدم (Frontend & App Layout)
98
  # ------------------------------------------------------------------------------
 
 
99
  st.markdown("<h1 style='text-align: center; color: #1e4620;'>🕌 وكيل الأزهريين الذكي</h1>", unsafe_allow_html=True)
100
+ st.markdown("<p style='text-align: center; color: #555; font-weight: bold; letter-spacing: 1px;'>Deputy of Al-Azhar Cloud Engine</p>", unsafe_allow_html=True)
101
+ st.markdown("<p style='text-align: center; color: #777; font-size: 14px;'>مشروع خيري مستقل يعمل بكفاءة 100% عبر الخوادم السحابية لحماية هاتفك وراماتك</p>", unsafe_allow_html=True)
102
  st.write("---")
103
 
104
+ # بناء القائمة الجانبية
105
  with st.sidebar:
106
  st.markdown("<h3 style='text-align: center; color: #1e4620;'>🔐 لوحة التحكم والتوجيه</h3>", unsafe_allow_html=True)
107
 
 
108
  user_mode = st.selectbox(
109
  "اختر بوابة الدخول الحالية:",
110
  ["👤 بوابة الطالب الأزهري", "👨‍🏫 بوابة معلم أزهري"]
111
  )
112
 
113
  st.write("---")
114
+ st.success("🔒 الخادم السحابي متصل بنموذج Qwen 2.5 الخارق (مجاني وسريع بالكامل بدون الحاجة لمفاتيح API مشفرة).")
115
+ st.info("💡 نصيحة: ارفع كتاب المعهد أولاً، ثم تنقل بين الأزرار للحصول على نتائجك.")
 
116
 
117
+ # صندوق رفع الملفات
118
  uploaded_file = st.file_uploader(
119
  "قم برفع كتاب المعهد، المذكرة الرسمية، أو مقرر المادة بصيغة (PDF):",
120
  type=["pdf"]
121
  )
122
 
 
123
  if uploaded_file is not None:
124
  with st.spinner("📄 جاري تشريح صفحات كتاب المعهد واستخراج النصوص بدقة أكاديمية..."):
125
  book_context = extract_text_from_pdf(uploaded_file)
126
+ st.toast("تمت قراءة الكتاب وتخزينه في الذاكرة السحابية بنجاح! 🎉", icon="✅")
127
  else:
128
  book_context = ""
129
 
130
  # ------------------------------------------------------------------------------
131
+ # 6. تفعيل البوابات بناءً على خيار المستخدم
132
  # ------------------------------------------------------------------------------
133
 
134
+ # === أولاً: بوابة الطالب الأزهري ===
135
  if user_mode == "👤 بوابة الطالب الأزهري":
136
  st.subheader("📚 رفيـقك الذكي للمذاكـرة وتوقعـات البوكلـيت")
137
+ st.write("مرحباً بك يا غالي. ارفع مقرر درسك، واطلب ما تريد من الوكيل الآن لتجاوز الملل وضمان التفوق:")
138
 
 
139
  student_query = st.text_input("اكتب سؤالك الفقهي أو النحوي، أو النقطة الصعبة التي تحتاج شرحها في هذا الدرس:")
140
 
 
141
  col1, col2 = st.columns(2)
142
 
143
  with col1:
144
  if st.button("💡 اشرح لي الدرس ببساطة"):
145
  if book_context and student_query:
146
+ with st.spinner("🤖 يقوم الوكيل الآن بصياغة الشرح والتبسيط سحابياً..."):
147
+ reply = get_cloud_answer(f"اشرح لي ببساطة الدرس وأجب عن هذا السؤال بالتفصيل: {student_query}", book_context, user_mode)
148
  st.success(reply)
 
149
  st.markdown("### 🎧 استمع إلى الشرح الصوتي المباشر للوكيل:")
150
  text_to_speech_player(reply)
151
  else:
 
155
  if st.button("📝 توليد أسئلة بوكليت متوقعة"):
156
  if book_context:
157
  with st.spinner("🤖 جاري قراءة السياق وتوليد أهم أسئلة امتحانات البوكليت المتوقعة..."):
158
+ reply = get_cloud_answer("استخرج من هذا النص المرفق 3 أسئلة امتحانات متوقعة بنظام البوكليت الأزهري الرسمي (مثال: ما الحكم مع التعليل، علل لما يأتي، اذكر الدليل الشرعي أو العلمي) متبوعة بالإجابات النموذجية الكاملة والمنظمة لكل سؤال.", book_context, user_mode)
159
  st.info(reply)
 
160
  st.markdown("### 🎧 استمع إلى الأسئلة المتوقعة وإجاباتها:")
161
  text_to_speech_player(reply)
162
  else:
163
  st.warning("⚠️ تنبيه: رجاءً ارفع ملف كتاب المعهد (PDF) أولاً لتوليد أسئلة الامتحان منه.")
164
 
165
+ # === ثانياً: بوابة المعلم الأزهري ===
166
  elif user_mode == "👨‍🏫 بوابة معلم أزهري":
167
  st.subheader("👨‍🏫 مساعدك التربوي المتقدم لتنظيم المنهج وبنوك الأسئلة")
168
+ st.write("أهلاً وسهلاً بمشايخنا وأساتذتنا الأجلاء. هنا أداتك البرمجية لتوفير الوقت والجهد في تحضير الحصص واختبار الطلاب:")
169
 
170
+ teacher_query = st.text_input("ما الدرس أو الجزئية المحددة التي ترغب في تحضيرها اليوم يا مولانا؟")
 
171
 
 
172
  col1, col2 = st.columns(2)
173
 
174
  with col1:
175
  if st.button("🗺️ وضع خطة تحضير وتوزيع للدرس"):
176
  if book_context:
177
  with st.spinner("🤖 جاري صياغة خطة التحضير التربوية والوسائل المقترحة..."):
178
+ reply = get_cloud_answer("قم بعمل تحضير دراسي نموذجي تربوي مفصل لهذا النص يحتوي على الأهداف السلوكية الثلاثة (معرفية، وجدانية، مهارية)، واقترح وسيلة تعليمية أو فكرة مبتكرة ومبسطة لشرح المعلم الدرس وتوصيل المعلومة بكفاءة لعقول الطلاب.", book_context, user_mode)
179
  st.success(reply)
 
180
  st.markdown("### 🎧 استمع إلى التحضير الصوتي التعليمي:")
181
  text_to_speech_player(reply)
182
  else:
 
186
  if st.button("🔍 ابتكار اختبار شهري للمادة"):
187
  if book_context:
188
  with st.spinner("🤖 جاري صياغة وبناء أسئلة الاختبار الشامل ومفتاح الحل..."):
189
+ reply = get_cloud_answer("اصنع اختباراً شهرياً منوعاً وشاملاً لتقييم استيعاب وفهم الطلاب لهذا النص، على أن يكون مقسماً بدقة وبشكل منظم إلى أسئلة مقالية، أسئلة موضوعية (صح وخطأ)، وأسئلة اختيار من متعدد، مع كتابة نموذج الإجابة التفصيلي ومفتاح الحل لكل سؤال لراحة المعلم.", book_context, user_mode)
190
  st.info(reply)
 
191
  st.markdown("### 🎧 استمع إلى بنك الأسئلة والاختبار الشهري:")
192
  text_to_speech_player(reply)
193
  else: