SNS / app.py
codeboosterstech's picture
Update app.py
d5d3f1f verified
raw
history blame
3.17 kB
import os
import tempfile
from pathlib import Path
import gradio as gr
from pypdf import PdfReader
from agents import GroqClient, SerpClient
from multi_agent import MultiAgentOrchestrator
from docx_builder import (
build_question_paper_docx,
build_answers_docx,
build_obe_docx,
)
# ---------------------------
# Utility: Extract PDF text
# ---------------------------
def extract_text_from_pdf(file_obj) -> str:
try:
reader = PdfReader(file_obj.name)
pages = [p.extract_text() or "" for p in reader.pages]
return "\n".join(pages)
except:
return ""
# ---------------------------
# Initialize Clients
# ---------------------------
def init_clients():
groq_key = os.getenv("GROQ_API_KEY")
serp_key = os.getenv("SERPAPI_KEY")
groq = GroqClient(api_key=groq_key)
serp = SerpClient(api_key=serp_key)
return groq, serp
groq_client, serp_client = init_clients()
orchestrator = MultiAgentOrchestrator(groq_client, serp_client)
# ---------------------------
# Main Pipeline Trigger
# ---------------------------
def run_system(subject, stream, partA, partB, partC, syl_file, ref_file):
if syl_file is None:
return None, None, None, "Upload syllabus first."
syllabus_text = extract_text_from_pdf(syl_file)
ref_text = extract_text_from_pdf(ref_file) if ref_file else ""
output = orchestrator.run_pipeline(
subject=subject,
stream=stream,
partA=int(partA),
partB=int(partB),
partC=int(partC),
syllabus_text=syllabus_text,
ref_qp_text=ref_text,
)
final_json = output.get("final", {})
generator_raw = output.get("generator_raw", "")
tmpdir = Path(tempfile.mkdtemp())
qp_path = tmpdir / f"{subject}_QP.docx"
ans_path = tmpdir / f"{subject}_Answers.docx"
obe_path = tmpdir / f"{subject}_OBE.docx"
build_question_paper_docx(qp_path, final_json, generator_raw, subject)
build_answers_docx(ans_path, final_json, subject)
build_obe_docx(obe_path, final_json, subject)
return qp_path, ans_path, obe_path, "Done!"
# ---------------------------
# Gradio UI
# ---------------------------
with gr.Blocks() as app:
gr.Markdown("# Multi-Agent Question Paper Generator (Groq + SerpAPI)")
with gr.Row():
subject = gr.Textbox(label="Subject Name")
stream = gr.Dropdown(["CSE", "Non-CSE"], value="CSE", label="Stream")
with gr.Row():
partA = gr.Number(value=10, precision=0, label="Part A Count")
partB = gr.Number(value=5, precision=0, label="Part B Count")
partC = gr.Number(value=1, precision=0, label="Part C Count")
syllabus = gr.File(label="Upload Syllabus PDF")
ref_qp = gr.File(label="Upload Reference QP (Optional)")
btn = gr.Button("Generate Question Paper")
qp_file = gr.File(label="Question Paper")
ans_file = gr.File(label="Answer Key")
obe_file = gr.File(label="OBE Summary")
status = gr.Markdown("Status: Idle")
btn.click(
run_system,
inputs=[subject, stream, partA, partB, partC, syllabus, ref_qp],
outputs=[qp_file, ans_file, obe_file, status]
)
app.launch()