jackkuo's picture
add QA
79899c0
"""生物医学RAG服务主程序入口。"""
import importlib
import pkgutil
import time
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
import uvicorn
from asgi_correlation_id import CorrelationIdMiddleware, correlation_id
from fastapi import FastAPI, Request
from fastapi_mcp import FastApiMCP
from fastapi.middleware.cors import CORSMiddleware
from routers import sensor, mcp_sensor
from utils.bio_logger import bio_logger as logger
# 调试:验证环境变量是否加载
logger.info(f"SERPER_API_KEY loaded: {'Yes' if os.getenv('SERPER_API_KEY') else 'No'}")
app = FastAPI(
docs_url=None, # 关闭 Swagger UI 文档
redoc_url=None, # 关闭 ReDoc 文档
openapi_url=None, # 关闭 OpenAPI 规范文件
debug=False, # 关闭调试模式
)
# 第一个添加的中间件
app.add_middleware(CorrelationIdMiddleware)
# 配置CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 路由
app.include_router(sensor.router)
app.include_router(mcp_sensor.router) # 包含 MCP 路由
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
"""HTTP中间件,记录请求处理时间和状态。"""
start_time = time.time()
logger.info(f"Request started | URL: {request.url}")
response = await call_next(request)
process_time = time.time() - start_time
logger.info(
f"Request completed | "
f"Status: {response.status_code} | "
f"Time: {process_time:.2f}s"
)
return response
def dynamic_import_subclasses(parent_dir: str) -> None:
"""动态导入指定目录下的所有Python模块。
Args:
parent_dir: 要导入的目录路径
"""
for _, module_name, _ in pkgutil.iter_modules([parent_dir]):
module = importlib.import_module(f"{parent_dir}.{module_name}")
logger.info(f"Imported: {module.__name__}")
# Add MCP server to the FastAPI app
mcp = FastApiMCP(
app,
name="bio qa mcp",
include_operations=["bio_qa_stream_chat"]
)
# Mount the MCP server to the FastAPI app
# 挂载SSE端点到 /mcp/sse
mcp.mount_sse()
if __name__ == "__main__":
logger.info("Starting Bio RAG Server...")
dynamic_import_subclasses("search_service")
uvicorn.run(app, host="0.0.0.0", port=9487)