Przejdź do głównej treści

Dokumentacja konfiguracji pamięci

Ta strona zawiera wszystkie opcje konfiguracji wyszukiwania pamięci w OpenClaw. Aby zapoznać się z omówieniami koncepcyjnymi, zobacz: Wszystkie ustawienia wyszukiwania pamięci znajdują się w agents.defaults.memorySearch w pliku openclaw.json, o ile nie zaznaczono inaczej.

Wybór dostawcy

KluczTypDomyślnieOpis
providerstringwykrywany automatycznieIdentyfikator adaptera embeddingów: openai, gemini, voyage, mistral, ollama, local
modelstringdomyślny dostawcyNazwa modelu embeddingów
fallbackstring"none"Identyfikator adaptera zapasowego, gdy główny zawiedzie
enabledbooleantrueWłącza lub wyłącza wyszukiwanie pamięci

Kolejność automatycznego wykrywania

Gdy provider nie jest ustawiony, OpenClaw wybiera pierwszy dostępny:
  1. local — jeśli skonfigurowano memorySearch.local.modelPath i plik istnieje.
  2. openai — jeśli można rozwiązać klucz OpenAI.
  3. gemini — jeśli można rozwiązać klucz Gemini.
  4. voyage — jeśli można rozwiązać klucz Voyage.
  5. mistral — jeśli można rozwiązać klucz Mistral.
ollama jest obsługiwana, ale nie jest wykrywana automatycznie (ustaw ją jawnie).

Rozpoznawanie klucza API

Zdalne embeddingi wymagają klucza API. OpenClaw rozpoznaje go z: profili auth, models.providers.*.apiKey lub zmiennych środowiskowych.
DostawcaZmienna środowiskowaKlucz konfiguracji
OpenAIOPENAI_API_KEYmodels.providers.openai.apiKey
GeminiGEMINI_API_KEYmodels.providers.google.apiKey
VoyageVOYAGE_API_KEYmodels.providers.voyage.apiKey
MistralMISTRAL_API_KEYmodels.providers.mistral.apiKey
OllamaOLLAMA_API_KEY (placeholder)
Codex OAuth obejmuje tylko chat/completions i nie spełnia wymagań żądań embeddingów.

Konfiguracja zdalnego punktu końcowego

Dla niestandardowych punktów końcowych zgodnych z OpenAI lub nadpisania ustawień domyślnych dostawcy:
KluczTypOpis
remote.baseUrlstringNiestandardowy bazowy URL API
remote.apiKeystringNadpisanie klucza API
remote.headersobjectDodatkowe nagłówki HTTP (scalane z domyślnymi dostawcy)
{
  agents: {
    defaults: {
      memorySearch: {
        provider: "openai",
        model: "text-embedding-3-small",
        remote: {
          baseUrl: "https://api.example.com/v1/",
          apiKey: "YOUR_KEY",
        },
      },
    },
  },
}

Konfiguracja specyficzna dla Gemini

KluczTypDomyślnieOpis
modelstringgemini-embedding-001Obsługuje także gemini-embedding-2-preview
outputDimensionalitynumber3072Dla Embedding 2: 768, 1536 lub 3072
Zmiana modelu lub outputDimensionality powoduje automatyczne pełne ponowne indeksowanie.

Konfiguracja lokalnych embeddingów

KluczTypDomyślnieOpis
local.modelPathstringpobierany automatycznieŚcieżka do pliku modelu GGUF
local.modelCacheDirstringdomyślne node-llama-cppKatalog cache dla pobranych modeli
Model domyślny: embeddinggemma-300m-qat-Q8_0.gguf (~0.6 GB, pobierany automatycznie). Wymaga natywnego buildu: pnpm approve-builds, a następnie pnpm rebuild node-llama-cpp.

Konfiguracja wyszukiwania hybrydowego

Wszystko w memorySearch.query.hybrid:
KluczTypDomyślnieOpis
enabledbooleantrueWłącza hybrydowe wyszukiwanie BM25 + wektorowe
vectorWeightnumber0.7Waga dla wyników wektorowych (0-1)
textWeightnumber0.3Waga dla wyników BM25 (0-1)
candidateMultipliernumber4Mnożnik rozmiaru puli kandydatów

MMR (różnorodność)

KluczTypDomyślnieOpis
mmr.enabledbooleanfalseWłącza ponowne rankingowanie MMR
mmr.lambdanumber0.70 = maks. różnorodność, 1 = maks. trafność

Zanikanie czasowe (świeżość)

