calculator-app / app.py
NikhilSetiya
Simplify calculator by removing HTTP requests
facb1f4
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)