"""
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, extract
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.include_router(extract.router, prefix="/extract", tags=["Extract"])
@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
)