Управление сеансами
OpenClaw рассматривает один сеанс прямого чата на агента как основной. Прямые чаты сворачиваются кagent:<agentId>:<mainKey> (по умолчанию main), тогда как групповые/канальные чаты получают собственные ключи. session.mainKey соблюдается.
Используйте session.dmScope, чтобы управлять тем, как группируются личные сообщения (DM):
main(по умолчанию): все DM используют основной сеанс для непрерывности.per-peer: изоляция по идентификатору отправителя между каналами.per-channel-peer: изоляция по каналу + отправителю (рекомендуется для многопользовательских входящих).per-account-channel-peer: изоляция по аккаунту + каналу + отправителю (рекомендуется для многоаккаунтных входящих). Используйтеsession.identityLinks, чтобы сопоставлять peer id с префиксом провайдера с канонической идентичностью, чтобы один и тот же человек разделял один DM-сеанс между каналами при использованииper-peer,per-channel-peerилиper-account-channel-peer.
Режим безопасных DM (рекомендуется для многопользовательских настроек)
Предупреждение по безопасности: если ваш агент может получать DM от нескольких людей, настоятельно рекомендуется включить режим безопасных DM. Без него все пользователи разделяют один и тот же контекст разговора, что может привести к утечке приватной информации между пользователями.Пример проблемы с настройками по умолчанию:
- Алиса (
<SENDER_A>) пишет вашему агенту о приватной теме (например, о медицинском приёме) - Боб (
<SENDER_B>) пишет вашему агенту, спрашивая: «О чём мы говорили?» - Поскольку оба DM используют один и тот же сеанс, модель может ответить Бобу, используя предыдущий контекст Алисы.
dmScope, чтобы изолировать сеансы по пользователям:
- У вас есть подтверждения сопряжения для более чем одного отправителя
- Вы используете allowlist DM с несколькими записями
- Вы установили
dmPolicy: "open" - Несколько телефонных номеров или аккаунтов могут писать вашему агенту
- По умолчанию используется
dmScope: "main"для непрерывности (все DM используют основной сеанс). Это подходит для однопользовательских настроек. - Для многоаккаунтных входящих в одном и том же канале предпочтительнее
per-account-channel-peer. - Если один и тот же человек связывается с вами через несколько каналов, используйте
session.identityLinks, чтобы свернуть его DM-сеансы в одну каноническую идентичность. - Вы можете проверить настройки DM с помощью
openclaw security audit(см. security).
Gateway — источник истины
Всё состояние сеансов принадлежит Gateway (шлюзу) ( «master» OpenClaw). Клиенты UI (приложение для macOS, WebChat и т. п.) должны запрашивать у шлюза списки сеансов и счётчики токенов, а не читать локальные файлы.- В удалённом режиме хранилище сеансов, которое вас интересует, находится на удалённом хосте шлюза Gateway, а не на вашем Mac.
- Счётчики токенов, отображаемые в UI, берутся из полей хранилища шлюза (
inputTokens,outputTokens,totalTokens,contextTokens). Клиенты не парсят JSONL‑транскрипты, чтобы «исправлять» итоги.
Где хранится состояние
- На хосте шлюза Gateway:
- Файл хранилища:
~/.openclaw/agents/<agentId>/sessions/sessions.json(на агента).
- Файл хранилища:
- Транскрипты:
~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonl(сеансы тем Telegram используют.../<SessionId>-topic-<threadId>.jsonl). - Хранилище — это отображение
sessionKey -> { sessionId, updatedAt, ... }. Удаление записей безопасно; они пересоздаются по требованию. - Групповые записи могут включать
displayName,channel,subject,roomиspaceдля маркировки сеансов в UI. - Записи сеансов включают метаданные
origin(метка + подсказки маршрутизации), чтобы UI мог объяснять происхождение сеанса. - OpenClaw не читает устаревшие папки сеансов Pi/Tau.
Обрезка сеансов
По умолчанию OpenClaw обрезает старые результаты инструментов из контекста в памяти непосредственно перед вызовами LLM. Это не переписывает историю JSONL. См. /concepts/session-pruning.Предварительный сброс памяти перед уплотнением
Когда сеанс приближается к автоуплотнению, OpenClaw может выполнить тихий сброс памяти — ход, который напоминает модели записать устойчивые заметки на диск. Это выполняется только когда рабочее пространство доступно для записи. Memory и Compaction.Сопоставление транспортов → ключи сеансов
- Прямые чаты следуют
session.dmScope(по умолчаниюmain).main:agent:<agentId>:<mainKey>(непрерывность между устройствами/каналами).- Несколько телефонных номеров и каналов могут сопоставляться с одним основным ключом агента; они действуют как транспорты в один разговор.
per-peer:agent:<agentId>:dm:<peerId>.per-channel-peer:agent:<agentId>:<channel>:dm:<peerId>.per-account-channel-peer:agent:<agentId>:<channel>:<accountId>:dm:<peerId>(accountId по умолчанию —default).- Если
session.identityLinksсовпадает с peer id с префиксом провайдера (например,telegram:123), канонический ключ заменяет<peerId>, чтобы один и тот же человек разделял сеанс между каналами.
- Групповые чаты изолируют состояние:
agent:<agentId>:<channel>:group:<id>(комнаты/каналы используютagent:<agentId>:<channel>:channel:<id>).- Темы форумов Telegram добавляют
:topic:<threadId>к идентификатору группы для изоляции. - Устаревшие ключи
group:<id>всё ещё распознаются для миграции.
- Темы форумов Telegram добавляют
- Входящие контексты всё ещё могут использовать
group:<id>; канал выводится изProviderи нормализуется к канонической формеagent:<agentId>:<channel>:group:<id>. - Другие источники:
- Cron‑задачи:
cron:<job.id> - Webhooks:
hook:<uuid>(если явно не задано хуком) - Запуски узлов:
node-<nodeId>
- Cron‑задачи:
Жизненный цикл
- Политика сброса: сеансы переиспользуются до истечения срока, а истечение оценивается при следующем входящем сообщении.
- Ежедневный сброс: по умолчанию 4:00 по местному времени на хосте шлюза Gateway. Сеанс считается устаревшим, если его последнее обновление раньше времени последнего ежедневного сброса.
- Сброс по бездействию (необязательно):
idleMinutesдобавляет скользящее окно простоя. Когда настроены и ежедневный, и простой‑сброс, что истечёт раньше, то и принудит новый сеанс. - Устаревший режим «только простой»: если вы установили
session.idleMinutesбез какой‑либо конфигурацииsession.reset/resetByType, OpenClaw остаётся в режиме только по простоям для обратной совместимости. - Переопределения по типам (необязательно):
resetByTypeпозволяет переопределять политику для сессийdirect,groupиthread(thread = треды Slack/Discord, темы Telegram, треды Matrix, когда они предоставляются коннектором). - Переопределения по каналам (необязательно):
resetByChannelпереопределяет политику сброса для канала (применяется ко всем типам сеансов этого канала и имеет приоритет надreset/resetByType). - Триггеры сброса: точные
/newили/reset(плюс любые дополнительные вresetTriggers) запускают новый идентификатор сеанса и пропускают остаток сообщения дальше./new <model>принимает алиас модели,provider/modelили имя провайдера (нечёткое совпадение), чтобы задать модель нового сеанса. Если/newили/resetотправлены отдельно, OpenClaw выполняет короткий приветственный ход «hello» для подтверждения сброса. - Ручной сброс: удалите конкретные ключи из хранилища или удалите JSONL‑транскрипт; следующее сообщение пересоздаст их.
- Изолированные cron‑задачи всегда создают новый
sessionIdна каждый запуск (без повторного использования по простою).
Политика отправки (необязательно)
Блокируйте доставку для конкретных типов сеансов без перечисления отдельных идентификаторов./send on→ разрешить для этого сеанса/send off→ запретить для этого сеанса/send inherit→ очистить переопределение и использовать правила конфига Отправляйте их как отдельные сообщения, чтобы они зарегистрировались.
Конфигурация (пример необязательного переименования)
Инспектирование
openclaw status— показывает путь к хранилищу и недавние сеансы.openclaw sessions --json— выгружает каждую запись (фильтрация с помощью--active <minutes>).openclaw gateway call sessions.list --params '{}'— получает сеансы из работающего шлюза (используйте--url/--tokenдля доступа к удалённому шлюзу).- Отправьте
/statusкак отдельное сообщение в чате, чтобы увидеть, доступен ли агент, какая часть контекста сеанса используется, текущие переключатели thinking/verbose и когда в последний раз обновлялись ваши учётные данные WhatsApp Web (помогает выявлять необходимость перепривязки). - Отправьте
/context listили/context detail, чтобы увидеть содержимое системного промпта и внедрённых файлов рабочего пространства (и крупнейших вкладчиков в контекст). - Отправьте
/stopкак отдельное сообщение, чтобы прервать текущий запуск, очистить очередь последующих действий для этого сеанса и остановить любые запуски субагентов, порождённые им (ответ включает количество остановленных). - Отправьте
/compact(необязательные инструкции) как отдельное сообщение, чтобы суммировать более старый контекст и освободить место в окне. См. /concepts/compaction. - JSONL‑транскрипты можно открыть напрямую для просмотра полных ходов.
Советы
- Держите основной ключ выделенным для трафика 1:1; пусть группы сохраняют собственные ключи.
- При автоматизации очистки удаляйте отдельные ключи, а не всё хранилище, чтобы сохранить контекст в других местах.
Метаданные происхождения сеанса
Каждая запись сеанса фиксирует, откуда она пришла (best‑effort), вorigin:
label: человекочитаемая метка (разрешается из метки разговора + темы группы/канала)provider: нормализованный идентификатор канала (включая расширения)from/to: сырые идентификаторы маршрутизации из входящего конвертаaccountId: идентификатор аккаунта провайдера (при многоаккаунтности)threadId: идентификатор треда/темы, когда канал это поддерживает Поля происхождения заполняются для личных сообщений, каналов и групп. Если коннектор обновляет только маршрутизацию доставки (например, чтобы поддерживать актуальность основного DM‑сеанса), он всё равно должен предоставлять входящий контекст, чтобы сеанс сохранял свои поясняющие метаданные. Расширения могут сделать это, отправивConversationLabel,GroupSubject,GroupChannel,GroupSpaceиSenderNameво входящем контексте и вызвавrecordSessionMetaFromInbound(или передав тот же контекст вupdateLastRoute).