---
read_when:
    - Вам нужно отлаживать идентификаторы сеансов, transcript JSONL или поля sessions.json
    - Вы изменяете поведение автоматической Compaction или добавляете служебную очистку «pre-compaction»
    - Вы хотите реализовать сбросы памяти или тихие системные ходы
summary: 'Глубокий разбор: хранилище сессий и стенограммы, жизненный цикл и внутреннее устройство (авто)Compaction'
title: Подробный разбор управления сеансами
x-i18n:
    generated_at: "2026-06-28T23:45:02Z"
    model: gpt-5.5
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: 7d4b6195c54024a8c0096ec2462ba367dbb6e16a8f6e10f2f912b879848c65af
    source_path: reference/session-management-compaction.md
    workflow: 16
---

OpenClaw управляет сессиями от начала до конца в следующих областях:

- **Маршрутизация сессий** (как входящие сообщения сопоставляются с `sessionKey`)
- **Хранилище сессий** (`sessions.json`) и что оно отслеживает
- **Сохранение транскрипта** (`*.jsonl`) и его структура
- **Гигиена транскрипта** (исправления, специфичные для провайдера, перед запусками)
- **Ограничения контекста** (контекстное окно и отслеживаемые токены)
- **Compaction** (ручная и автоматическая Compaction) и где подключать работу перед Compaction
- **Тихое обслуживание** (записи памяти, которые не должны создавать видимый пользователю вывод)

Если сначала нужен более общий обзор, начните с:

- [Управление сессиями](/ru/concepts/session)
- [Compaction](/ru/concepts/compaction)
- [Обзор памяти](/ru/concepts/memory)
- [Поиск по памяти](/ru/concepts/memory-search)
- [Очистка сессий](/ru/concepts/session-pruning)
- [Гигиена транскрипта](/ru/reference/transcript-hygiene)

---

## Источник истины: Gateway

OpenClaw спроектирован вокруг одного **процесса Gateway**, который владеет состоянием сессий.

- UI (приложение macOS, веб Control UI, TUI) должны запрашивать у Gateway списки сессий и счетчики токенов.
- В удаленном режиме файлы сессий находятся на удаленном хосте; «проверка файлов на вашем локальном Mac» не отразит то, что использует Gateway.

---

## Два слоя сохранения

OpenClaw сохраняет сессии в двух слоях:

1. **Хранилище сессий (`sessions.json`)**
   - Карта ключ/значение: `sessionKey -> SessionEntry`
   - Небольшое, изменяемое, безопасное для редактирования (или удаления записей)
   - Отслеживает метаданные сессии (текущий идентификатор сессии, последняя активность, переключатели, счетчики токенов и т. д.)

2. **Транскрипт (`<sessionId>.jsonl`)**
   - Транскрипт только с добавлением записей и древовидной структурой (записи имеют `id` + `parentId`)
   - Хранит фактическую беседу + вызовы инструментов + сводки Compaction
   - Используется для восстановления контекста модели для будущих ходов
   - Контрольные точки Compaction являются метаданными над уплотненным последующим
     транскриптом. Новые Compaction не записывают вторую копию `.checkpoint.*.jsonl`.

Читателям истории Gateway следует избегать материализации всего транскрипта, если
поверхности явно не нужен произвольный исторический доступ. История первой страницы,
встроенная история чата, восстановление после перезапуска и проверки токенов/использования используют ограниченное
чтение хвоста. Полные сканирования транскрипта проходят через асинхронный индекс транскрипта, который
кэшируется по пути к файлу плюс `mtimeMs`/`size` и совместно используется параллельными читателями.

---

## Расположения на диске

Для каждого агента, на хосте Gateway:

- Хранилище: `~/.openclaw/agents/<agentId>/sessions/sessions.json`
- Транскрипты: `~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl`
  - Сессии тем Telegram: `.../<sessionId>-topic-<threadId>.jsonl`

OpenClaw разрешает эти пути через `src/config/sessions.ts`.

---

## Обслуживание хранилища и управление диском

Сохранение сессий имеет автоматические элементы управления обслуживанием (`session.maintenance`) для `sessions.json`, артефактов транскриптов и побочных файлов траекторий:

