from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse from api.routes import router as api_router from api.kg_routes import router as kg_router from api.reasoning_routes import router as reasoning_router from api.rag_v10_routes import router as v10_router from api.advanced_rag_routes import router as advanced_rag_router from api.raptor_routes import router as raptor_router from api.temporal_routes import router as temporal_router from api.kg_rag_routes import router as kg_rag_router # 方案A: KG-RAG融合 from api.species_routes import router as species_router # 物种查询路由 from api.methodology_routes import router as methodology_router from api.kb_qa_routes import router as kb_qa_router from api.v15_graph_qa_routes import router as v15_graph_qa_router from api.v15_agentic_qa_routes import router as v15_agentic_qa_router from src.rag.project_config import PROJECT_ROOT @asynccontextmanager async def lifespan(app: FastAPI): yield app = FastAPI( title="Gene Family RAG System", description="纯净版RAG系统 - 为bbav20311项目提供知识检索支持", version="1.0.0", lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(api_router, prefix="/api/v1") app.include_router(kg_router, prefix="/api/v1") app.include_router(reasoning_router, prefix="/api/v1") app.include_router(v10_router, prefix="/api/v1") app.include_router(advanced_rag_router, prefix="/api/v1") app.include_router(raptor_router, prefix="/api/v1") app.include_router(temporal_router, prefix="/api/v1") app.include_router(kg_rag_router, prefix="/api/v1") # 方案A: KG-RAG融合 app.include_router(species_router, prefix="/api/v1") # 物种查询路由 app.include_router(methodology_router, prefix="/api/v1") app.include_router(kb_qa_router, prefix="/api/v1") # V15 SRT SQLite知识库QA app.include_router(v15_graph_qa_router, prefix="/api/v1") # V15 Neo4j Graph QA app.include_router(v15_agentic_qa_router, prefix="/api/v1") # V15 Agentic QA # 静态文件服务 app.mount("/static", StaticFiles(directory=str(PROJECT_ROOT / "static")), name="static") @app.get("/") async def root(): return FileResponse(str(PROJECT_ROOT / "static" / "index.html")) @app.get("/health") async def health_check(): return {"status": "healthy"} # 监控指标端点 from fastapi import Request import time # 简单的请求计数器 request_count = 0 request_times = [] @app.middleware("http") async def add_metrics(request: Request, call_next): global request_count start_time = time.time() request_count += 1 response = await call_next(request) process_time = time.time() - start_time request_times.append(process_time) if len(request_times) > 1000: request_times.pop(0) return response @app.get("/metrics") async def metrics(): """Prometheus监控指标""" avg_time = sum(request_times) / len(request_times) if request_times else 0 return { "request_count": request_count, "avg_response_time": avg_time, "status": "healthy" }