MCQ / app.py
mimoha's picture
Update app.py
19ab709 verified
# 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)