"""FastAPI 应用入口:注册路由、CORS、启动后台任务循环。""" import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.config import settings from app.api import admin, agent, cli from app.middleware import RequestLogMiddleware from app.scheduler_loop import SchedulerLoop from app.repository.redis_client import get_redis_pool logging.basicConfig( level=getattr(logging, settings.log_level.upper(), logging.INFO), format="%(asctime)s %(levelname)s [%(name)s] %(message)s", ) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): # 启动时会话 redis = await get_redis_pool() loop = SchedulerLoop(redis) app.state.redis = redis app.state.scheduler_loop = loop await loop.start() logger.info("Gateway started, host=%s port=%s", settings.host, settings.port) try: yield finally: await loop.stop() await redis.aclose() logger.info("Gateway stopped") app = FastAPI( title="A2A Gateway", description="A2A 智能网关:任务池 / Agent 池 / 规则调度 / 通信中转 / 可视化运维", version="1.0.0", lifespan=lifespan, ) # CORS:允许前端开发服务器访问 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.add_middleware(RequestLogMiddleware) app.include_router(cli.router, prefix="/api/cli", tags=["CLI"]) app.include_router(agent.router, prefix="/api/agent", tags=["Agent"]) app.include_router(admin.router, prefix="/api/admin", tags=["Admin"]) @app.get("/health", tags=["health"]) async def health(): return {"status": "ok"}