KluczTypDomyślnieOpis
temporalDecay.enabledbooleanfalseWłącza premiowanie świeżości
temporalDecay.halfLifeDaysnumber30Wynik zmniejsza się o połowę co N dni
Pliki evergreen (MEMORY.md, pliki bez daty w memory/) nigdy nie podlegają zanikaniu.

Pełny przykład

{
  agents: {
    defaults: {
      memorySearch: {
        query: {
          hybrid: {
            vectorWeight: 0.7,
            textWeight: 0.3,
            mmr: { enabled: true, lambda: 0.7 },
            temporalDecay: { enabled: true, halfLifeDays: 30 },
          },
        },
      },
    },
  },
}

Dodatkowe ścieżki pamięci

KluczTypOpis
extraPathsstring[]Dodatkowe katalogi lub pliki do indeksowania
{
  agents: {
    defaults: {
      memorySearch: {
        extraPaths: ["../team-docs", "/srv/shared-notes"],
      },
    },
  },
}
Ścieżki mogą być bezwzględne lub względne względem workspace. Katalogi są skanowane rekurencyjnie w poszukiwaniu plików .md. Obsługa symlinków zależy od aktywnego backendu: wbudowany silnik ignoruje symlinki, a QMD podąża za zachowaniem skanera QMD. Do wyszukiwania transkryptów między agentami w zakresie konkretnego 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 wspólne nazwy, gdy ścieżka wskazuje poza bieżący workspace. Jeśli ta sama rozpoznana ścieżka pojawi się zarówno w memory.qmd.paths, jak i memorySearch.qmd.extraCollections, QMD zachowuje pierwszy wpis i pomija duplikat.

Pamięć multimodalna (Gemini)

Indeksuj obrazy i audio obok Markdown przy użyciu Gemini Embedding 2:
KluczTypDomyślnieOpis
multimodal.enabledbooleanfalseWłącza indeksowanie multimodalne
multimodal.modalitiesstring[]["image"], ["audio"] lub ["all"]
multimodal.maxFileBytesnumber10000000Maksymalny rozmiar pliku do indeksowania
Dotyczy tylko plików w extraPaths. Domyślne korzenie pamięci pozostają tylko dla Markdown. Wymaga gemini-embedding-2-preview. fallback musi mieć wartość "none". Obsługiwane formaty: .jpg, .jpeg, .png, .webp, .gif, .heic, .heif (obrazy); .mp3, .wav, .ogg, .opus, .m4a, .aac, .flac (audio).

Cache embeddingów

KluczTypDomyślnieOpis
cache.enabledbooleanfalseCache embeddingów chunków w SQLite
cache.maxEntriesnumber50000Maksymalna liczba zapisanych embeddingów
Zapobiega ponownemu tworzeniu embeddingów dla niezmienionego tekstu podczas ponownego indeksowania lub aktualizacji transkryptów.

Indeksowanie wsadowe

KluczTypDomyślnieOpis
remote.batch.enabledbooleanfalseWłącza API embeddingów wsadowych
remote.batch.concurrencynumber2Równoległe zadania wsadowe
remote.batch.waitbooleantrueCzeka na zakończenie wsadu
remote.batch.pollIntervalMsnumberInterwał odpytywania
remote.batch.timeoutMinutesnumberLimit czasu wsadu
Dostępne dla openai, gemini i voyage. Wsadowe API OpenAI jest zwykle najszybsze i najtańsze przy dużych backfillach.

Wyszukiwanie pamięci sesji (eksperymentalne)

Indeksuj transkrypty sesji i udostępniaj je przez memory_search:
KluczTypDomyślnieOpis
experimental.sessionMemorybooleanfalseWłącza indeksowanie sesji
sourcesstring[]["memory"]Dodaj "sessions", aby uwzględnić transkrypty
sync.sessions.deltaBytesnumber100000Próg bajtów do ponownego indeksowania
sync.sessions.deltaMessagesnumber50Próg wiadomości do ponownego indeksowania
Indeksowanie sesji jest opcjonalne i działa asynchronicznie. Wyniki mogą być nieco nieaktualne. Logi sesji są przechowywane na dysku, więc granicą zaufania jest dostęp do systemu plików.

Akceleracja wektorowa SQLite (sqlite-vec)

KluczTypDomyślnieOpis
store.vector.enabledbooleantrueUżywa sqlite-vec do zapytań wektorowych
store.vector.extensionPathstringwbudowanaNadpisuje ścieżkę sqlite-vec
Gdy sqlite-vec jest niedostępne, OpenClaw automatycznie wraca do podobieństwa cosinusowego w procesie.

Przechowywanie indeksu

