Bug Description
When memory.backend is set to "qmd" with searchMode: "search" (BM25-only, no embeddings needed), the memory_search agent tool still fails with:
No API key found for provider "openai".
No API key found for provider "google".
No API key found for provider "voyage".
The tool is marked as disabled: true and returns no results.
Expected Behavior
When the memory backend is configured as QMD with BM25-only search, the memory_search tool should route queries through QMD (qmd search) without requiring any embedding provider API keys.
Actual Behavior
The memory_search tool validates embedding provider credentials regardless of the configured memory backend. It checks for OpenAI, Google, and Voyage API keys even though QMD BM25 search does not use embeddings.
Reproduction
- Configure
openclaw.json:
{
"memory": {
"backend": "qmd",
"qmd": {
"command": "/path/to/qmd",
"searchMode": "search",
"includeDefaultMemory": true
}
}
}
- Do NOT configure any embedding provider API keys (OpenAI, Google, Voyage)
- Restart gateway
- Agent calls
memory_search tool → fails with "No API key found" errors
- Meanwhile, running
qmd search "query" via exec works perfectly
Environment
- OpenClaw: 2026.2.17
- QMD: installed via bun (
@tobilu/qmd)
- OS: macOS (arm64)
- Memory config:
backend: "qmd", searchMode: "search" (BM25-only)
Workaround
Using exec to call qmd search directly instead of the memory_search tool.
Notes
The 2026.2.17 release note mentions "Memory/Search: add FTS fallback plus query expansion" but this fix appears to be within the builtin memory backend, not the QMD integration path. The memory_search tool seems to unconditionally initialize the embedding provider validation pipeline before checking which backend is configured.
Bug Description
When
memory.backendis set to"qmd"withsearchMode: "search"(BM25-only, no embeddings needed), thememory_searchagent tool still fails with:The tool is marked as
disabled: trueand returns no results.Expected Behavior
When the memory backend is configured as QMD with BM25-only search, the
memory_searchtool should route queries through QMD (qmd search) without requiring any embedding provider API keys.Actual Behavior
The
memory_searchtool validates embedding provider credentials regardless of the configured memory backend. It checks for OpenAI, Google, and Voyage API keys even though QMD BM25 search does not use embeddings.Reproduction
openclaw.json:{ "memory": { "backend": "qmd", "qmd": { "command": "/path/to/qmd", "searchMode": "search", "includeDefaultMemory": true } } }memory_searchtool → fails with "No API key found" errorsqmd search "query"viaexecworks perfectlyEnvironment
@tobilu/qmd)backend: "qmd",searchMode: "search"(BM25-only)Workaround
Using
execto callqmd searchdirectly instead of thememory_searchtool.Notes
The 2026.2.17 release note mentions "Memory/Search: add FTS fallback plus query expansion" but this fix appears to be within the builtin memory backend, not the QMD integration path. The
memory_searchtool seems to unconditionally initialize the embedding provider validation pipeline before checking which backend is configured.