""" NER 服务主入口 """ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from loguru import logger import sys from .config import settings from .routers import ner, relation from .models import HealthResponse # 配置日志 logger.remove() logger.add( sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}", level=settings.log_level ) # 创建 FastAPI 应用 app = FastAPI( title=settings.app_name, version=settings.app_version, description="NER(命名实体识别)服务,提供实体提取和关系抽取功能", docs_url="/docs", redoc_url="/redoc" ) # CORS 中间件 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册路由 app.include_router(ner.router, prefix="/ner", tags=["NER"]) app.include_router(relation.router, prefix="/ner", tags=["Relation"]) @app.get("/health", response_model=HealthResponse, tags=["Health"]) async def health_check(): """健康检查接口""" return HealthResponse( status="ok", version=settings.app_version, ner_model=settings.ner_model ) @app.get("/", tags=["Root"]) async def root(): """根路径""" return { "service": settings.app_name, "version": settings.app_version, "status": "running" } @app.on_event("startup") async def startup_event(): """启动事件""" logger.info(f"Starting {settings.app_name} v{settings.app_version}") logger.info(f"NER Model: {settings.ner_model}") logger.info(f"GPU Enabled: {settings.use_gpu}") @app.on_event("shutdown") async def shutdown_event(): """关闭事件""" logger.info(f"Shutting down {settings.app_name}") if __name__ == "__main__": import uvicorn uvicorn.run( "app.main:app", host=settings.host, port=settings.port, reload=settings.debug )