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)