"""
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
)