Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import random | |
| import time | |
| from transformers import pipeline | |
| # Load question generation pipeline | |
| qg_pipeline = pipeline("text2text-generation", model="iarfmoose/t5-base-question-generator") | |
| st.set_page_config(page_title="AI MCQ Quiz", layout="centered") | |
| st.title("π§ Auto-Generated AI Quiz") | |
| # Step 1: User input | |
| input_text = st.text_area("Enter a topic or paragraph:") | |
| if st.button("Generate Quiz"): | |
| if not input_text.strip(): | |
| st.warning("Please enter some text first.") | |
| else: | |
| with st.spinner("Generating quiz questions..."): | |
| result = qg_pipeline(f"generate questions: {input_text}", max_length=512, do_sample=True) | |
| raw_questions = result[0]['generated_text'].split("\n") | |
| quiz_data = [] | |
| for q in raw_questions: | |
| if q.strip() and "?" in q: | |
| question = q.strip() | |
| correct = "Not provided" # Placeholder (you can use a separate model for answer extraction) | |
| options = [correct] | |
| # Generate 3 fake options (distractors) | |
| fake_answers = [ | |
| "Option A", "Option B", "Option C", "Option D", "None of these", | |
| "Random guess", "All of the above", "Incorrect answer" | |
| ] | |
| while len(options) < 4: | |
| option = random.choice(fake_answers) | |
| if option not in options: | |
| options.append(option) | |
| random.shuffle(options) | |
| quiz_data.append({ | |
| "question": question, | |
| "options": options, | |
| "answer": correct # For now this is unknown | |
| }) | |
| if quiz_data: | |
| st.session_state.quiz = quiz_data | |
| st.session_state.current_q = 0 | |
| st.session_state.score = 0 | |
| st.session_state.start_time = time.time() | |
| st.experimental_rerun() | |
| # Proceed to quiz if it's generated | |
| if "quiz" in st.session_state and st.session_state.current_q < len(st.session_state.quiz): | |
| quiz = st.session_state.quiz | |
| q_index = st.session_state.current_q | |
| q_data = quiz[q_index] | |
| st.markdown(f"### β Question {q_index + 1}:") | |
| st.markdown(f"**{q_data['question']}**") | |
| time_left = max(0, 15 - int(time.time() - st.session_state.start_time)) | |
| st.info(f"β±οΈ Time left: {time_left} seconds") | |
| if time_left == 0: | |
| st.warning("β° Time's up! Moving to next question...") | |
| st.session_state.current_q += 1 | |
| st.session_state.start_time = time.time() | |
| st.experimental_rerun() | |
| selected = st.radio("Your Answer:", q_data["options"], index=None, key=q_index) | |
| if st.button("Submit Answer"): | |
| if selected: | |
| if selected == q_data["answer"]: | |
| st.success("β Correct!") | |
| st.session_state.score += 1 | |
| else: | |
| st.error(f"β Incorrect! Correct: {q_data['answer']}") | |
| time.sleep(1.5) | |
| st.session_state.current_q += 1 | |
| st.session_state.start_time = time.time() | |
| st.experimental_rerun() | |
| else: | |
| st.warning("Please choose an option.") | |
| elif "quiz" in st.session_state and st.session_state.current_q >= len(st.session_state.quiz): | |
| st.success(f"π Quiz completed! Score: {st.session_state.score}/{len(st.session_state.quiz)}") | |
| if st.button("Restart"): | |
| for key in ["quiz", "current_q", "score", "start_time"]: | |
| st.session_state.pop(key, None) | |
| st.experimental_rerun() | |