File size: 3,276 Bytes
9ba43c9 0f04293 9ba43c9 6518593 0f04293 95b77e6 6518593 f2c0b26 95b77e6 6518593 0f04293 9b4aaf4 9ba43c9 a97a87b 0f04293 19ab709 9ba43c9 19ab709 9ba43c9 19ab709 0f04293 6518593 9ba43c9 6518593 9ba43c9 6518593 9ba43c9 a97a87b 9ba43c9 a97a87b 9ba43c9 a97a87b 9ba43c9 a802676 a97a87b 9ba43c9 0f04293 a97a87b 9ba43c9 0f04293 9ba43c9 a97a87b a802676 9ba43c9 a97a87b 9ba43c9 0f04293 6518593 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | # app.py
import gradio as gr
import json
import re
import google.generativeai as genai
API_KEY = "AIzaSyB4JKubDJd7nLx1NqPhDfMGeVWeQ7kqClY"
genai.configure(api_key=API_KEY)
MODEL_NAME = "gemini-2.5-flash"
model = genai.GenerativeModel(MODEL_NAME)
def generate_mcqs_gemini(paragraph: str, n_questions: int, n_choices: int = 4):
if not paragraph or paragraph.strip() == "":
return " Please enter a paragraph first.", ""
prompt = f"""
اقرأ الفقرة أو الدرس الآتي بعناية:
{paragraph}
ثم أنشئ {n_questions} سؤال من نوع الاختيار من متعدد (MCQ) يختبر الفهم الحقيقي لمضمون النص.
يجب أن تتصف الأسئلة بالشروط التالية:
- أن تكون واضحة ومباشرة.
- أن يكون مستوى الصعوبة متوسطًا.
- أن تكون الخيارات الأربعة متقاربة المعنى إلى حدٍّ ما، ولكن واحدة منها فقط صحيحة بوضوح.
- أن تُكتب الخيارات بلغة عربية فصحى سليمة ومتناسقة في الأسلوب.
- عدد الخيارات = {n_choices}.
أعِد المخرجات بصيغة JSON فقط بدون أي شرح إضافي.
البنية المطلوبة:
{{
"mcqs": [
{{
"question": "النص",
"options": ["اختيار1","اختيار2","اختيار3","اختيار4"],
"answer_index": رقم (0 إلى {n_choices-1})
}}
]
}}
"""
try:
response = model.generate_content(prompt)
raw_text = response.text.strip()
cleaned = re.sub(r"```(json)?", "", raw_text).strip("` \n")
data = json.loads(cleaned)
mcqs = data.get("mcqs", [])
if not mcqs:
return " Could not parse MCQs.", ""
questions_text = ""
answers_text = ""
for i, q in enumerate(mcqs, 1):
questions_text += f"\nQ{i}: {q['question']}\n"
for j, opt in enumerate(q["options"]):
questions_text += f" {j}) {opt}\n"
correct_idx = q["answer_index"]
answers_text += f"Q{i}: {correct_idx} {q['options'][correct_idx]}\n"
return questions_text, answers_text
except Exception as e:
return f" Error while connecting to API: {e}", ""
with gr.Blocks() as demo:
gr.Markdown("## Arabic MCQ Generator (Difficulty = سهل)")
paragraph = gr.Textbox(
label="Paragraph (Input text)",
lines=8,
placeholder="Paste your paragraph here..."
)
n_questions = gr.Number(
label="Number of Questions",
value=5,
precision=0
)
output_questions = gr.Textbox(label="Generated MCQs (without answers)", lines=20)
output_answers = gr.Textbox(label="Answers with index", lines=10)
submit_btn = gr.Button("Submit")
submit_btn.click(
fn=generate_mcqs_gemini,
inputs=[paragraph, n_questions],
outputs=[output_questions, output_answers]
)
if __name__ == "__main__":
demo.launch(share=True, show_error=True)
|