2e779d11a0
* fix: update to version 3 endpoints and adding update and delete tool * chore: removing the test md file * fix: prevent circuit breaker on client errors in Mem0 provider * chore: add telemetry for platform version * feat: add OSS mode support to Mem0 memory provider * chore: bump mem0ai dependency to >=2.0.1 in memory plugin * refactor: enhance dependency checks and embedder config in mem0 backend * refactor: adjust fact storage message for OSS mode * refactor: expand user paths, add collection recreation on dimension change for Qdrant * fix(mem0): make MEM0_USER_ID override gateway-native ids and tag writes with channel When MEM0_USER_ID was configured (env or mem0.json), the gateway-native id from kwargs (Telegram numeric id, Discord snowflake, ...) still won, so the same human ended up under different user_ids per channel and memories never merged across CLI / Telegram / Slack / Discord. Mirrors openclaw's cfg.userId pattern: configured override wins, gateway-native id is the fallback. The legacy "hermes-user" placeholder default written by the setup wizard is treated as unset to avoid silently bucketing every gateway user together. Also tag every write with metadata.channel (cli/telegram/discord/...) so the dashboard can offer per-channel filtered views without coupling identity to the channel; document the read/write filter asymmetry as intentional (reads scope to user_id only for cross-agent recall). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor: improve Mem0 memory provider backend, pagination, config, and error handling * refactor: update mem0 telemetry code, docs, and bump version * fix(mem0): make get_config_schema() return unified schema with mode-aware required flag Schema always includes api_key field so picker shows "API key / local" for both modes. In OSS mode api_key.required=False so status won't mislead. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: improve mem0 telemetry, add env var key and OSS mode detection * chore: bump mem0ai lower bound to 2.0.4 (latest SDK release) * refactor: set telemetry sample rate to 1.0 and update docs for opt‑out * fix(mem0): resolve 15 correctness, thread-safety, and resource bugs Thread safety: - Protect circuit breaker counters with _breaker_lock (race between prefetch/sync daemon threads and main thread) - Wrap sync_turn thread creation in _sync_lock; skip if previous sync is still alive after 5 s join to prevent duplicate memory ingestion - Guard _schedule_flush timer creation under _queue_lock (TOCTOU race) - Capture local `backend` reference in prefetch/sync closures so shutdown() nulling self._backend cannot crash in-flight threads Correctness: - Fix bool("false")==True for rerank param; parse string values explicitly - Guard page/top_k with max(1,...) and move int() inside try blocks - Fix fact_count=0 always in OSS mode (Memory.add returns list, not dict) - Fix prefetch() not clearing result when thread still alive after timeout - Fix atexit.register accumulating on repeated initialize() calls Backend / setup: - Handle Qdrant named-vector collections in _recreate_collection_if_dims_changed (vectors is a dict; .size access raised AttributeError, swallowed silently) - Wrap QdrantClient and psycopg2 conn/cursor in try/finally to prevent leaks - Resolve ollama_bin at top of _ensure_ollama; use it for ollama pull - Fix embedder key lookup when LLM provider has no env_var (e.g. ollama) Also: remove _telemetry_enabled cache (env var check is cheap), bump required mem0ai to >=2.0.7, minor README wording fix. * fix(mem0): fix brittle qdrant path test + add telemetry sample-rate docs - Replace generator-throw lambda with a proper def in test_qdrant_path_not_writable; use tmp_path instead of a hardcoded /nonexistent path so the test is root-safe - Add MEM0_TELEMETRY_SAMPLE_RATE to memory-providers.md (was only in the plugin README, not the user-guide docs) * revert: remove MEM0_TELEMETRY_SAMPLE_RATE from user-guide docs * refactor: remove telemetry from mem0 plugin and update documentation * fix(mem0): set stdin=DEVNULL on setup subprocess calls The TUI stdin guard (scripts/check_subprocess_stdin.py) requires every subprocess call in plugin code to set stdin= so it can't inherit the gateway's JSON-RPC stdin fd. Muzzle the docker/ollama calls in the OSS setup wizard with stdin=subprocess.DEVNULL (none need interactive input). Also covers the docker-inspect call the linter's regex misses. --------- Co-authored-by: chaithanyak42 <chaithanya.kumar42a@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
153 lines
3.7 KiB
Markdown
153 lines
3.7 KiB
Markdown
# Mem0 Memory Provider
|
|
|
|
Server-side LLM fact extraction with semantic search and hybrid multi-signal retrieval via the Mem0 Platform v3 API.
|
|
|
|
## Requirements
|
|
|
|
- `pip install mem0ai`
|
|
- Mem0 API key from [app.mem0.ai](https://app.mem0.ai)
|
|
|
|
## Setup
|
|
|
|
```bash
|
|
hermes memory setup # select "mem0"
|
|
```
|
|
|
|
Or manually:
|
|
```bash
|
|
hermes config set memory.provider mem0
|
|
echo "MEM0_API_KEY=your-key" >> ~/.hermes/.env
|
|
```
|
|
|
|
## Config
|
|
|
|
Behavioral settings live in `$HERMES_HOME/mem0.json` (set them via `hermes memory setup`). Only the secret `MEM0_API_KEY` belongs in `~/.hermes/.env`.
|
|
|
|
| Key | Default | Description |
|
|
|-----|---------|-------------|
|
|
| `mode` | `platform` | `platform` (Mem0 Cloud) or `oss` (self-hosted) |
|
|
| `user_id` | `hermes-user` | User identifier on Mem0 |
|
|
| `agent_id` | `hermes` | Agent identifier |
|
|
| `rerank` | `true` | Rerank search results for relevance (platform mode only) |
|
|
|
|
## OSS (Self-Hosted) Mode
|
|
|
|
Run Mem0 locally with your own LLM, embedder, and vector store.
|
|
|
|
### Interactive Setup
|
|
|
|
```bash
|
|
hermes memory setup
|
|
# Select "mem0" → "Open Source (self-hosted)"
|
|
# Follow prompts for LLM, embedder, and vector store
|
|
```
|
|
|
|
### Agent-Driven Setup (Flags)
|
|
|
|
```bash
|
|
hermes memory setup mem0 --mode oss \
|
|
--oss-llm openai --oss-llm-key sk-... \
|
|
--oss-vector qdrant
|
|
```
|
|
|
|
### Supported Providers
|
|
|
|
| Component | Providers |
|
|
|-----------|-----------|
|
|
| LLM | openai, ollama |
|
|
| Embedder | openai, ollama |
|
|
| Vector Store | qdrant (local/server), pgvector |
|
|
|
|
### Flags Reference
|
|
|
|
| Flag | Description |
|
|
|------|-------------|
|
|
| `--mode` | `platform` or `oss` |
|
|
| `--oss-llm` | LLM provider (default: openai) |
|
|
| `--oss-llm-key` | LLM API key |
|
|
| `--oss-embedder` | Embedder provider (default: openai) |
|
|
| `--oss-vector` | Vector store (default: qdrant) |
|
|
| `--oss-vector-path` | Qdrant local path |
|
|
| `--user-id` | User identifier |
|
|
|
|
## Switching Modes
|
|
|
|
### Platform to OSS
|
|
|
|
```bash
|
|
hermes memory setup mem0 --mode oss --oss-llm-key sk-...
|
|
```
|
|
|
|
Or edit `$HERMES_HOME/mem0.json` directly:
|
|
```json
|
|
{
|
|
"mode": "oss",
|
|
"oss": {
|
|
"llm": {"provider": "openai", "config": {"model": "gpt-5-mini"}},
|
|
"embedder": {"provider": "openai", "config": {"model": "text-embedding-3-small"}},
|
|
"vector_store": {"provider": "qdrant", "config": {"path": "~/.hermes/mem0_qdrant"}}
|
|
}
|
|
}
|
|
```
|
|
|
|
### OSS to Platform
|
|
|
|
```bash
|
|
hermes memory setup mem0 --mode platform --api-key sk-...
|
|
```
|
|
|
|
### Dry Run (preview without writing)
|
|
|
|
```bash
|
|
hermes memory setup mem0 --mode oss --oss-llm-key sk-... --dry-run
|
|
```
|
|
|
|
## Tools
|
|
|
|
| Tool | Description |
|
|
|------|-------------|
|
|
| `mem0_list` | List all stored memories (paginated) |
|
|
| `mem0_search` | Semantic search by meaning |
|
|
| `mem0_add` | Store a fact verbatim (no LLM extraction) |
|
|
| `mem0_update` | Update a memory's text by ID |
|
|
| `mem0_delete` | Delete a memory by ID |
|
|
|
|
## Troubleshooting
|
|
|
|
### "Mem0 temporarily unavailable"
|
|
|
|
Circuit breaker tripped after 5 consecutive failures. Resets after 2 minutes.
|
|
|
|
- **Platform mode**: Check API key and internet connectivity.
|
|
- **OSS mode**: Check that your vector store (qdrant/pgvector) is running.
|
|
|
|
### OSS: Qdrant connection refused
|
|
|
|
```bash
|
|
# If using local Qdrant, check the storage path is writable:
|
|
ls -la ~/.hermes/mem0_qdrant
|
|
|
|
# If using Qdrant server, check it's reachable:
|
|
curl http://localhost:6333/healthz
|
|
```
|
|
|
|
### OSS: PGVector connection refused
|
|
|
|
```bash
|
|
# Verify PostgreSQL is running and accepting connections:
|
|
pg_isready -h localhost -p 5432
|
|
```
|
|
|
|
### OSS: Ollama not reachable
|
|
|
|
```bash
|
|
# Check Ollama is running:
|
|
curl http://localhost:11434/api/tags
|
|
```
|
|
|
|
### Memories not appearing
|
|
|
|
- `mem0_add` stores verbatim (no extraction). Use `sync_turn` for LLM extraction.
|
|
- Search uses semantic matching — try broader queries.
|
|
- Check `user_id` matches between sessions (`$HERMES_HOME/mem0.json`).
|