Przegląd pamięci
Jak działa pamięć.
Wbudowany silnik
Domyślny backend SQLite.
Silnik QMD
Lokalny sidecar.
Wyszukiwanie pamięci
Potok wyszukiwania i strojenie.
Active Memory
Podagent pamięci dla sesji interaktywnych.
agents.defaults.memorySearch w openclaw.json, chyba że zaznaczono inaczej.
Jeśli szukasz przełącznika funkcji Active Memory i konfiguracji podagenta, znajduje się ona w
plugins.entries.active-memory, a nie w memorySearch.Active Memory używa modelu dwóch bramek:- Plugin musi być włączony i wskazywać bieżący identyfikator agenta
- żądanie musi być kwalifikującą się interaktywną, trwałą sesją czatu
Wybór dostawcy
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
provider | string | "openai" | Identyfikator adaptera osadzania, taki jak bedrock, deepinfra, gemini, github-copilot, local, mistral, ollama, openai, openai-compatible lub voyage; może też być skonfigurowanym models.providers.<id>, którego api wskazuje adapter osadzania pamięci lub API modelu zgodne z OpenAI |
model | string | domyślny dostawcy | Nazwa modelu osadzania |
fallback | string | "none" | Identyfikator adaptera awaryjnego używany, gdy podstawowy zawiedzie |
enabled | boolean | true | Włącz lub wyłącz wyszukiwanie pamięci |
provider nie jest ustawiony, OpenClaw używa osadzeń OpenAI. Ustaw provider
jawnie, aby użyć Gemini, Voyage, Mistral, DeepInfra, Bedrock, GitHub Copilot,
Ollama, lokalnego modelu GGUF albo zgodnego z OpenAI punktu końcowego /v1/embeddings.
Starsze konfiguracje, które nadal zawierają provider: "auto", są rozwiązywane jako openai.
Gdy provider nie jest ustawiony, obecne jest starsze provider: "auto" albo
provider: "none" celowo wybiera tryb tylko FTS, przywoływanie pamięci nadal może
używać leksykalnego rankingu FTS, gdy osadzenia są niedostępne.
Jawni dostawcy nielokalni zawodzą w trybie zamkniętym. Jeśli ustawisz memorySearch.provider na
konkretnego dostawcę opartego na zdalnym backendzie, takiego jak OpenAI, Gemini, Voyage, Mistral,
Bedrock, GitHub Copilot, DeepInfra, Ollama, LM Studio albo zgodnego z OpenAI
dostawcę niestandardowego, i ten dostawca jest niedostępny w czasie działania, memory_search
zwraca wynik niedostępności zamiast po cichu używać przywoływania tylko FTS. Napraw
konfigurację dostawcy/uwierzytelniania, przełącz się na osiągalnego dostawcę albo ustaw
provider: "none", jeśli chcesz celowego przywoływania tylko FTS.
Niestandardowe identyfikatory dostawców
memorySearch.provider może wskazywać niestandardowy wpis models.providers.<id> dla adapterów dostawców specyficznych dla pamięci, takich jak ollama, albo dla zgodnych z OpenAI API modeli, takich jak openai-responses / openai-completions. OpenClaw rozwiązuje właściciela api tego dostawcy dla adaptera osadzania, zachowując jednocześnie niestandardowy identyfikator dostawcy na potrzeby obsługi punktu końcowego, uwierzytelniania i prefiksu modelu. Dzięki temu konfiguracje z wieloma GPU lub wieloma hostami mogą przeznaczyć osadzenia pamięci dla konkretnego lokalnego punktu końcowego:
Rozwiązywanie klucza API
Zdalne osadzenia wymagają klucza API. Bedrock używa zamiast tego domyślnego łańcucha poświadczeń AWS SDK (role instancji, SSO, klucze dostępu).| Dostawca | Zmienna środowiskowa | Klucz konfiguracji |
|---|---|---|
| Bedrock | Łańcuch poświadczeń AWS | Klucz API nie jest potrzebny |
| 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 | Profil uwierzytelniania przez logowanie urządzenia |
| Mistral | MISTRAL_API_KEY | models.providers.mistral.apiKey |
| Ollama | OLLAMA_API_KEY (symbol zastępczy) | — |
| OpenAI | OPENAI_API_KEY | models.providers.openai.apiKey |
| Voyage | VOYAGE_API_KEY | models.providers.voyage.apiKey |
OAuth Codex obejmuje tylko czat/uzupełnienia i nie spełnia wymagań żądań osadzeń.
Konfiguracja zdalnego punktu końcowego
Użyjprovider: "openai-compatible" dla ogólnego zgodnego z OpenAI
serwera /v1/embeddings, który nie powinien dziedziczyć globalnych poświadczeń czatu OpenAI.
Niestandardowy bazowy URL API.
Zastąp klucz API.
Dodatkowe nagłówki HTTP (scalane z domyślnymi ustawieniami dostawcy).
Konfiguracja specyficzna dla dostawcy
Gemini
Gemini
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
model | string | gemini-embedding-001 | Obsługuje też gemini-embedding-2-preview |
outputDimensionality | number | 3072 | Dla Embedding 2: 768, 1536 albo 3072 |
Typy wejścia zgodne z OpenAI
Typy wejścia zgodne z OpenAI
Zgodne z OpenAI punkty końcowe osadzania mogą włączyć specyficzne dla dostawcy pola żądania
Zmiana tych wartości wpływa na tożsamość pamięci podręcznej osadzeń dla indeksowania wsadowego dostawcy i powinna być wykonana razem z ponownym indeksowaniem pamięci, gdy model upstream traktuje etykiety inaczej.
input_type. Jest to przydatne dla asymetrycznych modeli osadzania, które wymagają różnych etykiet dla osadzeń zapytań i dokumentów.| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
inputType | string | nieustawione | Wspólne input_type dla osadzeń zapytań i dokumentów |
queryInputType | string | nieustawione | input_type w czasie zapytania; zastępuje inputType |
documentInputType | string | nieustawione | input_type indeksu/dokumentu; zastępuje inputType |
Bedrock
Bedrock
Konfiguracja osadzeń Bedrock
Bedrock używa domyślnego łańcucha poświadczeń AWS SDK — klucze API nie są potrzebne. Jeśli OpenClaw działa na EC2 z rolą instancji z włączonym Bedrock, wystarczy ustawić dostawcę i model:| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
model | string | amazon.titan-embed-text-v2:0 | Dowolny identyfikator modelu osadzania Bedrock |
outputDimensionality | number | domyślna modelu | Dla Titan V2: 256, 512 albo 1024 |
| Identyfikator modelu | Dostawca | Domyślne wymiary | Konfigurowalne wymiary |
|---|---|---|---|
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-1536 |
twelvelabs.marengo-embed-3-0-v1:0 | TwelveLabs | 512 | — |
twelvelabs.marengo-embed-2-7-v1:0 | TwelveLabs | 1024 | — |
amazon.titan-embed-text-v1:2:8k) dziedziczą konfigurację modelu bazowego.Uwierzytelnianie: uwierzytelnianie Bedrock używa standardowej kolejności rozwiązywania poświadczeń AWS SDK:- Zmienne środowiskowe (
AWS_ACCESS_KEY_ID+AWS_SECRET_ACCESS_KEY) - Pamięć podręczna tokenów SSO
- Poświadczenia tokenu tożsamości webowej
- Współdzielone pliki poświadczeń i konfiguracji
- Poświadczenia metadanych ECS lub EC2
AWS_REGION, AWS_DEFAULT_REGION, baseUrl dostawcy amazon-bedrock albo domyślnie ustawiany na us-east-1.Uprawnienia IAM: rola lub użytkownik IAM potrzebuje:InvokeModel do konkretnego modelu:Lokalnie (GGUF + llama.cpp)
Lokalnie (GGUF + llama.cpp)
| Klucz | Typ | Domyślna wartość | Opis |
|---|---|---|---|
local.modelPath | string | pobierany automatycznie | Ścieżka do pliku modelu GGUF |
local.modelCacheDir | string | domyślna node-llama-cpp | Katalog pamięci podręcznej dla pobranych modeli |
local.contextSize | number | "auto" | 4096 | Rozmiar okna kontekstu dla kontekstu embeddingów. 4096 obejmuje typowe fragmenty (128–512 tokenów), jednocześnie ograniczając VRAM niezajmowany przez wagi. Obniż do 1024–2048 na ograniczonych hostach. "auto" używa wytrenowanego maksimum modelu — niezalecane dla modeli 8B+ (Qwen3-Embedding-8B: 40 960 tokenów → ~32 GB VRAM vs ~8,8 GB przy 4096). |
openclaw plugins install @openclaw/llama-cpp-provider.
Model domyślny: embeddinggemma-300m-qat-Q8_0.gguf (~0,6 GB, pobierany automatycznie). Kopie robocze ze źródeł nadal wymagają zatwierdzenia natywnej kompilacji: pnpm approve-builds, a następnie pnpm rebuild node-llama-cpp.Użyj samodzielnego CLI, aby zweryfikować tę samą ścieżkę dostawcy, której używa Gateway:provider: "local" jawnie dla lokalnych embeddingów GGUF. Odwołania do modeli hf: i HTTP(S) są obsługiwane dla jawnych konfiguracji lokalnych, ale nie zmieniają domyślnego dostawcy.Limit czasu embeddingów inline
Nadpisz limit czasu dla partii embeddingów inline podczas indeksowania pamięci.Brak ustawienia używa wartości domyślnej dostawcy: 600 sekund dla dostawców lokalnych/samodzielnie hostowanych, takich jak
local, ollama i lmstudio, oraz 120 sekund dla dostawców hostowanych. Zwiększ tę wartość, gdy lokalne partie embeddingów ograniczone przez CPU działają poprawnie, ale wolno.Konfiguracja wyszukiwania hybrydowego
Wszystko podmemorySearch.query.hybrid:
| Klucz | Typ | Domyślna wartość | Opis |
|---|---|---|---|
enabled | boolean | true | Włącz hybrydowe wyszukiwanie BM25 + wektorowe |
vectorWeight | number | 0.7 | Waga wyników wektorowych (0-1) |
textWeight | number | 0.3 | Waga wyników BM25 (0-1) |
candidateMultiplier | number | 4 | Mnożnik rozmiaru puli kandydatów |
- MMR (różnorodność)
- Zanik czasowy (aktualność)
| Klucz | Typ | Domyślna wartość | Opis |
|---|---|---|---|
mmr.enabled | boolean | false | Włącz ponowne rankingowanie MMR |
mmr.lambda | number | 0.7 | 0 = maks. różnorodność, 1 = maks. trafność |
Pełny przykład
Dodatkowe ścieżki pamięci
| Klucz | Typ | Opis |
|---|---|---|
extraPaths | string[] | Dodatkowe katalogi lub pliki do zaindeksowania |
.md. Obsługa dowiązań symbolicznych zależy od aktywnego backendu: wbudowany silnik ignoruje dowiązania symboliczne, natomiast QMD stosuje zachowanie bazowego skanera QMD.
W przypadku wyszukiwania transkrypcji między agentami w zakresie agenta użyj agents.list[].memorySearch.qmd.extraCollections zamiast memory.qmd.paths. Te dodatkowe kolekcje mają ten sam kształt { path, name, pattern? }, ale są scalane per agent i mogą zachowywać jawne nazwy współdzielone, gdy ścieżka wskazuje poza bieżący obszar roboczy. Jeśli ta sama rozwiązana ścieżka pojawia się zarówno w memory.qmd.paths, jak i w memorySearch.qmd.extraCollections, QMD zachowuje pierwszy wpis i pomija duplikat.
Pamięć multimodalna (Gemini)
Indeksuj obrazy i audio razem z Markdown przy użyciu Gemini Embedding 2:| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
multimodal.enabled | boolean | false | Włącz indeksowanie multimodalne |
multimodal.modalities | string[] | — | ["image"], ["audio"] lub ["all"] |
multimodal.maxFileBytes | number | 10000000 | Maksymalny rozmiar pliku do indeksowania |
Dotyczy tylko plików w
extraPaths. Domyślne katalogi główne pamięci pozostają ograniczone do Markdown. Wymaga gemini-embedding-2-preview. fallback musi mieć wartość "none"..jpg, .jpeg, .png, .webp, .gif, .heic, .heif (obrazy); .mp3, .wav, .ogg, .opus, .m4a, .aac, .flac (audio).
Pamięć podręczna embeddingów
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
cache.enabled | boolean | true | Buforuj embeddingi fragmentów w SQLite |
cache.maxEntries | number | 50000 | Maksymalna liczba buforowanych embeddingów |
Indeksowanie wsadowe
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
remote.nonBatchConcurrency | number | 4 | Równoległe embeddingi inline |
remote.batch.enabled | boolean | false | Włącz API embeddingów wsadowych |
remote.batch.concurrency | number | 2 | Równoległe zadania wsadowe |
remote.batch.wait | boolean | true | Czekaj na ukończenie wsadu |
remote.batch.pollIntervalMs | number | — | Interwał odpytywania |
remote.batch.timeoutMinutes | number | — | Limit czasu wsadu |
openai, gemini i voyage. Wsad OpenAI jest zwykle najszybszy i najtańszy przy dużych uzupełnieniach historycznych.
remote.nonBatchConcurrency kontroluje wywołania embeddingów inline używane przez lokalnych/samodzielnie hostowanych dostawców oraz dostawców hostowanych, gdy API wsadowe dostawcy nie są aktywne. Ollama domyślnie używa 1 dla indeksowania niewsadowego, aby uniknąć przeciążenia mniejszych hostów lokalnych; ustaw wyższą wartość na większych maszynach.
Jest to niezależne od sync.embeddingBatchTimeoutSeconds, które kontroluje limit czasu wywołań embeddingów inline.
Wyszukiwanie w pamięci sesji (eksperymentalne)
Indeksuj transkrypcje sesji i udostępniaj je przezmemory_search:
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
experimental.sessionMemory | boolean | false | Włącz indeksowanie sesji |
sources | string[] | ["memory"] | Dodaj "sessions", aby uwzględnić transkrypcje |
sync.sessions.deltaBytes | number | 100000 | Próg bajtów do ponownego indeksowania |
sync.sessions.deltaMessages | number | 50 | Próg wiadomości do ponownego indeksowania |
tools.sessions.visibility. Domyślna
widoczność tree udostępnia tylko bieżącą sesję oraz sesje przez nią utworzone. Aby
przywołać niepowiązaną sesję tego samego agenta wysłaną przez Gateway z innej
sesji, takiej jak DM, celowo rozszerz widoczność do agent (lub do all tylko
wtedy, gdy wymagane jest także przywoływanie między agentami i zezwala na to polityka agent-agent).
Poniższe przykłady umieszczają te ustawienia w agents.defaults. Możesz też
zastosować równoważne ustawienia memorySearch w nadpisaniu dla konkretnego agenta, gdy tylko jeden
agent ma indeksować i przeszukiwać transkrypcje sesji.
Dla przywoływania Gateway-do-DM tego samego agenta:
- Wbudowany backend
- Backend QMD
agents.defaults.memorySearch.experimental.sessionMemory oraz
sources: ["sessions"] same z siebie nie eksportują transkrypcji do QMD. Ustaw
również memory.qmd.sessions.enabled: true.
Przyspieszenie wektorowe SQLite (sqlite-vec)
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
store.vector.enabled | boolean | true | Używaj sqlite-vec do zapytań wektorowych |
store.vector.extensionPath | string | bundled | Nadpisz ścieżkę sqlite-vec |
Przechowywanie indeksów
Wbudowane indeksy pamięci znajdują się w bazie danych OpenClaw SQLite każdego agenta podagents/<agentId>/agent/openclaw-agent.sqlite.
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
store.fts.tokenizer | string | unicode61 | Tokenizer FTS5 (unicode61 lub trigram) |
Konfiguracja backendu QMD
Ustawmemory.backend = "qmd", aby włączyć. Wszystkie ustawienia QMD znajdują się w memory.qmd:
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
command | string | qmd | Ścieżka do pliku wykonywalnego QMD; ustaw ścieżkę bezwzględną, gdy PATH usługi różni się od powłoki |
searchMode | string | search | Polecenie wyszukiwania: search, vsearch, query |
rerank | boolean | — | Ustaw na false z searchMode: "query" i QMD 2.1+, aby pominąć ponowne rankingowanie QMD |
includeDefaultMemory | boolean | true | Automatycznie indeksuj MEMORY.md + memory/**/*.md |
paths[] | array | — | Dodatkowe ścieżki: { name, path, pattern? } |
sessions.enabled | boolean | false | Eksportuj transkrypcje sesji do QMD |
sessions.retentionDays | number | — | Przechowywanie transkrypcji |
sessions.exportDir | string | — | Katalog eksportu |
searchMode: "search" działa wyłącznie leksykalnie/BM25. OpenClaw nie uruchamia sond gotowości wektorów semantycznych ani utrzymania embeddingów QMD dla tego trybu, także podczas memory status --deep; vsearch i query nadal wymagają gotowości wektorowej QMD oraz embeddingów.
rerank: false zmienia tylko tryb query QMD i wymaga QMD 2.1 lub nowszego. W bezpośrednim trybie CLI OpenClaw przekazuje --no-rerank; w trybie MCP opartym na mcporter przekazuje rerank: false do ujednoliconego narzędzia zapytań QMD. Pozostaw to nieustawione, aby używać domyślnego zachowania ponownego rankingowania zapytań QMD.
OpenClaw preferuje bieżące kształty kolekcji QMD i zapytań MCP, ale utrzymuje działanie starszych wydań QMD, próbując w razie potrzeby zgodnych flag wzorców kolekcji i starszych nazw narzędzi MCP. Gdy QMD deklaruje obsługę wielu filtrów kolekcji, kolekcje z tego samego źródła są przeszukiwane jednym procesem QMD; starsze kompilacje QMD zachowują ścieżkę zgodności dla pojedynczych kolekcji. To samo źródło oznacza, że trwałe kolekcje pamięci są grupowane razem, natomiast kolekcje transkrypcji sesji pozostają osobną grupą, aby dywersyfikacja źródeł nadal miała oba wejścia.
Nadpisania modeli QMD pozostają po stronie QMD, a nie w konfiguracji OpenClaw. Jeśli musisz globalnie nadpisać modele QMD, ustaw zmienne środowiskowe, takie jak
QMD_EMBED_MODEL, QMD_RERANK_MODEL i QMD_GENERATE_MODEL, w środowisku uruchomieniowym Gateway.Harmonogram aktualizacji
Harmonogram aktualizacji
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
update.interval | string | 5m | Interwał odświeżania |
update.debounceMs | number | 15000 | Debounce zmian plików |
update.onBoot | boolean | true | Odświeżaj po otwarciu długotrwałego menedżera QMD; ustaw false, aby pominąć natychmiastową aktualizację przy uruchomieniu |
update.startup | string | off | Opcjonalna inicjalizacja QMD przy starcie Gateway: off, idle lub immediate |
update.startupDelayMs | number | 120000 | Opóźnienie przed uruchomieniem odświeżania startup: "idle" |
update.waitForBootSync | boolean | false | Blokuj otwarcie menedżera do zakończenia jego początkowego odświeżania |
update.embedInterval | string | — | Osobny rytm osadzania |
update.commandTimeoutMs | number | — | Limit czasu poleceń QMD |
update.updateTimeoutMs | number | — | Limit czasu operacji aktualizacji QMD |
update.embedTimeoutMs | number | — | Limit czasu operacji osadzania QMD |
Limity
Limity
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
limits.maxResults | number | 6 | Maksymalna liczba wyników wyszukiwania |
limits.maxSnippetChars | number | — | Ogranicz długość fragmentu |
limits.maxInjectedChars | number | — | Ogranicz łączną liczbę wstrzykniętych znaków |
limits.timeoutMs | number | 4000 | Limit czasu wyszukiwania |
Zakres
Zakres
Steruje tym, które sesje mogą otrzymywać wyniki wyszukiwania QMD. Ten sam schemat co Dostarczona wartość domyślna zezwala na sesje bezpośrednie i kanałowe, nadal odmawiając grupom.Domyślnie tylko DM.
session.sendPolicy:match.keyPrefix dopasowuje znormalizowany klucz sesji; match.rawKeyPrefix dopasowuje surowy klucz wraz z agent:<id>:.Cytowania
Cytowania
memory.citations dotyczy wszystkich backendów:| Wartość | Zachowanie |
|---|---|
auto (domyślnie) | Uwzględnij stopkę Source: <path#line> we fragmentach |
on | Zawsze uwzględniaj stopkę |
off | Pomiń stopkę (ścieżka nadal jest wewnętrznie przekazywana agentowi) |
update.onBoot ma wartość true i nie skonfigurowano konserwacji interwału ani osadzania, uruchomienie używa jednorazowego menedżera do odświeżenia przy starcie i zamyka go. Jeśli skonfigurowano interwał aktualizacji lub osadzania, uruchomienie otwiera długotrwałego menedżera QMD, aby mógł posiadać obserwator i liczniki interwałów; update.onBoot: false pomija tylko natychmiastowe odświeżenie przy starcie.
Pełny przykład QMD
Dreaming
Dreaming konfiguruje się wplugins.entries.memory-core.config.dreaming, a nie w agents.defaults.memorySearch.
Dreaming działa jako jedno zaplanowane przemiatanie i używa wewnętrznych faz lekkiej/głębokiej/REM jako szczegółu implementacyjnego.
Opis zachowania koncepcyjnego i poleceń z ukośnikiem znajdziesz w Dreaming.
Ustawienia użytkownika
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
enabled | boolean | false | Całkowicie włącz lub wyłącz dreaming |
frequency | string | 0 3 * * * | Opcjonalny rytm cron dla pełnego przemiatania dreaming |
model | string | model domyślny | Opcjonalne zastąpienie modelu subagenta Dziennika snów |
phases.deep.maxPromotedSnippetTokens | number | 160 | Maksymalna szacowana liczba tokenów zachowywanych z każdego krótkoterminowego fragmentu przypomnienia promowanego do MEMORY.md; metadane pochodzenia pozostają widoczne |
Przykład
- Dreaming zapisuje stan maszyny w
memory/.dreams/. - Dreaming zapisuje czytelne dla człowieka dane narracyjne wyjściowe w
DREAMS.md(lub istniejącymdreams.md). dreaming.modelużywa istniejącej bramki zaufania subagenta Plugin; ustawplugins.entries.memory-core.subagent.allowModelOverride: trueprzed jej włączeniem.- Dziennik snów ponawia próbę raz z domyślnym modelem sesji, gdy skonfigurowany model jest niedostępny. Niepowodzenia zaufania lub listy dozwolonych są rejestrowane i nie są po cichu ponawiane.
- Zasady i progi faz lekkiej/głębokiej/REM są zachowaniem wewnętrznym, a nie konfiguracją przeznaczoną dla użytkownika.