| 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() |
|
|
| |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=["*"], |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
|
|
| |
| |
| |
|
|
| 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 |
| } |