An end-to-end Adaptive Retrieval-Augmented Generation (RAG) system with a full authentication layer. Ask questions against your uploaded documents β the system intelligently decides whether to search your knowledge base, answer from general knowledge, or run a live web search.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Streamlit Frontend β
β ββββββββββββββββ ββββββββββββββββββββββββββββββββ β
β β Login Page β βββββΊ β Chat UI + Document Upload β β
β ββββββββββββββββ ββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ
β JWT Bearer Token
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Auth Service (FastAPI :8080) β
β POST /auth/register Β· POST /auth/login Β· GET /user/me β
β POST /agent/chat βββΊ proxies to RAG backend β
β SQLite (users.db) Β· Argon2id Β· JWT (python-jose) β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ
β Internal HTTP
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Adaptive RAG Backend (FastAPI :8000) β
β β
β POST /rag/query POST /rag/documents/upload β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β LangGraph Workflow β β
β β β β
β β Query Classifier ββΊ [index] ββΊ FAISS Retriever β β
β β β β β β
β β β βΌ β β
β β β Document Grader β β
β β β β β β β
β β β Relevant Irrelevant β β
β β β β β β β
β β βββΊ [general]β βΌ β β
β β β Groq β Query Rewriter β β
β β β Direct β β β β
β β β β βΌ β β
β β βββΊ [search]ββ΄βββββββΊ Web Search (Tavily) β β
β β β β β
β β βΌ β β
β β Generate Answer (Groq LLM) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Gemini Embeddings (text-embedding-004) Β· FAISS Β· MongoDB β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Feature | Details |
|---|---|
| π Authentication | JWT Bearer tokens Β· Argon2id password hashing Β· Register/Login |
| π§ Adaptive Routing | Classifier decides: RAG / General LLM / Web Search |
| π Document Upload | PDF & TXT ingestion β chunking β Gemini embedding β FAISS |
| π Web Search Fallback | Tavily API for real-time information |
| π¬ Chat History | Per-user session persistence in MongoDB |
| β‘ Groq-Powered | Llama 3.3 70B (Groq) for LLM inference Β· text-embedding-004 for embeddings |
| π₯οΈ Streamlit UI | Glassmorphism dark theme with login, chat, and file upload |
Adaptive-Rag/
βββ adaptive_rag/ # RAG backend + Streamlit frontend
β βββ main.py # FastAPI entry point (:8000)
β βββ requirements.txt
β βββ src/
β β βββ api/routes.py # /rag/query, /rag/documents/upload
β β βββ config/
β β β βββ settings.py # Environment config (Pydantic)
β β β βββ prompts.yaml # LLM prompt templates
β β βββ llms/groq_llm.py # Groq LLM client + Gemini embeddings
β β βββ memory/chat_history_mongo.py
β β βββ models/ # State, Grade, RouteIdentifier schemas
β β βββ rag/
β β βββ graph_builder.py # Full LangGraph workflow
β β βββ retriever_setup.py # FAISS vector store
β β βββ document_upload.py # File ingestion pipeline
β βββ streamlit_app/
β βββ Home.py # Login / Register page
β βββ pages/chat.py # Protected chat UI
β βββ utils/api_client.py # HTTP client (JWT Bearer)
β
βββ auth_service/ # Authentication BFF (migrated from Rust)
β βββ app/
β β βββ main.py # FastAPI entry point (:8080)
β β βββ auth.py # JWT + Argon2id
β β βββ database.py # Async SQLite (aiosqlite)
β β βββ models.py # SQLAlchemy User model
β β βββ schemas.py # Pydantic request/response schemas
β β βββ dependencies.py # JWT bearer dependency
β β βββ routers/
β β βββ auth.py # POST /auth/register, /auth/login
β β βββ user.py # GET /user/me
β β βββ agent.py # POST /agent/chat (proxy)
β βββ requirements.txt
β
βββ .env.example # Environment variables template
βββ .gitignore
βββ README.md
Note: rename
src/llms/gemini.pyβsrc/llms/groq_llm.py(or keep the filename and just swap internals) to match β update if you named it differently.
- Python 3.11+
- Groq API key (free) β for LLM inference
- Google AI Studio API key β for Gemini embeddings (
text-embedding-004) - Tavily API key (free tier available)
- MongoDB (optional β chat history is disabled gracefully if unavailable)
git clone https://github.com/itsmehotpants/Adaptive-Rag.git
cd Adaptive-Rag
cp .env.example .env
# Edit .env and fill in your GROQ_API_KEY, GEMINI_API_KEY (embeddings), and TAVILY_API_KEY
cd auth_service
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # macOS/Linux
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload
Auth service will be available at: http://localhost:8080 API docs: http://localhost:8080/docs
cd adaptive_rag
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
RAG backend at: http://localhost:8000 API docs: http://localhost:8000/docs
cd adaptive_rag/streamlit_app
streamlit run Home.py
Frontend at: http://localhost:8501
1. Register: POST /auth/register { username, password }
2. Login: POST /auth/login { username, password } β { access_token }
3. Use token: Authorization: Bearer <access_token>
4. Chat: POST /agent/chat { query } (proxied to RAG with session_id)
Note: Streamlit Community Cloud runs only the Streamlit app. You need the backend services deployed separately.
- Push your code to GitHub (already done).
- Go to share.streamlit.io.
- Click New app β Select
itsmehotpants/Adaptive-Rag. - Set Main file path:
adaptive_rag/streamlit_app/Home.py - Under Advanced β Secrets, add:
AUTH_SERVICE_URL = "https://your-auth-service.onrender.com"
RAG_SERVICE_URL = "https://your-rag-backend.onrender.com"
- Click Deploy.
- Go to render.com β New Web Service.
- Connect GitHub repo β Select
itsmehotpants/Adaptive-Rag. - Settings:
- Root Directory:
auth_service - Build Command:
pip install -r requirements.txt - Start Command:
uvicorn app.main:app --host 0.0.0.0 --port $PORT
- Add environment variables:
JWT_SECRET,ACCESS_TOKEN_EXPIRE_MINUTES=60
- New Web Service β same repo.
- Settings:
- Root Directory:
adaptive_rag - Build Command:
pip install -r requirements.txt - Start Command:
uvicorn main:app --host 0.0.0.0 --port $PORT
- Add environment variables:
GROQ_API_KEY,GEMINI_API_KEY,TAVILY_API_KEY,MONGODB_URL
# Install Railway CLI
npm install -g @railway/cli
railway login
# Deploy auth service
cd auth_service
railway up
# Deploy RAG backend
cd ../adaptive_rag
railway up
| Method | Endpoint | Auth | Description |
|---|---|---|---|
POST |
/auth/register |
β | Create new user account |
POST |
/auth/login |
β | Login and receive JWT token |
GET |
/user/me |
β JWT | Get current user profile |
POST |
/agent/chat |
β JWT | Proxy chat to RAG backend |
GET |
/health |
β | Health check |
| Method | Endpoint | Description |
|---|---|---|
POST |
/rag/query |
Run adaptive RAG query |
POST |
/rag/documents/upload |
Upload & index document |
GET |
/ |
Health check |
| Layer | Technology |
|---|---|
| LLM | Groq β llama-3.3-70b-versatile |
| Embeddings | Google text-embedding-004 |
| RAG Orchestration | LangGraph 0.5 |
| Vector Store | FAISS (in-memory) |
| Web Search | Tavily API |
| Chat History | MongoDB |
| Auth Backend | FastAPI + Argon2id + JWT |
| Auth Database | SQLite (aiosqlite) |
| RAG Backend | FastAPI + Uvicorn |
| Frontend | Streamlit |
MIT Β© 2024 itsmehotpants