calsu / app.py
d3dname's picture
Update app.py
8196fba verified
import gradio as gr
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
return "Error: Division by zero"
return a / b
def calculator(input_text):
try:
# Remove all spaces and then add spaces around operators
input_text = input_text.replace(" ", "")
for op in ['+', '-', '*', '/']:
input_text = input_text.replace(op, f" {op} ")
parts = input_text.split()
if len(parts) != 3:
return "Error: Invalid input"
a = float(parts[0])
op = parts[1]
b = float(parts[2])
if op == '+':
return str(add(a, b))
elif op == '-':
return str(subtract(a, b))
elif op == '*':
return str(multiply(a, b))
elif op == '/':
return str(divide(a, b))
else:
return "Error: Invalid operator"
except ValueError:
return "Error: Invalid number"
except Exception as e:
return f"Error: {str(e)}"
def append_to_input(current, value):
if current is None:
current = ""
current = str(current) # Ensure current is a string
value = str(value) # Ensure value is a string
if value in ['+', '-', '*', '/']:
return f"{current} {value} "
return current + value
def clear_input():
return ""
def backspace(current):
if current is None or current == "":
return ""
return current[:-1]
class CalculationInput(BaseModel):
a: float
b: float
@app.post("/add")
async def api_add(input: CalculationInput):
return {"result": add(input.a, input.b)}
@app.post("/subtract")
async def api_subtract(input: CalculationInput):
return {"result": subtract(input.a, input.b)}
@app.post("/multiply")
async def api_multiply(input: CalculationInput):
return {"result": multiply(input.a, input.b)}
@app.post("/divide")
async def api_divide(input: CalculationInput):
if input.b == 0:
raise HTTPException(status_code=400, detail="Division by zero")
return {"result": divide(input.a, input.b)}
@app.post("/calculate")
async def api_calculate(input: CalculationInput, operation: str):
if operation == "+":
return {"result": add(input.a, input.b)}
elif operation == "-":
return {"result": subtract(input.a, input.b)}
elif operation == "*":
return {"result": multiply(input.a, input.b)}
elif operation == "/":
if input.b == 0:
raise HTTPException(status_code=400, detail="Division by zero")
return {"result": divide(input.a, input.b)}
else:
raise HTTPException(status_code=400, detail="Invalid operation")
@app.get("/test")
async def test_route():
return {"message": "FastAPI is working!"}
with gr.Blocks() as demo:
input_text = gr.Textbox(label="Input", value="")
output = gr.Textbox(label="Result")
buttons = [
["7", "8", "9", "/"],
["4", "5", "6", "*"],
["1", "2", "3", "-"],
["0", ".", "=", "+"]
]
for row in buttons:
with gr.Row():
for button in row:
if button == "=":
gr.Button(button).click(calculator, inputs=input_text, outputs=output)
else:
gr.Button(button).click(
lambda x, btn=button: append_to_input(x, btn),
inputs=[input_text],
outputs=input_text
)
with gr.Row():
clear_btn = gr.Button("Clear")
backspace_btn = gr.Button("⌫")
clear_btn.click(clear_input, inputs=[], outputs=input_text)
backspace_btn.click(backspace, inputs=[input_text], outputs=input_text)
app = gr.mount_gradio_app(app, demo, path="/")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860)