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
} |