- `mode`: `enforce` (по умолчанию) или `warn`
- `pruneAfter`: порог возраста устаревших записей (по умолчанию `30d`)
- `maxEntries`: ограничение записей в `sessions.json` (по умолчанию `500`)
- Хранение краткоживущих пробных запусков модели Gateway фиксировано на `24h`, но оно ограничено давлением: устаревшие строки строгих проб удаляются только при достижении давления обслуживания/лимита записей сессий. Это применяется только к строгим явным ключам проб, соответствующим `agent:*:explicit:model-run-<uuid>`, и выполняется перед глобальной очисткой/ограничением устаревших записей, когда запускается.
- `resetArchiveRetention`: срок хранения архивов транскриптов `*.reset.<timestamp>` (по умолчанию: такой же, как `pruneAfter`; `false` отключает очистку)
- `maxDiskBytes`: необязательный бюджет каталога сессий
- `highWaterBytes`: необязательная цель после очистки (по умолчанию `80%` от `maxDiskBytes`)

Обычные записи Gateway проходят через писатель сессий для каждого хранилища, который сериализует внутрипроцессные мутации без взятия файловой блокировки времени выполнения. Вспомогательные функции исправлений на горячем пути заимствуют проверенный изменяемый кэш, пока удерживают этот слот писателя, поэтому большие файлы `sessions.json` не клонируются и не перечитываются при каждом обновлении метаданных. Код времени выполнения должен предпочитать `updateSessionStore(...)` или `updateSessionStoreEntry(...)`; прямые сохранения всего хранилища являются инструментами совместимости и автономного обслуживания. Когда Gateway доступен, не пробные `openclaw sessions cleanup` и `openclaw agents delete` делегируют мутации хранилища Gateway, чтобы очистка попадала в ту же очередь писателя; `--store <path>` — это явный автономный путь восстановления для прямого обслуживания файла. Очистка `maxEntries` по-прежнему пакетируется для производственных лимитов, поэтому хранилище может ненадолго превысить настроенный лимит до того, как следующая очистка по верхнему порогу снова сократит его. Чтения хранилища сессий не очищают и не ограничивают записи во время запуска Gateway; используйте записи или `openclaw sessions cleanup --enforce` для очистки. `openclaw sessions cleanup --enforce` по-прежнему немедленно применяет настроенный лимит и удаляет старые неиспользуемые артефакты транскриптов, контрольных точек и траекторий, даже если дисковый бюджет не настроен.

Обслуживание сохраняет долговечные внешние указатели бесед, такие как групповые сессии
и сессии чата в рамках веток, но синтетические записи времени выполнения для cron, хуков,
Heartbeat, ACP и субагентов все равно могут быть удалены, когда они превышают
настроенный возраст, количество или дисковый бюджет. Сессии пробных запусков модели Gateway используют
отдельный срок хранения модельных запусков `24h` только когда их ключ точно соответствует
`agent:*:explicit:model-run-<uuid>`; другие явные сессии не входят в это
хранение. Очистка модельных запусков применяется только при давлении лимита записей сессий.
Изолированные запуски cron сохраняют собственный элемент управления `cron.sessionRetention`,
независимый от хранения проб модельных запусков.

OpenClaw больше не создает автоматические ротационные резервные копии `sessions.json.bak.*` во время записей Gateway. Устаревший ключ `session.maintenance.rotateBytes` игнорируется, а `openclaw doctor --fix` удаляет его из старых конфигураций.

Мутации транскрипта используют блокировку записи сессии на файле транскрипта. Получение блокировки ожидает до
`session.writeLock.acquireTimeoutMs`, прежде чем показать ошибку занятой сессии; значение по умолчанию — `60000`
мс. Увеличивайте его только когда законная подготовка, очистка, Compaction или зеркалирование транскрипта конкурируют
дольше на медленных машинах. `session.writeLock.staleMs` управляет тем, когда существующая блокировка может быть
повторно захвачена как устаревшая; значение по умолчанию — `1800000` мс. `session.writeLock.maxHoldMs` управляет
порогом освобождения внутрипроцессного сторожевого механизма; значение по умолчанию — `300000` мс. Экстренные переопределения env:
`OPENCLAW_SESSION_WRITE_LOCK_ACQUIRE_TIMEOUT_MS`, `OPENCLAW_SESSION_WRITE_LOCK_STALE_MS` и
`OPENCLAW_SESSION_WRITE_LOCK_MAX_HOLD_MS`.

