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