import gradio as gr import os import tempfile from mylangv2 import DocumentProcessor, QuestionGenerator # Check for required environment variables at startup REQUIRED_ENV_VARS = [ "AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_EMBEDDING_DEPLOYMENT", "AZURE_OPENAI_CHAT_DEPLOYMENT", "AZURE_OPENAI_API_VERSION" ] missing_vars = [var for var in REQUIRED_ENV_VARS if not os.environ.get(var)] if missing_vars: raise EnvironmentError(f"Missing required environment variables: {', '.join(missing_vars)}") # Initialize core logic processor = DocumentProcessor() generator = QuestionGenerator() def generate_questions_from_pdf(pdf_file, subject, section, question_type, class_grade, difficulty, bloom_level, num_questions, additional_instructions): import shutil pdf_path = None vectorstore = None if pdf_file is not None: # Handle both file-like and NamedString cases with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp: if hasattr(pdf_file, 'read'): tmp.write(pdf_file.read()) elif hasattr(pdf_file, 'name'): with open(pdf_file.name, 'rb') as fsrc: shutil.copyfileobj(fsrc, tmp) else: return "Invalid file input. Please upload a valid PDF file." pdf_path = tmp.name try: vectorstore, _ = processor.process_uploaded_document(pdf_path) except Exception as e: return ("An error occurred while processing the PDF. " "Please check your file and try again. If the problem persists, contact support or check the logs for details.") try: topic_data = { "subjectName": subject, "sectionName": section, "questionType": question_type, "classGrade": class_grade, "difficulty": difficulty, "bloomLevel": bloom_level, "numQuestions": int(num_questions), "additionalInstructions": additional_instructions or "" } result = generator.generate_questions(topic_data, vectorstore) questions = result["questions"] # Format for display display = "" for i, q in enumerate(questions, 1): display += f"Question {i}: {q.get('question', '')}
" if 'options' in q: display += "Options:" display += f"Answer: {q.get('answer', q.get('correctAnswer', ''))}
" display += f"Explanation: {q.get('explanation', '')}

" return display except Exception as e: return ("An error occurred while generating questions. " "Please check your input and try again. If the problem persists, contact support or check the logs for details.") finally: if pdf_path is not None: os.remove(pdf_path) with gr.Blocks() as demo: gr.Markdown("# Question Generator from PDF (LangChain)") with gr.Row(): with gr.Column(): pdf_file = gr.File(label="Upload PDF", file_types=[".pdf"]) subject = gr.Textbox(label="Subject Name", placeholder="e.g. Biology") section = gr.Textbox(label="Topic/Section Name", placeholder="e.g. Life Process") question_type = gr.Dropdown(["MCQ", "Short Answer", "Long Answer"], label="Question Type", value="MCQ") class_grade = gr.Textbox(label="Class/Grade", placeholder="e.g. 10") difficulty = gr.Dropdown(["Easy", "Medium", "Hard"], label="Difficulty", value="Medium") bloom_level = gr.Textbox(label="Bloom's Level", placeholder="e.g. Understand") num_questions = gr.Number(label="Number of Questions", value=2, precision=0) additional_instructions = gr.Textbox(label="Additional Instructions", placeholder="Any extra instructions (optional)") btn = gr.Button("Generate Questions") with gr.Column(): output = gr.HTML(label="Generated Questions") btn.click( generate_questions_from_pdf, inputs=[pdf_file, subject, section, question_type, class_grade, difficulty, bloom_level, num_questions, additional_instructions], outputs=output ) if __name__ == "__main__": demo.launch()