Technical reference
Довідник із конфігурації пам’яті
На цій сторінці перелічено всі параметри конфігурації для пошуку в пам’яті OpenClaw. Концептуальні огляди дивіться тут:
Як працює пам’ять.
Типовий бекенд SQLite.
Локальний передусім sidecar.
Конвеєр пошуку та налаштування.
Субагент пам’яті для інтерактивних сеансів.
Усі налаштування пошуку в пам’яті розташовані в agents.defaults.memorySearch у openclaw.json, якщо не зазначено інше.
Вибір провайдера
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
provider |
string |
визначається автоматично | ID адаптера embedding, як-от bedrock, deepinfra, gemini, github-copilot, local, mistral, ollama, openai або voyage; також може бути налаштованим models.providers.<id>, у якому api вказує на один із цих адаптерів |
model |
string |
типове значення провайдера | Назва моделі embedding |
fallback |
string |
"none" |
ID резервного адаптера, коли основний не спрацьовує |
enabled |
boolean |
true |
Увімкнути або вимкнути пошук у пам’яті |
Порядок автоматичного визначення
Коли provider не задано, OpenClaw вибирає перший доступний:
local
Вибирається, якщо memorySearch.local.modelPath налаштовано й файл існує.
github-copilot
Вибирається, якщо можна визначити токен GitHub Copilot (змінна середовища або профіль автентифікації).
openai
Вибирається, якщо можна визначити ключ OpenAI.
gemini
Вибирається, якщо можна визначити ключ Gemini.
voyage
Вибирається, якщо можна визначити ключ Voyage.
mistral
Вибирається, якщо можна визначити ключ Mistral.
deepinfra
Вибирається, якщо можна визначити ключ DeepInfra.
bedrock
Вибирається, якщо ланцюжок облікових даних AWS SDK успішно визначається (роль інстанса, ключі доступу, профіль, SSO, вебідентичність або спільна конфігурація).
ollama підтримується, але не визначається автоматично (задайте його явно).
Власні ідентифікатори провайдерів
memorySearch.provider може вказувати на власний запис models.providers.<id>. OpenClaw визначає власника api цього провайдера для адаптера embedding, зберігаючи власний ідентифікатор провайдера для обробки кінцевої точки, автентифікації та префікса моделі. Це дає змогу конфігураціям із кількома GPU або кількома хостами виділити embeddings пам’яті для конкретної локальної кінцевої точки:
{
models: {
providers: {
"ollama-5080": {
api: "ollama",
baseUrl: "http://gpu-box.local:11435",
apiKey: "ollama-local",
models: [{ id: "qwen3-embedding:0.6b" }],
},
},
},
agents: {
defaults: {
memorySearch: {
provider: "ollama-5080",
model: "qwen3-embedding:0.6b",
},
},
},
}
Визначення API-ключа
Віддалені embeddings потребують API-ключа. Bedrock натомість використовує типовий ланцюжок облікових даних AWS SDK (ролі інстансів, SSO, ключі доступу).
| Провайдер | Змінна середовища | Ключ конфігурації |
|---|---|---|
| Bedrock | ланцюжок облікових даних AWS | API-ключ не потрібен |
| 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 |
Профіль автентифікації через вхід із пристрою |
| Mistral | MISTRAL_API_KEY |
models.providers.mistral.apiKey |
| Ollama | OLLAMA_API_KEY (заповнювач) |
-- |
| OpenAI | OPENAI_API_KEY |
models.providers.openai.apiKey |
| Voyage | VOYAGE_API_KEY |
models.providers.voyage.apiKey |
Конфігурація віддаленої кінцевої точки
Для власних OpenAI-сумісних кінцевих точок або перевизначення типових значень провайдера:
remote.baseUrlstringВласний базовий URL API.
remote.apiKeystringПеревизначити API-ключ.
remote.headersobjectДодаткові заголовки HTTP (об’єднуються з типовими значеннями провайдера).
{
agents: {
defaults: {
memorySearch: {
provider: "openai",
model: "text-embedding-3-small",
remote: {
baseUrl: "https://api.example.com/v1/",
apiKey: "YOUR_KEY",
},
},
},
},
}
Конфігурація для окремих провайдерів
Gemini
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
model |
string |
gemini-embedding-001 |
Також підтримує gemini-embedding-2-preview |
outputDimensionality |
number |
3072 |
Для Embedding 2: 768, 1536 або 3072 |
OpenAI-сумісні типи введення
OpenAI-сумісні кінцеві точки embedding можуть увімкнути специфічні для провайдера поля запиту input_type. Це корисно для асиметричних моделей embedding, яким потрібні різні мітки для embeddings запитів і документів.
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
inputType |
string |
не задано | Спільний input_type для embeddings запитів і документів |
queryInputType |
string |
не задано | input_type під час запиту; перевизначає inputType |
documentInputType |
string |
не задано | input_type індексу/документа; перевизначає inputType |
{
agents: {
defaults: {
memorySearch: {
provider: "openai",
remote: {
baseUrl: "https://embeddings.example/v1",
apiKey: "env:EMBEDDINGS_API_KEY",
},
model: "asymmetric-embedder",
queryInputType: "query",
documentInputType: "passage",
},
},
},
}
Зміна цих значень впливає на ідентичність кешу embedding для пакетного індексування провайдера, і після неї слід виконати переіндексування пам’яті, якщо upstream-модель обробляє мітки по-різному.
Bedrock
Конфігурація embedding Bedrock
Bedrock використовує типовий ланцюжок облікових даних AWS SDK — API-ключі не потрібні. Якщо OpenClaw працює на EC2 з роллю інстанса з доступом до Bedrock, просто задайте провайдера й модель:
{
agents: {
defaults: {
memorySearch: {
provider: "bedrock",
model: "amazon.titan-embed-text-v2:0",
},
},
},
}
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
model |
string |
amazon.titan-embed-text-v2:0 |
Будь-який ID моделі embedding Bedrock |
outputDimensionality |
number |
типове значення моделі | Для Titan V2: 256, 512 або 1024 |
Підтримувані моделі (з визначенням сімейства та типовими розмірностями):
| ID моделі | Провайдер | Типові розмірності | Налаштовувані розмірності |
|---|---|---|---|
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) успадковують конфігурацію базової моделі.
Автентифікація: автентифікація Bedrock використовує стандартний порядок визначення облікових даних AWS SDK:
- Змінні середовища (
AWS_ACCESS_KEY_ID+AWS_SECRET_ACCESS_KEY) - Кеш токенів SSO
- Облікові дані токена вебідентичності
- Спільні файли облікових даних і конфігурації
- Облікові дані метаданих ECS або EC2
Регіон визначається з AWS_REGION, AWS_DEFAULT_REGION, baseUrl провайдера amazon-bedrock або за замовчуванням встановлюється на us-east-1.
Дозволи IAM: роль або користувач IAM потребує:
{
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "*"
}
Для мінімальних привілеїв обмежте InvokeModel конкретною моделлю:
arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
Local (GGUF + node-llama-cpp)
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
local.modelPath |
string |
автоматично завантажується | Шлях до файлу моделі GGUF |
local.modelCacheDir |
string |
типове для node-llama-cpp | Каталог кешу для завантажених моделей |
local.contextSize |
number | "auto" |
4096 |
Розмір контекстного вікна для контексту embedding. 4096 покриває типові фрагменти (128-512 токенів), водночас обмежуючи VRAM не для ваг. Зменште до 1024-2048 на обмежених хостах. "auto" використовує навчений максимум моделі — не рекомендовано для моделей 8B+ (Qwen3-Embedding-8B: 40 960 токенів → ~32 ГБ VRAM проти ~8.8 ГБ за 4096). |
Типова модель: embeddinggemma-300m-qat-Q8_0.gguf (~0.6 ГБ, автоматично завантажується). Вихідні checkout-и все ще потребують схвалення нативного складання: pnpm approve-builds, потім pnpm rebuild node-llama-cpp.
Використовуйте окремий CLI, щоб перевірити той самий шлях провайдера, який використовує Gateway:
openclaw memory status --deep --agent main
openclaw memory index --force --agent main
Якщо provider має значення auto, local вибирається лише тоді, коли local.modelPath вказує на наявний локальний файл. Посилання на моделі hf: і HTTP(S) усе ще можна явно використовувати з provider: "local", але вони не змушують auto вибрати local до того, як модель стане доступною на диску.
Тайм-аут inline embedding
sync.embeddingBatchTimeoutSecondsnumberПеревизначає тайм-аут для inline embedding пакетів під час індексування пам’яті.
Якщо не задано, використовується типове значення провайдера: 600 секунд для локальних/self-hosted провайдерів, таких як local, ollama і lmstudio, та 120 секунд для hosted провайдерів. Збільште це значення, коли локальні CPU-bound embedding пакети справні, але повільні.
Конфігурація гібридного пошуку
Усе в memorySearch.query.hybrid:
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
enabled |
boolean |
true |
Увімкнути гібридний пошук BM25 + векторний пошук |
vectorWeight |
number |
0.7 |
Вага для векторних оцінок (0-1) |
textWeight |
number |
0.3 |
Вага для оцінок BM25 (0-1) |
candidateMultiplier |
number |
4 |
Множник розміру пулу кандидатів |
MMR (diversity)
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
mmr.enabled |
boolean |
false |
Увімкнути повторне ранжування MMR |
mmr.lambda |
number |
0.7 |
0 = макс. різноманітність, 1 = макс. релевантність |
Temporal decay (recency)
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
temporalDecay.enabled |
boolean |
false |
Увімкнути підсилення за свіжістю |
temporalDecay.halfLifeDays |
number |
30 |
Оцінка зменшується вдвічі кожні N днів |
Evergreen-файли (MEMORY.md, файли без дат у memory/) ніколи не піддаються згасанню.
Повний приклад
{
agents: {
defaults: {
memorySearch: {
query: {
hybrid: {
vectorWeight: 0.7,
textWeight: 0.3,
mmr: { enabled: true, lambda: 0.7 },
temporalDecay: { enabled: true, halfLifeDays: 30 },
},
},
},
},
},
}
Додаткові шляхи пам’яті
| Ключ | Тип | Опис |
|---|---|---|
extraPaths |
string[] |
Додаткові каталоги або файли для індексування |
{
agents: {
defaults: {
memorySearch: {
extraPaths: ["../team-docs", "/srv/shared-notes"],
},
},
},
}
Шляхи можуть бути абсолютними або відносними до workspace. Каталоги рекурсивно скануються на файли .md. Обробка symlink залежить від активного backend: вбудований рушій ігнорує symlink, тоді як QMD дотримується поведінки базового сканера QMD.
Для agent-scoped пошуку транскриптів між агентами використовуйте agents.list[].memorySearch.qmd.extraCollections замість memory.qmd.paths. Ці додаткові колекції мають таку саму форму { path, name, pattern? }, але об’єднуються для кожного агента й можуть зберігати явні спільні назви, коли шлях вказує за межі поточного workspace. Якщо той самий resolved path з’являється і в memory.qmd.paths, і в memorySearch.qmd.extraCollections, QMD зберігає перший запис і пропускає дублікат.
Мультимодальна пам’ять (Gemini)
Індексуйте зображення й аудіо разом із Markdown за допомогою Gemini Embedding 2:
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
multimodal.enabled |
boolean |
false |
Увімкнути мультимодальне індексування |
multimodal.modalities |
string[] |
-- | ["image"], ["audio"] або ["all"] |
multimodal.maxFileBytes |
number |
10000000 |
Максимальний розмір файлу для індексування |
Підтримувані формати: .jpg, .jpeg, .png, .webp, .gif, .heic, .heif (зображення); .mp3, .wav, .ogg, .opus, .m4a, .aac, .flac (аудіо).
Кеш embedding
| Ключ | Тип | За замовчуванням | Опис |
|---|---|---|---|
cache.enabled |
boolean |
false |
Кешувати embedding фрагментів у SQLite |
cache.maxEntries |
number |
50000 |
Максимальна кількість кешованих embedding |
Запобігає повторному embedding незміненого тексту під час повторного індексування або оновлень транскриптів.
Пакетне індексування
| Ключ | Тип | За замовчуванням | Опис |
|---|---|---|---|
remote.nonBatchConcurrency |
number |
4 |
Паралельні inline embedding |
remote.batch.enabled |
boolean |
false |
Увімкнути API пакетного embedding |
remote.batch.concurrency |
number |
2 |
Паралельні пакетні завдання |
remote.batch.wait |
boolean |
true |
Чекати завершення пакета |
remote.batch.pollIntervalMs |
number |
-- | Інтервал опитування |
remote.batch.timeoutMinutes |
number |
-- | Тайм-аут пакета |
Доступно для openai, gemini і voyage. Пакетний режим OpenAI зазвичай найшвидший і найдешевший для великих ретроспективних заповнень.
remote.nonBatchConcurrency керує inline-викликами embedding, які використовуються локальними/self-hosted провайдерами та hosted провайдерами, коли пакетні API провайдера не активні. Для непакетного індексування Ollama за замовчуванням використовує 1, щоб не перевантажувати менші локальні хости; задайте більше значення на потужніших машинах.
Це окремо від sync.embeddingBatchTimeoutSeconds, який керує тайм-аутом для inline-викликів embedding.
Пошук у пам’яті сеансів (експериментально)
Індексуйте транскрипти сеансів і надавайте їх через memory_search:
| Ключ | Тип | За замовчуванням | Опис |
|---|---|---|---|
experimental.sessionMemory |
boolean |
false |
Увімкнути індексування сеансів |
sources |
string[] |
["memory"] |
Додайте "sessions", щоб включити транскрипти |
sync.sessions.deltaBytes |
number |
100000 |
Пороговий обсяг байтів для повторного індексування |
sync.sessions.deltaMessages |
number |
50 |
Порогова кількість повідомлень для повторного індексування |
Векторне прискорення SQLite (sqlite-vec)
| Ключ | Тип | За замовчуванням | Опис |
|---|---|---|---|
store.vector.enabled |
boolean |
true |
Використовувати sqlite-vec для векторних запитів |
store.vector.extensionPath |
string |
bundled | Перевизначити шлях sqlite-vec |
Коли sqlite-vec недоступний, OpenClaw автоматично повертається до косинусної подібності в межах процесу.
Сховище індексу
| Ключ | Тип | За замовчуванням | Опис |
|---|---|---|---|
store.path |
string |
~/.openclaw/memory/{agentId}.sqlite |
Розташування індексу (підтримує токен {agentId}) |
store.fts.tokenizer |
string |
unicode61 |
Токенізатор FTS5 (unicode61 або trigram) |
Конфігурація backend QMD
Задайте memory.backend = "qmd", щоб увімкнути. Усі налаштування QMD розташовані в memory.qmd:
| Ключ | Тип | За замовчуванням | Опис |
|---|---|---|---|
command |
string |
qmd |
Шлях до виконуваного файлу QMD; задайте абсолютний шлях, коли PATH сервісу відрізняється від вашої оболонки |
searchMode |
string |
search |
Команда пошуку: search, vsearch, query |
includeDefaultMemory |
boolean |
true |
Автоматично індексувати MEMORY.md + memory/**/*.md |
paths[] |
array |
-- | Додаткові шляхи: { name, path, pattern? } |
sessions.enabled |
boolean |
false |
Індексувати транскрипти сеансів |
sessions.retentionDays |
number |
-- | Термін зберігання транскриптів |
sessions.exportDir |
string |
-- | Каталог експорту |
searchMode: "search" є лише лексичним/BM25. OpenClaw не запускає перевірки готовності семантичних векторів або обслуговування QMD-вбудовувань для цього режиму, зокрема під час memory status --deep; vsearch і query і далі потребують готовності QMD-векторів і вбудовувань.
OpenClaw віддає перевагу поточним колекціям QMD і формам запитів MCP, але зберігає сумісність зі старішими випусками QMD, за потреби пробуючи сумісні прапорці шаблонів колекцій і старіші назви інструментів MCP. Коли QMD оголошує підтримку кількох фільтрів колекцій, колекції з одного джерела шукаються одним процесом QMD; старіші збірки QMD зберігають шлях сумісності для кожної колекції. Одне джерело означає, що колекції сталої пам’яті групуються разом, тоді як колекції транскриптів сесій залишаються окремою групою, щоб диверсифікація джерел і далі мала обидва входи.
Розклад оновлень
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
update.interval |
string |
5m |
Інтервал оновлення |
update.debounceMs |
number |
15000 |
Усунення брязкоту змін файлів |
update.onBoot |
boolean |
true |
Оновлювати, коли відкривається довгоживучий менеджер QMD; також обмежує добровільне стартове оновлення |
update.startup |
string |
off |
Необов’язкове оновлення під час запуску gateway: off, idle або immediate |
update.startupDelayMs |
number |
120000 |
Затримка перед виконанням оновлення startup: "idle" |
update.waitForBootSync |
boolean |
false |
Блокувати відкриття менеджера, доки не завершиться його початкове оновлення |
update.embedInterval |
string |
-- | Окрема періодичність вбудовування |
update.commandTimeoutMs |
number |
-- | Тайм-аут для команд QMD |
update.updateTimeoutMs |
number |
-- | Тайм-аут для операцій оновлення QMD |
update.embedTimeoutMs |
number |
-- | Тайм-аут для операцій вбудовування QMD |
Обмеження
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
limits.maxResults |
number |
6 |
Максимальна кількість результатів пошуку |
limits.maxSnippetChars |
number |
-- | Обмежити довжину фрагмента |
limits.maxInjectedChars |
number |
-- | Обмежити загальну кількість вставлених символів |
limits.timeoutMs |
number |
4000 |
Тайм-аут пошуку |
Область дії
Керує тим, які сесії можуть отримувати результати пошуку QMD. Та сама схема, що й session.sendPolicy:
{
memory: {
qmd: {
scope: {
default: "deny",
rules: [{ action: "allow", match: { chatType: "direct" } }],
},
},
},
}
Типове значення, що постачається, дозволяє прямі сесії та сесії каналів, але й далі забороняє групи.
Типово дозволено лише DM. match.keyPrefix зіставляє нормалізований ключ сесії; match.rawKeyPrefix зіставляє сирий ключ, включно з agent:<id>:.
Цитування
memory.citations застосовується до всіх бекендів:
| Значення | Поведінка |
|---|---|
auto (типово) |
Додавати нижній колонтитул Source: <path#line> у фрагменти |
on |
Завжди додавати нижній колонтитул |
off |
Не додавати нижній колонтитул (шлях усе одно передається агенту внутрішньо) |
Оновлення QMD під час завантаження використовують одноразовий шлях підпроцесу під час запуску gateway. Довгоживучий менеджер QMD і далі володіє звичайним спостерігачем за файлами та таймерами інтервалів, коли пошук у пам’яті відкрито для інтерактивного використання.
Повний приклад 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
Dreaming налаштовується в plugins.entries.memory-core.config.dreaming, а не в agents.defaults.memorySearch.
Dreaming виконується як одне заплановане сканування та використовує внутрішні фази light/deep/REM як деталь реалізації.
Концептуальну поведінку та slash-команди див. у Dreaming.
Налаштування користувача
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
enabled |
boolean |
false |
Повністю увімкнути або вимкнути dreaming |
frequency |
string |
0 3 * * * |
Необов’язкова cron-періодичність для повного сканування dreaming |
model |
string |
типова модель | Необов’язкове перевизначення моделі субагента Dream Diary |
Приклад
{
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",
},
},
},
},
},
}