Naar hoofdinhoud gaan
QMD is een local-first zoek-sidecar die naast OpenClaw draait. Het combineert BM25, vectorzoekopdrachten en reranking in één binary, en kan inhoud indexeren buiten je werkruimtegeheugenbestanden.

Wat het toevoegt bovenop builtin

  • Reranking en query-uitbreiding voor betere recall.
  • Extra mappen indexeren — projectdocumentatie, teamnotities, alles op schijf.
  • Sessietranscripten indexeren — haal eerdere gesprekken terug.
  • Volledig lokaal — draait met de officiële llama.cpp provider-plugin en downloadt GGUF-modellen automatisch.
  • Automatische fallback — als QMD niet beschikbaar is, valt OpenClaw naadloos terug op de builtin engine.

Aan de slag

Vereisten

  • Installeer QMD: npm install -g @tobilu/qmd of bun install -g @tobilu/qmd
  • SQLite-build die extensies toestaat (brew install sqlite op macOS).
  • QMD moet op de PATH van de gateway staan.
  • macOS en Linux werken direct. Windows wordt het best ondersteund via WSL2.

Inschakelen

{
  memory: {
    backend: "qmd",
  },
}
OpenClaw maakt een zelfstandige QMD-home aan onder ~/.openclaw/agents/<agentId>/qmd/ en beheert de sidecar-levenscyclus automatisch — collections, updates en embedding-runs worden voor je afgehandeld. Het geeft de voorkeur aan de huidige QMD-collection- en MCP-queryvormen, maar valt indien nodig nog steeds terug op alternatieve collection-patroonflags en oudere MCP-toolnamen. Reconciliatie tijdens het opstarten maakt ook verouderde beheerde collections opnieuw aan volgens hun canonieke patronen wanneer een oudere QMD-collection met dezelfde naam nog aanwezig is.

Hoe de sidecar werkt

  • OpenClaw maakt collections op basis van je werkruimtegeheugenbestanden en eventuele geconfigureerde memory.qmd.paths, en voert daarna qmd update uit wanneer de QMD-manager wordt geopend en periodiek daarna (standaard elke 5 minuten). Deze vernieuwingen lopen via QMD-subprocessen, niet via een in-process bestandssysteemcrawl. Semantische modi voeren ook qmd embed uit.
  • De standaardwerkruimtecollection volgt MEMORY.md plus de memory/-boom. Kleine-letter memory.md wordt niet als rootgeheugenbestand geïndexeerd.
  • QMD’s eigen scanner negeert verborgen paden en veelgebruikte afhankelijkheids-/buildmappen zoals .git, .cache, node_modules, vendor, dist en build. Gateway-opstart initialiseert QMD standaard niet, zodat een koude start voorkomt dat de geheugenruntime wordt geïmporteerd of de langlevende watcher wordt aangemaakt voordat geheugen voor het eerst wordt gebruikt.
  • Als je QMD toch bij Gateway-start wilt initialiseren, stel dan memory.qmd.update.startup in op idle of immediate. Met memory.qmd.update.onBoot: true voert het opstarten de eerste vernieuwing uit. Met onBoot: false slaat het opstarten die directe vernieuwing over, maar opent het nog steeds de langlevende manager wanneer update- of embed-intervallen zijn geconfigureerd, zodat QMD zijn reguliere watcher en timers kan beheren.
  • Zoekopdrachten gebruiken de geconfigureerde searchMode (standaard: search; ondersteunt ook vsearch en query). search is alleen BM25, dus OpenClaw slaat gereedheidsprobes voor semantische vectoren en embedding-onderhoud over in die modus. Als een modus faalt, probeert OpenClaw het opnieuw met qmd query.
  • Wanneer searchMode query is, stel memory.qmd.rerank in op false om QMD’s hybride querypad zonder reranker te gebruiken. OpenClaw geeft --no-rerank door aan het directe QMD-CLI-pad en rerank: false aan QMD’s MCP-querytool. Deze optie vereist QMD 2.1 of nieuwer.
  • Met QMD-releases die filters voor meerdere collections adverteren, groepeert OpenClaw collections met dezelfde bron in één QMD-zoekaanroep. Oudere QMD-releases behouden de compatibele fallback per collection.
  • Als QMD volledig faalt, valt OpenClaw terug op de builtin SQLite-engine. Herhaalde pogingen tijdens chatbeurten wachten kort na een openingsfout, zodat een ontbrekende binary of kapotte sidecar-afhankelijkheid geen retrystorm veroorzaakt; openclaw memory status en eenmalige CLI-probes controleren QMD nog steeds direct opnieuw.
