File size: 4,447 Bytes
a09c5e4
c98da6a
 
 
a09c5e4
c98da6a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cdd26db
 
 
a09c5e4
 
cdd26db
 
 
a09c5e4
cdd26db
 
8f7ab76
 
 
 
a09c5e4
cdd26db
 
8ade526
 
8f7ab76
cdd26db
 
8f7ab76
 
a09c5e4
e540e5d
 
 
 
a09c5e4
e540e5d
 
 
 
 
 
 
 
cdd26db
 
 
 
 
a09c5e4
e540e5d
 
 
 
 
 
 
 
 
 
 
 
 
 
a09c5e4
 
e540e5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a09c5e4
 
 
 
 
 
e540e5d
 
afb4dff
e540e5d
c98da6a
 
 
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import gradio as gr
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

# --- Backend FastAPI ---
app = FastAPI()

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float

@app.get("/")
def read_root():
    return {"message": "Olá do Backend FastAPI!"}

@app.get("/hello/{name}")
def read_hello(name: str):
    return {"message": f"Olá, {name}! Bem-vindo(a)!"}

@app.post("/items/")
def create_api_item(item: Item):
    return item

# --- Funções de Lógica (agora chamadas diretamente) ---
def get_hello_message(name: str):
    """Chama a lógica do backend diretamente."""
    if not name:
        return "Por favor, insira um nome."
    # Chamada direta à função do backend
    response = read_hello(name)
    return response.get("message", "Resposta inesperada.")

def create_item(name: str, description: str, price: float):
    """Chama a lógica do backend diretamente."""
    # Validação explícita para evitar problemas com valores 'falsy' como 0.0
    if not name or price is None: 
        # Retorna um JSON vazio ou uma mensagem de erro, mantendo o tipo de saída consistente.
        return gr.JSON(value={"error": "Nome e Preço são campos obrigatórios."})
    
    # Cria uma instância do modelo Pydantic, como o backend espera
    item_model = Item(
        name=name,
        description=description,
        price=float(price) # Garante que o tipo é float
    )
    # Chamada direta à função do backend
    # O Gradio espera um dicionário para o componente gr.JSON, então convertemos o modelo.
    return create_api_item(item_model).model_dump()

# --- Interface Gradio ---
with gr.Blocks(title="FastAPI + Gradio Integrado") as demo:    
    gr.Markdown("# 🚀 FastAPI + Gradio Integrado")
    gr.Markdown("**Backend e Frontend em um único app!**")

    with gr.Tab("🏠 Saudação Raiz"):
        gr.Markdown("### Endpoint: GET /")
        btn_root = gr.Button("Chamar API Raiz", variant="primary")
        output_root = gr.Textbox(
            label="Resposta da API",
            placeholder="Clique no botão para ver a mensagem...",
            lines=3
        )
        # Para a rota raiz, podemos simplesmente chamar a função do backend diretamente no click
        btn_root.click(
            fn=lambda: read_root().get("message", "Resposta inesperada."), 
            inputs=None, 
            outputs=output_root)

    with gr.Tab("👋 Saudação com Nome"):
        gr.Markdown("### Endpoint: GET /hello/{name}")
        with gr.Row():
            with gr.Column():
                input_name = gr.Textbox(
                    label="Digite seu nome",
                    placeholder="Seu nome aqui..."
                )
                btn_hello = gr.Button("Enviar Saudação", variant="primary")
            with gr.Column():
                output_hello = gr.Textbox(
                    label="Resposta da API",
                    lines=3
                )
        btn_hello.click(fn=get_hello_message, inputs=input_name, outputs=output_hello)

    with gr.Tab("📦 Criar Item"):
        gr.Markdown("### Endpoint: POST /items/")
        with gr.Row():
            with gr.Column():
                input_item_name = gr.Textbox(
                    label="Nome do Item*",
                    placeholder="Nome do item..."
                )
                input_item_desc = gr.Textbox(
                    label="Descrição do Item (Opcional)",
                    placeholder="Descrição do item...",
                    lines=2
                )
                input_item_price = gr.Number(
                    label="Preço do Item*",
                    value=0.0
                )
                btn_create = gr.Button("Criar Item", variant="primary")
            with gr.Column():
                output_item = gr.JSON(
                    label="Item Criado (Resposta da API)"
                )
        
        btn_create.click(
            fn=create_item, 
            inputs=[input_item_name, input_item_desc, input_item_price], 
            outputs=output_item
        )

    # Rodapé
    gr.Markdown("---")
    gr.Markdown("### 🔧 Desenvolvido com Gradio (Frontend) + FastAPI (Backend)")

# Monta a interface Gradio na aplicação FastAPI.
# A plataforma do Hugging Face Spaces detectará o objeto 'app' e o executará com um servidor ASGI (Uvicorn).
app = gr.mount_gradio_app(app, demo, path="/")