import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from config import settings from services.embeddings import EmbeddingService from services.vectorstore import VectorStoreService logger = logging.getLogger(__name__) embedding_service: EmbeddingService | None = None vectorstore_service: VectorStoreService | None = None @asynccontextmanager async def lifespan(app: FastAPI): global embedding_service, vectorstore_service logging.basicConfig(level=getattr(logging, settings.log_level.upper(), logging.INFO)) logger.info("Loading embedding model: %s", settings.embedding_model) embedding_service = EmbeddingService(settings.embedding_model) logger.info("Embedding model loaded") vectorstore_service = VectorStoreService( persist_dir=settings.chroma_persist_dir, embedding_service=embedding_service, ) logger.info("ChromaDB initialized at %s", settings.chroma_persist_dir) yield logger.info("Shutting down") app = FastAPI( title="Chat Agent for Patients — Tuning Tool", description="RAG-ядро и инструмент настройки пациентского чат-агента", version="0.1.0", lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) from routers import documents, health, query # noqa: E402 app.include_router(health.router) app.include_router(documents.router) app.include_router(query.router) app.mount("/", StaticFiles(directory="static", html=True), name="static")