from contextlib import asynccontextmanager import mlflow from fastapi import FastAPI from fastapi.responses import RedirectResponse from src.config import ( MLFLOW_TRACKING_URI, MODEL_SOURCE, FINAL_MODEL_PATH, HF_MODEL_REPO, HF_TOKEN, ) from src.recommendations.loader import load_model from src.api.monitoring.metadata import load_crops_by_area_from_db from src.api.routes.prediction import router as prediction_router from src.api.routes.recommendation import router as recommendation_router from src.api.routes.metadata import router as metadata_router from src.api.monitoring.routes import router as monitoring_router @asynccontextmanager async def lifespan(app: FastAPI): mlflow.set_tracking_uri(MLFLOW_TRACKING_URI) mlflow.set_registry_uri(MLFLOW_TRACKING_URI) app.state.model = load_model( model_source=MODEL_SOURCE, local_path=FINAL_MODEL_PATH, hf_repo=HF_MODEL_REPO, hf_token=HF_TOKEN, ) app.state.crops_by_area = load_crops_by_area_from_db() yield app = FastAPI( title="API de Prédiction de Rendement et Recommandation de Cultures", lifespan=lifespan, ) @app.get("/") def root(): return RedirectResponse(url="/docs") @app.get("/health", tags=["Health"]) def health(): return {"status": "ok"} app.include_router(prediction_router) app.include_router(recommendation_router) app.include_router(metadata_router) app.include_router(monitoring_router)