110 lines
3.7 KiB
Python
110 lines
3.7 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.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())
|