diff --git a/.env.example b/.env.example
index ceff2e9..03ac8f0 100644
--- a/.env.example
+++ b/.env.example
@@ -1,19 +1,31 @@
-# OpenAI Configuration
-OPENAI_API_KEY=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
+# LLM Provider Selection
+# Options: "openai" or "ollama"
+LLM_PROVIDER=openai
+EMBEDDER_PROVIDER=openai
+# OpenAI Configuration
+# Required when LLM_PROVIDER=openai or EMBEDDER_PROVIDER=openai
+OPENAI_API_KEY=sk-your-openai-api-key-here
+
+# Ollama Configuration
+# Required when LLM_PROVIDER=ollama or EMBEDDER_PROVIDER=ollama
+# Ollama must be running and models must be pulled
+OLLAMA_BASE_URL=http://localhost:11434
+OLLAMA_LLM_MODEL=llama3.1:8b
+OLLAMA_EMBEDDING_MODEL=nomic-embed-text
# Supabase Configuration
-SUPABASE_CONNECTION_STRING=postgresql://postgres:CzkaYmRvc26Y@172.21.0.8:5432/postgres
+SUPABASE_CONNECTION_STRING=postgresql://user:password@host:5432/database
# Neo4j Configuration
NEO4J_URI=neo4j://neo4j:7687
NEO4J_USER=neo4j
-NEO4J_PASSWORD=rH7v8bDmtqXP
+NEO4J_PASSWORD=your-neo4j-password
# API Configuration
API_HOST=0.0.0.0
API_PORT=8080
-API_KEY=mem0_01KfV2ydPmwCIDftQOfx8eXgQikkhaFHpvIJrliW
+API_KEY=your-secure-api-key-here
# MCP Server Configuration
MCP_HOST=0.0.0.0
diff --git a/README.md b/README.md
index 11a7f0b..5556185 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,10 @@ Comprehensive memory system based on mem0.ai featuring MCP server integration, R
- **REST API**: Full HTTP API for memory operations (CRUD)
- **Hybrid Storage**: Supabase (pgvector) + Neo4j (graph relationships)
- **Synchronized Operations**: Automatic sync across vector and graph stores
-- **AI-Powered**: OpenAI embeddings and LLM processing
+- **Flexible LLM Support**:
+ - ✅ OpenAI (GPT-4, GPT-3.5)
+ - ✅ Ollama (Llama 3.1, Mistral, local models)
+ - ✅ Switchable via environment variables
- **Multi-Agent Support**: User and agent-specific memory isolation
- **Graph Visualization**: Neo4j Browser for relationship exploration
- **Docker-Native**: Fully containerized with Docker Compose
@@ -42,7 +45,9 @@ Mem0 Core Library (v0.1.118)
- Docker and Docker Compose
- Existing Supabase instance (PostgreSQL with pgvector)
-- OpenAI API key
+- **Choose one:**
+ - OpenAI API key (for cloud LLM)
+ - Ollama installed (for local LLM) - [Setup Guide](docs/setup/ollama.mdx)
- Python 3.11+ (for development)
### Installation
@@ -68,9 +73,13 @@ curl http://localhost:8765/health
Create `.env` file:
+**Option 1: OpenAI (Default)**
+
```bash
-# OpenAI
-OPENAI_API_KEY=sk-...
+# LLM Configuration
+LLM_PROVIDER=openai
+EMBEDDER_PROVIDER=openai
+OPENAI_API_KEY=sk-your-key-here
# Supabase
SUPABASE_CONNECTION_STRING=postgresql://user:pass@172.21.0.12:5432/postgres
@@ -89,10 +98,43 @@ MCP_PORT=8765
# Mem0 Configuration
MEM0_COLLECTION_NAME=t6_memories
-MEM0_EMBEDDING_DIMS=1536
+MEM0_EMBEDDING_DIMS=1536 # OpenAI embeddings
MEM0_VERSION=v1.1
```
+**Option 2: Ollama (Local LLM)**
+
+```bash
+# LLM Configuration
+LLM_PROVIDER=ollama
+EMBEDDER_PROVIDER=ollama
+OLLAMA_BASE_URL=http://localhost:11434
+OLLAMA_LLM_MODEL=llama3.1:8b
+OLLAMA_EMBEDDING_MODEL=nomic-embed-text
+
+# Supabase
+SUPABASE_CONNECTION_STRING=postgresql://user:pass@172.21.0.12:5432/postgres
+
+# Neo4j
+NEO4J_URI=neo4j://neo4j:7687
+NEO4J_USER=neo4j
+NEO4J_PASSWORD=your-password
+
+# REST API
+API_KEY=your-secure-api-key
+
+# MCP Server
+MCP_HOST=0.0.0.0
+MCP_PORT=8765
+
+# Mem0 Configuration
+MEM0_COLLECTION_NAME=t6_memories
+MEM0_EMBEDDING_DIMS=768 # Ollama nomic-embed-text
+MEM0_VERSION=v1.1
+```
+
+See [Ollama Setup Guide](docs/setup/ollama.mdx) for detailed configuration.
+
## Usage
### REST API
@@ -165,12 +207,20 @@ See [n8n integration guide](docs/examples/n8n.mdx) for complete workflow example
Full documentation available at: `docs/` (Mintlify)
+### MCP Server
- [MCP Server Introduction](docs/mcp/introduction.mdx)
- [MCP Installation Guide](docs/mcp/installation.mdx)
- [MCP Tool Reference](docs/mcp/tools.mdx)
+
+### Integration Guides
- [n8n Integration Guide](docs/examples/n8n.mdx)
- [Claude Code Integration](docs/examples/claude-code.mdx)
-- [Architecture](ARCHITECTURE.md)
+
+### Setup
+- [Ollama Setup (Local LLM)](docs/setup/ollama.mdx)
+
+### Architecture
+- [Architecture Overview](ARCHITECTURE.md)
- [Project Requirements](PROJECT_REQUIREMENTS.md)
## Project Structure
@@ -200,10 +250,12 @@ t6_mem0_v2/
## Technology Stack
-- **Core**: mem0ai library
+- **Core**: mem0ai library (v0.1.118+)
- **Vector DB**: Supabase with pgvector
- **Graph DB**: Neo4j 5.x
-- **LLM**: OpenAI API (Phase 1), Ollama (Phase 2)
+- **LLM Options**:
+ - OpenAI API (GPT-4o-mini, text-embedding-3-small)
+ - Ollama (Llama 3.1, Mistral, nomic-embed-text)
- **REST API**: FastAPI
- **MCP**: Python MCP SDK
- **Container**: Docker & Docker Compose
@@ -221,11 +273,11 @@ t6_mem0_v2/
- ✅ Claude Code integration
- ✅ Docker deployment with health checks
-### Phase 2: Local LLM (Next)
-- ⏳ Local Ollama integration
-- ⏳ Model switching capabilities (OpenAI ↔ Ollama)
-- ⏳ Performance optimization
-- ⏳ Embedding model selection
+### Phase 2: Local LLM ✅ COMPLETED
+- ✅ Local Ollama integration
+- ✅ Model switching capabilities (OpenAI ↔ Ollama)
+- ✅ Embedding model selection
+- ✅ Environment-based provider configuration
### Phase 3: Advanced Features
- ⏳ Memory versioning and history
@@ -268,12 +320,15 @@ Proprietary - All rights reserved
---
-**Status**: Phase 1 Complete - Production Ready
-**Version**: 1.0.0
+**Status**: Phase 2 Complete - Production Ready with Ollama Support
+**Version**: 1.1.0
**Last Updated**: 2025-10-15
## Recent Updates
+- **2025-10-15**: ✅ Ollama integration complete - local LLM support
+- **2025-10-15**: ✅ Flexible provider switching (OpenAI ↔ Ollama)
+- **2025-10-15**: ✅ Support for multiple embedding models
- **2025-10-15**: MCP HTTP/SSE server implementation complete
- **2025-10-15**: n8n AI Agent integration tested and documented
- **2025-10-15**: Complete Mintlify documentation site
diff --git a/config.py b/config.py
index c64dda7..035c880 100644
--- a/config.py
+++ b/config.py
@@ -12,8 +12,17 @@ from pydantic import Field
class Settings(BaseSettings):
"""Application settings loaded from environment variables"""
+ # LLM Provider Selection
+ llm_provider: str = Field(default="openai", env="LLM_PROVIDER") # openai or ollama
+ embedder_provider: str = Field(default="openai", env="EMBEDDER_PROVIDER") # openai or ollama
+
# OpenAI
- openai_api_key: str = Field(..., env="OPENAI_API_KEY")
+ openai_api_key: str = Field(default="", env="OPENAI_API_KEY") # Optional if using Ollama
+
+ # Ollama
+ ollama_base_url: str = Field(default="http://localhost:11434", env="OLLAMA_BASE_URL")
+ ollama_llm_model: str = Field(default="llama3.1:8b", env="OLLAMA_LLM_MODEL")
+ ollama_embedding_model: str = Field(default="nomic-embed-text", env="OLLAMA_EMBEDDING_MODEL")
# Supabase
supabase_connection_string: str = Field(..., env="SUPABASE_CONNECTION_STRING")
@@ -60,7 +69,7 @@ def get_settings() -> Settings:
def get_mem0_config(settings: Settings) -> Dict[str, Any]:
"""
- Generate Mem0 configuration from settings
+ Generate Mem0 configuration from settings with support for OpenAI and Ollama
Args:
settings: Application settings
@@ -68,6 +77,51 @@ def get_mem0_config(settings: Settings) -> Dict[str, Any]:
Returns:
Dict containing Mem0 configuration
"""
+ # LLM Configuration - Switch between OpenAI and Ollama
+ if settings.llm_provider.lower() == "ollama":
+ llm_config = {
+ "provider": "ollama",
+ "config": {
+ "model": settings.ollama_llm_model,
+ "temperature": 0.1,
+ "max_tokens": 2000,
+ "ollama_base_url": settings.ollama_base_url
+ }
+ }
+ else: # Default to OpenAI
+ if not settings.openai_api_key:
+ raise ValueError("OPENAI_API_KEY is required when LLM_PROVIDER=openai")
+ llm_config = {
+ "provider": "openai",
+ "config": {
+ "model": "gpt-4o-mini",
+ "temperature": 0.1,
+ "max_tokens": 2000,
+ "api_key": settings.openai_api_key
+ }
+ }
+
+ # Embedder Configuration - Switch between OpenAI and Ollama
+ if settings.embedder_provider.lower() == "ollama":
+ embedder_config = {
+ "provider": "ollama",
+ "config": {
+ "model": settings.ollama_embedding_model,
+ "ollama_base_url": settings.ollama_base_url
+ }
+ }
+ else: # Default to OpenAI
+ if not settings.openai_api_key:
+ raise ValueError("OPENAI_API_KEY is required when EMBEDDER_PROVIDER=openai")
+ embedder_config = {
+ "provider": "openai",
+ "config": {
+ "model": "text-embedding-3-small",
+ "embedding_dims": settings.mem0_embedding_dims,
+ "api_key": settings.openai_api_key
+ }
+ }
+
return {
# Vector Store - Supabase
"vector_store": {
@@ -91,26 +145,11 @@ def get_mem0_config(settings: Settings) -> Dict[str, Any]:
}
},
- # LLM Provider - OpenAI
- "llm": {
- "provider": "openai",
- "config": {
- "model": "gpt-4o-mini",
- "temperature": 0.1,
- "max_tokens": 2000,
- "api_key": settings.openai_api_key
- }
- },
+ # LLM Provider - Dynamic (OpenAI or Ollama)
+ "llm": llm_config,
- # Embedder - OpenAI
- "embedder": {
- "provider": "openai",
- "config": {
- "model": "text-embedding-3-small",
- "embedding_dims": settings.mem0_embedding_dims,
- "api_key": settings.openai_api_key
- }
- },
+ # Embedder - Dynamic (OpenAI or Ollama)
+ "embedder": embedder_config,
# Version
"version": settings.mem0_version
diff --git a/docs/setup/ollama.mdx b/docs/setup/ollama.mdx
new file mode 100644
index 0000000..c4496f9
--- /dev/null
+++ b/docs/setup/ollama.mdx
@@ -0,0 +1,474 @@
+---
+title: 'Ollama Setup'
+description: 'Use local LLM models with Ollama instead of OpenAI'
+---
+
+# Ollama Setup Guide
+
+T6 Mem0 v2 supports both OpenAI and Ollama as LLM providers. Use Ollama to run completely local models without requiring OpenAI API credits.
+
+## Why Ollama?
+
+- **Cost-effective**: No API costs, run models locally
+- **Privacy**: All data stays on your infrastructure
+- **Offline capability**: Works without internet connection
+- **Model variety**: Access to Llama, Mistral, and other open-source models
+
+## Prerequisites
+
+- Docker and Docker Compose (if using containerized deployment)
+- Or Ollama installed locally
+- Sufficient RAM (8GB+ for smaller models, 16GB+ recommended)
+- GPU optional but recommended for better performance
+
+## Installation
+
+### Option 1: Ollama on Host Machine
+
+**Install Ollama:**
+
+```bash
+# Linux
+curl -fsSL https://ollama.com/install.sh | sh
+
+# macOS
+brew install ollama
+
+# Or download from https://ollama.com/download
+```
+
+**Start Ollama service:**
+
+```bash
+ollama serve
+```
+
+**Pull required models:**
+
+```bash
+# LLM model (choose one)
+ollama pull llama3.1:8b # 8B parameters, 4.7GB
+ollama pull llama3.1:70b # 70B parameters, 40GB (requires 48GB RAM)
+ollama pull mistral:7b # 7B parameters, 4.1GB
+
+# Embedding model (required)
+ollama pull nomic-embed-text # 274MB
+```
+
+### Option 2: Ollama in Docker
+
+**Add to docker-compose.yml:**
+
+```yaml
+services:
+ ollama:
+ image: ollama/ollama:latest
+ container_name: t6-ollama
+ ports:
+ - "11434:11434"
+ volumes:
+ - ollama_data:/root/.ollama
+ networks:
+ - localai
+ restart: unless-stopped
+
+volumes:
+ ollama_data:
+```
+
+**Pull models inside container:**
+
+```bash
+docker exec -it t6-ollama ollama pull llama3.1:8b
+docker exec -it t6-ollama ollama pull nomic-embed-text
+```
+
+## Configuration
+
+### Environment Variables
+
+Update your `.env` file:
+
+```bash
+# Switch to Ollama
+LLM_PROVIDER=ollama
+EMBEDDER_PROVIDER=ollama
+
+# Ollama configuration
+OLLAMA_BASE_URL=http://localhost:11434
+OLLAMA_LLM_MODEL=llama3.1:8b
+OLLAMA_EMBEDDING_MODEL=nomic-embed-text
+
+# OpenAI key no longer required
+# OPENAI_API_KEY= # Can be left empty
+```
+
+### Docker Network Configuration
+
+If running Ollama in Docker on the same network as mem0:
+
+```bash
+# Find Ollama container IP
+docker inspect t6-ollama --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
+
+# Update .env
+OLLAMA_BASE_URL=http://172.21.0.15:11434 # Use actual container IP
+```
+
+Or use Docker service name:
+
+```bash
+OLLAMA_BASE_URL=http://ollama:11434 # If on same Docker network
+```
+
+## Model Selection
+
+### LLM Models
+
+| Model | Size | RAM Required | Use Case |
+|-------|------|--------------|----------|
+| `llama3.1:8b` | 4.7GB | 8GB | General purpose, fast |
+| `llama3.1:70b` | 40GB | 48GB | High quality responses |
+| `mistral:7b` | 4.1GB | 8GB | Fast, efficient |
+| `codellama:7b` | 3.8GB | 8GB | Code generation |
+| `phi3:3.8b` | 2.3GB | 4GB | Smallest viable model |
+
+### Embedding Models
+
+| Model | Size | Dimensions | Use Case |
+|-------|------|------------|----------|
+| `nomic-embed-text` | 274MB | 768 | Recommended, fast |
+| `mxbai-embed-large` | 669MB | 1024 | Higher quality |
+| `all-minilm` | 46MB | 384 | Smallest option |
+
+**Important**: Update `MEM0_EMBEDDING_DIMS` to match your embedding model:
+
+```bash
+# For nomic-embed-text
+MEM0_EMBEDDING_DIMS=768
+
+# For mxbai-embed-large
+MEM0_EMBEDDING_DIMS=1024
+
+# For all-minilm
+MEM0_EMBEDDING_DIMS=384
+```
+
+## Switching Between OpenAI and Ollama
+
+### Full Ollama Configuration
+
+```bash
+LLM_PROVIDER=ollama
+EMBEDDER_PROVIDER=ollama
+OLLAMA_BASE_URL=http://localhost:11434
+OLLAMA_LLM_MODEL=llama3.1:8b
+OLLAMA_EMBEDDING_MODEL=nomic-embed-text
+MEM0_EMBEDDING_DIMS=768
+```
+
+### Hybrid Configuration
+
+Use Ollama for LLM but OpenAI for embeddings:
+
+```bash
+LLM_PROVIDER=ollama
+EMBEDDER_PROVIDER=openai
+OLLAMA_BASE_URL=http://localhost:11434
+OLLAMA_LLM_MODEL=llama3.1:8b
+OPENAI_API_KEY=sk-your-key
+MEM0_EMBEDDING_DIMS=1536 # OpenAI dimensions
+```
+
+Or use OpenAI for LLM but Ollama for embeddings:
+
+```bash
+LLM_PROVIDER=openai
+EMBEDDER_PROVIDER=ollama
+OPENAI_API_KEY=sk-your-key
+OLLAMA_BASE_URL=http://localhost:11434
+OLLAMA_EMBEDDING_MODEL=nomic-embed-text
+MEM0_EMBEDDING_DIMS=768 # Ollama dimensions
+```
+
+### Back to OpenAI
+
+```bash
+LLM_PROVIDER=openai
+EMBEDDER_PROVIDER=openai
+OPENAI_API_KEY=sk-your-key
+MEM0_EMBEDDING_DIMS=1536
+```
+
+## Deployment
+
+### Docker Deployment with Ollama
+
+**Complete docker-compose.yml:**
+
+```yaml
+version: '3.8'
+
+services:
+ ollama:
+ image: ollama/ollama:latest
+ container_name: t6-ollama
+ ports:
+ - "11434:11434"
+ volumes:
+ - ollama_data:/root/.ollama
+ networks:
+ - localai
+ restart: unless-stopped
+
+ mcp-server:
+ build:
+ context: .
+ dockerfile: docker/Dockerfile.mcp
+ container_name: t6-mem0-mcp
+ restart: unless-stopped
+ ports:
+ - "8765:8765"
+ environment:
+ - LLM_PROVIDER=ollama
+ - EMBEDDER_PROVIDER=ollama
+ - OLLAMA_BASE_URL=http://ollama:11434
+ - OLLAMA_LLM_MODEL=llama3.1:8b
+ - OLLAMA_EMBEDDING_MODEL=nomic-embed-text
+ - MEM0_EMBEDDING_DIMS=768
+ - SUPABASE_CONNECTION_STRING=${SUPABASE_CONNECTION_STRING}
+ - NEO4J_URI=neo4j://neo4j:7687
+ - NEO4J_USER=${NEO4J_USER}
+ - NEO4J_PASSWORD=${NEO4J_PASSWORD}
+ depends_on:
+ - ollama
+ - neo4j
+ networks:
+ - localai
+
+ neo4j:
+ image: neo4j:5.26.0
+ container_name: t6-neo4j
+ ports:
+ - "7474:7474"
+ - "7687:7687"
+ environment:
+ - NEO4J_AUTH=neo4j/${NEO4J_PASSWORD}
+ volumes:
+ - neo4j_data:/data
+ networks:
+ - localai
+
+volumes:
+ ollama_data:
+ neo4j_data:
+
+networks:
+ localai:
+ external: true
+```
+
+**Startup sequence:**
+
+```bash
+# Start services
+docker compose up -d
+
+# Pull models
+docker exec -it t6-ollama ollama pull llama3.1:8b
+docker exec -it t6-ollama ollama pull nomic-embed-text
+
+# Verify Ollama is working
+curl http://localhost:11434/api/tags
+
+# Restart mem0 services to pick up models
+docker compose restart mcp-server
+```
+
+## Testing
+
+### Test Ollama Connection
+
+```bash
+# List available models
+curl http://localhost:11434/api/tags
+
+# Test generation
+curl http://localhost:11434/api/generate -d '{
+ "model": "llama3.1:8b",
+ "prompt": "Hello, world!",
+ "stream": false
+}'
+```
+
+### Test Memory Operations
+
+```bash
+# Add memory via REST API
+curl -X POST http://localhost:8080/v1/memories/ \
+ -H "Authorization: Bearer YOUR_API_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "messages": [
+ {"role": "user", "content": "I love local AI models"},
+ {"role": "assistant", "content": "Noted!"}
+ ],
+ "user_id": "test_user"
+ }'
+
+# Check logs for Ollama usage
+docker logs t6-mem0-mcp --tail 50
+```
+
+## Performance Tuning
+
+### GPU Acceleration
+
+If you have an NVIDIA GPU:
+
+```yaml
+ollama:
+ image: ollama/ollama:latest
+ deploy:
+ resources:
+ reservations:
+ devices:
+ - driver: nvidia
+ count: all
+ capabilities: [gpu]
+```
+
+### Model Caching
+
+Models are cached in `ollama_data` volume. To clear cache:
+
+```bash
+docker volume rm ollama_data
+```
+
+### Concurrent Requests
+
+Ollama handles concurrent requests by default. For high load:
+
+```yaml
+ollama:
+ environment:
+ - OLLAMA_NUM_PARALLEL=4 # Number of parallel requests
+ - OLLAMA_MAX_LOADED_MODELS=2 # Keep models in memory
+```
+
+## Troubleshooting
+
+### Ollama Not Responding
+
+```bash
+# Check Ollama status
+curl http://localhost:11434/api/tags
+
+# Check logs
+docker logs t6-ollama
+
+# Restart Ollama
+docker restart t6-ollama
+```
+
+### Model Not Found
+
+```bash
+# List pulled models
+docker exec -it t6-ollama ollama list
+
+# Pull missing model
+docker exec -it t6-ollama ollama pull llama3.1:8b
+```
+
+### Out of Memory
+
+Try a smaller model:
+
+```bash
+# Switch to smaller model in .env
+OLLAMA_LLM_MODEL=phi3:3.8b
+
+# Or use quantized version
+OLLAMA_LLM_MODEL=llama3.1:8b-q4_0 # 4-bit quantization
+```
+
+### Slow Response Times
+
+- Use GPU acceleration
+- Use smaller models (phi3:3.8b)
+- Reduce concurrent requests
+- Check system resources (RAM, CPU)
+
+### Connection Refused
+
+If mem0 can't connect to Ollama:
+
+```bash
+# Test from mem0 container
+docker exec -it t6-mem0-mcp curl http://ollama:11434/api/tags
+
+# Check both containers on same network
+docker network inspect localai
+```
+
+## Migration from OpenAI
+
+### 1. Pull Models
+
+```bash
+ollama pull llama3.1:8b
+ollama pull nomic-embed-text
+```
+
+### 2. Update Configuration
+
+```bash
+# Backup current .env
+cp .env .env.openai.backup
+
+# Update .env
+LLM_PROVIDER=ollama
+EMBEDDER_PROVIDER=ollama
+OLLAMA_BASE_URL=http://localhost:11434
+OLLAMA_LLM_MODEL=llama3.1:8b
+OLLAMA_EMBEDDING_MODEL=nomic-embed-text
+MEM0_EMBEDDING_DIMS=768 # Changed from 1536
+```
+
+### 3. Clear Existing Embeddings (Important!)
+
+
+When switching embedding models, you must clear existing embeddings as dimensions changed from 1536 (OpenAI) to 768 (Ollama).
+
+
+```bash
+# Clear Supabase embeddings
+psql $SUPABASE_CONNECTION_STRING -c "DELETE FROM t6_memories;"
+
+# Clear Neo4j graph
+docker exec -it t6-neo4j cypher-shell -u neo4j -p YOUR_PASSWORD \
+ "MATCH (n) DETACH DELETE n"
+```
+
+### 4. Restart Services
+
+```bash
+docker compose restart
+```
+
+### 5. Test
+
+Add new memories and verify they work with Ollama.
+
+## Next Steps
+
+
+
+ Deploy with Ollama in Docker
+
+
+ Compare OpenAI vs Ollama performance
+
+