Files
AILab/bbit_ai/app/app.py
T
2026-07-16 09:28:57 +08:00

115 lines
3.9 KiB
Python

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