|
|
"""Main FastAPI application entry point""" |
|
|
|
|
|
from contextlib import asynccontextmanager |
|
|
from fastapi import FastAPI |
|
|
from fastapi.middleware.cors import CORSMiddleware |
|
|
import uvicorn |
|
|
import logging |
|
|
|
|
|
from config import ( |
|
|
API_TITLE, |
|
|
API_DESCRIPTION, |
|
|
API_VERSION, |
|
|
STANCE_MODEL_ID, |
|
|
HUGGINGFACE_API_KEY, |
|
|
HOST, |
|
|
PORT, |
|
|
RELOAD, |
|
|
CORS_ORIGINS, |
|
|
CORS_CREDENTIALS, |
|
|
CORS_METHODS, |
|
|
CORS_HEADERS, |
|
|
) |
|
|
from services import stance_model_manager |
|
|
from routes import api_router |
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
@asynccontextmanager |
|
|
async def lifespan(app: FastAPI): |
|
|
"""Load models on startup and cleanup on shutdown""" |
|
|
|
|
|
logger.info("Loading models on startup...") |
|
|
|
|
|
|
|
|
try: |
|
|
logger.info(f"Loading stance model from Hugging Face: {STANCE_MODEL_ID}") |
|
|
stance_model_manager.load_model(STANCE_MODEL_ID, HUGGINGFACE_API_KEY) |
|
|
except Exception as e: |
|
|
logger.error(f"✗ Failed to load stance model: {str(e)}") |
|
|
logger.error("⚠️ Stance detection endpoints will not work!") |
|
|
|
|
|
logger.info("✓ API startup complete") |
|
|
|
|
|
yield |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app = FastAPI( |
|
|
title=API_TITLE, |
|
|
description=API_DESCRIPTION, |
|
|
version=API_VERSION, |
|
|
docs_url="/docs", |
|
|
redoc_url="/redoc", |
|
|
lifespan=lifespan, |
|
|
) |
|
|
|
|
|
|
|
|
app.add_middleware( |
|
|
CORSMiddleware, |
|
|
allow_origins=CORS_ORIGINS, |
|
|
allow_credentials=CORS_CREDENTIALS, |
|
|
allow_methods=CORS_METHODS, |
|
|
allow_headers=CORS_HEADERS, |
|
|
) |
|
|
|
|
|
|
|
|
app.include_router(api_router) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uvicorn.run( |
|
|
"main:app", |
|
|
host=HOST, |
|
|
port=PORT, |
|
|
reload=RELOAD, |
|
|
log_level="info" |
|
|
) |
|
|
|