File size: 2,717 Bytes
951c6d3
6f446f3
 
 
 
 
8d34c11
6f446f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
facb1f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f446f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8d34c11
951c6d3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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)