De eerste zoekopdracht kan traag zijn — QMD downloadt GGUF-modellen (~2 GB) voor reranking en query-uitbreiding bij de eerste qmd query-run.

Zoekprestaties en compatibiliteit

OpenClaw houdt het QMD-zoekpad compatibel met zowel huidige als oudere QMD-installaties. Bij het opstarten controleert OpenClaw de helptekst van de geïnstalleerde QMD één keer per manager. Als de binary ondersteuning adverteert voor meerdere collection-filters, doorzoekt OpenClaw alle collections met dezelfde bron met één opdracht:
qmd search "router notes" --json -n 10 -c memory-root-main -c memory-dir-main
Dit voorkomt dat voor elke durable-memory-collection een QMD-subproces wordt gestart. Collections met sessietranscripten blijven in hun eigen brongroep, zodat gemengde memory + sessions-zoekopdrachten nog steeds input voor de resultaatdiversificatie uit beide bronnen geven. Oudere QMD-builds accepteren slechts één collection-filter. Wanneer OpenClaw zo’n build detecteert, behoudt het het compatibiliteitspad en doorzoekt het elke collection afzonderlijk voordat resultaten worden samengevoegd en ontdubbeld. Om het geïnstalleerde contract handmatig te inspecteren, voer je uit:
qmd --help | grep -i collection
De huidige QMD-help zegt dat collection-filters één of meer collections kunnen targeten. Oudere help beschrijft meestal één collection.

Model-overrides

QMD-modelomgevingsvariabelen worden ongewijzigd doorgegeven vanuit het Gateway-proces, zodat je QMD globaal kunt afstellen zonder nieuwe OpenClaw-config toe te voegen:
export QMD_EMBED_MODEL="hf:Qwen/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf"
export QMD_RERANK_MODEL="/absolute/path/to/reranker.gguf"
export QMD_GENERATE_MODEL="/absolute/path/to/generator.gguf"
Voer embeddings opnieuw uit nadat je het embeddingmodel hebt gewijzigd, zodat de index overeenkomt met de nieuwe vectorruimte.

Extra paden indexeren

Wijs QMD naar aanvullende mappen om ze doorzoekbaar te maken:
{
  memory: {
    backend: "qmd",
    qmd: {
      paths: [{ name: "docs", path: "~/notes", pattern: "**/*.md" }],
    },
  },
}
Snippets uit extra paden verschijnen als qmd/<collection>/<relative-path> in zoekresultaten. memory_get begrijpt dit prefix en leest uit de juiste collection-root.

Sessietranscripten indexeren

Schakel sessie-indexering in om eerdere gesprekken terug te halen. QMD heeft zowel de algemene sessiebron memorySearch als de QMD-transcriptexporter nodig:
{
  agents: {
    defaults: {
      memorySearch: {
        experimental: { sessionMemory: true },
        sources: ["memory", "sessions"],
      },
    },
  },
  memory: {
    backend: "qmd",
    qmd: {
      sessions: { enabled: true },
    },
  },
}
Transcripten worden geëxporteerd als opgeschoonde Gebruiker-/Assistent-beurten naar een toegewijde QMD-collection onder ~/.openclaw/agents/<id>/qmd/sessions/. Alleen memorySearch.experimental.sessionMemory instellen exporteert geen transcripten naar QMD. Sessietreffers worden nog steeds gefilterd door tools.sessions.visibility. De standaardzichtbaarheid tree toont geen ongerelateerde sessies van dezelfde agent. Als een door de Gateway verzonden sessie terughaalbaar moet zijn vanuit een afzonderlijke DM-sessie, stel dan bewust tools.sessions.visibility: "agent" in.

Zoekbereik

