File size: 2,443 Bytes
d4ec2fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import logging

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from api.config import IS_PRODUCTION, FRONTEND_URL
from api.routes.classify import router as classify_router
from api.routes.search import router as search_router
from api.routes.corrections import router as corrections_router
from api.routes.ask import router as ask_router
from api.routes.stats import router as stats_router
from api.routes.model_performance import router as model_performance_router
from api.services.model_service import model_service
from api.services.embedding_service import embedding_service
from api.services.vector_store import vector_store

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

app = FastAPI(title="Maintenance Log Classifier API", version="0.1.0")

# CORS: permissive in dev to make local frontend work painlessly; tighten before any
# real deployment (per Security doc's "ENV toggles debug logging and CORS rules")
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"] if not IS_PRODUCTION else ([FRONTEND_URL] if FRONTEND_URL else []),
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.on_event("startup")
def load_models_on_startup():
    from api.services.model_downloader import ensure_models_available
    ensure_models_available()

    logger.info("Loading models...")
    model_service.load()
    if not model_service.loaded:
        logger.error(f"Models failed to load: {model_service.load_error}")

    embedding_service.load()
    if not embedding_service.loaded:
        logger.warning(f"Embedding model failed to load (search will degrade): {embedding_service.load_error}")

    vector_store.load()
    if not vector_store.loaded:
        logger.warning(f"Vector store failed to load (search will degrade): {vector_store.load_error}")


@app.get("/health")
def health():
    return {
        "status": "ok" if model_service.loaded else "degraded",
        "models_loaded": model_service.loaded,
    }


app.include_router(classify_router)
app.include_router(search_router)
app.include_router(corrections_router)
app.include_router(ask_router)
app.include_router(stats_router)
app.include_router(model_performance_router)

from fastapi.staticfiles import StaticFiles
from api.config import BASE_DIR
_reports_dir = BASE_DIR / "reports"
if _reports_dir.exists():
    app.mount("/reports", StaticFiles(directory=str(_reports_dir)), name="reports")