Spaces:
Running
Running
import logging | |
from contextlib import asynccontextmanager | |
from pathlib import Path | |
from dotenv import load_dotenv | |
from fastapi import FastAPI | |
from app.api.routes import router | |
from app.core.config import get_settings | |
from app.dependencies import set_rag_service | |
from app.services.rag_service import RAGService | |
logger = logging.getLogger(__name__) | |
load_dotenv() | |
async def lifespan(app: FastAPI): | |
"""Manage application lifecycle - load index on startup""" | |
settings = get_settings() | |
logger.info("Initializing RAG service...") | |
rag_service = RAGService(settings) | |
set_rag_service(rag_service) | |
index_path = Path(settings.index_path) | |
colbert_index_path = Path(settings.colbert_index_path) | |
index_exists = ( | |
(index_path / "bm25_index.pkl").exists() if not settings.colbert_only else True | |
) | |
colbert_exists = ( | |
(colbert_index_path / "documents.pkl").exists() | |
if settings.use_colbert | |
else True | |
) | |
if index_exists and colbert_exists: | |
try: | |
rag_service.load_index() | |
logger.info("Existing RAG index loaded successfully") | |
except Exception as e: | |
logger.error(f"Failed to load index: {e}") | |
logger.info("Will attempt to rebuild index...") | |
index_exists = False | |
else: | |
logger.info("No existing index found") | |
if not (index_exists and colbert_exists): | |
markdown_path = Path(settings.markdown_directory) | |
if markdown_path.exists() and any(markdown_path.glob("**/*.md")): | |
try: | |
logger.info(f"Building new index from {settings.markdown_directory}...") | |
rag_service.build_index(settings.markdown_directory) | |
logger.info("Index built successfully") | |
except Exception as e: | |
logger.error(f"Failed to build index: {e}") | |
logger.warning( | |
"Application starting without index - you'll need to build it manually" | |
) | |
else: | |
logger.warning(f"No markdown files found in {settings.markdown_directory}") | |
logger.warning( | |
"Application starting without index - add markdown files and restart" | |
) | |
yield | |
logger.info("Shutting down...") | |
app = FastAPI( | |
title="RAG API", | |
description="Retrieval Augmented Generation API for Document Q&A", | |
version="1.0.0", | |
lifespan=lifespan, | |
) | |
app.include_router(router, prefix="/api/v1") | |