Spaces:
Sleeping
Sleeping
| 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() | |