Bug Description
After switching memorySearch.provider from openai to local (node-llama-cpp with nomic-embed-text-v1.5), the indexer detects the provider change and sets Dirty: yes, but never actually reindexes. No error or progress appears in gateway logs. The SQLite metadata remains unchanged (old OpenAI 1536-dim embeddings), and memory_search returns empty results.
Steps to Reproduce
- Start with working OpenAI embedding (
text-embedding-3-small, 1536 dims, 541 chunks indexed)
- Apply config:
{
"agents": {
"defaults": {
"memorySearch": {
"provider": "local",
"fallback": "none",
"local": {
"modelPath": "/path/to/nomic-embed-text-v1.5.Q8_0.gguf"
}
}
}
}
}
- Restart gateway
- Run
openclaw memory status
- Call
memory_search to trigger sync
- Wait several minutes, repeat
Expected Behavior
- Indexer detects provider/model change (OpenAI 1536 → local 768)
- SQLite is reset and all chunks are re-embedded with the local model
memory_search returns results using local embeddings
Actual Behavior
openclaw memory status shows:
Provider: local (requested: local) ✅
Dirty: yes (never clears)
Vector dims: 1536 (old OpenAI dims, never changes to 768)
Indexed: 63/63 files · 541 chunks (old data)
memory_search returns empty results with provider: "local"
- Gateway logs contain zero mentions of embedding, reindex, llama, or local model loading
- No errors, no warnings — completely silent failure
Additional Context
- node-llama-cpp works correctly when tested directly:
$ node --input-type=module -e "
import { getLlama } from 'node-llama-cpp';
const llama = await getLlama();
const model = await llama.loadModel({ modelPath: '...' });
const ctx = await model.createEmbeddingContext();
const vec = await ctx.getEmbeddingFor('test');
console.log('dims:', vec.vector.length); // 768 ✅
"
npx node-llama-cpp inspect gpu shows Metal available, Apple M4 Pro
- Also tried:
pnpm rebuild node-llama-cpp, deleting SQLite and forcing rebuild (0/52 forever), multiple gateway restarts
- Tested over 2 days with same result
- Reverted to OpenAI embedding (works immediately)
Environment
- OpenClaw version: 2026.2.13
- Node: v22.22.0
- OS: macOS 25.2.0 (arm64)
- Hardware: Mac mini M4 Pro, 64GB RAM
- node-llama-cpp: 3.15.1 (prebuilt binaries, Metal available)
- Model: nomic-embed-text-v1.5.Q8_0.gguf (Q8_0, 139MB)
- Memory files: 63 files, ~1MB total (largest 442KB)
Bug Description
After switching
memorySearch.providerfromopenaitolocal(node-llama-cpp with nomic-embed-text-v1.5), the indexer detects the provider change and setsDirty: yes, but never actually reindexes. No error or progress appears in gateway logs. The SQLite metadata remains unchanged (old OpenAI 1536-dim embeddings), andmemory_searchreturns empty results.Steps to Reproduce
text-embedding-3-small, 1536 dims, 541 chunks indexed){ "agents": { "defaults": { "memorySearch": { "provider": "local", "fallback": "none", "local": { "modelPath": "/path/to/nomic-embed-text-v1.5.Q8_0.gguf" } } } } }openclaw memory statusmemory_searchto trigger syncExpected Behavior
memory_searchreturns results using local embeddingsActual Behavior
openclaw memory statusshows:Provider: local (requested: local)✅Dirty: yes(never clears)Vector dims: 1536(old OpenAI dims, never changes to 768)Indexed: 63/63 files · 541 chunks(old data)memory_searchreturns empty results withprovider: "local"Additional Context
npx node-llama-cpp inspect gpushows Metal available, Apple M4 Propnpm rebuild node-llama-cpp, deleting SQLite and forcing rebuild (0/52 forever), multiple gateway restartsEnvironment