Порядок применения очистки дискового бюджета (`mode: "enforce"`):

1. Сначала удалить самые старые архивные, сиротские транскриптные или сиротские артефакты траекторий.
2. Если все еще выше цели, вытеснить самые старые записи сессий и их файлы транскриптов/траекторий.
3. Продолжать, пока использование не станет не выше `highWaterBytes`.

В `mode: "warn"` OpenClaw сообщает о потенциальных вытеснениях, но не изменяет хранилище/файлы.

Запустить обслуживание по требованию:

```bash
openclaw sessions cleanup --dry-run
openclaw sessions cleanup --enforce
```

---

## Сессии Cron и журналы запусков

Изолированные запуски cron также создают записи/транскрипты сессий и имеют выделенные элементы управления хранением:

- `cron.sessionRetention` (по умолчанию `24h`) удаляет старые изолированные сессии запусков cron из хранилища сессий (`false` отключает).
- `cron.runLog.keepLines` удаляет сохраненные строки истории запусков SQLite для каждого задания cron (по умолчанию: `2000`). `cron.runLog.maxBytes` остается допустимым для старых файловых журналов запусков.

Когда cron принудительно создает новую изолированную сессию запуска, он очищает предыдущую
запись сессии `cron:<jobId>` перед записью новой строки. Он переносит безопасные
предпочтения, такие как настройки thinking/fast/verbose, метки и явные
выбранные пользователем переопределения модели/auth. Он отбрасывает окружающий контекст беседы,
такой как маршрутизация канала/группы, политика отправки или очереди, повышение прав, источник и привязка времени выполнения ACP,
чтобы свежий изолированный запуск не мог унаследовать устаревшую доставку или
полномочия времени выполнения от старого запуска.

---

## Ключи сессий (`sessionKey`)

`sessionKey` определяет, _в каком контейнере беседы_ вы находитесь (маршрутизация + изоляция).

Распространенные шаблоны:

- Основной/прямой чат (для каждого агента): `agent:<agentId>:<mainKey>` (по умолчанию `main`)
- Группа: `agent:<agentId>:<channel>:group:<id>`
- Комната/канал (Discord/Slack): `agent:<agentId>:<channel>:channel:<id>` или `...:room:<id>`
- Cron: `cron:<job.id>`
- Webhook: `hook:<uuid>` (если не переопределено)

Канонические правила документированы в [/concepts/session](/ru/concepts/session).

---

## Идентификаторы сессий (`sessionId`)

Каждый `sessionKey` указывает на текущий `sessionId` (файл транскрипта, который продолжает беседу).

Практические правила:

- **Сброс** (`/new`, `/reset`) создает новый `sessionId` для этого `sessionKey`.
- **Ежедневный сброс** (по умолчанию 4:00 AM по локальному времени на хосте Gateway) создает новый `sessionId` при следующем сообщении после границы сброса.
- **Истечение из-за простоя** (`session.reset.idleMinutes` или устаревший `session.idleMinutes`) создает новый `sessionId`, когда сообщение приходит после окна простоя. Когда ежедневный сброс и простой настроены одновременно, срабатывает то, что истекает первым.
- **Возобновление после переподключения Control UI** может сохранить текущую видимую сессию для одной отправки после переподключения, когда Gateway получает соответствующий `sessionId` от клиента операторского UI. Обычные устаревшие отправки все равно создают новый `sessionId`.
- **Системные события** (Heartbeat, пробуждения cron, уведомления exec, служебный учет Gateway) могут изменять строку сессии, но не продлевают свежесть ежедневного сброса/сброса по простою. При переходе сброса отбрасываются поставленные в очередь уведомления системных событий для предыдущей сессии до построения свежего промпта.
- **Политика форка родителя** использует активную ветку OpenClaw при создании ветки обсуждения или форка субагента. Если эта ветка слишком большая, OpenClaw запускает дочерний объект с изолированным контекстом вместо сбоя или наследования непригодной истории. Политика определения размера автоматическая; устаревшая конфигурация `session.parentForkMaxTokens` удаляется `openclaw doctor --fix`.