KluczTypDomyślnieOpis
store.pathstring~/.openclaw/memory/{agentId}.sqliteLokalizacja indeksu (obsługuje token {agentId})
store.fts.tokenizerstringunicode61Tokenizer FTS5 (unicode61 lub trigram)

Konfiguracja backendu QMD

Ustaw memory.backend = "qmd", aby włączyć. Wszystkie ustawienia QMD znajdują się w memory.qmd:
KluczTypDomyślnieOpis
commandstringqmdŚcieżka do pliku wykonywalnego QMD
searchModestringsearchPolecenie wyszukiwania: search, vsearch, query
includeDefaultMemorybooleantrueAutomatycznie indeksuje MEMORY.md + memory/**/*.md
paths[]arrayDodatkowe ścieżki: { name, path, pattern? }
sessions.enabledbooleanfalseIndeksuje transkrypty sesji
sessions.retentionDaysnumberRetencja transkryptów
sessions.exportDirstringKatalog eksportu

Harmonogram aktualizacji

KluczTypDomyślnieOpis
update.intervalstring5mInterwał odświeżania
update.debounceMsnumber15000Debounce zmian w plikach
update.onBootbooleantrueOdświeżanie przy uruchomieniu
update.waitForBootSyncbooleanfalseBlokuje uruchomienie do zakończenia odświeżania
update.embedIntervalstringOddzielny harmonogram embeddingów
update.commandTimeoutMsnumberLimit czasu dla poleceń QMD
update.updateTimeoutMsnumberLimit czasu dla operacji aktualizacji QMD
update.embedTimeoutMsnumberLimit czasu dla operacji embeddingów QMD

Limity

KluczTypDomyślnieOpis
limits.maxResultsnumber6Maksymalna liczba wyników wyszukiwania
limits.maxSnippetCharsnumberOgranicza długość fragmentu
limits.maxInjectedCharsnumberOgranicza łączną liczbę wstrzykniętych znaków
limits.timeoutMsnumber4000Limit czasu wyszukiwania

Zakres

Kontroluje, które sesje mogą otrzymywać wyniki wyszukiwania QMD. Ten sam schemat co session.sendPolicy:
{
  memory: {
    qmd: {
      scope: {
        default: "deny",
        rules: [{ action: "allow", match: { chatType: "direct" } }],
      },
    },
  },
}
Domyślnie tylko DM. match.keyPrefix dopasowuje znormalizowany klucz sesji; match.rawKeyPrefix dopasowuje surowy klucz zawierający agent:<id>:.

Cytowania

memory.citations dotyczy wszystkich backendów:
WartośćZachowanie
auto (domyślnie)Dołącza stopkę Source: <path#line> do fragmentów
onZawsze dołącza stopkę
offPomija stopkę (ścieżka nadal jest przekazywana wewnętrznie do agenta)

Pełny przykład QMD

{
  memory: {
    backend: "qmd",
    citations: "auto",
    qmd: {
      includeDefaultMemory: true,
      update: { interval: "5m", debounceMs: 15000 },
      limits: { maxResults: 6, timeoutMs: 4000 },
      scope: {
        default: "deny",
        rules: [{ action: "allow", match: { chatType: "direct" } }],
      },
      paths: [{ name: "docs", path: "~/notes", pattern: "**/*.md" }],
    },
  },
}

Dreaming (eksperymentalne)

Dreaming konfiguruje się w plugins.entries.memory-core.config.dreaming, a nie w agents.defaults.memorySearch. Szczegóły koncepcyjne i polecenia czatu znajdziesz w Dreaming.
KluczTypDomyślnieOpis
modestring"off"Preset: off, core, rem lub deep
cronstringdomyślnie dla presetuNadpisanie wyrażenia cron dla harmonogramu
timezonestringstrefa czasowa użytkownikaStrefa czasowa używana do obliczania harmonogramu
limitnumberdomyślnie dla presetuMaksymalna liczba kandydatów do promowania na cykl
minScorenumberdomyślnie dla presetuMinimalny ważony wynik do promowania
minRecallCountnumberdomyślnie dla presetuMinimalny próg liczby przywołań
minUniqueQueriesnumberdomyślnie dla presetuMinimalny próg liczby różnych zapytań

Domyślne wartości presetów

TrybCzęstotliwośćminScoreminRecallCountminUniqueQueries
offWyłączone
coreCodziennie 3:000.7532
remCo 6 godzin0.8543
deepCo 12 godzin0.8033

Przykład

{
  plugins: {
    entries: {
      "memory-core": {
        config: {
          dreaming: {
            mode: "core",
            timezone: "America/New_York",
          },
        },
      },
    },
  },
}