import argparse import pathlib import uvicorn import gradio as gr from .reviewer import PDFReviewer from .api import app as fastapi_app def _cli_review(args): reviewer = PDFReviewer(debug=args.debug) result = reviewer.review_pdf(args.pdf) for key, value in result.items(): print(f"\n{key.upper()}:\n{value}\n") def _cli_demo(args): reviewer = PDFReviewer(debug=args.debug) def gradio_interface(file, progress=gr.Progress()): result = reviewer.review_pdf(file.name) return ( result["contributions"], result["strengths"], result["weaknesses"], result["requested_changes"], result["impact_concerns"], result["claims_and_evidence"], result["audience_interest"], ) iface = gr.Interface( fn=gradio_interface, inputs=gr.File(label="Upload PDF"), outputs=[ gr.Textbox(label="Contributions"), gr.Textbox(label="Strengths"), gr.Textbox(label="Weaknesses"), gr.Textbox(label="Requested Changes"), gr.Textbox(label="Impact Concerns"), gr.Textbox(label="Claims and Evidence"), gr.Textbox(label="Audience Interest"), ], title="PDF Review Parser", description="Upload a PDF to parse and review its content.", ) iface.launch(share=True) def _cli_api(args): uvicorn.run(fastapi_app, host=args.host, port=args.port, reload=args.reload) def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description="TMLR PDF Reviewer") subparsers = parser.add_subparsers(dest="command", required=True) # Review command p_review = subparsers.add_parser("review", help="Process a PDF and output to console") p_review.add_argument("pdf", type=pathlib.Path, help="Path to the PDF file") p_review.add_argument("--debug", action="store_true", help="Enable debug mode (uses gpt-4o and drops to pdb on errors)") p_review.set_defaults(func=_cli_review) # Demo command p_demo = subparsers.add_parser("demo", help="Launch Gradio demo") p_demo.add_argument("--debug", action="store_true", help="Enable debug mode (uses gpt-4o and drops to pdb on errors)") p_demo.set_defaults(func=_cli_demo) # API command p_api = subparsers.add_parser("api", help="Run FastAPI server") p_api.add_argument("--host", default="0.0.0.0") p_api.add_argument("--port", type=int, default=8000) p_api.add_argument("--reload", action="store_true") p_api.set_defaults(func=_cli_api) return parser def main(): parser = build_parser() args = parser.parse_args() args.func(args) if __name__ == "__main__": main()