Деталь реализации: решение происходит в `initSessionState()` в `src/auto-reply/reply/session.ts`.

---

## Схема хранилища сессий (`sessions.json`)

Тип значения хранилища — `SessionEntry` в `src/config/sessions.ts`.

Ключевые поля (не исчерпывающий список):

- `sessionId`: текущий идентификатор транскрипта (имя файла выводится из него, если `sessionFile` не задан)
- `sessionStartedAt`: временная метка начала текущего `sessionId`; свежесть ежедневного сброса
  использует ее. Устаревшие строки могут выводить ее из заголовка сессии JSONL.
- `lastInteractionAt`: временная метка последнего реального взаимодействия пользователя/канала; свежесть сброса по простою
  использует ее, поэтому Heartbeat, cron и события exec не поддерживают сессии
  живыми. Устаревшие строки без этого поля откатываются к восстановленному времени начала сессии
  для свежести по простою.
- `updatedAt`: временная метка последней мутации строки хранилища, используется для перечисления, очистки и
  служебного учета. Она не является источником истины для свежести ежедневного/простого сброса.
- `sessionFile`: необязательное явное переопределение пути транскрипта
- `chatType`: `direct | group | room` (помогает UI и политике отправки)
- `provider`, `subject`, `room`, `space`, `displayName`: метаданные для маркировки групп/каналов
- Переключатели:
  - `thinkingLevel`, `verboseLevel`, `reasoningLevel`, `elevatedLevel`
  - `sendPolicy` (переопределение для сессии)
- Выбор модели:
  - `providerOverride`, `modelOverride`, `authProfileOverride`
- Счетчики токенов (по возможности / зависят от провайдера):
  - `inputTokens`, `outputTokens`, `totalTokens`, `contextTokens`
- `compactionCount`: как часто автоматическая Compaction завершалась для этого ключа сессии
- `memoryFlushAt`: временная метка последней очистки памяти перед Compaction
- `memoryFlushCompactionCount`: счетчик Compaction на момент последней очистки

Хранилище безопасно редактировать, но Gateway является источником истины: он может переписывать или восстанавливать записи во время выполнения сессий.

---

## Структура транскрипта (`*.jsonl`)

Транскриптами управляет `SessionManager` из `openclaw/plugin-sdk/agent-sessions`.

Файл имеет формат JSONL:

- Первая строка: заголовок сессии (`type: "session"`, включает `id`, `cwd`, `timestamp`, необязательный `parentSession`)
- Затем: записи сессии с `id` + `parentId` (дерево)

Примечательные типы записей:

- `message`: сообщения user/assistant/toolResult
- `custom_message`: внедренные расширением сообщения, которые _попадают_ в контекст модели (могут быть скрыты в UI)
- `custom`: состояние расширения, которое _не_ попадает в контекст модели
- `compaction`: сохраненная сводка Compaction с `firstKeptEntryId` и `tokensBefore`
- `branch_summary`: сохраненная сводка при навигации по ветке дерева

OpenClaw намеренно **не** "исправляет" транскрипты; Gateway использует `SessionManager` для их чтения/записи.

---

## Окна контекста и отслеживаемые токены

Важны два разных понятия:

1. **Окно контекста модели**: жесткий лимит для каждой модели (токены, видимые модели)
2. **Счетчики хранилища сессии**: скользящая статистика, записываемая в `sessions.json` (используется для /status и панелей мониторинга)

Если вы настраиваете лимиты:

- Окно контекста берется из каталога моделей (и может быть переопределено через конфиг).
- `contextTokens` в хранилище — это оценочное/отчетное значение времени выполнения; не считайте его строгой гарантией.

Подробнее см. [/token-use](/ru/reference/token-use).

---

## Compaction: что это такое

Compaction сворачивает старую часть разговора в сохраненную запись `compaction` в транскрипте и оставляет последние сообщения без изменений.

После Compaction будущие ходы видят:

- Сводку Compaction
- Сообщения после `firstKeptEntryId`

Повторное внедрение разделов AGENTS.md после Compaction включается явно через
`agents.defaults.compaction.postCompactionSections`; если значение не задано или равно `[]`,
OpenClaw не добавляет выдержки из AGENTS.md поверх сводки Compaction.

