import gradio as gr import requests import os from fastapi import FastAPI from pydantic import BaseModel from fastapi.middleware.cors import CORSMiddleware # Create FastAPI app app = FastAPI() # Add CORS middleware app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) class CalculatorInput(BaseModel): num1: float num2: float operation: str class CalculatorResponse(BaseModel): result: float operation: str @app.post("/calculate", response_model=CalculatorResponse) async def calculate(input_data: CalculatorInput): result = 0.0 if input_data.operation == "add": result = input_data.num1 + input_data.num2 elif input_data.operation == "subtract": result = input_data.num1 - input_data.num2 elif input_data.operation == "multiply": result = input_data.num1 * input_data.num2 elif input_data.operation == "divide": if input_data.num2 == 0: raise ValueError("Cannot divide by zero") result = input_data.num1 / input_data.num2 else: raise ValueError("Invalid operation") return CalculatorResponse(result=result, operation=input_data.operation) # Create Gradio interface def calculate_interface(num1: float, num2: float, operation: str) -> str: try: # Calculate directly without making an HTTP request result = 0.0 if operation == "add": result = num1 + num2 elif operation == "subtract": result = num1 - num2 elif operation == "multiply": result = num1 * num2 elif operation == "divide": if num2 == 0: return "Error: Cannot divide by zero" result = num1 / num2 else: return "Error: Invalid operation" return f"Result: {result}" except Exception as e: return f"Error: {str(e)}" # Create the Gradio interface with gr.Blocks(title="Calculator") as demo: gr.Markdown("# Calculator") with gr.Row(): num1 = gr.Number(label="First Number") num2 = gr.Number(label="Second Number") with gr.Row(): operation = gr.Radio( choices=["add", "subtract", "multiply", "divide"], label="Operation", value="add" ) with gr.Row(): calculate_btn = gr.Button("Calculate") result = gr.Textbox(label="Result") calculate_btn.click( fn=calculate_interface, inputs=[num1, num2, operation], outputs=result ) # Launch the app if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)