Files

172 lines
7.0 KiB
Python

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