|
|
|
|
|
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) |
|
|
|