Compaction является **постоянной** (в отличие от обрезки сессии). См. [/concepts/session-pruning](/ru/concepts/session-pruning).

## Границы фрагментов Compaction и парность инструментов

Когда OpenClaw разбивает длинный транскрипт на фрагменты Compaction, он сохраняет
вызовы инструментов ассистента в паре с соответствующими записями `toolResult`.

- Если разбиение по доле токенов попадает между вызовом инструмента и его результатом, OpenClaw
  сдвигает границу к сообщению ассистента с вызовом инструмента, вместо того чтобы разделять
  пару.
- Если завершающий блок результатов инструмента иначе вывел бы фрагмент за целевой размер,
  OpenClaw сохраняет этот ожидающий блок инструмента и оставляет несуммаризованный хвост
  без изменений.
- Прерванные/ошибочные блоки вызовов инструментов не удерживают ожидающее разбиение открытым.

---

## Когда происходит auto-compaction (среда выполнения OpenClaw)

Во встроенном агенте OpenClaw auto-compaction срабатывает в двух случаях:

1. **Восстановление после переполнения**: модель возвращает ошибку переполнения контекста
   (`request_too_large`, `context length exceeded`, `input exceeds the maximum
number of tokens`, `input token count exceeds the maximum number of input
tokens`, `input is too long for the model`, `ollama error: context length
exceeded` и похожие варианты в формате провайдера) → compact → retry.
   Когда провайдер сообщает число токенов предпринятой попытки, OpenClaw передает это
   наблюдаемое число в Compaction для восстановления после переполнения. Если провайдер подтверждает
   переполнение, но не раскрывает разбираемое число, OpenClaw передает в механизмы
   Compaction и диагностику синтетическое число, минимально превышающее бюджет.
   Если восстановление после переполнения все равно не удается, OpenClaw показывает явные инструкции
   пользователю и сохраняет текущее сопоставление сессии, вместо того чтобы молча ротировать
   ключ сессии на новый идентификатор сессии. Следующий шаг контролирует оператор:
   повторить сообщение, выполнить `/compact` или выполнить `/new`, когда предпочтительна
   новая сессия.
2. **Поддержание порога**: после успешного хода, когда:

`contextTokens > contextWindow - reserveTokens`

Где:

- `contextWindow` — окно контекста модели
- `reserveTokens` — запас, зарезервированный для промптов + следующего вывода модели

Это семантика среды выполнения OpenClaw.

OpenClaw также может запускать предварительный локальный Compaction перед открытием следующего
запуска, когда задан `agents.defaults.compaction.maxActiveTranscriptBytes` и
активный файл транскрипта достигает этого размера. Это ограничитель размера файла для локальной
стоимости повторного открытия, а не сырое архивирование: OpenClaw по-прежнему выполняет обычный семантический Compaction,
и для него требуется `truncateAfterCompaction`, чтобы сжатая сводка могла стать
новым транскриптом-преемником.

Для встроенных запусков OpenClaw `agents.defaults.compaction.midTurnPrecheck.enabled: true`
добавляет явный ограничитель цикла инструментов. После добавления результата инструмента и перед
следующим вызовом модели OpenClaw оценивает давление на промпт с помощью той же логики бюджета
предварительной проверки, которая используется в начале хода. Если контекст больше не помещается, ограничитель
не выполняет Compaction внутри хука `transformContext` среды выполнения OpenClaw. Он выдает структурированный
сигнал предварительной проверки в середине хода, останавливает текущую отправку промпта и позволяет
внешнему циклу запуска использовать существующий путь восстановления: обрезать слишком большие результаты инструментов,
когда этого достаточно, или запустить настроенный режим Compaction и повторить попытку. Опция
по умолчанию отключена и работает как с режимом Compaction `default`, так и с `safeguard`,
включая safeguard Compaction на базе провайдера.
Это не зависит от `maxActiveTranscriptBytes`: ограничитель по размеру в байтах выполняется
до открытия хода, а предварительная проверка в середине хода выполняется позже во встроенном цикле инструментов OpenClaw
после добавления новых результатов инструментов.

---

