""" LightRAG Python Sidecar - Knowledge Graph Integration for LLM Gateway FastAPI server providing hybrid knowledge graph RAG capabilities: - Entity extraction & linking (LLM-powered) - Hybrid retrieval (BM25 + vector similarity) - Knowledge graph storage (PostgreSQL + Qdrant) - Evaluation framework for retrieval quality """ from fastapi import FastAPI, HTTPException, BackgroundTasks from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager import logging import os from app.config import settings from app.db import init_db from app.routes import query, ingest, eval, health # Configure logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): """Application lifecycle management.""" # Startup logger.info(f"Starting LightRAG Sidecar on port {settings.LIGHTRAG_PORT}") logger.info(f"Domain: {settings.LIGHTRAG_DOMAIN}") logger.info(f"LLM Backend: {settings.LLM_BACKEND}") logger.info(f"Database: {settings.DATABASE_URL}") logger.info(f"Qdrant: {settings.QDRANT_URL}") try: await init_db() logger.info("Database initialized successfully") except Exception as e: logger.error(f"Failed to initialize database: {e}") raise yield # Shutdown logger.info("Shutting down LightRAG Sidecar") # Create app app = FastAPI( title="LightRAG Sidecar", description="Knowledge Graph RAG integration for LLM Gateway", version="1.0.0", lifespan=lifespan ) # CORS middleware for llm-gateway app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:3103", "http://192.168.178.82:3103"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Mount routers app.include_router(health.router, prefix="/api/kg", tags=["health"]) app.include_router(query.router, prefix="/api/kg", tags=["query"]) app.include_router(ingest.router, prefix="/api/kg", tags=["ingest"]) app.include_router(eval.router, prefix="/api/kg", tags=["evaluation"]) @app.get("/", tags=["info"]) async def root(): """API root endpoint.""" return { "service": "LightRAG Sidecar", "version": "1.0.0", "domain": settings.LIGHTRAG_DOMAIN, "endpoints": { "health": "/api/kg/health", "query": "/api/kg/query", "ingest": "/api/kg/ingest", "eval": "/api/kg/eval", } } if __name__ == "__main__": import uvicorn uvicorn.run( "app.main:app", host="0.0.0.0", port=settings.LIGHTRAG_PORT, reload=os.getenv("ENVIRONMENT") == "development" )