File size: 3,119 Bytes
b0fef3b
80b5330
62c229f
1419e3f
 
 
d5a7e20
95ba2d8
 
7dd6d90
2de832b
1419e3f
 
 
62c229f
 
 
 
 
 
 
 
 
 
 
 
 
80b5330
 
c05625d
1419e3f
 
0c38509
80b5330
7dd6d90
bd47a3e
f8d8c35
80b5330
 
2de832b
f8d8c35
 
4a3aa7c
80b5330
 
2de832b
f31996c
2de832b
f31996c
 
2de832b
f31996c
 
 
 
9e114e3
f31996c
 
 
 
 
 
 
 
1419e3f
80b5330
 
2de832b
1419e3f
2de832b
1419e3f
 
2de832b
1419e3f
2de832b
8c70a56
2de832b
1419e3f
2de832b
1419e3f
2de832b
1419e3f
d5a7e20
 
 
 
0c17fb7
2de832b
d09c063
2de832b
1419e3f
2de832b
1419e3f
 
d5a7e20
2de832b
1419e3f
2de832b
d5a7e20
1419e3f
 
 
 
 
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
import app.bootstrap 
from fastapi import FastAPI, UploadFile, File, Form, Request
from fastapi.middleware.cors import CORSMiddleware
import shutil
import os
import json
from app.config import LLM_MODE, VIDEO_TEMP_PATH, LOG_FILE
from app.pipeline import run_pipeline
from app.decision import classify
from app.llm import ensure_deepface_model, ensure_model_ollama, generate_alert
from app.logger import get_logger, log

app = FastAPI()

# LIBERAR CORS (para testes)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # ou depois restringe
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

#allow_origins=[
#    "https://seu-space.hf.space"
#]

def get_logger_from_request(request: Request):
    return request.app.state.logger

@app.on_event("startup")
def startup_event():
    app.state.logger = get_logger("API")
    app.state.logger.info("Aplicação iniciada.")
    ensure_deepface_model(app.state.logger)
    
@app.get("/")
def health(request: Request):
    logger = get_logger_from_request(request)
    log("Iniciando health check.", logger=logger)
    return {"status": "ok"}

@app.get("/logs")
def read_logs(request: Request):
    logger = get_logger_from_request(request)
    log("Lendo logs.", logger=logger)
    try:
        if not os.path.exists(LOG_FILE):
            return {"status": "error", "message": "Arquivo de log não encontrado"}

        with open(LOG_FILE, "r") as f:
            content = f.read()

        return {
            "status": "success",
            "log": content.splitlines()
        }

    except Exception as e:
        return {
            "status": "error",
            "message": str(e)
        }

@app.post("/analyze")
async def analyze(request: Request, video: UploadFile = File(...), medical_text: str = Form(None)):
    logger = get_logger_from_request(request)
    log("Iniciando análise.", logger=logger)

    log("Salvando vídeo.", logger=logger)
    with open(VIDEO_TEMP_PATH, "wb") as buffer:
        shutil.copyfileobj(video.file, buffer)
    log("Vídeo salvo com sucesso!", logger=logger)

    log("Iniciando Pipeline", logger=logger)
    data = run_pipeline(VIDEO_TEMP_PATH, logger)
    log("Pipeline concluído.", logger=logger)

    log("Iniciando classificação", logger=logger)
    estado = classify(data)
    log("Classificação concluída com sucesso!", logger=logger)

    if LLM_MODE == "ollama":
        log("Iniciando LLM.", logger=logger)
        ensure_model_ollama(logger=logger)
        log("LLM iniciada com sucesso!", logger=logger)

    log("Iniciando geração de alertas.", logger=logger)
    alerta = generate_alert(data, medical_text, logger=logger)
    log("Geração de alertas concluída com sucesso!", logger=logger)

    log(f"Excluindo arquivo de video: {VIDEO_TEMP_PATH}")
    if os.path.exists(VIDEO_TEMP_PATH):
        os.remove(VIDEO_TEMP_PATH)
    
    log(f"Arquivo de video '{VIDEO_TEMP_PATH}' excluído com sucesso!", logger=logger)

    log("retornando resultados...", logger=logger)

    return {
        "estado": estado,
        "alerta": alerta,
        "data": data
    }