CoolFace
Apppublic

Poojashetty357/Python_Tutorbot_Additionalfeatures

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
app.py113 linesDownload Raw Back to root
1 2import os3import gradio as gr4from openai import OpenAI5from dotenv import load_dotenv6import re7 8# ๐Ÿ“Œ Load API key9load_dotenv()10api_key = os.getenv("OPENAI_API_KEY")11client = OpenAI(api_key=api_key)12 13# โœจ Global variable to store last topic and correct answer14last_user_question = ""15last_correct_answer = ""16quiz_question_text = ""17quiz_options = []18 19# ๐Ÿ Python Tutor Function20def python_tutor(user_input):21    global last_user_question22    last_user_question = user_input  # store latest question for quiz23    response = client.chat.completions.create(24        model="gpt-4.1-mini",25        messages=[26            {27                "role": "system",28                "content": """You are a Python tutor. Help users understand Python with short examples. Be kind, clear, and only answer Python-related questions."""29            },30            {"role": "user", "content": user_input}31        ],32        temperature=0.1,33        max_tokens=50034    )35    return response.choices[0].message.content36 37# ๐Ÿ“š Dynamic Quiz Generator Based on User Topic38def generate_quiz():39    global last_user_question, last_correct_answer, quiz_question_text, quiz_options40 41    if not last_user_question:42        return "Please ask a Python question first in the tutor tab.", gr.update(choices=[])43 44    quiz_prompt = f"""Generate one simple multiple-choice quiz question based on this Python topic/question: "{last_user_question}". 45Format: 46Question: ...47Options:48A. ...49B. ...50C. ...51D. ...52Answer: ..."""53 54    response = client.chat.completions.create(55        model="gpt-4.1-mini",56        messages=[57            {"role": "system", "content": "You are a quiz generator for Python topics."},58            {"role": "user", "content": quiz_prompt}59        ],60        temperature=0.3,61        max_tokens=30062    )63 64    content = response.choices[0].message.content.strip()65 66    # Parse question, options, answer67    question_match = re.search(r"Question:\s*(.*)", content)68    options_match = re.findall(r"[A-D]\.\s*(.*)", content)69    answer_match = re.search(r"Answer:\s*([A-D])", content)70 71    if not (question_match and options_match and answer_match):72        return "โŒ Error parsing quiz content.", gr.update(choices=[])73 74    quiz_question_text = question_match.group(1)75    quiz_options = options_match76    last_correct_answer = answer_match.group(1).strip().upper()77 78    return quiz_question_text, gr.update(choices=quiz_options, value=None)79 80# โœ… Evaluate Answer81def evaluate_user_answer(user_choice):82    if not user_choice:83        return "Please select an answer."84 85    correct_index = ord(last_correct_answer) - ord("A")86    correct_option = quiz_options[correct_index]87 88    if user_choice.strip() == correct_option.strip():89        return "โœ… Correct! Well done!"90    else:91        return f"โŒ Incorrect. The correct answer is: {last_correct_answer}. {correct_option}"92 93# ๐ŸŽจ Gradio UI with Two Pages94with gr.Blocks() as app:95    with gr.Tab("๐Ÿ Python Tutor"):96        gr.Markdown("### Ask your Python question:")97        question_input = gr.Textbox(lines=2, label="Your Question")98        answer_output = gr.Textbox(label="Tutor's Answer")99        gr.Button("Ask").click(python_tutor, inputs=question_input, outputs=answer_output)100 101    with gr.Tab("๐Ÿงช Mini Quiz"):102        gr.Markdown("### Quiz Based on Your Tutor Question")103        quiz_question = gr.Textbox(label="Generated Quiz Question", interactive=False)104        options_dropdown = gr.Dropdown(label="Choose Your Answer", choices=[])105        result_output = gr.Textbox(label="Result")106        generate_btn = gr.Button("๐Ÿ”„ Generate Quiz")107        submit_btn = gr.Button("โœ… Submit Answer")108 109        generate_btn.click(fn=generate_quiz, outputs=[quiz_question, options_dropdown])110        submit_btn.click(fn=evaluate_user_answer, inputs=options_dropdown, outputs=result_output)111 112app.launch()113