|
|
|
|
|
import logging |
|
|
from fastapi import FastAPI, Request |
|
|
from fastapi.responses import JSONResponse |
|
|
from fastapi.middleware.cors import CORSMiddleware |
|
|
import uvicorn |
|
|
import os |
|
|
from dotenv import load_dotenv |
|
|
|
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
|
|
|
from ylff.routers import ( |
|
|
training, |
|
|
validation, |
|
|
inference, |
|
|
profiling, |
|
|
jobs, |
|
|
models, |
|
|
ingest, |
|
|
) |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
def create_app() -> FastAPI: |
|
|
"""Create and configure the YLFF API application.""" |
|
|
app = FastAPI( |
|
|
title="YLFF API", |
|
|
description="API for You Learn From Failure training pipeline", |
|
|
version="0.1.0", |
|
|
) |
|
|
|
|
|
|
|
|
app.add_middleware( |
|
|
CORSMiddleware, |
|
|
allow_origins=["*"], |
|
|
allow_credentials=True, |
|
|
allow_methods=["*"], |
|
|
allow_headers=["*"], |
|
|
) |
|
|
|
|
|
|
|
|
app.include_router(training.router, prefix="/api/v1") |
|
|
app.include_router(jobs.router, prefix="/api/v1") |
|
|
app.include_router(models.router, prefix="/api/v1") |
|
|
app.include_router(ingest.router, prefix="/api/v1") |
|
|
|
|
|
|
|
|
try: |
|
|
app.include_router(validation.router, prefix="/api/v1") |
|
|
except AttributeError: |
|
|
logger.warning("Could not include validation router") |
|
|
|
|
|
try: |
|
|
app.include_router(inference.router, prefix="/api/v1/inference") |
|
|
except AttributeError: |
|
|
pass |
|
|
|
|
|
try: |
|
|
app.include_router(profiling.router, prefix="/api/v1/profiling") |
|
|
except AttributeError: |
|
|
pass |
|
|
|
|
|
@app.get("/health") |
|
|
async def health_check(): |
|
|
return {"status": "ok", "service": "ylff"} |
|
|
|
|
|
from fastapi.responses import JSONResponse |
|
|
@app.exception_handler(Exception) |
|
|
async def global_exception_handler(request: Request, exc: Exception): |
|
|
import traceback |
|
|
logger.error(f"Global Error: {str(exc)}\n{traceback.format_exc()}") |
|
|
return JSONResponse( |
|
|
status_code=500, |
|
|
content={"detail": f"Internal Server Error: {str(exc)}"}, |
|
|
) |
|
|
|
|
|
return app |
|
|
|
|
|
app = create_app() |
|
|
|
|
|
def start_server(host: str = "0.0.0.0", port: int = 8000): |
|
|
"""Run the API server.""" |
|
|
logging.basicConfig( |
|
|
level=logging.INFO, |
|
|
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" |
|
|
) |
|
|
logger.info(f"Starting YLFF API server at http://{host}:{port}") |
|
|
uvicorn.run(app, host=host, port=port, log_level="info", access_log=True) |
|
|
|