# SimbaRAG 🐱 A Retrieval-Augmented Generation (RAG) conversational AI system for querying information about Simba the cat. Built with LangChain, ChromaDB, and modern web technologies. ## Features - 🤖 **Intelligent Conversations** - LangChain-powered agent with tool use and memory - 📚 **Document Retrieval** - RAG system using ChromaDB vector store - 🔍 **Web Search** - Integrated Tavily API for real-time web searches - 🔐 **OIDC Authentication** - Secure auth via Authelia with LDAP group support - 💬 **Multi-Conversation** - Manage multiple conversation threads per user - 🎨 **Modern UI** - React 19 frontend with Tailwind CSS - 🐳 **Docker Ready** - Containerized deployment with Docker Compose ## System Architecture ```mermaid graph TB subgraph "Client Layer" Browser[Web Browser] end subgraph "Frontend - React" UI[React UI
Tailwind CSS] Auth[Auth Service] API[API Client] end subgraph "Backend - Quart/Python" App[Quart App
app.py] subgraph "Blueprints" Users[Users Blueprint
OIDC + JWT] Conv[Conversation Blueprint
Chat Management] RAG[RAG Blueprint
Document Indexing] end Agent[LangChain Agent
main.py] LLM[LLM Client
llm.py] end subgraph "Tools & Utilities" Search[Simba Search Tool] Web[Web Search Tool
Tavily] end subgraph "Data Layer" Postgres[(PostgreSQL
Users & Conversations)] Chroma[(ChromaDB
Vector Store)] end subgraph "External Services" Authelia[Authelia
OIDC Provider] LLDAP[LLDAP
User Directory] Ollama[Ollama
Local LLM] OpenAI[OpenAI
Fallback LLM] Paperless[Paperless-NGX
Documents] TavilyAPI[Tavily API
Web Search] end Browser --> UI UI --> Auth UI --> API API --> App App --> Users App --> Conv App --> RAG Conv --> Agent Agent --> Search Agent --> Web Agent --> LLM Search --> Chroma Web --> TavilyAPI RAG --> Chroma RAG --> Paperless Users --> Postgres Conv --> Postgres Users --> Authelia Authelia --> LLDAP LLM --> Ollama LLM -.Fallback.-> OpenAI style Browser fill:#e1f5ff style UI fill:#fff3cd style App fill:#d4edda style Agent fill:#d4edda style Postgres fill:#f8d7da style Chroma fill:#f8d7da style Ollama fill:#e2e3e5 style OpenAI fill:#e2e3e5 ``` ## Quick Start ### Prerequisites - Docker & Docker Compose - PostgreSQL (or use Docker) - Ollama (optional, for local LLM) - Paperless-NGX instance (for document source) ### Installation 1. **Clone the repository** ```bash git clone https://github.com/yourusername/simbarag.git cd simbarag ``` 2. **Configure environment variables** ```bash cp .env.example .env # Edit .env with your configuration ``` 3. **Start the services** ```bash # Development (local PostgreSQL only) docker compose -f docker-compose.dev.yml up -d # Or full Docker deployment docker compose up -d ``` 4. **Access the application** Open `http://localhost:8080` in your browser. ## Development ### Local Development Setup ```bash # 1. Start PostgreSQL docker compose -f docker-compose.dev.yml up -d # 2. Set environment variables export DATABASE_URL="postgres://raggr:raggr_dev_password@localhost:5432/raggr" export CHROMADB_PATH="./chromadb" export $(grep -v '^#' .env | xargs) # 3. Install dependencies pip install -r requirements.txt cd raggr-frontend && yarn install && yarn build && cd .. # 4. Run migrations aerich upgrade # 5. Start the server python app.py ``` See [docs/development.md](docs/development.md) for detailed development guide. ## Project Structure ``` simbarag/ ├── app.py # Quart application entry point ├── main.py # RAG logic & LangChain agent ├── llm.py # LLM client with Ollama/OpenAI ├── aerich_config.py # Database migration configuration │ ├── blueprints/ # API route blueprints │ ├── users/ # Authentication & authorization │ ├── conversation/ # Chat conversations │ └── rag/ # Document indexing │ ├── config/ # Configuration modules │ └── oidc_config.py # OIDC authentication settings │ ├── utils/ # Reusable utilities │ ├── chunker.py # Document chunking for embeddings │ ├── cleaner.py # PDF cleaning and summarization │ ├── image_process.py # Image description with LLM │ └── request.py # Paperless-NGX API client │ ├── scripts/ # Administrative scripts │ ├── add_user.py │ ├── user_message_stats.py │ ├── manage_vectorstore.py │ └── inspect_vector_store.py │ ├── raggr-frontend/ # React frontend │ └── src/ │ ├── migrations/ # Database migrations │ ├── docs/ # Documentation │ ├── index.md # Documentation hub │ ├── development.md # Development guide │ ├── deployment.md # Deployment & migrations │ ├── VECTORSTORE.md # Vector store management │ ├── MIGRATIONS.md # Migration reference │ └── authentication.md # Authentication setup │ ├── docker-compose.yml # Production compose ├── docker-compose.dev.yml # Development compose ├── Dockerfile # Production Dockerfile ├── Dockerfile.dev # Development Dockerfile ├── CLAUDE.md # AI assistant instructions └── README.md # This file ``` ## Key Technologies ### Backend - **Quart** - Async Python web framework - **LangChain** - Agent framework with tool use - **Tortoise ORM** - Async ORM for PostgreSQL - **Aerich** - Database migration tool - **ChromaDB** - Vector database for embeddings - **OpenAI** - Embeddings & LLM (fallback) - **Ollama** - Local LLM (primary) ### Frontend - **React 19** - UI framework - **Rsbuild** - Fast bundler - **Tailwind CSS** - Utility-first styling - **Axios** - HTTP client ### Authentication - **Authelia** - OIDC provider - **LLDAP** - Lightweight LDAP server - **JWT** - Token-based auth ## API Endpoints ### Authentication - `GET /api/user/oidc/login` - Initiate OIDC login - `GET /api/user/oidc/callback` - OIDC callback handler - `POST /api/user/refresh` - Refresh JWT token ### Conversations - `POST /api/conversation/` - Create conversation - `GET /api/conversation/` - List conversations - `GET /api/conversation/` - Get conversation with messages - `POST /api/conversation/query` - Send message and get response ### RAG (Admin Only) - `GET /api/rag/stats` - Vector store statistics - `POST /api/rag/index` - Index new documents - `POST /api/rag/reindex` - Clear and reindex all ## Configuration ### Environment Variables | Variable | Description | Default | |----------|-------------|---------| | `DATABASE_URL` | PostgreSQL connection string | `postgres://...` | | `CHROMADB_PATH` | ChromaDB storage path | `./chromadb` | | `OLLAMA_URL` | Ollama server URL | `http://localhost:11434` | | `OPENAI_API_KEY` | OpenAI API key | - | | `PAPERLESS_TOKEN` | Paperless-NGX API token | - | | `BASE_URL` | Paperless-NGX base URL | - | | `OIDC_ISSUER` | OIDC provider URL | - | | `OIDC_CLIENT_ID` | OIDC client ID | - | | `OIDC_CLIENT_SECRET` | OIDC client secret | - | | `JWT_SECRET_KEY` | JWT signing key | - | | `TAVILY_KEY` | Tavily web search API key | - | See `.env.example` for full list. ## Scripts ### User Management ```bash # Add a new user python scripts/add_user.py # View message statistics python scripts/user_message_stats.py ``` ### Vector Store Management ```bash # Show vector store statistics python scripts/manage_vectorstore.py stats # Index new documents from Paperless python scripts/manage_vectorstore.py index # Clear and reindex everything python scripts/manage_vectorstore.py reindex # Inspect vector store contents python scripts/inspect_vector_store.py ``` See [docs/vectorstore.md](docs/vectorstore.md) for details. ## Database Migrations ```bash # Generate a new migration aerich migrate --name "describe_your_changes" # Apply pending migrations aerich upgrade # View migration history aerich history # Rollback last migration aerich downgrade ``` See [docs/deployment.md](docs/deployment.md) for detailed migration workflows. ## LangChain Agent The conversational agent has access to two tools: 1. **simba_search** - Query the vector store for Simba's documents - Used for: Medical records, veterinary history, factual information 2. **web_search** - Search the web via Tavily API - Used for: Recent events, external knowledge, general questions The agent automatically selects the appropriate tool based on the user's query. ## Authentication Flow ``` User → Authelia (OIDC) → Backend (JWT) → Frontend (localStorage) ↓ LLDAP ``` 1. User clicks "Login" 2. Frontend redirects to Authelia 3. User authenticates via Authelia (backed by LLDAP) 4. Authelia redirects back with authorization code 5. Backend exchanges code for OIDC tokens 6. Backend issues JWT tokens 7. Frontend stores tokens in localStorage ## Contributing 1. Fork the repository 2. Create a feature branch 3. Make your changes 4. Run tests and linting 5. Submit a pull request ## Documentation - [Development Guide](docs/development.md) - Setup and development workflow - [Deployment Guide](docs/deployment.md) - Deployment and migrations - [Vector Store Guide](docs/vectorstore.md) - Managing the vector database - [Authentication Guide](docs/authentication.md) - OIDC and LDAP setup ## License [Your License Here] ## Acknowledgments - Built for Simba, the most important cat in the world 🐱 - Powered by LangChain, ChromaDB, and the open-source community