Technical reference
Referenz zur Speicherkonfiguration
Diese Seite führt alle Konfigurationsoptionen für die OpenClaw-Speichersuche auf. Konzeptionelle Übersichten finden Sie unter:
Funktionsweise des Speichers.
Standardmäßiges SQLite-Backend.
Local-First-Sidecar.
Suchpipeline und Optimierung.
Speicher-Sub-Agent für interaktive Sitzungen.
Sofern nicht anders angegeben, befinden sich alle Einstellungen für die Speichersuche unter agents.defaults.memorySearch in openclaw.json (oder in einer agentenspezifischen Überschreibung unter agents.list[].memorySearch).
Provider-Auswahl
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
enabled |
boolean |
true |
Aktiviert oder deaktiviert die Speichersuche |
provider |
string |
"openai" |
ID des Embedding-Adapters, etwa bedrock, deepinfra, gemini, github-copilot, local, mistral, ollama, openai, openai-compatible oder voyage; kann auch ein konfigurierter models.providers.<id> sein, dessen api auf einen Speicher-Embedding-Adapter oder eine OpenAI-kompatible Modell-API verweist |
model |
string |
Provider-Standard | Name des Embedding-Modells |
fallback |
string |
"none" |
ID des Ausweichadapters, wenn der primäre Adapter fehlschlägt |
Wenn provider nicht festgelegt ist, verwendet OpenClaw OpenAI-Embeddings. Legen Sie provider
explizit fest, um Bedrock, DeepInfra, Gemini, GitHub Copilot, Mistral, Ollama,
Voyage, ein lokales GGUF-Modell oder einen OpenAI-kompatiblen /v1/embeddings-Endpunkt zu verwenden.
Ältere Konfigurationen, die noch provider: "auto" enthalten, werden als openai aufgelöst.
Wenn provider nicht festgelegt ist, das ältere provider: "auto" vorhanden ist oder
provider: "none" absichtlich den reinen FTS-Modus auswählt, kann der Speicherabruf
weiterhin die lexikalische FTS-Rangfolge verwenden, wenn Embeddings nicht verfügbar sind.
Explizit konfigurierte nicht lokale Provider schlagen ohne Ausweichverhalten fehl. Wenn Sie memorySearch.provider
auf einen konkreten, remote gestützten Provider wie Bedrock, DeepInfra, Gemini, GitHub
Copilot, LM Studio, Mistral, Ollama, OpenAI, Voyage oder einen OpenAI-kompatiblen
benutzerdefinierten Provider festlegen und dieser Provider zur Laufzeit nicht verfügbar ist, gibt memory_search
ein Ergebnis mit dem Status „nicht verfügbar“ zurück, statt stillschweigend einen reinen FTS-Abruf zu verwenden. Korrigieren Sie die
Provider-/Authentifizierungskonfiguration, wechseln Sie zu einem erreichbaren Provider oder legen Sie
provider: "none" fest, wenn Sie bewusst einen reinen FTS-Abruf wünschen.
Benutzerdefinierte Provider-IDs
memorySearch.provider kann auf einen benutzerdefinierten models.providers.<id>-Eintrag für speicherspezifische Provider-Adapter wie ollama oder für OpenAI-kompatible Modell-APIs wie openai-responses / openai-completions verweisen. OpenClaw ermittelt den zugehörigen api-Besitzer für den Embedding-Adapter und behält zugleich die benutzerdefinierte Provider-ID für die Verarbeitung von Endpunkt, Authentifizierung und Modellpräfix bei. Dadurch können Konfigurationen mit mehreren GPUs oder Hosts Speicher-Embeddings einem bestimmten lokalen Endpunkt zuweisen:
{ models: { providers: { "ollama-5080": { api: "ollama", baseUrl: "http://gpu-box.local:11435", apiKey: "ollama-local", models: [{ id: "qwen3-embedding:0.6b", name: "Qwen3 Embedding 0.6B" }], }, }, }, agents: { defaults: { memorySearch: { provider: "ollama-5080", model: "qwen3-embedding:0.6b", }, }, },}Auflösung des API-Schlüssels
Remote-Embeddings erfordern einen API-Schlüssel. Bedrock verwendet stattdessen die standardmäßige AWS-SDK-Anmeldedatenkette (Instanzrollen, SSO, Zugriffsschlüssel oder einen Bedrock-API-Schlüssel).
| Provider | Umgebungsvariable | Konfigurationsschlüssel |
|---|---|---|
| Bedrock | AWS-Anmeldedatenkette oder AWS_BEARER_TOKEN_BEDROCK |
Kein API-Schlüssel erforderlich |
| DeepInfra | DEEPINFRA_API_KEY |
models.providers.deepinfra.apiKey |
| Gemini | GEMINI_API_KEY |
models.providers.google.apiKey |
| GitHub Copilot | COPILOT_GITHUB_TOKEN, GH_TOKEN, GITHUB_TOKEN |
Authentifizierungsprofil über Geräteanmeldung |
| Mistral | MISTRAL_API_KEY |
models.providers.mistral.apiKey |
| Ollama | OLLAMA_API_KEY (Platzhalter) |
-- |
| OpenAI | OPENAI_API_KEY |
models.providers.openai.apiKey |
| Voyage | VOYAGE_API_KEY |
models.providers.voyage.apiKey |
Konfiguration des Remote-Endpunkts
Verwenden Sie provider: "openai-compatible" für einen generischen OpenAI-kompatiblen
/v1/embeddings-Server, der die globalen OpenAI-Chat-Anmeldedaten nicht übernehmen soll.
remote.baseUrlstringBenutzerdefinierte API-Basis-URL.
remote.apiKeystringÜberschreibt den API-Schlüssel.
remote.headersobjectZusätzliche HTTP-Header (werden mit den Provider-Standardeinstellungen zusammengeführt).
{ agents: { defaults: { memorySearch: { provider: "openai-compatible", model: "text-embedding-3-small", remote: { baseUrl: "https://api.example.com/v1/", apiKey: "YOUR_KEY", }, }, }, },}Providerspezifische Konfiguration
Gemini
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
model |
string |
gemini-embedding-001 |
Unterstützt auch gemini-embedding-2-preview |
outputDimensionality |
number |
3072 |
Für Embedding 2: 768, 1536 oder 3072 |
Eingabetypen für OpenAI-kompatible Endpunkte
OpenAI-kompatible Embedding-Endpunkte können providerspezifische input_type-Anfragefelder aktivieren. Dies ist für asymmetrische Embedding-Modelle nützlich, die unterschiedliche Kennzeichnungen für Abfrage- und Dokument-Embeddings erfordern.
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
inputType |
string |
nicht festgelegt | Gemeinsamer input_type für Abfrage- und Dokument-Embeddings |
queryInputType |
string |
nicht festgelegt | input_type zur Abfragezeit; überschreibt inputType |
documentInputType |
string |
nicht festgelegt | input_type für Index/Dokument; überschreibt inputType |
{ agents: { defaults: { memorySearch: { provider: "openai-compatible", remote: { baseUrl: "https://embeddings.example/v1", apiKey: "${EMBEDDINGS_API_KEY}", }, model: "asymmetric-embedder", queryInputType: "query", documentInputType: "passage", }, }, },}Änderungen dieser Werte beeinflussen die Identität des Embedding-Caches für die Batch-Indexierung des Providers. Wenn das vorgelagerte Modell die Kennzeichnungen unterschiedlich behandelt, sollten Sie anschließend den Speicher neu indizieren.
Bedrock
Bedrock-Embedding-Konfiguration
Bedrock verwendet die standardmäßige AWS-SDK-Anmeldedatenkette sowie ein von OpenClaw geprüftes Bearer-Token, sodass keine API-Schlüssel in der Konfiguration gespeichert werden. Wenn OpenClaw auf EC2 mit einer für Bedrock aktivierten Instanzrolle ausgeführt wird, legen Sie lediglich Provider und Modell fest:
{ agents: { defaults: { memorySearch: { provider: "bedrock", model: "amazon.titan-embed-text-v2:0", }, }, },}| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
model |
string |
amazon.titan-embed-text-v2:0 |
Beliebige Bedrock-Embedding-Modell-ID |
outputDimensionality |
number |
Modellstandard | Für Titan V2: 256, 512 oder 1024 |
Unterstützte Modelle (mit Erkennung der Modellfamilie und Dimensionsstandards):
| Modell-ID | Provider | Standarddimensionen | Konfigurierbare Dimensionen |
|---|---|---|---|
amazon.titan-embed-text-v2:0 |
Amazon | 1024 | 256, 512, 1024 |
amazon.titan-embed-text-v1 |
Amazon | 1536 | -- |
amazon.titan-embed-g1-text-02 |
Amazon | 1536 | -- |
amazon.titan-embed-image-v1 |
Amazon | 1024 | -- |
amazon.nova-2-multimodal-embeddings-v1:0 |
Amazon | 1024 | 256, 384, 1024, 3072 |
cohere.embed-english-v3 |
Cohere | 1024 | -- |
cohere.embed-multilingual-v3 |
Cohere | 1024 | -- |
cohere.embed-v4:0 |
Cohere | 1536 | 256, 384, 512, 768, 1024, 1536 |
twelvelabs.marengo-embed-3-0-v1:0 |
TwelveLabs | 512 | -- |
twelvelabs.marengo-embed-2-7-v1:0 |
TwelveLabs | 1024 | -- |
Varianten mit Durchsatzsuffix (z. B. amazon.titan-embed-text-v1:2:8k) und Inferenzprofil-IDs mit Regionspräfix (z. B. us.amazon.titan-embed-text-v2:0) übernehmen die Konfiguration des Basismodells.
Region: wird in dieser Reihenfolge aufgelöst: die Überschreibung memorySearch.remote.baseUrl, die Konfiguration models.providers.amazon-bedrock.baseUrl, AWS_REGION, AWS_DEFAULT_REGION und anschließend der Standardwert us-east-1.
Authentifizierung: OpenClaw prüft zuerst auf AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY oder AWS_BEARER_TOKEN_BEDROCK und greift anschließend auf die standardmäßige Anmeldedaten-Provider-Kette des AWS SDK zurück:
- Umgebungsvariablen (
AWS_ACCESS_KEY_ID+AWS_SECRET_ACCESS_KEY), sofern nicht zusätzlichAWS_PROFILEfestgelegt ist - SSO (nur wenn SSO-Felder konfiguriert sind)
- Gemeinsame Anmeldedaten- und Konfigurationsdateien (
fromIni, einschließlichAWS_PROFILE) - Anmeldedatenprozess (
credential_processin der AWS-Konfigurationsdatei) - Webidentitätstoken-Anmeldedaten
- Anmeldedaten aus ECS- oder EC2-Instanzmetadaten
IAM-Berechtigungen: Die IAM-Rolle oder der IAM-Benutzer benötigt:
{ "Effect": "Allow", "Action": "bedrock:InvokeModel", "Resource": "*"}Beschränken Sie für minimale Berechtigungen InvokeModel auf das jeweilige Modell:
arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0Lokal (GGUF + llama.cpp)
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
local.modelPath |
string |
automatisch heruntergeladen | Pfad zur GGUF-Modelldatei |
local.modelCacheDir |
string |
node-llama-cpp-Standard | Cache-Verzeichnis für heruntergeladene Modelle |
local.contextSize |
number | "auto" |
4096 |
Größe des Kontextfensters für den Einbettungskontext. 4096 deckt typische Abschnitte (128–512 Token) ab und begrenzt zugleich den VRAM außerhalb der Modellgewichte. Reduzieren Sie den Wert auf eingeschränkten Hosts auf 1024–2048. "auto" verwendet das beim Training festgelegte Maximum des Modells – für Modelle ab 8B nicht empfohlen (Qwen3-Embedding-8B: Bis zu 40 960 Token können den VRAM-Bedarf auf ca. 32 GB erhöhen). |
Installieren Sie zuerst den offiziellen llama.cpp-Provider: openclaw plugins install @openclaw/llama-cpp-provider.
Standardmodell: embeddinggemma-300m-qat-Q8_0.gguf (ca. 0,6 GB, wird automatisch heruntergeladen). Quellcode-Checkouts erfordern weiterhin die Genehmigung des nativen Builds: pnpm approve-builds und anschließend pnpm rebuild node-llama-cpp.
Verwenden Sie die eigenständige CLI, um denselben Provider-Pfad zu überprüfen, den der Gateway verwendet:
openclaw memory status --deep --agent mainopenclaw memory index --force --agent mainNumerische Werte für local.contextSize fließen außerdem in die automatische Platzierung der GPU-Schichten durch node-llama-cpp ein, sodass die Modellgewichte und der angeforderte Einbettungskontext gemeinsam in den Speicher passen. Nachdem die Laufzeit das Modell geladen hat, meldet openclaw memory status --deep die zuletzt bekannten Angaben zu llama.cpp-Backend, Gerät, Auslagerung, angefordertem Kontext und Speicher mit Zeitstempel; eine passive Statusabfrage lädt kein Modell.
Legen Sie für lokale GGUF-Einbettungen ausdrücklich provider: "local" fest. hf:- und HTTP(S)-Modellreferenzen werden für explizite lokale Konfigurationen unterstützt (über die Modellauflösung von node-llama-cpp), ändern jedoch nicht den Standard-Provider.
Zeitüberschreitung für Inline-Einbettungen
sync.embeddingBatchTimeoutSecondsnumberÜberschreibt die Zeitüberschreitung für Inline-Einbettungsbatches während der Speicherindizierung.
Wenn kein Wert festgelegt ist, gilt der Standardwert des Providers: 600 Sekunden für lokale bzw. selbst gehostete Provider wie local, ollama und lmstudio sowie 120 Sekunden für gehostete Provider. Erhöhen Sie diesen Wert, wenn lokale CPU-gebundene Einbettungsbatches fehlerfrei funktionieren, aber langsam sind.
Indizierungsverhalten
Alle Optionen befinden sich unter memorySearch.sync, sofern nicht anders angegeben:
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
onSessionStart |
boolean |
true |
Synchronisiert den Speicherindex beim Start einer Sitzung |
onSearch |
boolean |
true |
Synchronisiert bei einer Suche verzögert, nachdem Inhaltsänderungen erkannt wurden |
watch |
boolean |
true |
Überwacht Speicherdateien (chokidar) und plant bei Änderungen eine Neuindizierung |
watchDebounceMs |
number |
1500 |
Entprellzeitfenster zum Zusammenfassen schnell aufeinanderfolgender Dateiüberwachungsereignisse |
intervalMinutes |
number |
0 |
Intervall für die regelmäßige Neuindizierung in Minuten (0 deaktiviert sie) |
sessions.postCompactionForce |
boolean |
true |
Erzwingt nach durch Compaction ausgelösten Transkriptaktualisierungen eine Neuindizierung der Sitzung |
chunking.tokensnumberChunkgröße in Tokens, die beim Aufteilen von Speicherquellen vor dem Embedding verwendet wird (Standard: 400).
chunking.overlapnumberToken-Überlappung zwischen benachbarten Abschnitten, um den Kontext nahe den Aufteilungsgrenzen zu bewahren (Standard: 80).
Konfiguration der hybriden Suche
Alle unter memorySearch.query:
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
maxResults |
number |
6 |
Maximale Anzahl vor der Einfügung zurückgegebener Treffer |
minScore |
number |
0.35 |
Mindestwert für die Relevanz, um einen Treffer aufzunehmen |
Und unter memorySearch.query.hybrid:
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
enabled |
boolean |
true |
Hybride BM25- und Vektorsuche aktivieren |
vectorWeight |
number |
0.7 |
Gewichtung für Vektorbewertungen (0–1) |
textWeight |
number |
0.3 |
Gewichtung für BM25-Bewertungen (0–1) |
candidateMultiplier |
number |
4 |
Multiplikator für die Größe des Kandidatenpools |
MMR (Diversität)
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
mmr.enabled |
boolean |
false |
MMR-Neusortierung aktivieren |
mmr.lambda |
number |
0.7 |
0 = maximale Diversität, 1 = maximale Relevanz |
Zeitlicher Abfall (Aktualität)
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
temporalDecay.enabled |
boolean |
false |
Aktualitätsverstärkung aktivieren |
temporalDecay.halfLifeDays |
number |
30 |
Bewertung halbiert sich alle N Tage |
Dauerhaft relevante Dateien (MEMORY.md, nicht datierte Dateien in memory/) unterliegen keinem zeitlichen Abfall.
Vollständiges Beispiel
{ agents: { defaults: { memorySearch: { query: { maxResults: 6, minScore: 0.35, hybrid: { vectorWeight: 0.7, textWeight: 0.3, mmr: { enabled: true, lambda: 0.7 }, temporalDecay: { enabled: true, halfLifeDays: 30 }, }, }, }, }, },}Zusätzliche Speicherpfade
| Schlüssel | Typ | Beschreibung |
|---|---|---|
extraPaths |
string[] |
Zusätzliche zu indizierende Verzeichnisse oder Dateien |
{ agents: { defaults: { memorySearch: { extraPaths: ["../team-docs", "/srv/shared-notes"], }, }, },}Pfade können absolut oder relativ zum Arbeitsbereich sein. Verzeichnisse werden rekursiv nach .md-Dateien durchsucht. Die Behandlung symbolischer Links hängt vom aktiven Backend ab: Die integrierte Engine überspringt symbolische Links, während QMD dem Verhalten des zugrunde liegenden QMD-Scanners folgt.
Verwenden Sie für die agentenspezifische, agentenübergreifende Transkriptsuche agents.list[].memorySearch.qmd.extraCollections anstelle von memory.qmd.paths. Diese zusätzlichen Sammlungen verwenden dieselbe Struktur { path, name, pattern? }, werden jedoch pro Agent zusammengeführt und können explizite gemeinsame Namen beibehalten, wenn der Pfad außerhalb des aktuellen Arbeitsbereichs liegt. Wenn derselbe aufgelöste Pfad sowohl in memory.qmd.paths als auch in memorySearch.qmd.extraCollections vorkommt, behält QMD den ersten Eintrag bei und überspringt das Duplikat.
Multimodaler Speicher (Gemini)
Indizieren Sie Bilder und Audiodateien zusammen mit Markdown mithilfe von Gemini Embedding 2:
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
multimodal.enabled |
boolean |
false |
Multimodale Indizierung aktivieren |
multimodal.modalities |
string[] |
-- | ["image"], ["audio"] oder ["all"] |
multimodal.maxFileBytes |
number |
10485760 |
Maximale Dateigröße für die Indizierung (10 MiB) |
Unterstützte Formate: .jpg, .jpeg, .png, .webp, .gif, .heic, .heif (Bilder); .mp3, .wav, .ogg, .opus, .m4a, .aac, .flac (Audio).
Embedding-Cache
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
cache.enabled |
boolean |
true |
Chunk-Embeddings in SQLite zwischenspeichern |
cache.maxEntries |
number |
nicht gesetzt | Unverbindliche Obergrenze für zwischengespeicherte Embeddings |
Verhindert, dass unveränderter Text bei einer Neuindizierung oder bei Transkriptaktualisierungen erneut eingebettet wird. Lassen Sie maxEntries für einen unbegrenzten Cache nicht gesetzt; legen Sie einen Wert fest, wenn die Begrenzung des Speicherplatzwachstums wichtiger als die maximale Neuindizierungsgeschwindigkeit ist. Wenn ein Wert festgelegt ist, werden zuerst die ältesten Einträge (nach dem Zeitpunkt der letzten Aktualisierung) entfernt, sobald der Cache den Grenzwert überschreitet.
Batch-Indizierung
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
remote.nonBatchConcurrency |
number |
4 |
Parallele Inline-Embeddings |
remote.batch.enabled |
boolean |
false |
Batch-Embedding-API aktivieren |
remote.batch.concurrency |
number |
2 |
Parallele Batch-Aufträge |
remote.batch.wait |
boolean |
true |
Auf Batch-Abschluss warten |
remote.batch.pollIntervalMs |
number |
2000 |
Abfrageintervall |
remote.batch.timeoutMinutes |
number |
60 |
Batch-Zeitüberschreitung |
Verfügbar für gemini, openai und voyage. OpenAI Batch ist bei umfangreichen nachträglichen Befüllungen üblicherweise am schnellsten und kostengünstigsten.
remote.nonBatchConcurrency steuert Inline-Embedding-Aufrufe, die von lokalen bzw. selbst gehosteten Providern und gehosteten Providern verwendet werden, wenn die Batch-APIs des Providers nicht aktiv sind. Ollama verwendet für die Indizierung ohne Batch standardmäßig 1, um kleinere lokale Hosts nicht zu überlasten; legen Sie auf leistungsfähigeren Systemen einen höheren Wert fest.
Dies ist unabhängig von sync.embeddingBatchTimeoutSeconds, das die Zeitüberschreitung für Inline-Embedding-Aufrufe steuert.
Sitzungsspeichersuche (experimentell)
Indizieren Sie Sitzungstranskripte und stellen Sie sie über memory_search bereit:
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
experimental.sessionMemory |
boolean |
false |
Sitzungsindizierung aktivieren |
sources |
string[] |
["memory"] |
"sessions" hinzufügen, um Transkripte einzubeziehen |
sync.sessions.deltaBytes |
number |
100000 |
Byte-Schwellenwert für die Neuindizierung |
sync.sessions.deltaMessages |
number |
50 |
Nachrichtenschwellenwert für die Neuindizierung |
Treffer aus Sitzungstranskripten unterliegen ebenfalls
tools.sessions.visibility. Die standardmäßige
Sichtbarkeit tree stellt nur die aktuelle Sitzung und die von ihr gestarteten Sitzungen bereit. Um
aus einer anderen Sitzung, beispielsweise einer Direktnachricht, auf eine nicht zusammenhängende, demselben Agenten zugeordnete und vom Gateway gestartete Sitzung
zuzugreifen, erweitern Sie die Sichtbarkeit bewusst auf agent (oder nur dann auf all,
wenn auch ein agentenübergreifender Zugriff erforderlich ist und die Richtlinie für die Kommunikation zwischen Agenten dies zulässt).
In den folgenden Beispielen werden diese Einstellungen unter agents.defaults eingeordnet. Sie können
entsprechende memorySearch-Einstellungen auch in einer agentenspezifischen Überschreibung
anwenden, wenn nur ein Agent Sitzungstranskripte indizieren und durchsuchen soll.
Für den Abruf vom Gateway zu Direktnachrichten innerhalb desselben Agenten:
Integriertes Backend
{ agents: { defaults: { memorySearch: { experimental: { sessionMemory: true }, sources: ["memory", "sessions"], }, }, }, tools: { sessions: { visibility: "agent" }, },}QMD-Backend
{ agents: { defaults: { memorySearch: { experimental: { sessionMemory: true }, sources: ["memory", "sessions"], }, }, }, memory: { backend: "qmd", qmd: { sessions: { enabled: true }, }, }, tools: { sessions: { visibility: "agent" }, },}Bei Verwendung von QMD exportieren agents.defaults.memorySearch.experimental.sessionMemory und
sources: ["sessions"] allein keine Transkripte nach QMD. Legen Sie zusätzlich
memory.qmd.sessions.enabled: true fest.
SQLite-Vektorbeschleunigung (sqlite-vec)
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
store.vector.enabled |
boolean |
true |
sqlite-vec für Vektorabfragen verwenden |
store.vector.extensionPath |
string |
gebündelt | sqlite-vec-Pfad überschreiben |
Wenn sqlite-vec nicht verfügbar ist, greift OpenClaw automatisch auf die prozessinterne Kosinusähnlichkeit zurück.
Indexspeicherung
Integrierte Speicherindizes befinden sich in der OpenClaw-SQLite-Datenbank des jeweiligen Agenten unter
agents/<agentId>/agent/openclaw-agent.sqlite.
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
store.fts.tokenizer |
string |
unicode61 |
FTS5-Tokenizer (unicode61 oder trigram) |
QMD-Backend-Konfiguration
Legen Sie zum Aktivieren memory.backend = "qmd" fest. Alle QMD-Einstellungen befinden sich unter memory.qmd:
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
command |
string |
qmd |
Pfad zur ausführbaren QMD-Datei; legen Sie einen absoluten Pfad fest, wenn sich der Dienst-PATH von Ihrer Shell unterscheidet |
searchMode |
string |
search |
Suchbefehl: search, vsearch, query |
rerank |
boolean |
-- | Mit searchMode: "query" und QMD 2.1+ auf false setzen, um das QMD-Reranking zu überspringen |
includeDefaultMemory |
boolean |
true |
MEMORY.md und memory/**/*.md automatisch indizieren |
paths[] |
array |
-- | Zusätzliche Pfade: { name, path, pattern? } |
sessions.enabled |
boolean |
false |
Sitzungstranskripte nach QMD exportieren |
sessions.retentionDays |
number |
-- | Aufbewahrungsdauer für Transkripte |
sessions.exportDir |
string |
-- | Exportverzeichnis |
searchMode: "search" verwendet ausschließlich lexikalische/BM25-Suche. OpenClaw führt für diesen Modus keine Prüfungen der semantischen Vektorbereitschaft und keine Pflege der QMD-Embeddings durch, auch nicht während memory status --deep; vsearch und query erfordern weiterhin die Vektorbereitschaft und Embeddings von QMD.
rerank: false ändert nur den QMD-Modus query und erfordert QMD 2.1 oder neuer. Im direkten CLI-Modus übergibt OpenClaw --no-rerank; im MCP-Modus über mcporter übergibt es rerank: false an das vereinheitlichte Abfragewerkzeug von QMD. Lassen Sie die Einstellung unausgefüllt, um das standardmäßige Reranking-Verhalten für QMD-Abfragen zu verwenden.
OpenClaw bevorzugt die aktuellen QMD-Formate für Sammlungen und MCP-Abfragen, unterstützt jedoch ältere QMD-Versionen weiterhin, indem bei Bedarf kompatible Flags für Sammlungsmuster und ältere MCP-Werkzeugnamen ausprobiert werden. Wenn QMD die Unterstützung mehrerer Sammlungsfilter meldet, werden Sammlungen derselben Quelle mit einem einzigen QMD-Prozess durchsucht; ältere QMD-Builds verwenden weiterhin den Kompatibilitätspfad pro Sammlung. „Dieselbe Quelle“ bedeutet, dass dauerhafte Speichersammlungen (Standardspeicherdateien sowie benutzerdefinierte Pfade) zusammen gruppiert werden, während Sammlungen von Sitzungstranskripten eine separate Gruppe bleiben, sodass die Quellendiversifizierung weiterhin beide Eingaben umfasst.
mcporter-Integration
Alle Einstellungen befinden sich unter memory.qmd.mcporter. QMD-Suchen werden über einen langlebigen mcporter-MCP-Daemon geleitet, anstatt für jede Abfrage qmd zu starten. Dies reduziert den Kaltstartaufwand bei größeren Modellen.
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
enabled |
boolean |
false |
QMD-Aufrufe über mcporter leiten, anstatt für jede Anfrage qmd zu starten |
serverName |
string |
qmd |
Name des mcporter-Servers, der qmd mcp mit lifecycle: keep-alive ausführt |
startDaemon |
boolean |
true |
Den mcporter-Daemon automatisch starten, wenn enabled auf true gesetzt ist |
Erfordert eine installierte und über PATH verfügbare Version von mcporter sowie einen konfigurierten mcporter-Server, der qmd mcp ausführt. Lassen Sie diese Option für einfachere lokale Einrichtungen deaktiviert, bei denen die Kosten für das Starten eines Prozesses pro Abfrage akzeptabel sind.
Aktualisierungszeitplan
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
update.interval |
string |
5m |
Aktualisierungsintervall |
update.debounceMs |
number |
15000 |
Dateiänderungen entprellen |
update.onBoot |
boolean |
true |
Beim Öffnen des langlebigen QMD-Managers aktualisieren; auf false setzen, um die sofortige Startaktualisierung zu überspringen |
update.startup |
string |
off |
Optionale QMD-Initialisierung beim Gateway-Start: off, idle oder immediate |
update.startupDelayMs |
number |
120000 |
Verzögerung vor der Aktualisierung mit startup: "idle" |
update.waitForBootSync |
boolean |
false |
Öffnen des Managers blockieren, bis seine erste Aktualisierung abgeschlossen ist |
update.embedInterval |
string |
60m |
Separates Intervall für Embeddings |
update.commandTimeoutMs |
number |
30000 |
Zeitüberschreitung für QMD-Wartungsbefehle (Sammlungen auflisten/hinzufügen) |
update.updateTimeoutMs |
number |
120000 |
Zeitüberschreitung für jeden qmd update-Durchlauf |
update.embedTimeoutMs |
number |
120000 |
Zeitüberschreitung für jeden qmd embed-Durchlauf |
Grenzwerte
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
limits.maxResults |
number |
4 |
Maximale Anzahl von Suchergebnissen |
limits.maxSnippetChars |
number |
450 |
Länge des Textausschnitts begrenzen |
limits.maxInjectedChars |
number |
2200 |
Gesamtzahl eingefügter Zeichen begrenzen |
limits.timeoutMs |
number |
4000 |
Zeitüberschreitung der Suche |
Geltungsbereich
Steuert, welche Sitzungen QMD-Suchergebnisse empfangen können. Verwendet dasselbe Schema wie session.sendPolicy:
{ memory: { qmd: { scope: { default: "deny", rules: [{ action: "allow", match: { chatType: "direct" } }], }, }, },}Der mitgelieferte Standard erlaubt nur Direktnachrichten bzw. direkte Chats und verweigert Gruppen sowie andere Kanaltypen. match.keyPrefix gleicht den normalisierten Sitzungsschlüssel ab; match.rawKeyPrefix gleicht den Rohschlüssel einschließlich agent:<id>: ab.
Quellenangaben
memory.citations gilt für alle Backends:
| Wert | Verhalten |
|---|---|
auto (Standard) |
Fußzeile Source: <path#line> in Ausschnitte aufnehmen |
on |
Fußzeile immer aufnehmen |
off |
Fußzeile weglassen (Pfad wird intern weiterhin an den Agenten übergeben) |
Wenn die QMD-Initialisierung beim Gateway-Start aktiviert ist, startet OpenClaw QMD nur für geeignete Agenten. Wenn update.onBoot auf true gesetzt und keine intervallbasierte Aktualisierungs- oder Einbettungswartung konfiguriert ist, verwendet der Startvorgang einen einmaligen Manager für die Aktualisierung beim Start und schließt ihn anschließend. Wenn ein Aktualisierungs- oder Einbettungsintervall konfiguriert ist, öffnet der Startvorgang den langlebigen QMD-Manager, damit dieser den Watcher und die Intervall-Timer verwalten kann. update.onBoot: false überspringt nur die unmittelbare Aktualisierung beim Start.
Vollständiges QMD-Beispiel
{ memory: { backend: "qmd", citations: "auto", qmd: { includeDefaultMemory: true, update: { interval: "5m", debounceMs: 15000 }, limits: { maxResults: 4, timeoutMs: 4000 }, scope: { default: "deny", rules: [{ action: "allow", match: { chatType: "direct" } }], }, paths: [{ name: "docs", path: "~/notes", pattern: "**/*.md" }], }, },}Dreaming
Dreaming wird unter plugins.entries.memory-core.config.dreaming konfiguriert, nicht unter agents.defaults.memorySearch.
Dreaming wird als ein geplanter Durchlauf ausgeführt und verwendet interne Light-/Deep-/REM-Phasen als Implementierungsdetail.
Informationen zum konzeptionellen Verhalten und zu Slash-Befehlen finden Sie unter Dreaming.
Benutzereinstellungen
| Schlüssel | Typ | Standardwert | Beschreibung |
|---|---|---|---|
enabled |
boolean |
false |
Dreaming vollständig aktivieren oder deaktivieren |
frequency |
string |
0 3 * * * |
Optionaler Cron-Zeitplan für den vollständigen Dreaming-Durchlauf |
model |
string |
Standardmodell | Optionale Modellüberschreibung für den Dream-Diary-Subagenten |
phases.deep.maxPromotedSnippetTokens |
number |
160 |
Maximale geschätzte Anzahl an Tokens, die aus jedem in MEMORY.md übernommenen Kurzzeit-Erinnerungsausschnitt beibehalten wird; Metadaten zur Herkunft bleiben sichtbar |
Beispiel
{ plugins: { entries: { "memory-core": { subagent: { allowModelOverride: true, allowedModels: ["anthropic/claude-sonnet-4-6"], }, config: { dreaming: { enabled: true, frequency: "0 3 * * *", model: "anthropic/claude-sonnet-4-6", }, }, }, }, },}