"""主程序"""
import logging
from collections.abc import AsyncGenerator
from contextlib import asynccontextmanager
import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from rich.console import Console
from rich.logging import RichHandler
from .common.config import config
from .common.postgres import postgres
from .routers import (
appcenter,
auth,
chat,
conversation,
document,
flow,
health,
llm,
mcp_service,
parameter,
record,
service,
tag,
user,
)
from .scheduler.pool.pool import pool
from .services.settings import SettingsManager
@asynccontextmanager
async def lifespan(_app: FastAPI) -> AsyncGenerator[None, None]:
"""应用生命周期管理"""
await postgres.init()
await SettingsManager.init_global_llm_settings()
await pool.init()
yield
await postgres.close()
app = FastAPI(redoc_url=None, lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
allow_origins=[config.fastapi.domain],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(appcenter.router)
app.include_router(auth.router)
app.include_router(chat.router)
app.include_router(conversation.router)
app.include_router(document.router)
app.include_router(flow.router)
app.include_router(health.router)
app.include_router(llm.router)
app.include_router(llm.admin_router)
app.include_router(mcp_service.router)
app.include_router(mcp_service.admin_router)
app.include_router(parameter.router)
app.include_router(record.router)
app.include_router(service.router)
app.include_router(service.admin_router)
app.include_router(tag.admin_router)
app.include_router(user.router)
LOGGER_FORMAT = "%(funcName)s() - %(message)s"
DATE_FORMAT = "%y-%b-%d %H:%M:%S"
logging.basicConfig(
level=logging.INFO,
format=LOGGER_FORMAT,
datefmt=DATE_FORMAT,
handlers=[RichHandler(rich_tracebacks=True, console=Console(
color_system="256",
width=160,
))],
)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8002, log_level="info", log_config=None)