Standaard worden QMD-zoekresultaten weergegeven in directe en kanaalsessies (niet in groepen). Configureer memory.qmd.scope om dit te wijzigen:
{
  memory: {
    qmd: {
      scope: {
        default: "deny",
        rules: [{ action: "allow", match: { chatType: "direct" } }],
      },
    },
  },
}
Wanneer scope een zoekopdracht weigert, logt OpenClaw een waarschuwing met het afgeleide kanaal en chattype, zodat lege resultaten makkelijker te debuggen zijn.

Citaten

Wanneer memory.citations auto of on is, bevatten zoeksnippets een footer Source: <path#line>. Stel memory.citations = "off" in om de footer weg te laten terwijl het pad intern nog steeds aan de agent wordt doorgegeven.

Wanneer gebruiken

Kies QMD wanneer je nodig hebt:
  • Reranking voor resultaten van hogere kwaliteit.
  • Projectdocumentatie of notities buiten de werkruimte doorzoeken.
  • Eerdere sessiegesprekken terughalen.
  • Volledig lokale zoekfunctie zonder API-sleutels.
Voor eenvoudigere setups werkt de builtin engine goed zonder extra afhankelijkheden.

Probleemoplossing

QMD niet gevonden? Zorg dat de binary op de PATH van de Gateway staat. Als OpenClaw als service draait, maak dan een symlink: sudo ln -s ~/.bun/bin/qmd /usr/local/bin/qmd. Als qmd --version in je shell werkt maar OpenClaw nog steeds spawn qmd ENOENT meldt, heeft het Gateway-proces waarschijnlijk een andere PATH dan je interactieve shell. Pin de binary expliciet:
{
  memory: {
    backend: "qmd",
    qmd: {
      command: "/absolute/path/to/qmd",
    },
  },
}
Gebruik command -v qmd in de omgeving waar QMD is geïnstalleerd, en controleer daarna opnieuw met openclaw memory status --deep. Eerste zoekopdracht erg traag? QMD downloadt GGUF-modellen bij het eerste gebruik. Warm vooraf op met qmd query "test" met dezelfde XDG-mappen die OpenClaw gebruikt. Veel QMD-subprocessen tijdens zoeken? Werk QMD bij als dat kan. OpenClaw gebruikt slechts één proces voor multi-collection-zoekopdrachten met dezelfde bron wanneer de geïnstalleerde QMD ondersteuning adverteert voor meerdere -c-filters; anders behoudt het de oudere fallback per collection voor correctheid. BM25-only QMD probeert nog steeds llama.cpp te bouwen? Stel memory.qmd.searchMode = "search" in. OpenClaw behandelt die modus als alleen lexicaal, voert geen QMD-vectorstatusprobes of embedding-onderhoud uit, en laat semantische gereedheidscontroles over aan vsearch- of query-setups. Zoekopdracht time-out? Verhoog memory.qmd.limits.timeoutMs (standaard: 4000 ms). Stel in op 120000 voor langzamere hardware. Lege resultaten in groepschats? Controleer memory.qmd.scope — de standaard staat alleen directe en kanaalsessies toe. Rootgeheugenzoekopdracht is plotseling te breed geworden? Start de Gateway opnieuw of wacht op de volgende opstartreconciliatie. OpenClaw maakt verouderde beheerde collections opnieuw aan volgens canonieke MEMORY.md- en memory/-patronen wanneer het een conflict met dezelfde naam detecteert. Werkruimte-zichtbare tijdelijke repo’s veroorzaken ENAMETOOLONG of kapotte indexering? QMD-traversal volgt momenteel het gedrag van de onderliggende QMD-scanner in plaats van OpenClaw’s builtin symlink-regels. Bewaar tijdelijke monorepo-checkouts onder verborgen mappen zoals .tmp/ of buiten geïndexeerde QMD-roots totdat QMD cyclusveilige traversal of expliciete uitsluitingsopties biedt.

Configuratie

Voor het volledige config-oppervlak (memory.qmd.*), zoekmodi, update-intervallen, scope-regels en alle andere instellingen, zie de referentie voor geheugenconfiguratie.

Gerelateerd