A full-stack RAG (Retrieval-Augmented Generation) chatbot that allows users to upload PDF and DOCX documents and chat with an AI about their content. Built with React, Express.js, LangChain, FAISS, and Google Gemini.
- π Document Upload: Upload one or multiple PDF and DOCX files (max 5 files, 10MB each)
- π€ AI-Powered Chat: Ask questions about uploaded documents using Google Gemini 2.0 Flash
- π Session-Based: Each user session maintains its own vector store and chat history
- π§Ή Auto-Cleanup: Documents and embeddings automatically cleared on session end
- π Responsive UI: Modern, clean interface built with React and Tailwind CSS
- π³ Dockerized: Fully containerized with Docker Compose for easy deployment
- β‘ Fast Vector Search: FAISS-powered semantic search with HuggingFace embeddings
- π Markdown Support: Rich markdown rendering in chat responses
- Node.js 20+ (for local development)
- Docker and Docker Compose (for containerized deployment)
- Google Gemini API Key - Get it from Google AI Studio
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT BROWSER β
β (React + Tailwind CSS) β
ββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β HTTP/HTTPS
β (Port 80/443)
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NGINX (Frontend) β
β Serves React SPA + Static Assets β
ββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β API Calls
β (Port 5000)
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β EXPRESS.JS BACKEND β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Middleware Layer β β
β β β’ CORS β’ Helmet β’ Sessions β’ Error Handler β’ Multer β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Routes β β
β β β’ /api/upload β’ /api/chat β’ /api/session β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Controllers β β
β β β’ uploadController β’ chatController β’ sessionCtrl β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Services (Business Logic) β β
β β β’ ragService β’ vectorStoreService β β
β β β’ sessionService β’ documentLoader β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββ¬βββββββββββββββββββββββ¬ββββββββββββββββββββββββ-β
β β
βΌ βΌ
ββββββββββββββββββββββ ββββββββββββββββββββββββ
β File System β β Memory Store β
β (uploads/) β β β’ Vector Stores β
β β’ PDF Files β β β’ Sessions β
β β’ DOCX Files β β β’ Chat History β
ββββββββββββββββββββββ ββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββ
β External Services β
β ββββββββββββββββββββ ββββββββββββββββ β
β β Google Gemini β β HuggingFace β β
β β (LLM - 2.0 Flash)β β (Embeddings) β β
β ββββββββββββββββββββ ββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββ
β User β
ββββββ¬ββββββ
β 1. Select/Drop Files (PDF/DOCX)
βΌ
βββββββββββββββββββ
β FileUpload β
β Component β
ββββββ¬βββββββββββββ
β 2. POST /api/upload (multipart/form-data)
βΌ
βββββββββββββββββββββββββββ
β uploadMiddleware β
β (Multer) β
β β’ Validate file type β
β β’ Check file size β
β β’ Save to uploads/ β
ββββββ¬βββββββββββββββββββββ
β 3. Files saved
βΌ
βββββββββββββββββββββββββββ
β uploadController β
β β’ Get file paths β
ββββββ¬βββββββββββββββββββββ
β 4. Process documents
βΌ
βββββββββββββββββββββββββββ
β ragService β
β processDocuments() β
ββββββ¬βββββββββββββββββββββ
β 5. Load documents
βΌ
βββββββββββββββββββββββββββ
β documentLoader β
β β’ Parse PDF/DOCX β
β β’ Extract text β
ββββββ¬βββββββββββββββββββββ
β 6. Document chunks
βΌ
βββββββββββββββββββββββββββ
β vectorStoreService β
β createVectorStore() β
ββββββ¬βββββββββββββββββββββ
β 7a. Split into chunks (1000 chars, 200 overlap)
βΌ
βββββββββββββββββββββββββββ
β HuggingFace β
β all-MiniLM-L6-v2 β
β β’ Generate embeddings β
ββββββ¬βββββββββββββββββββββ
β 7b. Embeddings (384-dim vectors)
βΌ
βββββββββββββββββββββββββββ
β FAISS β
β β’ Create index β
β β’ Store vectors β
ββββββ¬βββββββββββββββββββββ
β 8. Vector store created
βΌ
βββββββββββββββββββββββββββ
β sessionService β
β β’ Store vectorStore β
β β’ Link to session β
ββββββ¬βββββββββββββββββββββ
β 9. Success response
βΌ
βββββββββββββββββββ
β Frontend β
β β’ Show success β
β β’ Display filesβ
βββββββββββββββββββ
ββββββββββββ
β User β
ββββββ¬ββββββ
β 1. Type question
βΌ
βββββββββββββββββββ
β MessageInput β
β Component β
ββββββ¬βββββββββββββ
β 2. POST /api/chat { question }
βΌ
βββββββββββββββββββββββββββ
β chatController β
β β’ Get session ID β
β β’ Extract question β
ββββββ¬βββββββββββββββββββββ
β 3. Process query
βΌ
βββββββββββββββββββββββββββ
β ragService β
β chat() β
ββββββ¬βββββββββββββββββββββ
β 4. Get session data
βΌ
βββββββββββββββββββββββββββ
β sessionService β
β β’ Retrieve vectorStore β
β β’ Get chat history β
ββββββ¬βββββββββββββββββββββ
β 5a. Embed question
βΌ
βββββββββββββββββββββββββββ
β HuggingFace β
β all-MiniLM-L6-v2 β
β β’ Convert to vector β
ββββββ¬βββββββββββββββββββββ
β 5b. Question vector
βΌ
βββββββββββββββββββββββββββ
β FAISS VectorStore β
β similaritySearch() β
β β’ Find top 3 matches β
ββββββ¬βββββββββββββββββββββ
β 6. Retrieved chunks
βΌ
βββββββββββββββββββββββββββ
β ragService β
β β’ Format context β
β β’ Build prompt β
ββββββ¬βββββββββββββββββββββ
β 7. Prompt with context
βΌ
βββββββββββββββββββββββββββ
β Google Gemini β
β gemini-2.0-flash β
β β’ Generate answer β
ββββββ¬βββββββββββββββββββββ
β 8. AI response
βΌ
βββββββββββββββββββββββββββ
β ragService β
β β’ Save to history β
ββββββ¬βββββββββββββββββββββ
β 9. Return answer
βΌ
βββββββββββββββββββ
β ChatInterface β
β β’ Display msg β
β β’ Render MD β
βββββββββββββββββββ
Frontend (React) Backend (Express.js)
βββββββββββββββββββ βββββββββββββββββββββββ
βββββββββββββββ ββββββββββββββββββββ
β App.jsx ββββββββββββββββββ Session Mgmt β
β β Session Cookieβ Middleware β
ββββββββ¬βββββββ ββββββββββββββββββββ
β
βββββββ¬ββββββββββ¬βββββββββββββ
β β β β
βΌ βΌ βΌ βΌ
ββββββββββββ βββββββ ββββββββ ββββββββββββ
βFileUploadβ βChat β βMsg β βSession β
βComponent β βIntf β βInput β βControls β
ββββββ¬ββββββ ββββ¬βββ βββββ¬βββ ββββββ¬ββββββ
β β β β
β ββββββββββ΄ββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββββββββββββ
β api.js (Axios) β
β β’ uploadFiles() β
β β’ sendChatMessage() β
β β’ getChatHistory() β
β β’ clearSession() β
ββββββββββββββ¬βββββββββββββββββββββ
β HTTP Requests
βΌ
βββββββββββββββββββββ
β Routes β
β /api/upload ββββββ uploadMiddleware (Multer)
β /api/chat β
β /api/session β
ββββββββββ¬βββββββββββ
β
ββββββββββ΄βββββββββββ
β Controllers β
β uploadController β
β chatController β
β sessionCtrl β
ββββββββββ¬βββββββββββ
β
ββββββββββ΄βββββββββββ
β Services β
β ragService βββββ Google Gemini API
β vectorStoreServiceβββββ HuggingFace
β sessionService β
β documentLoader β
βββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RAG PROCESSING PIPELINE β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Step 1: DOCUMENT INGESTION
ββββββββββββββββββββββββββββ
ββββββββββββββββ
β User Upload β
β PDF/DOCX β
ββββββββ¬ββββββββ
β
βΌ
βββββββββββββββββββββββ
β Document Loaders β
β β’ PDFLoader β
β β’ DocxLoader β
ββββββββ¬βββββββββββββββ
β Raw Text
βΌ
Step 2: TEXT CHUNKING
ββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β RecursiveCharacterSplitter β
β β’ Chunk Size: 1000 chars β
β β’ Overlap: 200 chars β
β β’ Preserves context β
ββββββββ¬βββββββββββββββββββββββ
β Text Chunks
βΌ
Step 3: EMBEDDING GENERATION
ββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β HuggingFace Embeddings β
β Model: all-MiniLM-L6-v2 β
β β’ Input: Text chunks β
β β’ Output: 384-dim vectors β
ββββββββ¬βββββββββββββββββββββββ
β Vector Embeddings
βΌ
Step 4: VECTOR STORAGE
ββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β FAISS Vector Store β
β β’ Index Type: Flat (L2) β
β β’ In-Memory Storage β
β β’ Per-Session Isolation β
ββββββββ¬βββββββββββββββββββββββ
β Vector Store Ready
βΌ
Step 5: QUERY PROCESSING
ββββββββββββββββββββββββββββ
ββββββββββββββββ
β User Query β
ββββββββ¬ββββββββ
β
βΌ
βββββββββββββββββββββββββββββββ
β Embed Query β
β (same embedding model) β
ββββββββ¬βββββββββββββββββββββββ
β Query Vector
βΌ
Step 6: SIMILARITY SEARCH
ββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β FAISS Similarity Search β
β β’ Algorithm: Cosine Sim β
β β’ Retrieve Top K=3 β
β β’ Return relevant chunks β
ββββββββ¬βββββββββββββββββββββββ
β Relevant Context
βΌ
Step 7: PROMPT CONSTRUCTION
ββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β LangChain Prompt Template β
β β’ System Instructions β
β β’ Context: Retrieved chunks β
β β’ User Question β
ββββββββ¬βββββββββββββββββββββββ
β Formatted Prompt
βΌ
Step 8: GENERATION
ββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β Google Gemini 2.0 Flash β
β β’ Temperature: Default β
β β’ Max Tokens: Auto β
β β’ Response: Text β
ββββββββ¬βββββββββββββββββββββββ
β Generated Answer
βΌ
Step 9: POST-PROCESSING
ββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β β’ Save to chat history β
β β’ Format response β
β β’ Return to user β
ββββββββ¬βββββββββββββββββββββββ
β
βΌ
ββββββββββββββββ
β User Sees β
β AI Response β
ββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SESSION LIFECYCLE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββ
β User Opens β
β Application β
ββββββββ¬ββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Session Middleware β
β β’ Check session cookie β
β β’ No session exists? β
ββββββββ¬βββββββββββββββββββ
β YES - Create New
βΌ
βββββββββββββββββββββββββββββββββββ
β sessionService.createSession() β
β β’ Generate unique ID (UUID) β
β β’ Initialize empty state: β
β - vectorStore: null β
β - chatHistory: [] β
β - uploadedFiles: [] β
β - createdAt: timestamp β
β - lastAccessedAt: timestamp β
ββββββββ¬βββββββββββββββββββββββββββ
β Session Created
βΌ
βββββββββββββββββββββββββββββββββββ
β Store in Express Session β
β β’ Set cookie: connect.sid β
β β’ Save ragSessionId β
ββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββ
β User Uploads Documents β
β β’ Files saved to uploads/ β
β β’ Vector store created β
β β’ Linked to session β
ββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββ
β User Chats (Multiple Times) β
β β’ Each message saved β
β β’ Chat history maintained β
β β’ lastAccessedAt updated β
ββββββββ¬βββββββββββββββββββββββββββ
β
βββββββββββββββ¬βββββββββββββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββ
β User Clears β β User Closes β β Session Timeout β
β Session β β Browser β β (30 min idle) β
β (Manual) β β (Cookie exp) β β (Auto cleanup) β
ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββββββ
β β β
ββββββββββββββββββ΄βββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββ
β sessionService.clearSession() β
β β’ Delete uploaded files β
β β’ Clear vector store (memory) β
β β’ Clear chat history β
β β’ Remove from sessions map β
ββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββ
β Session Destroyed β
β Resources freed β
ββββββββββββββββββββββββββββββββββ
Background Process:
βββββββββββββββββββββββββββββββββββββββββββ
β Cleanup Service (runs every 10 min) β
β β’ Check all sessions β
β β’ Find inactive > SESSION_TTL (30 min) β
β β’ Auto-clear expired sessions β
β β’ Free memory resources β
βββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DOCKER COMPOSE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββ
β Docker Network β
β rag-chatbot-net β
ββββββββββ¬ββββββββββ
β
ββββββββββββββββββ΄βββββββββββββββββ
β β
βΌ βΌ
ββββββββββββββββββββββββββ ββββββββββββββββββββββββββ
β Frontend Container β β Backend Container β
β ββββββββββββββββββββ β β βββββββββββββββββββ β
β β’ Node:20-alpine β β β’ Node:20-alpine β
β β’ Build: Vite β β β’ Runtime: Node.js β
β β’ Serve: Nginx β β β’ Express.js app β
β β’ Port: 80 ββββββββββ β’ Port: 5000 β
β β’ Health: /health β API β β’ Health: /api/health β
ββββββββββ¬ββββββββββββββββ Calls ββββββββββ¬ββββββββββββββββ
β β
β β
Serves Static βββββββ΄βββββββ
React App β β
β βΌ βΌ
β βββββββββββββββ βββββββββββββββ
User Browser β Volume: β β Volume: β
β β uploads/ β β cache/ β
β β (Persist) β β (Models) β
βββββββββββββββββββΊβββββββββββββββ βββββββββββββββ
Port 80
β
External APIs
β
ββββββββββββββββββ΄βββββββββββββββββ
β β
βΌ βΌ
ββββββββββββββββββββ ββββββββββββββββββββ
β Google Gemini β β HuggingFace β
β API (LLM) β β Transformers β
β gemini-2.0-flash β β all-MiniLM-L6-v2 β
ββββββββββββββββββββ ββββββββββββββββββββ
Backend:
- Express.js - Web framework
- LangChain - RAG orchestration
- FAISS - Vector store
- HuggingFace Transformers - Text embeddings (all-MiniLM-L6-v2)
- Google Gemini 2.0 Flash - LLM
- Multer - File upload handling
- Express Session - Session management
Frontend:
- React 18 - UI framework
- Vite - Build tool
- Tailwind CSS - Styling
- React Dropzone - File upload interface
- React Markdown - Markdown rendering
- Axios - HTTP client
rag-chatbot/
βββ backend/ # Express.js backend
β βββ src/
β β βββ controllers/ # Request handlers
β β β βββ uploadController.js
β β β βββ chatController.js
β β β βββ sessionController.js
β β βββ services/ # Business logic
β β β βββ ragService.js # RAG implementation
β β β βββ vectorStoreService.js # FAISS operations
β β β βββ sessionService.js # Session management
β β βββ routes/ # API routes
β β β βββ uploadRoutes.js
β β β βββ chatRoutes.js
β β β βββ sessionRoutes.js
β β βββ middleware/ # Express middleware
β β β βββ uploadMiddleware.js # Multer config
β β β βββ sessionMiddleware.js
β β β βββ errorHandler.js
β β βββ utils/ # Utility functions
β β β βββ documentLoader.js # PDF/DOCX loaders
β β βββ app.js # Express app entry point
β βββ uploads/ # Uploaded files storage
β βββ .env # Environment variables
β βββ Dockerfile
β βββ package.json
β
βββ frontend/ # React + Vite frontend
β βββ src/
β β βββ components/ # React components
β β β βββ ChatInterface.jsx
β β β βββ FileUpload.jsx
β β β βββ MessageInput.jsx
β β β βββ ErrorBoundary.jsx
β β βββ hooks/ # Custom hooks
β β β βββ useChat.js
β β β βββ useSession.js
β β βββ services/ # API service
β β β βββ api.js
β β βββ App.jsx # Main app component
β β βββ main.jsx # Entry point
β βββ Dockerfile
β βββ nginx.conf # Nginx configuration
β βββ package.json
β
βββ docker-compose.yml # Docker orchestration
βββ README.md # This file
# Create .env file in root directory
cat > .env << EOF
GOOGLE_API_KEY=your_google_gemini_api_key_here
SESSION_SECRET=your_random_secret_string_here
EOFdocker-compose up -d- Frontend: http://localhost
- Backend API: http://localhost:5000
- Health Check: http://localhost:5000/api/health
docker-compose down- Navigate to backend directory:
cd backend- Install dependencies:
npm install- Create
.envfile:
# Copy your Google Gemini API Key from: https://makersuite.google.com/app/apikey
GOOGLE_API_KEY=your_api_key_here
# Server Configuration
PORT=5000
NODE_ENV=development
# Session Configuration
SESSION_SECRET=your_random_secret_key_here
# Upload Limits
MAX_FILE_SIZE=10485760 # 10MB
MAX_FILES=5
# Session TTL (milliseconds) - 30 minutes
SESSION_TTL=1800000- Start the backend:
npm run devBackend will run on http://localhost:5000
- Navigate to frontend directory:
cd frontend- Install dependencies:
npm install- Create
.envfile (optional):
VITE_API_URL=http://localhost:5000- Start the frontend:
npm run devFrontend will run on http://localhost:5173
- POST
/api/upload- Upload PDF/DOCX files- Body:
multipart/form-datawithfilesfield - Response: Upload confirmation with file count and document count
- Body:
-
POST
/api/chat- Send a chat message- Body:
{ "question": "Your question here" } - Response:
{ "success": true, "data": { "answer": "AI response" } }
- Body:
-
GET
/api/chat/history- Get chat history- Response: Array of chat messages with roles and timestamps
-
GET
/api/session- Get session information- Response: Session details, uploaded files count, document count
-
DELETE
/api/session- Clear current session- Response: Confirmation and new session ID
- GET
/api/health- Health check- Response: Server status and active session count
- Click or drag-and-drop PDF/DOCX files into the upload area
- Wait for the success notification
- Supported formats:
.pdf,.docx - Limits: Max 5 files, 10MB each
- Type your question in the input field at the bottom
- Press Enter or click Send
- AI will respond based on document content
- Chat history is maintained during your session
- Click the "Clear Session" button in the header to reset
- This deletes all uploaded files and chat history
- Session also clears automatically when you close the browser
| Variable | Default | Description |
|---|---|---|
GOOGLE_API_KEY |
- | Required: Google Gemini API key |
PORT |
5000 | Backend server port |
SESSION_SECRET |
- | Required: Secret for session encryption |
MAX_FILE_SIZE |
10485760 | Max file size in bytes (10MB) |
MAX_FILES |
5 | Max number of files per upload |
SESSION_TTL |
1800000 | Session timeout in ms (30 minutes) |
NODE_ENV |
development | Environment mode |
FRONTEND_URL |
http://localhost:5173 | Frontend URL for CORS |
| Variable | Default | Description |
|---|---|---|
VITE_API_URL |
http://localhost:5000 | Backend API URL |
User uploads PDF/DOCX β Backend receives files β
Parse documents to text β Split into chunks (1000 chars, 200 overlap) β
Generate embeddings using HuggingFace (all-MiniLM-L6-v2) β
Store in FAISS vector store (in-memory, per session)
User asks question β Embed question using same model β
Search FAISS for top 3 most relevant chunks β
Combine chunks as context β
Send context + question to Google Gemini 2.0 Flash β
Generate answer based only on provided context β
Return answer to user
- Each user gets a unique session ID (stored in cookies)
- Sessions store: vector store, uploaded files, chat history
- Auto-cleanup runs every 10 minutes to remove inactive sessions
- Sessions expire after 30 minutes of inactivity
1. Upload fails with "Network Error"
- Check if backend is running on port 5000
- Verify CORS settings in
backend/src/app.js - Ensure frontend is accessing correct API URL
2. "No documents uploaded" error when chatting
- Upload documents first before asking questions
- Check if upload was successful (green notification)
- Try clearing session and re-uploading
3. Docker container fails to start
- Verify
.envfile exists with required variables - Check if ports 80 and 5000 are available
- Run
docker-compose logsto see error details
4. Slow response times
- First request is slow due to model loading
- Subsequent requests should be faster
- Consider increasing memory allocation for Docker
5. "Invalid file type" error
- Only PDF and DOCX files are supported
- Check file extension is exactly
.pdfor.docx - Ensure file is not corrupted
To support additional file formats, modify:
backend/src/utils/documentLoader.js- Add new loaderbackend/src/middleware/uploadMiddleware.js- Update file filterfrontend/src/components/FileUpload.jsx- Update accepted types
To use a different model, modify backend/src/services/ragService.js:
- Update
initializeGemini()method - Change model configuration
- Adjust prompt template if needed
To use different embeddings, modify backend/src/services/vectorStoreService.js:
- Change the
modelNameingetEmbeddings() - Options: any HuggingFace transformers model
- Set production environment variables
- Build and run with Docker Compose:
docker-compose up -d --build- Use a reverse proxy (nginx/traefik) for HTTPS
- Set
NODE_ENV=productionin backend - Configure proper session secrets
Backend:
cd backend
npm install --production
NODE_ENV=production node src/app.jsFrontend:
cd frontend
npm install
npm run build
# Serve dist/ folder with nginx or similarMIT License - feel free to use this project for personal or commercial purposes.
Contributions are welcome! Please feel free to submit a Pull Request.
If you have any questions or run into issues:
- Check the troubleshooting section above
- Review the console logs for error details
- Open an issue on GitHub
Built with β€οΈ using React, Express.js, LangChain, and Google Gemini
- Session Management:
- Each user gets a unique session ID
- Vector store and chat history tied to session
- Inactive sessions cleaned up after 30 minutes
- Page refresh triggers session cleanup
Error: "GOOGLE_API_KEY not found"
- Ensure
.envfile exists in backend directory - Check that
GOOGLE_API_KEYis set correctly
Error: "Failed to load documents"
- Verify file format is PDF or DOCX
- Check file size is under 10MB
- Ensure backend has write permissions for
uploads/folder
Error: "Model download timeout"
- First run downloads HuggingFace model (~50MB)
- Wait a few minutes or check internet connection
- Docker: Model cached in
huggingface-cachevolume
Files not uploading
- Check backend is running on port 5000
- Verify CORS settings in backend
- Check browser console for errors
Chat not working
- Ensure documents are uploaded first
- Check backend logs for errors
- Verify Gemini API key is valid
Port already in use
- Change ports in
docker-compose.yml - Or stop conflicting services
Container fails to start
- Check logs:
docker-compose logs - Ensure
.envfile exists with API key - Try rebuilding:
docker-compose up --build
- Vector Store: In-memory only, not persisted to disk
- Embeddings: Cached in Docker volume for faster restarts
- Session Storage: Express-session with memory store (use Redis for production scale)
- File Cleanup: Uploaded files cleared with session (automatic)
- Use Redis for session storage (scalability)
- Implement rate limiting on API endpoints
- Add authentication for multi-user support
- Set up monitoring (health checks, logging)
- Use HTTPS with valid SSL certificates
- Configure nginx reverse proxy
- Set resource limits in Docker (memory, CPU)
- Implement file scanning for security
MIT License - Feel free to use this project for personal or commercial purposes.
Contributions are welcome! Please feel free to submit a Pull Request.
For issues and questions:
- Create an issue on GitHub
- Check existing issues for solutions
Built with β€οΈ by Maitrek Patel