Prashnotri / gradio_app.py
bibeksah's picture
lets see
93ae679
raw
history blame
4.53 kB
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 "<span style='color:red'>Invalid file input. Please upload a valid PDF file.</span>"
pdf_path = tmp.name
try:
vectorstore, _ = processor.process_uploaded_document(pdf_path)
except Exception as e:
return ("<span style='color:red'>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.</span>")
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"<b>Question {i}:</b> {q.get('question', '')}<br>"
if 'options' in q:
display += "Options:<ul>"
for opt in q['options']:
display += f"<li>{opt}</li>"
display += "</ul>"
display += f"<b>Answer:</b> {q.get('answer', q.get('correctAnswer', ''))}<br>"
display += f"<b>Explanation:</b> {q.get('explanation', '')}<br><hr>"
return display
except Exception as e:
return ("<span style='color:red'>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.</span>")
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()