main.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. """
  2. NER 服务主入口
  3. """
  4. from fastapi import FastAPI
  5. from fastapi.middleware.cors import CORSMiddleware
  6. from loguru import logger
  7. import sys
  8. from .config import settings
  9. from .routers import ner, relation
  10. from .models import HealthResponse
  11. # 配置日志
  12. logger.remove()
  13. logger.add(
  14. sys.stdout,
  15. format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
  16. level=settings.log_level
  17. )
  18. # 创建 FastAPI 应用
  19. app = FastAPI(
  20. title=settings.app_name,
  21. version=settings.app_version,
  22. description="NER(命名实体识别)服务,提供实体提取和关系抽取功能",
  23. docs_url="/docs",
  24. redoc_url="/redoc"
  25. )
  26. # CORS 中间件
  27. app.add_middleware(
  28. CORSMiddleware,
  29. allow_origins=["*"],
  30. allow_credentials=True,
  31. allow_methods=["*"],
  32. allow_headers=["*"],
  33. )
  34. # 注册路由
  35. app.include_router(ner.router, prefix="/ner", tags=["NER"])
  36. app.include_router(relation.router, prefix="/ner", tags=["Relation"])
  37. @app.get("/health", response_model=HealthResponse, tags=["Health"])
  38. async def health_check():
  39. """健康检查接口"""
  40. return HealthResponse(
  41. status="ok",
  42. version=settings.app_version,
  43. ner_model=settings.ner_model
  44. )
  45. @app.get("/", tags=["Root"])
  46. async def root():
  47. """根路径"""
  48. return {
  49. "service": settings.app_name,
  50. "version": settings.app_version,
  51. "status": "running"
  52. }
  53. @app.on_event("startup")
  54. async def startup_event():
  55. """启动事件"""
  56. logger.info(f"Starting {settings.app_name} v{settings.app_version}")
  57. logger.info(f"NER Model: {settings.ner_model}")
  58. logger.info(f"GPU Enabled: {settings.use_gpu}")
  59. @app.on_event("shutdown")
  60. async def shutdown_event():
  61. """关闭事件"""
  62. logger.info(f"Shutting down {settings.app_name}")
  63. if __name__ == "__main__":
  64. import uvicorn
  65. uvicorn.run(
  66. "app.main:app",
  67. host=settings.host,
  68. port=settings.port,
  69. reload=settings.debug
  70. )