Nomio4640's picture
added test for NER
7726529
import logging
import traceback
import torch
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from adapters.api.routers import analysis, insights, admin
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
)
logger = logging.getLogger(__name__)
app = FastAPI(
title="NLP Intelligence API",
description="Social media content analysis: NER, Topic Modeling, Sentiment Analysis, Network Analysis",
version="1.0.0",
)
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
tb = traceback.format_exc()
logger.error(f"Unhandled exception on {request.method} {request.url}\n{tb}")
return JSONResponse(
status_code=500,
content={"detail": f"{type(exc).__name__}: {exc}"},
)
# CORS for frontend
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # temporarily for testing
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Register routers
app.include_router(analysis.router, prefix="/api", tags=["Analysis"])
app.include_router(insights.router, prefix="/api", tags=["Insights"])
app.include_router(admin.router, prefix="/api/admin", tags=["Admin"])
@app.get("/")
async def root():
return {
"name": "NLP Intelligence API",
"version": "1.0.0",
"endpoints": {
"health": "GET /api/health",
"upload": "POST /api/upload",
"analyze": "POST /api/analyze",
"network": "POST /api/network",
"insights": "POST /api/insights",
"admin_entries": "GET/POST /api/admin/knowledge",
"admin_labels": "GET/POST /api/admin/labels",
"admin_stopwords": "GET/POST /api/admin/stopwords",
},
}
@app.get("/api/health")
async def health():
"""
Quick health check used by the frontend on page load.
Returns GPU availability and which NLP models are loaded.
"""
from adapters.api import services
gpu = torch.cuda.is_available()
gpu_name = torch.cuda.get_device_name(0) if gpu else None
return {
"status": "ok",
"gpu": gpu,
"gpu_name": gpu_name,
"models": {
"ner": services.ner._pipeline is not None,
"sentiment": services.sentiment._pipeline is not None,
"topic": services.topic._model is not None,
},
}