"""FastAPI 应用入口。 注册中间件、路由、异常处理。 """ import uuid from contextlib import asynccontextmanager from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from app.routers.auth import router as auth_router from app.routers.companies import router as companies_router from app.routers.copilot import router as copilot_router from app.routers.dashboard import router as dashboard_router from app.routers.reports import router as reports_router from app.routers.reports_export import router as reports_export_router from app.routers.risks import router as risks_router # Phase 2 路由 from app.routers.financial import router as financial_router from app.routers.agreements import router as agreements_router from app.routers.board import router as board_router from app.routers.weak_signals import router as weak_signals_router from app.routers.decision_sentinels import router as decision_sentinels_router from app.routers.events import router as events_router, router_inquiries as inquiries_router from app.routers.profiles import router as profiles_router from app.routers.admin import router as admin_router from app.routers.founder import router as founder_router # Phase 3 路由 from app.routers.synergies import router as synergies_router from app.routers.innovation import router as innovation_router from app.routers.talents import router as talents_router from app.routers.customer_plans import router as customer_plans_router from app.routers.okrs import router as okrs_router from app.routers.nudges import router as nudges_router from app.routers.peer_circles import router as peer_circles_router from app.routers.product_diagnostics import router as product_diagnostics_router from app.routers.milestones import router as milestones_router from app.routers.advanced_analysis import router as advanced_analysis_router from app.routers.tasks import router_tasks as tasks_router, router_comments as comments_router from app.routers.customer_success import router as customer_success_router # Phase 4 路由 from app.routers.alpha import router as alpha_router from app.routers.exit_predictions import router as exit_predictions_router from app.routers.portfolio import router as portfolio_router from app.routers.digital_twins import router as digital_twins_router from app.routers.knowledge_graph import router as knowledge_graph_router from app.routers.aars import router as aars_router from app.routers.pre_mortems import router_pre_mortem as pre_mortems_router, router_red_team as red_teams_router from app.routers.agent_executions import router as agent_executions_router from app.routers.knowledge import router as knowledge_router from app.routers.data_sources import router as data_sources_router from app.routers.industry_research import router as industry_research_router from app.routers.funds import router as funds_router from app.routers.evaluation import router as evaluation_router from app.schemas.common import error @asynccontextmanager async def lifespan(app: FastAPI): """应用生命周期管理。""" # startup — 初始化预设评价模板 from app.core.database import async_session_factory from app.services.evaluation_presets import seed_evaluation_templates async with async_session_factory() as session: await seed_evaluation_templates(session) await session.commit() yield # shutdown app = FastAPI( title="AIPortPilot", description="AI+ Portfolio Operating System — 投后管理与组合协同平台", version="0.1.0", lifespan=lifespan, ) # CORS app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:3000"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.middleware("http") async def trace_id_middleware(request: Request, call_next): """为每个请求注入 trace_id。""" trace_id = request.headers.get("X-Trace-Id", str(uuid.uuid4())) request.state.trace_id = trace_id response = await call_next(request) response.headers["X-Trace-Id"] = trace_id return response @app.exception_handler(Exception) async def global_exception_handler(request: Request, exc: Exception): """全局异常处理。""" trace_id = getattr(request.state, "trace_id", str(uuid.uuid4())) return JSONResponse( status_code=500, content=error(code=-1, message="内部服务器错误"), headers={"X-Trace-Id": trace_id}, ) @app.get("/health") async def health_check(): """健康检查端点。""" return {"status": "ok", "service": "aiportpilot-backend", "version": "0.1.0"} app.include_router(auth_router, prefix="/api/v1") app.include_router(companies_router, prefix="/api/v1") app.include_router(reports_router, prefix="/api/v1") app.include_router(dashboard_router, prefix="/api/v1") app.include_router(risks_router, prefix="/api/v1") app.include_router(copilot_router, prefix="/api/v1") app.include_router(reports_export_router, prefix="/api/v1") # Phase 2 app.include_router(financial_router, prefix="/api/v1") app.include_router(agreements_router, prefix="/api/v1") app.include_router(board_router, prefix="/api/v1") app.include_router(weak_signals_router, prefix="/api/v1") app.include_router(decision_sentinels_router, prefix="/api/v1") app.include_router(events_router, prefix="/api/v1") app.include_router(inquiries_router, prefix="/api/v1") app.include_router(profiles_router, prefix="/api/v1") app.include_router(admin_router, prefix="/api/v1") app.include_router(founder_router, prefix="/api/v1") # Phase 3 app.include_router(synergies_router, prefix="/api/v1") app.include_router(innovation_router, prefix="/api/v1") app.include_router(talents_router, prefix="/api/v1") app.include_router(customer_plans_router, prefix="/api/v1") app.include_router(okrs_router, prefix="/api/v1") app.include_router(nudges_router, prefix="/api/v1") app.include_router(peer_circles_router, prefix="/api/v1") app.include_router(product_diagnostics_router, prefix="/api/v1") app.include_router(milestones_router, prefix="/api/v1") app.include_router(advanced_analysis_router, prefix="/api/v1") app.include_router(tasks_router, prefix="/api/v1") app.include_router(comments_router, prefix="/api/v1") app.include_router(customer_success_router, prefix="/api/v1") # Phase 4 app.include_router(alpha_router, prefix="/api/v1") app.include_router(exit_predictions_router, prefix="/api/v1") app.include_router(portfolio_router, prefix="/api/v1") app.include_router(digital_twins_router, prefix="/api/v1") app.include_router(knowledge_graph_router, prefix="/api/v1") app.include_router(aars_router, prefix="/api/v1") app.include_router(pre_mortems_router, prefix="/api/v1") app.include_router(red_teams_router, prefix="/api/v1") app.include_router(agent_executions_router, prefix="/api/v1") app.include_router(knowledge_router, prefix="/api/v1") app.include_router(data_sources_router, prefix="/api/v1") app.include_router(industry_research_router, prefix="/api/v1") app.include_router(funds_router, prefix="/api/v1") app.include_router(evaluation_router, prefix="/api/v1")