import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse import uvicorn logging.basicConfig(level=logging.INFO, format="%(levelname)s:%(name)s: %(message)s") from config import settings from routers import chat, google_chat, nextcloud_talk, files, distill @asynccontextmanager async def lifespan(app: FastAPI): import scheduler scheduler.start() yield scheduler.stop() from llm_client import cleanup await cleanup() app = FastAPI(title="Cortex Dispatcher", lifespan=lifespan) app.include_router(chat.router) app.include_router(google_chat.router) app.include_router(nextcloud_talk.router) app.include_router(files.router) app.include_router(distill.router) app.mount("/static", StaticFiles(directory="static"), name="static") @app.get("/") async def index() -> FileResponse: return FileResponse("static/index.html") @app.get("/health") async def health() -> dict: return {"status": "ok"} if __name__ == "__main__": uvicorn.run( "main:app", host=settings.host, port=settings.port, reload=True, )