import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from api.v1.chat import router as v1_router from core.config import DEEPSEEK_API_KEY from core.llm import create_client # --------------------------------------------------------------------------- # Logging — tool calls will appear in the uvicorn console # --------------------------------------------------------------------------- logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(name)s] %(levelname)s: %(message)s", datefmt="%H:%M:%S", ) # --------------------------------------------------------------------------- # Load all agents & skills so they self-register at startup # --------------------------------------------------------------------------- from agents import load_all_agents # noqa: E402 load_all_agents() # --------------------------------------------------------------------------- # Lifespan # --------------------------------------------------------------------------- @asynccontextmanager async def lifespan(app: FastAPI): from bot.discord_bot import start_in_background # noqa: E402 start_in_background() yield # --------------------------------------------------------------------------- # App # --------------------------------------------------------------------------- app = FastAPI(lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # --------------------------------------------------------------------------- # Singletons (stored on app.state so every module can reach them via Depends) # --------------------------------------------------------------------------- app.state.llm_client = create_client(DEEPSEEK_API_KEY) # Lazy-compiled LangGraph graphs — populated on first use per agent app.state.agent_graphs: dict = {} # --------------------------------------------------------------------------- # Routers # --------------------------------------------------------------------------- app.include_router(v1_router, prefix="/v1")