File size: 2,686 Bytes
ff6ae63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2b57106
ff6ae63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import uvicorn
from fastapi import Body, FastAPI, UploadFile, File, Response 
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
import traceback
import numpy as np 
import json 

from detect import DengueDetector
from predict import DenguePredictor  

def default_json_serializer(obj):
    if isinstance(obj, np.integer):
        return int(obj)
    elif isinstance(obj, np.floating):
        return float(obj)
    elif isinstance(obj, np.ndarray):
        return obj.tolist()
    raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")

detector: DengueDetector = None
predictor: DenguePredictor = None

app = FastAPI()

# --- evento de startup para carregar os modelos ---
@app.on_event("startup")
async def startup_event():
    global detector, predictor
    print("Executando evento de startup: Carregando os m贸dulos de IA...")
    detector = DengueDetector()
    predictor = DenguePredictor()
    print("M贸dulos de IA carregados com sucesso. API pronta.")

# --- CORS ---
origins = ["https://previdengue.vercel.app", "http://localhost:3000", "*"]
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"]
)

# --- Rotas ---
@app.get("/")
def health_check():
    return {"status": "ok", "message": "API de Dengue rodando!"}

@app.post("/detect/")
async def detect(file: UploadFile = File(...)):
    if detector is None:
        return JSONResponse(status_code=503, content={"error": "Detector ainda n茫o foi inicializado."})
    try:
        content = await file.read()
        result = detector.detect_image(content)  
        return JSONResponse(content=result)
    except Exception as e:
        return JSONResponse(status_code=500, content={"error": str(e)})


@app.post("/predict/")
async def predict_dengue_route(payload: dict = Body(...)):
    if predictor is None:
        return JSONResponse(status_code=503, content={"error": "Preditor ainda n茫o foi inicializado."})
    try:
        ibge_code_str = payload.get("ibge_code")
        if ibge_code_str is None:
            raise ValueError("O campo 'ibge_code' 茅 obrigat贸rio.")
        
        ibge_code = int(ibge_code_str)
        result = predictor.predict(ibge_code)
        
        json_content = json.dumps(result, default=default_json_serializer)
        
        return Response(content=json_content, media_type="application/json")

    except Exception as e:
        tb_str = traceback.format_exc()
        print(tb_str) 
        return JSONResponse(status_code=500, content={
            "error": str(e),
            "traceback": tb_str 
        })