import asyncio from contextlib import asynccontextmanager from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from uvicorn import Config, Server from config.emqx import mqtt_client_runner from config.yolo import YOLOSingleton from models.BaseResponse import BaseResponse from routers.AnnualMeeting import amRouter from routers.Bot import botRouter from routers.Chat import chatRouter from routers.Datasource import reportDataRouter from routers.Iot import iot_router from routers.Knowledge import knowledgeRouter from routers.Public import publicRouter from routers.RabbitMQ import rqRouter from routers.Report import reportRouter from routers.Sentinel import sentinel_router from routers.Service import serviceRouter from routers.System import systemRouter from routers.Vision import visionRouter from routers.WS import iot_ws_router from service.RabbitMQ import ( mq_client, ) @asynccontextmanager async def lifespan(app: FastAPI): # 应用启动时初始化 MQ await mq_client.init() # 启动消费者 await mq_client.start_all_consumer() yield # 应用关闭时关闭 MQ 连接 if mq_client._connection: await mq_client._connection.close() async def ai_lab(): app = FastAPI(title="BBIT_AI", lifespan=lifespan) origins = [ "http://localhost:8091", # Vite dev 默认端口 "https://ai.ronsunny.cn:8090", "*", # ⚠️ 生产环境不要用 ] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], # 必须包含 OPTIONS、GET 等 allow_headers=["*"], ) routers = [ chatRouter, reportRouter, knowledgeRouter, reportDataRouter, serviceRouter, botRouter, rqRouter, ] for r in routers: app.include_router(r, prefix="/llm", tags=["llm"]) app.include_router(visionRouter, prefix="/cv", tags=["cv"]) app.include_router(systemRouter, prefix="/system", tags=["system"]) app.include_router(amRouter, prefix="/am", tags=["annual_meeting"]) app.include_router(iot_router, prefix="/iot", tags=["iot"]) app.include_router(sentinel_router, prefix="/iot/sentinel", tags=["iot_sentinel"]) app.include_router(iot_ws_router, prefix="/iot/ws", tags=["iot_ws"]) app.include_router(publicRouter, prefix="/api/public", tags=["api"]) # ----------- 全局异常捕获 --------- @app.exception_handler(Exception) async def global_exception_handler(request: Request, exc: Exception): return BaseResponse(status=False, message=str(exc), data=None) config = Config(app=app, host="0.0.0.0", port=13011, log_level="warning") server = Server(config) await server.serve() async def main(): # 初始化模型 YOLOSingleton.init_model() # 主干AI实验室FastAPI服务 task_api = asyncio.create_task(ai_lab()) # 等 HTTP 服务启动后再启动 MQTT task_mqtt = asyncio.create_task(mqtt_client_runner()) await asyncio.gather(task_api, task_mqtt) # MCP服务-ailab # endpoint_url_ai_lab = "wss://ai.ronsunny.cn:8090/aimcp/mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" # endpoint_url_ai_lab = "ws://ce_bot_mcp:8004/mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" # task_mcp1 = asyncio.create_task(init_mcp_server(endpoint_url_ai_lab)) # MCP服务-ql # endpoint_url_ql = "wss://ai.ronsunny.cn:8090/aimcp/mcp_endpoint/mcp/?token=8ZmCzp7FzsbxwHOg2%2FvBQkxrC3QWJiI%2B4iTfouExinjcT8ZgLwQfFUtgcMInI7St" # task_mcp2 = asyncio.create_task(init_mcp_server(endpoint_url_ql)) # await asyncio.gather(task_api, task_mcp1, task_mcp2, task_mq) if __name__ == "__main__": asyncio.run(main())