from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Optional, Union import gradio as gr app = FastAPI() class OperationInput(BaseModel): num1: Union[int, float] num2: Union[int, float] operation: str @app.post("/calculate") def calculate(input_data: OperationInput): try: num1 = input_data.num1 num2 = input_data.num2 operation = input_data.operation.lower() if operation == "addition": result = num1 + num2 elif operation == "subtraction": result = num1 - num2 elif operation == "multiplication": result = num1 * num2 elif operation == "division": if num2 == 0: raise HTTPException(status_code=400, detail="Division by zero is not allowed.") result = num1 / num2 else: raise HTTPException(status_code=400, detail="Invalid operation.") return {"result": result} except ValueError: raise HTTPException(status_code=400, detail="Invalid input types.") def calculator(num1, num2, operation): response = calculate(OperationInput(num1=num1, num2=num2, operation=operation)) return response['result'] iface = gr.Interface( fn=calculator, inputs=[ gr.Number(label="Number 1"), gr.Number(label="Number 2"), gr.Dropdown( choices=["Addition", "Subtraction", "Multiplication", "Division"], label="Operation" ) ], outputs="text", title="Basic Arithmetic Operations", description="Perform basic arithmetic operations: addition, subtraction, multiplication, and division.", ) gr.mount_gradio_app(app, iface, path="/") if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=7860)