Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,38 +1,29 @@
|
|
| 1 |
# ==============================================================================
|
| 2 |
# اسم المشروع: وكيل الأزهريين الذكي (Deputy of Al-Azhar)
|
| 3 |
-
# المحرك المدعوم:
|
| 4 |
-
# النموذج المستخدم:
|
| 5 |
# تـاريخ التحديث الأخير: يونيو 2026
|
| 6 |
# ==============================================================================
|
| 7 |
|
|
|
|
| 8 |
import streamlit as st
|
| 9 |
-
|
| 10 |
from pypdf import PdfReader
|
| 11 |
from gtts import gTTS
|
| 12 |
import io
|
| 13 |
|
| 14 |
# ------------------------------------------------------------------------------
|
| 15 |
-
# 1.
|
| 16 |
# ------------------------------------------------------------------------------
|
| 17 |
-
|
| 18 |
try:
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 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. الدوال البرمجية الخلفية للمشروع
|
| 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 |
-
|
| 67 |
-
|
| 68 |
-
|
| 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"⚠️ حدث خطأ أثناء الاتصال بسيرفر
|
| 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 |
-
|
| 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. بناء وتصميم الواجهة الأمامية للم
|
| 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;'>مشروع خيري مستقل
|
| 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.
|
| 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("تمت قراءة الكتاب وتخزينه في ذاكرة ال
|
| 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 =
|
| 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 =
|
| 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 =
|
| 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 =
|
| 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:
|