feat(memory): add experimental qmd search backend

This commit is contained in:
William Valentin
2026-02-15 19:33:43 -08:00
parent c6e3d09ecc
commit 81c97a9df1
14 changed files with 340 additions and 29 deletions
+19 -1
View File
@@ -626,6 +626,10 @@ memory:
chunk_overlap: 50 # Overlap between chunks
top_k: 5 # Top results from vector search
hybrid_weight: 0.7 # 0.0 = keyword only, 1.0 = vector only
qmd:
enabled: false # Experimental markdown-native search backend
top_k: 8 # Max QMD results
min_score: 0.15 # Minimum match score (0-1)
```
### Embedding Providers
@@ -640,7 +644,13 @@ memory:
Embeddings are indexed in the background — when memory is written, the namespace is marked dirty and re-indexed within 30 seconds. The vector index is stored in `vectors.db` alongside the session database.
When embeddings are disabled or the provider is unreachable, search falls back gracefully to keyword matching.
Search backend selection:
- `memory.embedding.enabled: true` -> hybrid keyword+vector backend
- `memory.embedding.enabled: false` and `memory.qmd.enabled: true` -> QMD markdown backend
- otherwise -> keyword-only fallback
When the selected backend is unavailable (for example embedding provider errors), search falls back gracefully to keyword matching.
### Embedding Config Fields
@@ -657,6 +667,14 @@ When embeddings are disabled or the provider is unreachable, search falls back g
| `top_k` | no | Number of vector results to return (default: `5`) |
| `hybrid_weight` | no | Vector vs keyword weight, 0.0-1.0 (default: `0.7`) |
### QMD Config Fields
| Field | Required | Description |
|-------|----------|-------------|
| `enabled` | no | Enable experimental markdown-native QMD backend (default: `false`) |
| `top_k` | no | Max QMD results returned by `memory.search` (default: `8`) |
| `min_score` | no | Minimum relevance score (0.0-1.0) for QMD matches (default: `0.15`) |
## Gateway Lock
Single-client mode for the WebSocket gateway. When enabled, only one WebSocket connection is allowed at a time. Additional connections are rejected with close code `4003`.