## Настройки Compaction (`reserveTokens`, `keepRecentTokens`)

Настройки Compaction среды выполнения OpenClaw находятся в настройках агента:

```json5
{
  compaction: {
    enabled: true,
    reserveTokens: 16384,
    keepRecentTokens: 20000,
  },
}
```

OpenClaw также применяет нижнюю границу безопасности для встроенных запусков:

- Если `compaction.reserveTokens < reserveTokensFloor`, OpenClaw повышает значение.
- Нижняя граница по умолчанию — `20000` токенов.
- Установите `agents.defaults.compaction.reserveTokensFloor: 0`, чтобы отключить нижнюю границу.
- Если значение уже выше, OpenClaw оставляет его без изменений.
- Ручной `/compact` учитывает явно заданный `agents.defaults.compaction.keepRecentTokens`
  и сохраняет точку отсечения недавнего хвоста среды выполнения OpenClaw. Без явного бюджета сохранения
  ручной Compaction остается жесткой контрольной точкой, а восстановленный контекст начинается с
  новой сводки.
- Установите `agents.defaults.compaction.midTurnPrecheck.enabled: true`, чтобы запускать
  необязательную предварительную проверку цикла инструментов после новых результатов инструментов и перед следующим вызовом
  модели. Это только триггер; генерация сводки по-прежнему использует настроенный
  путь Compaction. Это не зависит от `maxActiveTranscriptBytes`, который является
  ограничителем размера активного транскрипта в байтах в начале хода.
- Установите `agents.defaults.compaction.maxActiveTranscriptBytes` в значение в байтах или
  строку вроде `"20mb"`, чтобы запускать локальный Compaction перед ходом, когда активный
  транскрипт становится большим. Этот ограничитель активен только когда
  также включен `truncateAfterCompaction`. Оставьте значение незаданным или установите `0`, чтобы
  отключить.
- Когда включен `agents.defaults.compaction.truncateAfterCompaction`,
  OpenClaw ротирует активный транскрипт в сжатый JSONL-преемник после
  Compaction. Действия контрольных точек branch/restore используют этот сжатый преемник;
  старые файлы контрольных точек до Compaction остаются читаемыми, пока на них есть ссылки.

Почему: оставить достаточно запаса для многотактного "служебного обслуживания" (например, записей памяти), прежде чем Compaction станет неизбежным.

Реализация: `applyAgentCompactionSettingsFromConfig()` в `src/agents/agent-settings.ts`
(вызывается из путей хода embedded-runner и настройки Compaction).

---

## Подключаемые провайдеры Compaction

Plugins могут зарегистрировать провайдера Compaction через `registerCompactionProvider()` в API Plugin. Когда `agents.defaults.compaction.provider` установлен в идентификатор зарегистрированного провайдера, расширение safeguard делегирует суммаризацию этому провайдеру вместо встроенного конвейера `summarizeInStages`.

- `provider`: идентификатор зарегистрированного Plugin провайдера Compaction. Оставьте незаданным для стандартной LLM-суммаризации.
- Настройка `provider` принудительно включает `mode: "safeguard"`.
- Провайдеры получают те же инструкции Compaction и политику сохранения идентификаторов, что и встроенный путь.
- Safeguard по-прежнему сохраняет контекст суффикса последних ходов и разделенного хода после вывода провайдера.
- Встроенная суммаризация safeguard заново дистиллирует предыдущие сводки с новыми сообщениями
  вместо сохранения полной предыдущей сводки дословно.
- Режим safeguard по умолчанию включает аудиты качества сводки; установите
  `qualityGuard.enabled: false`, чтобы пропустить поведение повторной попытки при некорректном выводе.
- Если провайдер завершается с ошибкой или возвращает пустой результат, OpenClaw автоматически откатывается к встроенной LLM-суммаризации.
- Сигналы abort/timeout пробрасываются повторно (не подавляются), чтобы уважать отмену вызывающей стороны.

Источник: `src/plugins/compaction-provider.ts`, `src/agents/agent-hooks/compaction-safeguard.ts`.

---

## Поверхности, видимые пользователю

Вы можете наблюдать Compaction и состояние сессии через:

