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.CubeReport import cubeReportRouter 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 routers.dify_export_router import difyRouter 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.bbitcn.net", "*", # ⚠️ 生产环境不要用 ] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], # 必须包含 OPTIONS、GET 等 allow_headers=["*"], ) routers = [ chatRouter, cubeReportRouter, reportRouter, knowledgeRouter, reportDataRouter, serviceRouter, botRouter, rqRouter, difyRouter, ] for r in routers: app.include_router(r, prefix="/llm", tags=["llm"]) app.include_router(amRouter, prefix="/am", tags=["annual_meeting"]) app.include_router(difyRouter, prefix="/api/dify", tags=["dify"]) app.include_router(iot_router, prefix="/iot", tags=["iot"]) app.include_router(visionRouter, prefix="/cv", tags=["cv"]) app.include_router(systemRouter, prefix="/system", tags=["system"]) app.include_router(publicRouter, prefix="/api/public", tags=["api"]) app.include_router(iot_ws_router, prefix="/iot/ws", tags=["iot_ws"]) app.include_router(sentinel_router, prefix="/iot/sentinel", tags=["iot_sentinel"]) # ----------- 全局异常捕获 --------- @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())