YashJD's picture
Upload app.py
4368778 verified
raw
history blame contribute delete
4.66 kB
import streamlit as st
import google.generativeai as genai
import random
import re
# Configure the Gemini API with your API key
genai.configure(api_key='AIzaSyAjDT14MAn93D1xJMsBtHeaNThaFIYeLbs')
# Initialize the generative model
model = genai.GenerativeModel('gemini-pro')
def generate_mcqs(context):
prompt = f"""
Based on the following context, generate 10 multiple-choice questions (MCQs).
You can use data without the context too if needed, but all the topics within the context should be included.
Generate valid MCQs too.
Each MCQ should have 4 options with only one correct answer.
Format each question exactly as follows:
**Question X:** [Question text]
A) [Option A]
B) [Option B]
C) [Option C]
D) [Option D]
Correct Answer: [A/B/C/D]
Context:
{context}
"""
try:
response = model.generate_content(prompt)
raw_text = response.text
# Debug: Print raw response
# st.text("Raw API Response:")
# st.text(raw_text)
# Parse the raw text into a structured format
questions = re.split(r'\*\*Question \d+:\*\*', raw_text)[1:] # Split by question number
mcqs = []
for q in questions:
try:
# Extract question text
question_text = q.split('A)')[0].strip()
# Extract options
options = re.findall(r'([A-D]\).*?)(?=[A-D]\)|Correct Answer:)', q, re.DOTALL)
options = [opt.strip() for opt in options]
# Extract correct answer
correct_answer = re.search(r'Correct Answer:\s*([A-D])', q).group(1)
if len(options) == 4 and correct_answer in ['A', 'B', 'C', 'D']:
mcqs.append({
"question": question_text,
"options": options,
"correct_answer": correct_answer
})
else:
st.warning(f"Skipped question due to incorrect format: {q}")
except Exception as e:
st.warning(f"Skipped a malformed question: {str(e)}\nQuestion: {q}")
if not mcqs:
raise ValueError("No valid MCQs were generated")
return mcqs
except Exception as e:
st.error(f"An error occurred while generating MCQs: {str(e)}")
return None
def main():
st.title("MCQ Generator and Exam")
# Input section
st.header("Generate MCQs")
context = st.text_area("Enter the context or data for generating MCQs:")
if st.button("Generate MCQs"):
if context:
with st.spinner("Generating MCQs..."):
mcqs = generate_mcqs(context)
if mcqs:
st.session_state.mcqs = mcqs
st.success(f"Generated {len(mcqs)} MCQs successfully!")
else:
st.error("Failed to generate valid MCQs. Please try again with a different or more detailed context.")
else:
st.warning("Please enter some context to generate MCQs.")
# Exam section
st.header("Take Exam")
if 'mcqs' in st.session_state and st.session_state.mcqs:
user_answers = []
for i, question in enumerate(st.session_state.mcqs):
st.subheader(f"Question {i + 1}")
st.write(question['question'])
user_answer = st.radio("Select your answer:", question['options'], key=f"q{i}")
user_answers.append(user_answer)
if st.button("Submit Exam"):
score = sum(1 for q, a in zip(st.session_state.mcqs, user_answers)
if a == q['options'][ord(q['correct_answer']) - ord('A')])
st.subheader("Exam Completed!")
st.write(f"Your score: {score}/{len(st.session_state.mcqs)}")
# Display correct answers
st.subheader("Correct Answers:")
for i, (question, user_answer) in enumerate(zip(st.session_state.mcqs, user_answers)):
st.write(f"Q{i+1}: {question['question']}")
st.write(f"Your answer: {user_answer}")
correct_answer = question['options'][ord(question['correct_answer']) - ord('A')]
st.write(f"Correct answer: {correct_answer}")
st.write("---")
else:
st.info("Generate MCQs first to take the exam.")
if __name__ == "__main__":
main()