- `/status` (в любой чат-сессии)
- `openclaw status` (CLI)
- `openclaw sessions` / `sessions --json`
- Логи Gateway (`pnpm gateway:watch` или `openclaw logs --follow`): `embedded run auto-compaction start` + `complete`
- Подробный режим: `🧹 Auto-compaction complete` + счетчик Compaction

---

## Тихое служебное обслуживание (`NO_REPLY`)

OpenClaw поддерживает "тихие" ходы для фоновых задач, когда пользователь не должен видеть промежуточный вывод.

Соглашение:

- Ассистент начинает свой вывод с точного тихого токена `NO_REPLY` /
  `no_reply`, чтобы указать "не доставлять ответ пользователю".
- OpenClaw удаляет/подавляет это на уровне доставки.
- Подавление точного тихого токена не зависит от регистра, поэтому `NO_REPLY` и
  `no_reply` оба учитываются, когда весь payload состоит только из тихого токена.
- Это предназначено только для настоящих фоновых ходов без доставки; это не сокращенный путь для
  обычных пользовательских запросов, требующих действия.

Начиная с `2026.1.10`, OpenClaw также подавляет **потоковую передачу черновика/набора текста**, когда
частичный фрагмент начинается с `NO_REPLY`, поэтому тихие операции не раскрывают частичный
вывод в середине хода.

---

## "Сброс памяти" перед Compaction (реализовано)

Цель: перед auto-compaction выполнить тихий агентный ход, который записывает долговременное
состояние на диск (например, `memory/YYYY-MM-DD.md` в рабочей области агента), чтобы Compaction не мог
стереть критически важный контекст.

OpenClaw использует подход **предпорогового сброса**:

1. Отслеживать использование контекста сессии.
2. Когда оно пересекает "мягкий порог" (ниже порога Compaction среды выполнения OpenClaw), выполнить тихую
   директиву агенту "запиши память сейчас".
3. Использовать точный тихий токен `NO_REPLY` / `no_reply`, чтобы пользователь не видел
   ничего.

Конфиг (`agents.defaults.compaction.memoryFlush`):

- `enabled` (по умолчанию: `true`)
- `model` (необязательное точное переопределение провайдера/модели для хода сброса, например `ollama/qwen3:8b`)
- `softThresholdTokens` (по умолчанию: `4000`)
- `prompt` (сообщение пользователя для хода сброса)
- `systemPrompt` (дополнительный системный промпт, добавляемый для хода сброса)

Примечания:

- Стандартные prompt/system prompt включают подсказку `NO_REPLY` для подавления
  доставки.
- Когда задан `model`, ход сброса использует эту модель без наследования
  цепочки fallback активной сессии, поэтому локальное служебное обслуживание не откатывается молча
  к платной разговорной модели.
- Сброс выполняется один раз за цикл Compaction (отслеживается в `sessions.json`).
- Сброс выполняется только для встроенных сессий OpenClaw (CLI-бэкенды его пропускают).
- Сброс пропускается, когда рабочая область сессии доступна только для чтения (`workspaceAccess: "ro"` или `"none"`).
- См. [Память](/ru/concepts/memory) для схемы файлов рабочей области и шаблонов записи.

OpenClaw также предоставляет хук `session_before_compact` в API расширений, но логика
сброса OpenClaw сегодня находится на стороне Gateway.

---

## Контрольный список устранения неполадок

- Неверный ключ сессии? Начните с [/concepts/session](/ru/concepts/session) и подтвердите `sessionKey` в `/status`.
- Несоответствие хранилища и транскрипта? Подтвердите хост Gateway и путь хранилища из `openclaw status`.
- Спам Compaction? Проверьте:
  - окно контекста модели (слишком маленькое)
  - настройки Compaction (`reserveTokens` слишком велик для окна модели и может вызывать более ранний Compaction)
  - раздувание результатов инструментов: включите/настройте обрезку сессии
- Утечка тихих ходов? Подтвердите, что ответ начинается с `NO_REPLY` (точный токен без учета регистра), и что вы используете сборку с исправлением подавления потоковой передачи.

## Связанные материалы

- [Управление сессиями](/ru/concepts/session)
- [Обрезка сессии](/ru/concepts/session-pruning)
- [Движок контекста](/ru/concepts/context-engine)
