Огляд пам’яті
Як працює пам’ять.
Вбудований рушій
Типовий бекенд SQLite.
Рушій QMD
Локальний насамперед sidecar.
Пошук у пам’яті
Конвеєр пошуку та налаштування.
Active memory
Під-агент пам’яті для інтерактивних сеансів.
agents.defaults.memorySearch у openclaw.json, якщо не зазначено інше.
Якщо ви шукаєте перемикач функції active memory і конфігурацію під-агента, вони розташовані в
plugins.entries.active-memory, а не в memorySearch.Active memory використовує модель із двома шлюзами:- plugin має бути увімкнений і націлений на поточний ідентифікатор агента
- запит має бути придатним інтерактивним постійним сеансом чату
Вибір провайдера
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
provider | string | "openai" | Ідентифікатор адаптера embeddings, як-от bedrock, deepinfra, gemini, github-copilot, local, mistral, ollama, openai, openai-compatible або voyage; також може бути налаштованим models.providers.<id>, чий api вказує на адаптер memory embeddings або OpenAI-сумісний API моделі |
model | string | типове для провайдера | Назва моделі embeddings |
fallback | string | "none" | Ідентифікатор резервного адаптера, коли основний не спрацьовує |
enabled | boolean | true | Увімкнути або вимкнути пошук у пам’яті |
provider не задано, OpenClaw використовує embeddings OpenAI. Задайте provider
явно, щоб використовувати Gemini, Voyage, Mistral, DeepInfra, Bedrock, GitHub Copilot,
Ollama, локальну модель GGUF або OpenAI-сумісну кінцеву точку /v1/embeddings.
Застарілі конфігурації, у яких досі вказано provider: "auto", розв’язуються як openai.
Коли provider не задано, присутній застарілий provider: "auto" або
provider: "none" навмисно вибирає режим лише FTS, пригадування з пам’яті все одно може
використовувати лексичне ранжування FTS, коли embeddings недоступні.
Явні нелокальні провайдери завершуються закрито. Якщо ви задаєте memorySearch.provider як
конкретного провайдера з віддаленою підтримкою, наприклад OpenAI, Gemini, Voyage, Mistral,
Bedrock, GitHub Copilot, DeepInfra, Ollama, LM Studio або OpenAI-сумісного
власного провайдера, і цей провайдер недоступний під час виконання, memory_search
повертає результат недоступності замість тихого використання пригадування лише FTS. Виправте
конфігурацію провайдера/автентифікації, перейдіть на доступного провайдера або задайте
provider: "none", якщо хочете навмисне пригадування лише FTS.
Власні ідентифікатори провайдерів
memorySearch.provider може вказувати на власний запис models.providers.<id> для memory-specific provider adapters, як-от ollama, або для OpenAI-сумісних API моделей, як-от openai-responses / openai-completions. OpenClaw розв’язує власника api цього провайдера для адаптера embeddings, зберігаючи власний ідентифікатор провайдера для обробки кінцевої точки, автентифікації та префіксів моделей. Це дає змогу конфігураціям із кількома GPU або кількома хостами виділяти memory embeddings для конкретної локальної кінцевої точки:
Розв’язання ключа 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 |
Codex OAuth охоплює лише чат/completions і не задовольняє запити embeddings.
Конфігурація віддаленої кінцевої точки
Використовуйтеprovider: "openai-compatible" для загального OpenAI-сумісного
сервера /v1/embeddings, який не має успадковувати глобальні облікові дані чату OpenAI.
Власний базовий URL API.
Перевизначити ключ API.
Додаткові HTTP-заголовки (об’єднуються з типовими значеннями провайдера).
Конфігурація для окремих провайдерів
Gemini
Gemini
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
model | string | gemini-embedding-001 | Також підтримує gemini-embedding-2-preview |
outputDimensionality | number | 3072 | Для Embedding 2: 768, 1536 або 3072 |
OpenAI-сумісні типи введення
OpenAI-сумісні типи введення
OpenAI-сумісні кінцеві точки embeddings можуть увімкнути специфічні для провайдера поля запиту
Зміна цих значень впливає на ідентичність кешу embeddings для пакетного індексування провайдера, і після неї слід переіндексувати пам’ять, коли upstream-модель по-різному обробляє мітки.
input_type. Це корисно для асиметричних моделей embeddings, які потребують різних міток для embeddings запиту й документа.| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
inputType | string | не задано | Спільний input_type для embeddings запиту й документа |
queryInputType | string | не задано | input_type під час запиту; перевизначає inputType |
documentInputType | string | не задано | input_type індексу/документа; перевизначає inputType |
Bedrock
Bedrock
Конфігурація embeddings Bedrock
Bedrock використовує типовий ланцюжок облікових даних AWS SDK — ключі API не потрібні. Якщо OpenClaw працює на EC2 з роллю екземпляра, для якої ввімкнено Bedrock, просто задайте провайдера й модель:| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
model | string | amazon.titan-embed-text-v2:0 | Будь-який ідентифікатор моделі embeddings 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 потрібні:InvokeModel конкретною моделлю:Local (GGUF + llama.cpp)
Local (GGUF + 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). |
openclaw plugins install @openclaw/llama-cpp-provider.
Типова модель: embeddinggemma-300m-qat-Q8_0.gguf (~0,6 ГБ, автоматично завантажується). Вихідні checkout-и все ще потребують схвалення нативного складання: pnpm approve-builds, потім pnpm rebuild node-llama-cpp.Використовуйте автономний CLI, щоб перевірити той самий шлях постачальника, який використовує Gateway:provider: "local" для локальних GGUF embeddings. Посилання на моделі hf: і HTTP(S) підтримуються для явних локальних конфігурацій, але вони не змінюють типового постачальника.Тайм-аут inline embedding
Перевизначає тайм-аут для inline-пакетів embedding під час індексування пам’яті.Якщо не задано, використовується типове значення постачальника: 600 секунд для локальних/самостійно розміщених постачальників, як-от
local, ollama і lmstudio, та 120 секунд для розміщених постачальників. Збільште це значення, коли локальні 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)
- Temporal decay (recency)
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
mmr.enabled | boolean | false | Увімкнути повторне ранжування MMR |
mmr.lambda | number | 0.7 | 0 = максимальна різноманітність, 1 = максимальна релевантність |
Повний приклад
Додаткові шляхи пам’яті
| Ключ | Тип | Опис |
|---|---|---|
extraPaths | string[] | Додаткові каталоги або файли для індексування |
.md. Обробка симлінків залежить від активного бекенда: вбудований рушій ігнорує симлінки, а QMD дотримується поведінки базового сканера QMD.
Для пошуку транскриптів між агентами в межах агента використовуйте agents.list[].memorySearch.qmd.extraCollections замість memory.qmd.paths. Ці додаткові колекції мають ту саму форму { path, name, pattern? }, але об’єднуються для кожного агента й можуть зберігати явні спільні назви, коли шлях вказує за межі поточного робочого простору. Якщо той самий розв’язаний шлях з’являється і в 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 | Максимальний розмір файлу для індексу |
Застосовується лише до файлів у
extraPaths. Типові корені пам’яті залишаються лише для Markdown. Потрібен gemini-embedding-2-preview. fallback має бути "none"..jpg, .jpeg, .png, .webp, .gif, .heic, .heif (зображення); .mp3, .wav, .ogg, .opus, .m4a, .aac, .flac (аудіо).
Кеш embedding
| Ключ | Тип | Типово | Опис |
|---|---|---|---|
cache.enabled | boolean | true | Кешувати embedding чанків у SQLite |
cache.maxEntries | number | 50000 | Максимум кешованих 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, які використовують локальні/самостійно розміщені провайдери та хостингові провайдери, коли пакетні 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 | Порогове значення повідомлень для повторного індексу |
tools.sessions.visibility. Типова видимість
tree відкриває лише поточний сеанс і сеанси, які він породив. Щоб
пригадати непов’язаний сеанс того самого агента, надісланий через Gateway, з іншого
сеансу, наприклад приватного повідомлення, навмисно розширте видимість до agent (або до all лише
коли також потрібне пригадування між агентами й політика взаємодії агентів це дозволяє).
Наведені нижче приклади розміщують ці налаштування в agents.defaults. Ви також можете
застосувати еквівалентні налаштування memorySearch у перевизначенні для окремого агента, коли лише один
агент має індексувати й шукати транскрипти сеансів.
Для пригадування з Gateway до приватного повідомлення для того самого агента:
- Вбудований бекенд
- Бекенд QMD
agents.defaults.memorySearch.experimental.sessionMemory і
sources: ["sessions"] самі по собі не експортують транскрипти в QMD. Також установіть
memory.qmd.sessions.enabled: true.
Прискорення векторів SQLite (sqlite-vec)
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
store.vector.enabled | boolean | true | Використовувати sqlite-vec для векторних запитів |
store.vector.extensionPath | string | у комплекті | Перевизначити шлях sqlite-vec |
Сховище індексів
Вбудовані індекси пам’яті зберігаються в SQLite-базі даних OpenClaw кожного агента за шляхомagents/<agentId>/agent/openclaw-agent.sqlite.
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
store.fts.tokenizer | string | unicode61 | Токенізатор FTS5 (unicode61 або trigram) |
Конфігурація бекенда QMD
Установітьmemory.backend = "qmd", щоб увімкнути. Усі налаштування QMD розміщуються в memory.qmd:
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
command | string | qmd | Шлях до виконуваного файла QMD; задайте абсолютний шлях, коли PATH сервісу відрізняється від вашої оболонки |
searchMode | string | search | Команда пошуку: search, vsearch, query |
rerank | boolean | — | Установіть false з searchMode: "query" і QMD 2.1+, щоб пропустити повторне ранжування QMD |
includeDefaultMemory | boolean | true | Автоматично індексувати MEMORY.md + memory/**/*.md |
paths[] | array | — | Додаткові шляхи: { name, path, pattern? } |
sessions.enabled | boolean | false | Експортувати транскрипти сеансів у QMD |
sessions.retentionDays | number | — | Термін зберігання транскриптів |
sessions.exportDir | string | — | Каталог експорту |
searchMode: "search" є лише лексичним/BM25. OpenClaw не запускає перевірки готовності семантичних векторів або обслуговування вбудовувань QMD для цього режиму, зокрема під час memory status --deep; vsearch і query надалі потребують готовності векторів і вбудовувань QMD.
rerank: false змінює лише режим QMD query і потребує QMD 2.1 або новішої версії. У прямому режимі CLI OpenClaw передає --no-rerank; у режимі MCP на базі mcporter він передає rerank: false до уніфікованого інструмента запитів QMD. Залиште це незаданим, щоб використовувати типову поведінку повторного ранжування запитів QMD.
OpenClaw віддає перевагу поточним формам колекцій QMD і запитів MCP, але зберігає роботу зі старішими випусками QMD, за потреби пробуючи сумісні прапорці шаблонів колекцій і старіші назви інструментів MCP. Коли QMD оголошує підтримку кількох фільтрів колекцій, колекції з того самого джерела шукаються одним процесом QMD; старіші збірки QMD зберігають сумісний шлях для кожної колекції. Те саме джерело означає, що сталі колекції пам’яті групуються разом, тоді як колекції транскриптів сеансів залишаються окремою групою, щоб диверсифікація джерел усе ще мала обидва входи.
Перевизначення моделей QMD залишаються на боці QMD, а не в конфігурації OpenClaw. Якщо потрібно глобально перевизначити моделі QMD, задайте змінні середовища, як-от
QMD_EMBED_MODEL, QMD_RERANK_MODEL і QMD_GENERATE_MODEL, у середовищі виконання Gateway.Графік оновлень
Графік оновлень
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
update.interval | string | 5m | Інтервал оновлення |
update.debounceMs | number | 15000 | Debounce змін файлів |
update.onBoot | boolean | true | Оновлювати, коли відкривається довготривалий менеджер QMD; задайте false, щоб пропустити негайне оновлення під час завантаження |
update.startup | string | off | Необов’язкова ініціалізація QMD під час запуску Gateway: off, idle або immediate |
update.startupDelayMs | number | 120000 | Затримка перед запуском оновлення startup: "idle" |
update.waitForBootSync | boolean | false | Блокувати відкриття менеджера, доки не завершиться його початкове оновлення |
update.embedInterval | string | — | Окрема частота embed |
update.commandTimeoutMs | number | — | Таймаут для команд QMD |
update.updateTimeoutMs | number | — | Таймаут для операцій оновлення QMD |
update.embedTimeoutMs | number | — | Таймаут для операцій embed QMD |
Ліміти
Ліміти
| Ключ | Тип | Типове значення | Опис |
|---|---|---|---|
limits.maxResults | number | 6 | Максимум результатів пошуку |
limits.maxSnippetChars | number | — | Обмежити довжину фрагмента |
limits.maxInjectedChars | number | — | Обмежити загальну кількість вставлених символів |
limits.timeoutMs | number | 4000 | Таймаут пошуку |
Область дії
Область дії
Керує тим, які сеанси можуть отримувати результати пошуку QMD. Та сама схема, що й Типове значення, що постачається, дозволяє прямі та канальні сеанси, водночас усе ще забороняючи групи.Типове значення — лише DM.
session.sendPolicy:match.keyPrefix зіставляється з нормалізованим ключем сеансу; match.rawKeyPrefix зіставляється з сирим ключем, включно з agent:<id>:.Цитування
Цитування
memory.citations застосовується до всіх бекендів:| Значення | Поведінка |
|---|---|
auto (типово) | Додавати футер Source: <path#line> у фрагменти |
on | Завжди додавати футер |
off | Не додавати футер (шлях усе одно передається агенту внутрішньо) |
update.onBoot має значення true і не налаштовано обслуговування за інтервалом/embed, запуск використовує одноразовий менеджер для оновлення під час завантаження та закриває його. Якщо налаштовано інтервал оновлення або embed, запуск відкриває довготривалий менеджер QMD, щоб він міг володіти watcher і таймерами інтервалів; update.onBoot: false пропускає лише негайне оновлення під час завантаження.
Повний приклад QMD
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 * * * | Необов’язкова cadence Cron для повного проходу Dreaming |
model | string | типова модель | Необов’язкове перевизначення моделі субагента Dream Diary |
phases.deep.maxPromotedSnippetTokens | number | 160 | Максимальна оцінена кількість токенів, що зберігаються з кожного короткотермінового фрагмента recall, просунутого в MEMORY.md; метадані походження залишаються видимими |
Приклад
- Dreaming записує машинний стан у
memory/.dreams/. - Dreaming записує зручний для читання наративний вивід у
DREAMS.md(або наявнийdreams.md). dreaming.modelвикористовує наявний gate довіри субагента Plugin; задайтеplugins.entries.memory-core.subagent.allowModelOverride: trueперед увімкненням.- Dream Diary повторює спробу один раз із типовою моделлю сеансу, коли налаштована модель недоступна. Помилки довіри або allowlist записуються в журнал і не повторюються мовчки.
- Політика фаз light/deep/REM і порогові значення є внутрішньою поведінкою, а не користувацькою конфігурацією.