Spaces:
Sleeping
Sleeping
import streamlit as st | |
import google.generativeai as genai | |
import PyPDF2 | |
import io | |
# Manually set your API key here | |
API_KEY = "AIzaSyBU_CBGCFbqdhOy5-xjPOQT-CUsLrclrtE" # Replace this with your actual API key | |
genai.configure(api_key=API_KEY) | |
# Initialize the Generative Model | |
model = genai.GenerativeModel('gemini-pro') | |
def extract_text_from_pdf(pdf_file): | |
"""Extract text from the given PDF file.""" | |
try: | |
text = "" | |
pdf_file.seek(0) | |
reader = PyPDF2.PdfReader(io.BytesIO(pdf_file.read())) | |
for page in reader.pages: | |
text += page.extract_text() | |
return text | |
except Exception as e: | |
return f"Error extracting text from PDF: {e}" | |
def generate_quiz(text, difficulty, num_questions): | |
"""Generate a quiz based on the provided text, difficulty, and number of questions.""" | |
try: | |
prompt = (f"Based on the following text, generate a quiz with a maximum of {num_questions} questions. " | |
"Include both questions and answers in the format of question and answer pairs. " | |
"Adjust the difficulty to {difficulty} level:\n\n" | |
f"{text}\n\n" | |
"Please provide the quiz in the format of:\n" | |
"Question1: Question 1?\n" | |
"Answer1: Answer to Question 1\n" | |
"Question2: Question 2?\n" | |
"Answer2: Answer to Question 2\n" | |
"... and so on. Limit the total number of questions to {num_questions}.") | |
response = model.generate_content(prompt) | |
# Limit the response to the number of questions requested | |
lines = response.text.split('\n') | |
limited_quiz = [] | |
question_count = 0 | |
for line in lines: | |
if line.startswith('Q') and question_count >= num_questions: | |
break | |
if line.startswith('Q'): | |
question_count += 1 | |
limited_quiz.append(line) | |
return '\n'.join(limited_quiz) | |
except Exception as e: | |
return f"Error generating quiz: {e}" | |
def answer_question_from_quiz(question): | |
"""Answer the user's question based on the generated quiz.""" | |
try: | |
prompt = (f"Based on the following quiz, answer the user's question. The quiz is formatted with " | |
"questions followed by answers:\n\n" | |
f"{st.session_state.generated_quiz}\n\n" | |
f"User's question: {question}\n\n" | |
"Please provide a detailed answer based on the quiz content.") | |
response = model.generate_content(prompt) | |
return response.text | |
except Exception as e: | |
return f"Error answering question: {e}" | |
def process_pdf(pdf_file, difficulty, num_questions): | |
"""Process the uploaded PDF to generate and explain quiz questions.""" | |
try: | |
# Extract text from the PDF | |
extracted_text = extract_text_from_pdf(pdf_file) | |
# Generate a new quiz based on the extracted text | |
st.session_state.generated_quiz = generate_quiz(extracted_text, difficulty, num_questions) | |
return st.session_state.generated_quiz | |
except Exception as e: | |
return f"Error processing PDF: {e}" | |
def main(): | |
st.title("Welcome to ExtraQ!") | |
st.write("Please upload an exam or quiz PDF to generate a new quiz with the same style, while having the freedom to change complexity. You can also ask questions based on the generated quiz. This is a student project, with no funds and professional team to follow it regularly, so apologies if any inconvenience happens, I will try my best to improve this project as the time passes by!") | |
if 'generated_quiz' not in st.session_state: | |
st.session_state.generated_quiz = "" | |
uploaded_file = st.file_uploader("Upload PDF", type=["pdf"]) | |
difficulty = st.selectbox("Difficulty Level", ['easy', 'medium', 'hard']) | |
num_questions = st.selectbox("Number of Questions", [2, 4, 6, 8, 10]) | |
if st.button("Generate Quiz"): | |
if uploaded_file is not None: | |
st.session_state.generated_quiz = process_pdf(uploaded_file, difficulty, num_questions) | |
st.subheader("Generated Quiz") | |
st.text(st.session_state.generated_quiz) | |
else: | |
st.error("Please upload a PDF file.") | |
if st.session_state.generated_quiz: | |
question = st.text_input("Ask a question about the quiz", "") | |
if st.button("Ask"): | |
if question: | |
answer = answer_question_from_quiz(question) | |
st.subheader("Answer") | |
st.text(answer) | |
else: | |
st.error("Please type a question to get an answer.") | |
# Add credits section | |
st.markdown("---") | |
st.markdown("*Developed for NU Students by Mohamed Hafez*") | |
if __name__ == "__main__": | |
main() | |