chore(i18n): refresh uk translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-02 06:41:28 +00:00
parent 5416a76f0e
commit c3970790cd

View File

@ -1,28 +1,28 @@
---
read_when:
- Потрібно налагодити ідентифікатори сеансів, JSONL транскрипту або поля sessions.json
- Ви змінюєте поведінку автоматичного Compaction або додаєте підготовче обслуговування перед Compaction
- Ви хочете реалізувати скидання пам’яті або тихі системні ходи
summary: 'Поглиблений огляд: сховище сеансів + транскрипти, життєвий цикл і внутрішні механізми (авто)Compaction'
- Вам потрібно налагодити ідентифікатори сесій, JSONL транскриптів або поля sessions.json
- Ви змінюєте поведінку автоматичної Compaction або додаєте службове впорядкування перед “Compaction”
- Ви хочете реалізувати очищення пам’яті або тихі системні репліки
summary: 'Глибокий огляд: сховище сеансів + транскрипти, життєвий цикл і внутрішні механізми (авто)Compaction'
title: Поглиблений огляд керування сеансами
x-i18n:
generated_at: "2026-05-02T06:11:00Z"
generated_at: "2026-05-02T06:40:11Z"
model: gpt-5.5
provider: openai
source_hash: fb2df70fb8c70f8ba8236165d9f5455b292e8a6d01d3bbfcafdd14d193df718e
source_hash: b9ca8a35210625051f5051e90a18a005d6103bc1d65d356c34f818d2bfc0058c
source_path: reference/session-management-compaction.md
workflow: 16
---
OpenClaw керує сесіями наскрізно в цих областях:
OpenClaw керує сесіями від початку до кінця в таких сферах:
- **Маршрутизація сесій** (як вхідні повідомлення зіставляються з `sessionKey`)
- **Сховище сесій** (`sessions.json`) і те, що воно відстежує
- **Збереження транскриптів** (`*.jsonl`) і їхня структура
- **Гігієна транскриптів** (виправлення, специфічні для провайдера, перед запусками)
- **Обмеження контексту** (контекстне вікно порівняно з відстежуваними токенами)
- **Compaction** (ручна й автоматична Compaction) і де під’єднувати роботу перед Compaction
- **Тихе обслуговування** (записи пам’яті, які не мають створювати видимий для користувача вивід)
- **Сховище сесій** (`sessions.json`) і що воно відстежує
- **Збереження транскриптів** (`*.jsonl`) та їхня структура
- **Гігієна транскриптів** (специфічні для провайдера виправлення перед запусками)
- **Обмеження контексту** (контекстне вікно проти відстежуваних токенів)
- **Compaction** (ручний і автоматичний Compaction) і де підключати роботу перед Compaction
- **Тихе обслуговування** (записи в пам’ять, які не мають створювати видимий для користувача вивід)
Якщо спершу потрібен огляд вищого рівня, почніть із:
@ -37,30 +37,36 @@ OpenClaw керує сесіями наскрізно в цих областях
## Джерело істини: Gateway
OpenClaw спроєктовано навколо єдиного **процесу Gateway**, який володіє станом сесій.
OpenClaw спроєктовано навколо одного **процесу Gateway**, який володіє станом сесій.
- UI (застосунок macOS, веб Control UI, TUI) мають запитувати в Gateway списки сесій і кількість токенів.
- У віддаленому режимі файли сесій розташовані на віддаленому хості; “перевірка локальних файлів на Mac” не відобразить те, що використовує Gateway.
- Інтерфейси користувача (застосунок macOS, веб Control UI, TUI) мають запитувати Gateway для списків сесій і кількості токенів.
- У віддаленому режимі файли сесій розташовані на віддаленому хості; «перевірка ваших локальних файлів Mac» не відображатиме те, що використовує Gateway.
---
## Два шари збереження
## Два рівні збереження
OpenClaw зберігає сесії у двох шарах:
OpenClaw зберігає сесії на двох рівнях:
1. **Сховище сесій (`sessions.json`)**
- Мапа ключ/значення: `sessionKey -> SessionEntry`
- Невелике, змінне, безпечне для редагування (або видалення записів)
- Невелике, змінюване, безпечне для редагування (або видалення записів)
- Відстежує метадані сесії (поточний ідентифікатор сесії, останню активність, перемикачі, лічильники токенів тощо)
2. **Транскрипт (`<sessionId>.jsonl`)**
- Транскрипт лише з додаванням записів із деревоподібною структурою (записи мають `id` + `parentId`)
- Транскрипт лише з додаванням зі структурою дерева (записи мають `id` + `parentId`)
- Зберігає фактичну розмову + виклики інструментів + підсумки Compaction
- Використовується для відновлення контексту моделі для майбутніх ходів
- Великі контрольні точки налагодження перед Compaction пропускаються, щойно активний
транскрипт перевищує обмеження розміру контрольної точки, щоб уникнути другої гігантської
транскрипт перевищує ліміт розміру контрольної точки, щоб уникнути другої гігантської
копії `.checkpoint.*.jsonl`.
Зчитувачі історії Gateway мають уникати матеріалізації всього транскрипту, якщо
поверхня явно не потребує довільного історичного доступу. Історія першої сторінки,
вбудована історія чату, відновлення після перезапуску та перевірки токенів/використання застосовують обмежене читання хвоста.
Повні сканування транскрипту проходять через асинхронний індекс транскриптів, який
кешується за шляхом файлу плюс `mtimeMs`/`size` і спільно використовується паралельними зчитувачами.
---
## Розташування на диску
@ -71,39 +77,39 @@ OpenClaw зберігає сесії у двох шарах:
- Транскрипти: `~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl`
- Сесії тем Telegram: `.../<sessionId>-topic-<threadId>.jsonl`
OpenClaw визначає ці шляхи через `src/config/sessions.ts`.
OpenClaw визначає їх через `src/config/sessions.ts`.
---
## Обслуговування сховища та контроль диска
Збереження сесій має автоматичні засоби обслуговування (`session.maintenance`) для `sessions.json`, артефактів транскриптів і допоміжних файлів траєкторій:
Збереження сесій має автоматичні засоби обслуговування (`session.maintenance`) для `sessions.json`, артефактів транскриптів і супровідних файлів траєкторій:
- `mode`: `warn` (типово) або `enforce`
- `pruneAfter`: граничний вік застарілого запису (типово `30d`)
- `maxEntries`: обмеження кількості записів у `sessions.json` (типово `500`)
- `resetArchiveRetention`: строк зберігання архівів транскриптів `*.reset.<timestamp>` (типово: те саме, що `pruneAfter`; `false` вимикає очищення)
- `pruneAfter`: поріг віку застарілих записів (типово `30d`)
- `maxEntries`: ліміт записів у `sessions.json` (типово `500`)
- `resetArchiveRetention`: строк зберігання архівів транскриптів `*.reset.<timestamp>` (типово: такий самий, як `pruneAfter`; `false` вимикає очищення)
- `maxDiskBytes`: необов’язковий бюджет каталогу сесій
- `highWaterBytes`: необов’язкова ціль після очищення (типово `80%` від `maxDiskBytes`)
Звичайні записи Gateway пакетно виконують очищення `maxEntries` для обмежень виробничого розміру, тому сховище може короткочасно перевищувати налаштоване обмеження, доки наступне очищення верхнього рівня не перепише його назад до меншого розміру. Читання сховища сесій не обрізають і не обмежують записи під час запуску Gateway; для очищення використовуйте записи або `openclaw sessions cleanup --enforce`. `openclaw sessions cleanup --enforce` усе одно застосовує налаштоване обмеження негайно.
Звичайні записи Gateway групують очищення `maxEntries` для лімітів виробничого розміру, тому сховище може короткочасно перевищувати налаштований ліміт, перш ніж наступне очищення верхньої межі перепише його назад до меншого розміру. Читання сховища сесій не обрізають і не обмежують записи під час запуску Gateway; для очищення використовуйте записи або `openclaw sessions cleanup --enforce`. `openclaw sessions cleanup --enforce` усе одно негайно застосовує налаштований ліміт.
Обслуговування зберігає надійні зовнішні вказівники розмов, як-от групові сесії
та сесії чату в межах потоку, але синтетичні runtime-записи для cron, hooks,
heartbeat, ACP і підагентів усе ще можуть бути видалені, коли вони перевищують
Обслуговування зберігає тривкі зовнішні покажчики розмов, як-от групові сесії
та сесії чату в межах гілки, але синтетичні runtime-записи для Cron, hooks,
Heartbeat, ACP і субагентів усе ще можуть видалятися, коли перевищують
налаштований вік, кількість або дисковий бюджет.
OpenClaw більше не створює автоматичні ротаційні резервні копії `sessions.json.bak.*` під час записів Gateway. Застарілий ключ `session.maintenance.rotateBytes` ігнорується, а `openclaw doctor --fix` видаляє його зі старих конфігурацій.
OpenClaw більше не створює автоматичні ротаційні резервні копії `sessions.json.bak.*` під час записів Gateway. Застарілий ключ `session.maintenance.rotateBytes` ігнорується, а `openclaw doctor --fix` видаляє його зі старіших конфігурацій.
Порядок примусового очищення дискового бюджету (`mode: "enforce"`):
Порядок застосування очищення дискового бюджету (`mode: "enforce"`):
1. Спочатку видалити найстаріші архівовані, осиротілі транскрипти або осиротілі артефакти траєкторій.
2. Якщо все ще вище за ціль, витіснити найстаріші записи сесій та їхні файли транскриптів/траєкторій.
3. Продовжувати, доки використання не стане на рівні `highWaterBytes` або нижче.
1. Спершу видалити найстаріші архівовані, осиротілі артефакти транскриптів або осиротілі артефакти траєкторій.
2. Якщо все ще вище цілі, витіснити найстаріші записи сесій і їхні файли транскриптів/траєкторій.
3. Продовжувати, доки використання не буде на рівні або нижче `highWaterBytes`.
У `mode: "warn"` OpenClaw повідомляє про потенційні витіснення, але не змінює сховище/файли.
Запустіть обслуговування на вимогу:
Запуск обслуговування на вимогу:
```bash
openclaw sessions cleanup --dry-run
@ -114,28 +120,28 @@ openclaw sessions cleanup --enforce
## Сесії Cron і журнали запусків
Ізольовані запуски Cron також створюють записи сесій/транскрипти й мають окремі налаштування зберігання:
Ізольовані запуски Cron також створюють записи сесій/транскрипти та мають окремі засоби керування зберіганням:
- `cron.sessionRetention` (типово `24h`) обрізає старі ізольовані сесії запусків Cron зі сховища сесій (`false` вимикає).
- `cron.runLog.maxBytes` + `cron.runLog.keepLines` обрізають файли `~/.openclaw/cron/runs/<jobId>.jsonl` (типово: `2_000_000` байтів і `2000` рядків).
Коли Cron примусово створює нову ізольовану сесію запуску, він очищує попередній
Коли Cron примусово створює нову ізольовану сесію запуску, він санітизує попередній
запис сесії `cron:<jobId>` перед записом нового рядка. Він переносить безпечні
налаштування, як-от параметри thinking/fast/verbose, мітки та явні вибрані
користувачем перевизначення моделі/auth. Він відкидає навколишній контекст розмови,
як-от маршрутизацію каналу/групи, політику надсилання або черги, підвищення,
origin і runtime-прив’язку ACP, щоб свіжий ізольований запуск не міг успадкувати
застарілу доставку або runtime-повноваження від старішого запуску.
налаштування, як-от thinking/fast/verbose, мітки та явно
вибрані користувачем перевизначення моделі/автентифікації. Він відкидає навколишній контекст розмови, як-от
маршрутизацію каналу/групи, політику надсилання або черги, підвищення прав, походження та
runtime-прив’язку ACP, щоб новий ізольований запуск не міг успадкувати застарілу доставку або
runtime-повноваження від старішого запуску.
---
## Ключі сесій (`sessionKey`)
`sessionKey` визначає, _у якому контейнері розмови_ ви перебуваєте (маршрутизація + ізоляція).
`sessionKey` визначає, у якому _контейнері розмови_ ви перебуваєте (маршрутизація + ізоляція).
Поширені шаблони:
- Основний/прямий чат (для кожного агента): `agent:<agentId>:<mainKey>` (типово `main`)
- Основний/прямий чат (для агента): `agent:<agentId>:<mainKey>` (типово `main`)
- Група: `agent:<agentId>:<channel>:group:<id>`
- Кімната/канал (Discord/Slack): `agent:<agentId>:<channel>:channel:<id>` або `...:room:<id>`
- Cron: `cron:<job.id>`
@ -152,10 +158,10 @@ origin і runtime-прив’язку ACP, щоб свіжий ізольова
Практичні правила:
- **Скидання** (`/new`, `/reset`) створює новий `sessionId` для цього `sessionKey`.
- **Щоденне скидання** (типово 4:00 AM за локальним часом на хості Gateway) створює новий `sessionId` під час наступного повідомлення після межі скидання.
- **Закінчення через бездіяльність** (`session.reset.idleMinutes` або застарілий `session.idleMinutes`) створює новий `sessionId`, коли повідомлення надходить після вікна бездіяльності. Коли налаштовано і щоденне, і idle-скидання, перемагає те, що спливає першим.
- **Системні події** (heartbeat, пробудження Cron, exec-сповіщення, службовий облік Gateway) можуть змінювати рядок сесії, але не подовжують свіжість щоденного/idle-скидання. Перехід скидання відкидає поставлені в чергу сповіщення системних подій для попередньої сесії до побудови свіжого prompt.
- **Політика parent fork** використовує активну гілку PI під час створення потоку або fork підагента. Якщо ця гілка завелика, OpenClaw запускає дочірню сесію з ізольованим контекстом замість помилки або успадкування непридатної історії. Політика визначення розміру автоматична; застарілу конфігурацію `session.parentForkMaxTokens` видаляє `openclaw doctor --fix`.
- **Щоденне скидання** (типово о 4:00 AM за локальним часом на хості Gateway) створює новий `sessionId` у наступному повідомленні після межі скидання.
- **Закінчення строку бездіяльності** (`session.reset.idleMinutes` або застарілий `session.idleMinutes`) створює новий `sessionId`, коли повідомлення надходить після вікна бездіяльності. Коли налаштовані і щоденне скидання, і бездіяльність, спрацьовує те, що завершується першим.
- **Системні події** (Heartbeat, пробудження Cron, сповіщення exec, облік Gateway) можуть змінювати рядок сесії, але не подовжують свіжість щоденного/бездіяльного скидання. Перехід скидання відкидає сповіщення системних подій у черзі для попередньої сесії до побудови свіжого prompt.
- **Політика parent fork** використовує активну гілку Pi під час створення гілки або форка субагента. Якщо ця гілка завелика, OpenClaw запускає дочірній елемент з ізольованим контекстом замість помилки або успадкування непридатної історії. Політика визначення розміру автоматична; застарілу конфігурацію `session.parentForkMaxTokens` видаляє `openclaw doctor --fix`.
Деталь реалізації: рішення ухвалюється в `initSessionState()` у `src/auto-reply/reply/session.ts`.
@ -167,71 +173,71 @@ origin і runtime-прив’язку ACP, щоб свіжий ізольова
Ключові поля (не вичерпно):
- `sessionId`: поточний ідентифікатор транскрипту (назва файлу походить від нього, якщо `sessionFile` не задано)
- `sessionStartedAt`: timestamp початку для поточного `sessionId`; свіжість щоденного скидання
використовує його. Застарілі рядки можуть виводити його із заголовка сесії JSONL.
- `lastInteractionAt`: timestamp останньої реальної взаємодії користувача/каналу; свіжість idle-скидання
використовує його, тому heartbeat, Cron і exec-події не підтримують сесії
- `sessionId`: поточний ідентифікатор транскрипту (ім’я файлу виводиться з нього, якщо не встановлено `sessionFile`)
- `sessionStartedAt`: часова позначка початку поточного `sessionId`; щоденне скидання
використовує це для свіжості. Застарілі рядки можуть виводити її із заголовка сесії JSONL.
- `lastInteractionAt`: часова позначка останньої реальної взаємодії користувача/каналу; скидання через бездіяльність
використовує це для свіжості, щоб Heartbeat, Cron і exec-події не підтримували сесії
активними. Застарілі рядки без цього поля повертаються до відновленого часу початку сесії
для свіжості idle.
- `updatedAt`: timestamp останньої зміни рядка сховища, використовується для списків, обрізання та
службового обліку. Він не є джерелом істини для свіжості щоденного/idle-скидання.
для свіжості бездіяльності.
- `updatedAt`: часова позначка останньої зміни рядка сховища, використовується для списків, обрізання та
службового обліку. Вона не є джерелом істини для свіжості щоденного/бездіяльного скидання.
- `sessionFile`: необов’язкове явне перевизначення шляху транскрипту
- `chatType`: `direct | group | room` (допомагає UI і політиці надсилання)
- `provider`, `subject`, `room`, `space`, `displayName`: метадані для маркування груп/каналів
- `chatType`: `direct | group | room` (допомагає інтерфейсам і політиці надсилання)
- `provider`, `subject`, `room`, `space`, `displayName`: метадані для позначення груп/каналів
- Перемикачі:
- `thinkingLevel`, `verboseLevel`, `reasoningLevel`, `elevatedLevel`
- `sendPolicy` (перевизначення для окремої сесії)
- Вибір моделі:
- `providerOverride`, `modelOverride`, `authProfileOverride`
- Лічильники токенів (best-effort / залежить від провайдера):
- Лічильники токенів (найкращі зусилля / залежить від провайдера):
- `inputTokens`, `outputTokens`, `totalTokens`, `contextTokens`
- `compactionCount`: як часто auto-compaction завершувалася для цього ключа сесії
- `memoryFlushAt`: timestamp останнього скидання пам’яті перед Compaction
- `compactionCount`: як часто автоматичний Compaction завершувався для цього ключа сесії
- `memoryFlushAt`: часова позначка останнього скидання пам’яті перед Compaction
- `memoryFlushCompactionCount`: кількість Compaction, коли востаннє виконувався flush
Сховище безпечно редагувати, але Gateway є джерелом істини: він може перезаписувати або повторно гідратувати записи під час виконання сесій.
Сховище безпечно редагувати, але Gateway є джерелом істини: він може переписувати або повторно гідратувати записи під час виконання сесій.
---
## Структура транскрипту (`*.jsonl`)
Транскриптами керує `SessionManager` із `@mariozechner/pi-coding-agent`.
Транскриптами керує `SessionManager` з `@mariozechner/pi-coding-agent`.
Файл має формат JSONL:
- Перший рядок: заголовок сесії (`type: "session"`, містить `id`, `cwd`, `timestamp`, необов’язковий `parentSession`)
- Перший рядок: заголовок сесії (`type: "session"`, містить `id`, `cwd`, `timestamp`, необов’язково `parentSession`)
- Далі: записи сесії з `id` + `parentId` (дерево)
Важливі типи записів:
- `message`: повідомлення користувача/асистента/toolResult
- `custom_message`: повідомлення, ін’єктовані extension, які ходять_ до контексту моделі (можуть бути приховані від UI)
- `custom`: стан extension, який е входить_ до контексту моделі
- `compaction`: збережений підсумок Compaction із `firstKeptEntryId` і `tokensBefore`
- `message`: повідомлення user/assistant/toolResult
- `custom_message`: повідомлення, ін’єктовані extension, які ходять_ у контекст моделі (можуть бути приховані від UI)
- `custom`: стан extension, який е входить_ у контекст моделі
- `compaction`: збережений підсумок Compaction з `firstKeptEntryId` і `tokensBefore`
- `branch_summary`: збережений підсумок під час навігації гілкою дерева
OpenClaw навмисно **не** “виправляє” транскрипти; Gateway використовує `SessionManager` для їх читання/запису.
OpenClaw навмисно **не** «виправляє» транскрипти; Gateway використовує `SessionManager` для їх читання/запису.
---
## Контекстні вікна порівняно з відстежуваними токенами
## Контекстні вікна проти відстежуваних токенів
Важливі два різні поняття:
1. **Контекстне вікно моделі**: жорстке обмеження для кожної моделі (токени, видимі моделі)
2. **Лічильники сховища сесій**: рухомі статистики, записані в `sessions.json` (використовуються для /status і dashboard)
1. **Контекстне вікно моделі**: жорсткий ліміт для кожної моделі (токени, видимі моделі)
2. **Лічильники сховища сесій**: ковзна статистика, що записується в `sessions.json` (використовується для /status і dashboard)
Якщо ви налаштовуєте обмеження:
Якщо ви налаштовуєте ліміти:
- Контекстне вікно надходить із каталогу моделей (і може бути перевизначене через конфігурацію).
- `contextTokens` у сховищі — це runtime-оцінка/звітне значення; не сприймайте його як сувору гарантію.
- `contextTokens` у сховищі — runtime-оцінка/звітне значення; не сприймайте його як сувору гарантію.
Докладніше див. [/token-use](/uk/reference/token-use).
---
## Compaction: що це таке
## Compaction: що це
Compaction підсумовує старішу розмову в збережений запис `compaction` у транскрипті та залишає недавні повідомлення без змін.
@ -240,62 +246,62 @@ Compaction підсумовує старішу розмову в збереже
- Підсумок Compaction
- Повідомлення після `firstKeptEntryId`
Compaction є **постійною** (на відміну від обрізання сесій). Див. [/concepts/session-pruning](/uk/concepts/session-pruning).
Compaction є **постійним** (на відміну від обрізання сесій). Див. [/concepts/session-pruning](/uk/concepts/session-pruning).
## Межі чанків Compaction і парування інструментів
## Межі фрагментів Compaction і поєднання інструментів
Коли OpenClaw ділить довгий транскрипт на чанки Compaction, він зберігає
виклики інструментів асистента в парі з відповідними записами `toolResult`.
Коли OpenClaw розбиває довгий транскрипт на фрагменти Compaction, він зберігає
виклики інструментів assistant разом із відповідними записами `toolResult`.
- Якщо розділення за часткою токенів потрапляє між викликом інструмента та його результатом, OpenClaw
зсуває межу до повідомлення асистента з викликом інструмента замість розділення
зміщує межу до повідомлення assistant із викликом інструмента замість розділення
пари.
- Якщо кінцевий блок tool-result інакше перевищив би цільовий розмір чанка,
OpenClaw зберігає цей pending-блок інструмента й залишає непідсумований хвіст
- Якщо кінцевий блок результатів інструментів інакше вивів би фрагмент за ціль,
OpenClaw зберігає цей очікуваний блок інструментів і залишає непідсумований хвіст
без змін.
- Перервані/помилкові блоки tool-call не утримують pending-розділення відкритим.
- Перервані/помилкові блоки викликів інструментів не утримують очікуване розділення відкритим.
---
## Коли відбувається auto-compaction (Pi runtime)
## Коли відбувається автоматичний Compaction (runtime Pi)
У вбудованому агенті Pi auto-compaction запускається у двох випадках:
У вбудованому агенті Pi автоматичний 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.
2. **Порогове обслуговування**: після успішного ходу, коли:
exceeded` і подібні варіанти у форматі провайдерів) → compact → retry.
2. **Підтримка порога**: після успішного ходу, коли:
`contextTokens > contextWindow - reserveTokens`
Де:
- `contextWindow` — контекстне вікно моделі
- `reserveTokens` — запас, зарезервований для prompts + наступного виводу моделі
- `reserveTokens` — запас, зарезервований для промптів + наступного виводу моделі
Це семантика Pi runtime (OpenClaw споживає події, але Pi вирішує, коли виконувати compact).
Це семантика runtime Pi (OpenClaw споживає події, але Pi вирішує, коли compact).
OpenClaw також може запускати попередню локальну Compaction перед відкриттям наступного
запуску, коли встановлено `agents.defaults.compaction.maxActiveTranscriptBytes` і
активний файл транскрипту досягає цього розміру. Це запобіжник за розміром файлу для вартості
локального повторного відкриття, а не необробленого архівування: OpenClaw все одно виконує звичайну семантичну Compaction,
і для цього потрібен `truncateAfterCompaction`, щоб стиснений підсумок міг стати
активний файл транскрипта досягає цього розміру. Це захист за розміром файла для локальної
вартості повторного відкриття, а не сирого архівування: OpenClaw усе одно запускає звичайну семантичну Compaction,
і для цього потрібен `truncateAfterCompaction`, щоб ущільнений підсумок міг стати
новим наступним транскриптом.
Для вбудованих запусків Pi параметр `agents.defaults.compaction.midTurnPrecheck.enabled: true`
додає додатковий запобіжник циклу інструментів. Після додавання результату інструмента і перед
Для вбудованих запусків Pi, `agents.defaults.compaction.midTurnPrecheck.enabled: true`
додає опційний захист циклу інструментів. Після додавання результату інструмента та перед
наступним викликом моделі OpenClaw оцінює тиск на промпт, використовуючи ту саму логіку попереднього
бюджету, що й на початку ходу. Якщо контекст більше не вміщується, запобіжник
не виконує Compaction всередині хука `transformContext` Pi. Він піднімає структурований
сигнал попередньої перевірки всередині ходу, зупиняє поточне надсилання промпта і дає
бюджету, що й на початку ходу. Якщо контекст більше не вміщується, захист не
виконує compact усередині хуку Pi `transformContext`. Він піднімає структурований
сигнал попередньої перевірки посеред ходу, зупиняє поточне надсилання промпта й дає
зовнішньому циклу запуску використати наявний шлях відновлення: обрізати завеликі результати інструментів,
коли цього достатньо, або запустити налаштований режим Compaction і повторити спробу. Цей
параметр за замовчуванням вимкнений і працює з режимами Compaction `default` і `safeguard`,
зокрема з Compaction safeguard на основі провайдера.
Це не залежить від `maxActiveTranscriptBytes`: запобіжник за розміром у байтах запускається
перед відкриттям ходу, тоді як попередня перевірка всередині ходу запускається пізніше у вбудованому циклі інструментів Pi
коли цього достатньо, або запустити налаштований режим Compaction і повторити спробу. Опцію
вимкнено за замовчуванням, і вона працює з режимами Compaction `default` і `safeguard`,
зокрема з Compaction через провайдера safeguard.
Це незалежно від `maxActiveTranscriptBytes`: захист за розміром у байтах запускається
до відкриття ходу, тоді як попередня перевірка посеред ходу запускається пізніше у вбудованому циклі інструментів Pi
після додавання нових результатів інструментів.
---
@ -314,32 +320,32 @@ OpenClaw також може запускати попередню локаль
}
```
OpenClaw також забезпечує мінімальний поріг безпеки для вбудованих запусків:
OpenClaw також застосовує безпечний мінімум для вбудованих запусків:
- Якщо `compaction.reserveTokens < reserveTokensFloor`, OpenClaw підвищує його.
- Стандартний мінімальний поріг становить `20000` токенів.
- Встановіть `agents.defaults.compaction.reserveTokensFloor: 0`, щоб вимкнути цей поріг.
- Якщо він уже вищий, OpenClaw залишає його без змін.
- Типовий мінімум — `20000` токенів.
- Установіть `agents.defaults.compaction.reserveTokensFloor: 0`, щоб вимкнути мінімум.
- Якщо значення вже вище, OpenClaw залишає його без змін.
- Ручний `/compact` враховує явний `agents.defaults.compaction.keepRecentTokens`
і зберігає точку відсікання недавнього хвоста Pi. Без явного бюджету збереження
ручна Compaction залишається жорсткою контрольною точкою, а перебудований контекст починається з
нового підсумку.
- Встановіть `agents.defaults.compaction.midTurnPrecheck.enabled: true`, щоб запускати
додаткову попередню перевірку циклу інструментів після нових результатів інструментів і перед наступним
викликом моделі. Це лише тригер; створення підсумку все одно використовує налаштований
шлях Compaction. Він не залежить від `maxActiveTranscriptBytes`, який є
запобіжником розміру активного транскрипту в байтах на початку ходу.
- Встановіть `agents.defaults.compaction.maxActiveTranscriptBytes` у значення байтів або
- Установіть `agents.defaults.compaction.midTurnPrecheck.enabled: true`, щоб запускати
опційну попередню перевірку циклу інструментів після нових результатів інструментів і перед наступним
викликом моделі. Це лише тригер; генерація підсумку й далі використовує налаштований
шлях Compaction. Вона незалежна від `maxActiveTranscriptBytes`, який є
захистом за розміром у байтах активного транскрипта на початку ходу.
- Установіть `agents.defaults.compaction.maxActiveTranscriptBytes` у значення байтів або
рядок на кшталт `"20mb"`, щоб запускати локальну Compaction перед ходом, коли активний
транскрипт стає великим. Цей запобіжник активний лише тоді, коли також увімкнено
транскрипт стає великим. Цей захист активний лише тоді, коли також увімкнено
`truncateAfterCompaction`. Залиште його невстановленим або встановіть `0`, щоб
вимкнути.
- Коли увімкнено `agents.defaults.compaction.truncateAfterCompaction`,
OpenClaw після Compaction ротирує активний транскрипт у стиснений наступний JSONL.
Старий повний транскрипт залишається заархівованим і пов’язаним із
контрольною точкою Compaction замість перезапису на місці.
- Коли ввімкнено `agents.defaults.compaction.truncateAfterCompaction`,
OpenClaw після Compaction ротуює активний транскрипт у стиснутий наступний JSONL.
Старий повний транскрипт залишається в архіві та пов’язується з
контрольною точкою Compaction, а не переписується на місці.
Навіщо: залишити достатньо запасу для багатокрокового «обслуговування» (наприклад, записів у пам’ять) до того, як Compaction стане неминучою.
Навіщо: залишити достатньо запасу для багатоходового “службового обслуговування” (наприклад, записів пам’яті), перш ніж Compaction стане неминучою.
Реалізація: `ensurePiCompactionReserveTokens()` у `src/agents/pi-settings.ts`
(викликається з `src/agents/pi-embedded-runner.ts`).
@ -348,18 +354,18 @@ OpenClaw також забезпечує мінімальний поріг бе
## Підключувані провайдери Compaction
Plugins можуть реєструвати провайдера Compaction через `registerCompactionProvider()` в API Plugin. Коли `agents.defaults.compaction.provider` встановлено на ідентифікатор зареєстрованого провайдера, розширення safeguard делегує підсумовування цьому провайдеру замість вбудованого конвеєра `summarizeInStages`.
Plugins можуть зареєструвати провайдера Compaction через `registerCompactionProvider()` в API Plugin. Коли `agents.defaults.compaction.provider` встановлено на ідентифікатор зареєстрованого провайдера, розширення safeguard делегує підсумовування цьому провайдеру замість вбудованого пайплайна `summarizeInStages`.
- `provider`: ідентифікатор зареєстрованого Plugin провайдера Compaction. Залиште невстановленим для стандартного підсумовування LLM.
- Встановлення `provider` примусово задає `mode: "safeguard"`.
- `provider`: ідентифікатор зареєстрованого Plugin-провайдера Compaction. Залиште невстановленим для типового LLM-підсумовування.
- Установлення `provider` примусово вмикає `mode: "safeguard"`.
- Провайдери отримують ті самі інструкції Compaction і політику збереження ідентифікаторів, що й вбудований шлях.
- Safeguard усе одно зберігає контекст недавніх ходів і суфікса розділеного ходу після виводу провайдера.
- Safeguard усе одно зберігає контекст суфікса недавнього ходу та розділеного ходу після виводу провайдера.
- Вбудоване підсумовування safeguard повторно дистилює попередні підсумки з новими повідомленнями
замість збереження повного попереднього підсумку дослівно.
- Режим safeguard за замовчуванням вмикає аудити якості підсумку; встановіть
`qualityGuard.enabled: false`, щоб пропустити поведінку повторної спроби при некоректно сформованому виводі.
- Якщо провайдер завершується з помилкою або повертає порожній результат, OpenClaw автоматично повертається до вбудованого підсумовування LLM.
- Сигнали переривання/тайм-ауту повторно викидаються (не приглушуються), щоб поважати скасування викликувачем.
замість того, щоб зберігати повний попередній підсумок дослівно.
- Режим safeguard вмикає аудити якості підсумків за замовчуванням; установіть
`qualityGuard.enabled: false`, щоб пропустити поведінку повторної спроби після некоректно сформованого виводу.
- Якщо провайдер зазнає збою або повертає порожній результат, OpenClaw автоматично повертається до вбудованого LLM-підсумовування.
- Сигнали переривання/тайм-ауту перекидаються повторно (не поглинаються), щоб поважати скасування викликачем.
Джерело: `src/plugins/compaction-provider.ts`, `src/agents/pi-hooks/compaction-safeguard.ts`.
@ -367,68 +373,68 @@ Plugins можуть реєструвати провайдера Compaction че
## Поверхні, видимі користувачу
Ви можете спостерігати за Compaction і станом сеансу через:
Ви можете спостерігати Compaction і стан сесії через:
- `/status` (у будь-якому чат-сеансі)
- `/status` (у будь-якій чат-сесії)
- `openclaw status` (CLI)
- `openclaw sessions` / `sessions --json`
- Докладний режим: `🧹 Auto-compaction complete` + кількість Compaction
- Докладний режим: `🧹 Auto-compaction complete` + лічильник Compaction
---
## Тихе обслуговування (`NO_REPLY`)
## Тихе службове обслуговування (`NO_REPLY`)
OpenClaw підтримує «тихі» ходи для фонових завдань, де користувач не повинен бачити проміжний вивід.
OpenClaw підтримує “тихі” ходи для фонових завдань, де користувач не має бачити проміжний вивід.
Угода:
Домовленість:
- Асистент починає свій вивід із точного тихого токена `NO_REPLY` /
`no_reply`, щоб позначити «не доставляти відповідь користувачу».
- OpenClaw прибирає/пригнічує це на рівні доставки.
- Пригнічення точного тихого токена не чутливе до регістру, тому `NO_REPLY` і
- Асистент починає свій вивід з точного тихого токена `NO_REPLY` /
`no_reply`, щоб указати “не доставляти відповідь користувачу”.
- OpenClaw вилучає/пригнічує це на рівні доставки.
- Пригнічення точного тихого токена не залежить від регістру, тому `NO_REPLY` і
`no_reply` обидва зараховуються, коли весь payload є лише тихим токеном.
- Це лише для справді фонових ходів без доставки; це не скорочення для
звичайних дієвих запитів користувача.
Станом на `2026.1.10` OpenClaw також пригнічує **потокове передавання чернетки/набирання**, коли
частковий фрагмент починається з `NO_REPLY`, тож тихі операції не пропускають частковий
вивід усередині ходу.
Станом на `2026.1.10`, OpenClaw також пригнічує **потокове передавання чернетки/набору** коли
частковий фрагмент починається з `NO_REPLY`, тож тихі операції не протікають частковим
виводом посеред ходу.
---
## «Скидання пам’яті» перед Compaction (реалізовано)
## “Скидання пам’яті” перед Compaction (реалізовано)
Мета: перед автоматичною Compaction запустити тихий агентний хід, який записує довговічний
стан на диск (наприклад, `memory/YYYY-MM-DD.md` у робочій області агента), щоб Compaction не могла
стан на диск (наприклад, `memory/YYYY-MM-DD.md` у робочому просторі агента), щоб Compaction не могла
стерти критичний контекст.
OpenClaw використовує підхід **скидання перед порогом**:
1. Відстежуйте використання контексту сеансу.
2. Коли воно перетинає «м’який поріг» (нижче порога Compaction Pi), запустіть тиху
директиву «запиши пам’ять зараз» для агента.
3. Використайте точний тихий токен `NO_REPLY` / `no_reply`, щоб користувач не бачив
нічого.
1. Відстежувати використання контексту сесії.
2. Коли воно перетинає “м’який поріг” (нижче порога Compaction Pi), запустити тиху
директиву “запиши пам’ять зараз” для агента.
3. Використати точний тихий токен `NO_REPLY` / `no_reply`, щоб користувач
нічого не бачив.
Конфігурація (`agents.defaults.compaction.memoryFlush`):
- `enabled` (за замовчуванням: `true`)
- `model` (необов’язкове точне перевизначення провайдера/моделі для ходу скидання, наприклад `ollama/qwen3:8b`)
- `model` (опційне точне перевизначення провайдера/моделі для ходу скидання, наприклад `ollama/qwen3:8b`)
- `softThresholdTokens` (за замовчуванням: `4000`)
- `prompt` (повідомлення користувача для ходу скидання)
- `systemPrompt` (додатковий системний промпт, доданий для ходу скидання)
Примітки:
- Стандартний промпт/системний промпт містять підказку `NO_REPLY`, щоб пригнітити
- Типові prompt/system prompt містять підказку `NO_REPLY`, щоб пригнітити
доставку.
- Коли встановлено `model`, хід скидання використовує цю модель без успадкування
ланцюга fallback активного сеансу, тож локальне обслуговування непомітно не
переходить на платну розмовну модель.
ланцюга fallback активної сесії, тож локальне службове обслуговування не буде непомітно
відступати до платної розмовної моделі.
- Скидання запускається один раз за цикл Compaction (відстежується в `sessions.json`).
- Скидання запускається лише для вбудованих сеансів Pi (бекенди CLI його пропускають).
- Скидання пропускається, коли робоча область сеансу доступна лише для читання (`workspaceAccess: "ro"` або `"none"`).
- Див. [Пам’ять](/uk/concepts/memory) щодо структури файлів робочої області та шаблонів запису.
- Скидання запускається лише для вбудованих сесій Pi (CLI-бекенди пропускають його).
- Скидання пропускається, коли робочий простір сесії доступний лише для читання (`workspaceAccess: "ro"` або `"none"`).
- Див. [Пам’ять](/uk/concepts/memory) щодо розкладки файлів робочого простору та патернів запису.
Pi також надає хук `session_before_compact` в API розширення, але логіка
скидання OpenClaw сьогодні живе на боці Gateway.
@ -437,16 +443,16 @@ Pi також надає хук `session_before_compact` в API розширен
## Контрольний список усунення несправностей
- Неправильний ключ сеансу? Почніть із [/concepts/session](/uk/concepts/session) і підтвердьте `sessionKey` у `/status`.
- Невідповідність сховища й транскрипту? Підтвердьте хост Gateway і шлях сховища з `openclaw status`.
- Неправильний ключ сесії? Почніть з [/concepts/session](/uk/concepts/session) і підтвердьте `sessionKey` у `/status`.
- Невідповідність сховища й транскрипта? Підтвердьте хост Gateway і шлях сховища з `openclaw status`.
- Спам Compaction? Перевірте:
- вікно контексту моделі (занадто мале)
- налаштування Compaction (`reserveTokens` занадто високий для вікна моделі може спричиняти ранішу Compaction)
- роздування результатів інструментів: увімкніть/налаштуйте обрізання сеансу
- Тихі ходи просочуються? Підтвердьте, що відповідь починається з `NO_REPLY` (точний токен без урахування регістру) і що ви використовуєте збірку, яка містить виправлення пригнічення потокового передавання.
- контекстне вікно моделі (занадто мале)
- налаштування Compaction (`reserveTokens` занадто високий для вікна моделі може спричинити ранішу Compaction)
- роздування результатів інструментів: увімкніть/налаштуйте обрізання сесії
- Тихі ходи протікають? Підтвердьте, що відповідь починається з `NO_REPLY` (точний токен без урахування регістру) і що ви використовуєте збірку, яка містить виправлення пригнічення streaming.
## Пов’язане
- [Керування сеансами](/uk/concepts/session)
- [Обрізання сеансів](/uk/concepts/session-pruning)
- [Керування сесіями](/uk/concepts/session)
- [Обрізання сесії](/uk/concepts/session-pruning)
- [Рушій контексту](/uk/concepts/context-engine)