"""应用入口:四库异步生命周期 + 中间件 + 全局异常 + 路由装配。""" from contextlib import asynccontextmanager import asyncio import uvicorn from fastapi import FastAPI from api.router import api_router from config import database from rag.milvus_collections import ensure_collections from service.customer_agent.bootstrap import ( build_default_knowledge_upload_service, build_default_runtime, ) from service.client_agent.bootstrap import build_default_runtime as build_client_runtime from service.client_agent.idle_archive_worker import IdleArchiveWorker from utils.exceptions import register_exception_handlers from utils.logger import setup_logging from utils.request_id import RequestIdMiddleware @asynccontextmanager async def lifespan(app: FastAPI): setup_logging() await ensure_collections() app.state.customer_agent_runtime = build_default_runtime() app.state.client_agent_runtime = build_client_runtime() app.state.client_agent_archive_worker = IdleArchiveWorker( redis=app.state.client_agent_runtime.redis, memory_service=app.state.client_agent_runtime.memory_service, ) await app.state.client_agent_archive_worker.recover_due_index() app.state.client_agent_archive_task = asyncio.create_task( app.state.client_agent_archive_worker.run() ) app.state.knowledge_upload_service = build_default_knowledge_upload_service() yield await app.state.client_agent_archive_worker.stop() await app.state.client_agent_archive_task await database.dispose() app = FastAPI(title="智能公募基金系统", version="0.1.0", lifespan=lifespan) app.add_middleware(RequestIdMiddleware) register_exception_handlers(app) app.include_router(api_router) @app.get("/") async def root(): return {"message": "智能公募基金系统 API", "docs": "/docs"} if __name__ == '__main__': uvicorn.run(app, host="127.0.0.1", port=8000)