import gradio as gr from fastapi import FastAPI, HTTPException from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse from fastapi.middleware.wsgi import WSGIMiddleware # FastAPI setup app = FastAPI() @app.exception_handler(RequestValidationError) async def validation_exception_handler(request, exc): return JSONResponse( status_code=400, content={"detail": "Invalid input. Please provide valid numbers."} ) @app.get("/") async def root(): return {"message": "Welcome to the Calculator API"} @app.get("/add/{a}/{b}") async def add(a: float, b: float): return {"result": a + b} @app.get("/subtract/{a}/{b}") async def subtract(a: float, b: float): return {"result": a - b} @app.get("/multiply/{a}/{b}") async def multiply(a: float, b: float): return {"result": a * b} @app.get("/divide/{a}/{b}") async def divide(a: float, b: float): if b == 0: raise HTTPException(status_code=400, detail="Cannot divide by zero") return {"result": a / b} # Gradio interface def calculate(operation, num1, num2): try: num1, num2 = float(num1), float(num2) if operation == "add": result = add(num1, num2) elif operation == "subtract": result = subtract(num1, num2) elif operation == "multiply": result = multiply(num1, num2) elif operation == "divide": result = divide(num1, num2) else: return "Invalid operation" return result["result"] except HTTPException as e: return f"Error: {e.detail}" except Exception as e: return f"Error: {str(e)}" iface = gr.Interface( fn=calculate, inputs=[ gr.Dropdown(["add", "subtract", "multiply", "divide"], label="Operation"), gr.Number(label="Number 1"), gr.Number(label="Number 2") ], outputs="text" ) # Mount Gradio app to FastAPI app = gr.mount_gradio_app(app, iface, path="/") # For running locally if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=7860)