Обзор памяти
Как работает память.
Встроенный движок
Backend SQLite по умолчанию.
Движок QMD
Локальный sidecar.
Поиск по памяти
Конвейер поиска и настройка.
Active Memory
Подагент памяти для интерактивных сеансов.
agents.defaults.memorySearch в openclaw.json, если не указано иное.
Если вы ищете переключатель функции Active Memory и конфигурацию подагента, они находятся в
plugins.entries.active-memory, а не в memorySearch.Active Memory использует модель с двумя условиями:- Plugin должен быть включен и нацелен на текущий идентификатор агента
- запрос должен быть подходящим интерактивным постоянным сеансом чата
Выбор провайдера
| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
provider | string | "openai" | ID адаптера embedding, например bedrock, deepinfra, gemini, github-copilot, local, mistral, ollama, openai, openai-compatible или voyage; также может быть настроенным models.providers.<id>, чей api указывает на адаптер embedding памяти или OpenAI-совместимый API модели |
model | string | default провайдера | Имя модели embedding |
fallback | string | "none" | ID резервного адаптера, когда основной завершается с ошибкой |
enabled | boolean | true | Включить или отключить поиск по памяти |
provider не задан, OpenClaw использует embeddings OpenAI. Задайте provider
явно, чтобы использовать Gemini, Voyage, Mistral, DeepInfra, Bedrock, GitHub Copilot,
Ollama, локальную модель GGUF или OpenAI-совместимый endpoint /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.
Пользовательские ID провайдеров
memorySearch.provider может указывать на пользовательскую запись models.providers.<id> для специализированных адаптеров провайдера памяти, таких как ollama, или для OpenAI-совместимых API моделей, таких как openai-responses / openai-completions. OpenClaw разрешает владельца api этого провайдера для адаптера embedding, сохраняя пользовательский ID провайдера для endpoint, аутентификации и обработки префиксов моделей. Это позволяет конфигурациям с несколькими GPU или хостами выделять embeddings памяти на конкретный локальный endpoint:
Разрешение ключа 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 (placeholder) | — |
| OpenAI | OPENAI_API_KEY | models.providers.openai.apiKey |
| Voyage | VOYAGE_API_KEY | models.providers.voyage.apiKey |
Codex OAuth покрывает только chat/completions и не удовлетворяет запросы embedding.
Конфигурация удаленного endpoint
Используйте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-совместимые endpoint embeddings могут включать специфичные для провайдера поля запроса
Изменение этих значений влияет на идентичность кэша embeddings для пакетной индексации провайдера, и после него следует переиндексировать память, когда upstream-модель по-разному обрабатывает метки.
input_type. Это полезно для асимметричных моделей embedding, которым нужны разные метки для embeddings запросов и документов.| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
inputType | string | не задан | Общий input_type для embeddings запросов и документов |
queryInputType | string | не задан | input_type во время запроса; переопределяет inputType |
documentInputType | string | не задан | input_type индекса/документа; переопределяет inputType |
Bedrock
Bedrock
Конфигурация embedding Bedrock
Bedrock использует цепочку учетных данных AWS SDK по умолчанию — ключи API не нужны. Если OpenClaw работает на EC2 с ролью экземпляра, в которой включен Bedrock, просто задайте провайдера и модель:| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
model | string | amazon.titan-embed-text-v2:0 | Любой ID модели embedding Bedrock |
outputDimensionality | number | default модели | Для 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 конкретной моделью:Локально (GGUF + llama.cpp)
Локально (GGUF + llama.cpp)
| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
local.modelPath | string | скачивается автоматически | Путь к файлу модели GGUF |
local.modelCacheDir | string | значение по умолчанию node-llama-cpp | Каталог кэша для скачанных моделей |
local.contextSize | number | "auto" | 4096 | Размер контекстного окна для контекста эмбеддингов. 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. Ссылки на модели hf: и HTTP(S) поддерживаются для явных локальных конфигураций, но они не меняют провайдера по умолчанию.Тайм-аут inline-эмбеддингов
Переопределяет тайм-аут для inline-пакетов эмбеддингов во время индексирования памяти.Если значение не задано, используется значение провайдера по умолчанию: 600 секунд для локальных и самостоятельно размещенных провайдеров, таких как
local, ollama и lmstudio, и 120 секунд для размещенных провайдеров. Увеличьте это значение, когда локальные CPU-bound пакеты эмбеддингов работают корректно, но медленно.Конфигурация гибридного поиска
Все находится вmemorySearch.query.hybrid:
| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled | boolean | true | Включить гибридный поиск BM25 + векторный поиск |
vectorWeight | number | 0.7 | Вес векторных оценок (0-1) |
textWeight | number | 0.3 | Вес оценок BM25 (0-1) |
candidateMultiplier | number | 4 | Множитель размера пула кандидатов |
- MMR (разнообразие)
- Временное затухание (актуальность)
| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
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 (аудио).
Кэш эмбеддингов
| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
cache.enabled | boolean | true | Кэшировать эмбеддинги фрагментов в SQLite |
cache.maxEntries | number | 50000 | Максимум кэшированных эмбеддингов |
Пакетное индексирование
| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
remote.nonBatchConcurrency | number | 4 | Параллельные встроенные эмбеддинги |
remote.batch.enabled | boolean | false | Включить API пакетных эмбеддингов |
remote.batch.concurrency | number | 2 | Параллельные пакетные задания |
remote.batch.wait | boolean | true | Ждать завершения пакета |
remote.batch.pollIntervalMs | number | — | Интервал опроса |
remote.batch.timeoutMinutes | number | — | Тайм-аут пакета |
openai, gemini и voyage. Пакетная обработка OpenAI обычно самая быстрая и дешевая для больших обратных заполнений.
remote.nonBatchConcurrency управляет встроенными вызовами создания эмбеддингов, используемыми локальными/самостоятельно размещенными провайдерами и размещенными провайдерами, когда API пакетной обработки провайдера не активны. Для непакетного индексирования Ollama по умолчанию использует 1, чтобы не перегружать небольшие локальные хосты; на более крупных машинах задайте большее значение.
Это отдельно от sync.embeddingBatchTimeoutSeconds, который управляет тайм-аутом встроенных вызовов создания эмбеддингов.
Поиск в памяти сеансов (экспериментально)
Индексируйте расшифровки сеансов и предоставляйте их черезmemory_search:
| Ключ | Тип | По умолчанию | Описание |
|---|---|---|---|
experimental.sessionMemory | boolean | false | Включить индексирование сеансов |
sources | string[] | ["memory"] | Добавьте "sessions", чтобы включить расшифровки |
sync.sessions.deltaBytes | number | 100000 | Порог байтов для повторного индексирования |
sync.sessions.deltaMessages | number | 50 | Порог сообщений для повторного индексирования |
tools.sessions.visibility. Видимость по умолчанию
tree открывает только текущую сессию и сессии, которые она запустила. Чтобы
из другой сессии, например из личного сообщения (DM), вспомнить несвязанную сессию того же агента, отправленную через Gateway,
намеренно расширьте видимость до agent (или до all только
когда также требуется вспоминание между агентами и это разрешает политика взаимодействия агентов).
В примерах ниже эти настройки размещены в agents.defaults. Вы также можете
применить эквивалентные настройки memorySearch в переопределении для отдельного агента, когда только один
агент должен индексировать стенограммы сессий и искать по ним.
Для вспоминания из Gateway в DM в рамках одного агента:
- Встроенный бэкенд
- Бэкенд 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+, чтобы пропустить reranking 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 не запускает проверки готовности семантических векторов или обслуживание embedding QMD для этого режима, в том числе во время memory status --deep; vsearch и query по-прежнему требуют готовности векторов QMD и embeddings.
rerank: false меняет только режим QMD query и требует QMD 2.1 или новее. В режиме прямого CLI OpenClaw передает --no-rerank; в режиме MCP на базе mcporter он передает rerank: false в единый инструмент запросов QMD. Оставьте параметр незаданным, чтобы использовать стандартное поведение reranking запросов 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 | Подавлять дребезг изменений файлов |
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 (default) | Включать строку Source: <path#line> внизу фрагментов |
on | Всегда включать строку внизу |
off | Не включать строку внизу (путь все равно передается агенту внутренне) |
update.onBoot равно true и обслуживание по интервалу/embed не настроено, при запуске используется одноразовый менеджер для обновления при загрузке, после чего он закрывается. Если настроен интервал обновления или embed, при запуске открывается долговременный менеджер QMD, чтобы он владел наблюдателем и таймерами интервалов; 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 * * * | Необязательная периодичность Cron для полного прохода dreaming |
model | string | модель по умолчанию | Необязательное переопределение модели субагента Dream Diary |
phases.deep.maxPromotedSnippetTokens | number | 160 | Максимальное расчетное число токенов, сохраняемых из каждого фрагмента краткосрочного recall, продвинутого в MEMORY.md; метаданные происхождения остаются видимыми |
Пример
- Dreaming записывает машинное состояние в
memory/.dreams/. - Dreaming записывает человекочитаемый повествовательный вывод в
DREAMS.md(или существующийdreams.md). dreaming.modelиспользует существующий шлюз доверия субагента Plugin; перед включением задайтеplugins.entries.memory-core.subagent.allowModelOverride: true.- Dream Diary повторяет попытку один раз с моделью сеанса по умолчанию, если настроенная модель недоступна. Сбои доверия или allowlist журналируются и не повторяются без уведомления.
- Политика и пороги фаз light/deep/REM являются внутренним поведением, а не пользовательской конфигурацией.