chore(i18n): refresh uk translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-05 18:53:56 +00:00
parent 5688c7e9a0
commit 25a271da1d
7 changed files with 2250 additions and 2256 deletions

View File

@ -1,40 +1,40 @@
---
read_when:
- Ви хочете зрозуміти, що означає “context” в OpenClaw
- Ви налагоджуєте, чому модель “знає” щось (або забула це)
- Ви хочете зменшити накладні витрати контексту (/context, /status, /compact)
summary: 'Контекст: що бачить модель, як він формується і як його перевірити'
title: Context
- Ви хочете зрозуміти, що означає «контекст» в OpenClaw
- Ви налагоджуєте, чому модель щось «знає» (або забула це)
- Ви хочете зменшити накладні витрати контексту (`/context`, `/status`, `/compact`)
summary: 'Контекст: що бачить модель, як він будується та як його перевірити'
title: Контекст
x-i18n:
generated_at: "2026-04-05T18:00:56Z"
generated_at: "2026-04-05T18:48:31Z"
model: gpt-5.4
provider: openai
source_hash: a75b4cd65bf6385d46265b9ce1643310bc99d220e35ec4b4924096bed3ca4aa0
source_hash: fe7dfe52cb1a64df229c8622feed1804df6c483a6243e0d2f309f6ff5c9fe521
source_path: concepts/context.md
workflow: 15
---
# Context
# Контекст
«Контекст» — це **все, що OpenClaw надсилає моделі для одного запуску**. Він обмежений **вікном контексту** моделі (лімітом токенів).
«Контекст» — це **все, що OpenClaw надсилає моделі для запуску**. Він обмежений **вікном контексту** моделі (лімітом токенів).
Базова ментальна модель:
Проста ментальна модель для початківців:
- **System prompt** (побудований OpenClaw): правила, інструменти, список Skills, час/runtime та впроваджені файли робочого простору.
- **Історія розмови**: ваші повідомлення + повідомлення асистента для цієї сесії.
- **Системний запит** (збудований OpenClaw): правила, інструменти, список Skills, час/середовище виконання та впроваджені файли робочого простору.
- **Історія розмови**: ваші повідомлення + повідомлення помічника для цієї сесії.
- **Виклики/результати інструментів + вкладення**: вивід команд, читання файлів, зображення/аудіо тощо.
Контекст _це не те саме_, що й «memory»: memory може зберігатися на диску й повторно завантажуватися пізніше; context — це те, що міститься в поточному вікні моделі.
Контекст _не є тим самим_, що й «пам’ять»: пам’ять може зберігатися на диску та повторно завантажуватися пізніше; контекст — це те, що міститься в поточному вікні моделі.
## Швидкий старт (перевірка context)
## Швидкий старт (перевірка контексту)
- `/status` → швидкий перегляд «наскільки заповнене моє вікно?» + налаштування сесії.
- `/context list` → що впроваджується + приблизні розміри (для кожного файлу + підсумки).
- `/context detail` → глибший розбір: розміри для кожного файлу, для кожної схеми інструмента, для кожного запису skill і розмір system prompt.
- `/usage tokens` → додає до звичайних відповідей нижній колонтитул із використанням.
- `/compact`підсумовує старішу історію в compact entry, щоб звільнити місце у вікні.
- `/status` → швидкий перегляд «наскільки заповнене моє вікно?» + параметри сесії.
- `/context list` → що впроваджено + приблизні розміри (для кожного файла + загальні).
- `/context detail` → глибший розбір: для кожного файла, розміри схем кожного інструмента, розміри записів кожного skill та розмір системного запиту.
- `/usage tokens` → додає нижній колонтитул використання для кожної відповіді до звичайних відповідей.
- `/compact`узагальнює старішу історію в компактний запис, щоб звільнити місце у вікні.
Див. також: [Slash commands](/tools/slash-commands), [Використання токенів і вартість](/reference/token-use), [Compaction](/concepts/compaction).
Див. також: [Слеш-команди](/uk/tools/slash-commands), [Використання токенів і витрати](/uk/reference/token-use), [Компресія](/uk/concepts/compaction).
## Приклад виводу
@ -43,11 +43,11 @@ x-i18n:
### `/context list`
```
🧠 Розбивка контексту
🧠 Розподіл контексту
Робочий простір: <workspaceDir>
Макс. bootstrap/file: 20,000 chars
Sandbox: mode=non-main sandboxed=false
System prompt (run): 38,412 chars (~9,603 tok) (Project Context 23,901 chars (~5,976 tok))
Макс. bootstrap на файл: 20,000 chars
Пісочниця: mode=non-main sandboxed=false
Системний запит (запуск): 38,412 chars (~9,603 tok) (Project Context 23,901 chars (~5,976 tok))
Впроваджені файли робочого простору:
- AGENTS.md: OK | raw 1,742 chars (~436 tok) | injected 1,742 chars (~436 tok)
@ -58,58 +58,58 @@ System prompt (run): 38,412 chars (~9,603 tok) (Project Context 23,901 chars (~5
- HEARTBEAT.md: MISSING | raw 0 | injected 0
- BOOTSTRAP.md: OK | raw 0 chars (~0 tok) | injected 0 chars (~0 tok)
Список Skills (текст system prompt): 2,184 chars (~546 tok) (12 skills)
Tools: read, edit, write, exec, process, browser, message, sessions_send, …
Список інструментів (текст system prompt): 1,032 chars (~258 tok)
Схеми інструментів (JSON): 31,988 chars (~7,997 tok) (враховується в context; не показується як текст)
Tools: (те саме, що вище)
Список Skills (текст системного запиту): 2,184 chars (~546 tok) (12 skills)
Інструменти: read, edit, write, exec, process, browser, message, sessions_send, …
Список інструментів (текст системного запиту): 1,032 chars (~258 tok)
Схеми інструментів (JSON): 31,988 chars (~7,997 tok) (враховуються в контексті; не показуються як текст)
Інструменти: (те саме, що вище)
Токени сесії (cached): 14,250 total / ctx=32,000
Токени сесії (кешовані): 14,250 total / ctx=32,000
```
### `/context detail`
```
🧠 Розбивка контексту (детально)
🧠 Розподіл контексту (детально)
Найбільші skills (розмір запису в prompt):
Найбільші skills (розмір запису в запиті):
- frontend-design: 412 chars (~103 tok)
- oracle: 401 chars (~101 tok)
… (+10 more skills)
… (+ще 10 skills)
Найбільші tools (розмір схеми):
Найбільші інструменти (розмір схеми):
- browser: 9,812 chars (~2,453 tok)
- exec: 6,240 chars (~1,560 tok)
… (+N more tools)
… (+ще N)
```
## Що враховується у вікні контексту
Усе, що отримує модель, враховується, зокрема:
Враховується все, що отримує модель, зокрема:
- System prompt (усі розділи).
- Системний запит (усі розділи).
- Історія розмови.
- Виклики інструментів + результати інструментів.
- Вкладення/транскрипти (зображення/аудіо/файли).
- Підсумки compaction і артефакти pruning.
- Підсумки компресії та артефакти обрізання.
- «Обгортки» провайдера або приховані заголовки (не видимі, але все одно враховуються).
## Як OpenClaw будує system prompt
## Як OpenClaw будує системний запит
System prompt **належить OpenClaw** і перебудовується для кожного запуску. Він включає:
Системний запит **належить OpenClaw** і перебудовується для кожного запуску. Він містить:
- Список інструментів + короткі описи.
- Список Skills (лише метадані; див. нижче).
- Розташування робочого простору.
- Час (UTC + перетворений користувацький час, якщо налаштовано).
- Метадані runtime (хост/OS/модель/thinking).
- Час (UTC + перетворений час користувача, якщо налаштовано).
- Метадані середовища виконання (хост/ОС/модель/thinking).
- Впроваджені bootstrap-файли робочого простору в розділі **Project Context**.
Повна розбивка: [System Prompt](/concepts/system-prompt).
Повний розбір: [Системний запит](/uk/concepts/system-prompt).
## Впроваджені файли робочого простору (Project Context)
Типово OpenClaw впроваджує фіксований набір файлів робочого простору (якщо вони існують):
Типово OpenClaw впроваджує фіксований набір файлів робочого простору (якщо вони є):
- `AGENTS.md`
- `SOUL.md`
@ -119,68 +119,68 @@ System prompt **належить OpenClaw** і перебудовується д
- `HEARTBEAT.md`
- `BOOTSTRAP.md` (лише під час першого запуску)
Великі файли обрізаються для кожного файлу окремо через `agents.defaults.bootstrapMaxChars` (типово `20000` chars). OpenClaw також примусово застосовує загальне обмеження на впровадження bootstrap у всіх файлах через `agents.defaults.bootstrapTotalMaxChars` (типово `150000` chars). `/context` показує розміри **raw vs injected** і те, чи відбулося обрізання.
Великі файли обрізаються окремо для кожного файла за допомогою `agents.defaults.bootstrapMaxChars` (типово `20000` символів). OpenClaw також застосовує загальне обмеження на впровадження bootstrap для всіх файлів через `agents.defaults.bootstrapTotalMaxChars` (типово `150000` символів). `/context` показує розміри **raw vs injected** і те, чи відбулося обрізання.
Коли відбувається обрізання, runtime може впровадити в prompt блок попередження в розділі Project Context. Це налаштовується через `agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`; типово `once`).
Коли відбувається обрізання, середовище виконання може впровадити в запит блок попередження в розділі Project Context. Налаштовується це через `agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`; типово `once`).
## Skills: впроваджені чи завантажені на вимогу
System prompt включає компактний **список Skills** (назва + опис + розташування). Цей список має реальні накладні витрати.
Системний запит містить компактний **список skills** (назва + опис + розташування). Цей список створює реальні накладні витрати.
Інструкції Skills _типово не включаються_. Очікується, що модель викличе `read` для `SKILL.md` skill **лише за потреби**.
Інструкції skill е_ включаються типово. Очікується, що модель виконає `read` для `SKILL.md` цього skill **лише за потреби**.
## Tools: є дві вартості
## Інструменти: є дві складові вартості
Інструменти впливають на context двома способами:
Інструменти впливають на контекст двома способами:
1. **Текст списку інструментів** у system prompt (те, що ви бачите як «Tooling»).
2. **Схеми інструментів** (JSON). Вони надсилаються моделі, щоб вона могла викликати інструменти. Вони враховуються в context, навіть якщо ви не бачите їх як звичайний текст.
1. **Текст списку інструментів** у системному запиті (те, що ви бачите як “Tooling”).
2. **Схеми інструментів** (JSON). Вони надсилаються моделі, щоб вона могла викликати інструменти. Вони враховуються в контексті, навіть якщо ви не бачите їх як звичайний текст.
`/context detail` розбиває найбільші схеми інструментів, щоб ви могли побачити, що домінує.
## Команди, директиви й "inline shortcuts"
## Команди, директиви та "вбудовані скорочення"
Slash-команди обробляються Gateway. Є кілька різних типів поведінки:
Слеш-команди обробляються Gateway. Існує кілька різних варіантів поведінки:
- **Standalone commands**: повідомлення, яке складається лише з `/...`, виконується як команда.
- **Directives**: `/think`, `/verbose`, `/reasoning`, `/elevated`, `/model`, `/queue` прибираються до того, як модель побачить повідомлення.
- Повідомлення лише з директивами зберігають налаштування сесії.
- Inline directives у звичайному повідомленні діють як підказки для конкретного повідомлення.
- **Inline shortcuts** (лише для allowlisted senders): деякі токени `/...` всередині звичайного повідомлення можуть виконуватися негайно (приклад: «hey /status») і прибираються до того, як модель побачить решту тексту.
- **Окремі команди**: повідомлення, яке складається лише з `/...`, виконується як команда.
- **Директиви**: `/think`, `/verbose`, `/reasoning`, `/elevated`, `/model`, `/queue` прибираються до того, як модель побачить повідомлення.
- Повідомлення лише з директивами зберігають параметри сесії.
- Вбудовані директиви у звичайному повідомленні діють як підказки для конкретного повідомлення.
- **Вбудовані скорочення** (лише для відправників із allowlist): певні токени `/...` усередині звичайного повідомлення можуть виконуватися негайно (приклад: “hey /status”), а потім прибираються до того, як модель побачить решту тексту.
Подробиці: [Slash commands](/tools/slash-commands).
Докладніше: [Слеш-команди](/uk/tools/slash-commands).
## Sessions, compaction і pruning (що зберігається)
## Сесії, компресія та обрізання (що зберігається)
Те, що зберігається між повідомленнями, залежить від механізму:
Що саме зберігається між повідомленнями, залежить від механізму:
- **Normal history** зберігається в session transcript, доки не буде ущільнено/обрізано політикою.
- **Compaction** зберігає підсумок у transcript і залишає нещодавні повідомлення без змін.
- **Pruning** видаляє старі результати інструментів із prompt _у пам’яті_ для запуску, але не переписує transcript.
- **Звичайна історія** зберігається в транскрипті сесії, доки не буде стиснута/обрізана відповідно до політики.
- **Компресія** зберігає підсумок у транскрипті та залишає недавні повідомлення без змін.
- **Обрізання** видаляє старі результати інструментів із _внутрішньої_ підказки для запуску, але не переписує транскрипт.
Документація: [Session](/concepts/session), [Compaction](/concepts/compaction), [Session pruning](/concepts/session-pruning).
Документація: [Сесія](/uk/concepts/session), [Компресія](/uk/concepts/compaction), [Обрізання сесії](/uk/concepts/session-pruning).
Типово OpenClaw використовує вбудований `legacy` context engine для збирання і
compaction. Якщо ви встановите plugin, який надає `kind: "context-engine"`, і
виберете його через `plugins.slots.contextEngine`, OpenClaw делегує збирання
context, `/compact` та пов’язані hooks життєвого циклу контексту субагентів цьому
engine. `ownsCompaction: false` не спричиняє автоматичний резервний перехід до
legacy engine; активний engine все одно має коректно реалізовувати `compact()`. Див.
[Context Engine](/concepts/context-engine), щоб ознайомитися з повним
інтерфейсом підключення, hooks життєвого циклу та конфігурацією.
Типово OpenClaw використовує вбудований контекстний рушій `legacy` для збирання
та компресії. Якщо ви встановите плагін, який надає `kind: "context-engine"`, і
виберете його через `plugins.slots.contextEngine`, OpenClaw натомість делегує
цьому рушію збирання контексту, `/compact` і пов’язані гачки життєвого циклу
контексту субагента. `ownsCompaction: false` не вмикає автоматичний fallback до
рушія legacy; активний рушій усе одно має коректно реалізовувати `compact()`. Див.
[Context Engine](/uk/concepts/context-engine), щоб ознайомитися з повним
підключуваним інтерфейсом, гачками життєвого циклу та конфігурацією.
## Що насправді показує `/context`
`/context` за можливості надає перевагу найсвіжішому звіту про system prompt, **побудованого під час запуску**:
`/context` за можливості віддає перевагу найновішому звіту про системний запит, **побудований під час запуску**:
- `System prompt (run)` = захоплено з останнього вбудованого запуску (з підтримкою інструментів) і збережено в session store.
- `System prompt (estimate)` = обчислено на льоту, коли звіту про запуск немає (або під час виконання через CLI backend, який не генерує такого звіту).
- `System prompt (run)` = зафіксований з останнього вбудованого запуску (з підтримкою інструментів) і збережений у сховищі сесії.
- `System prompt (estimate)` = обчислений на льоту, якщо звіту про запуску ще немає.
У будь-якому разі він повідомляє розміри та найбільші складові; він **не** виводить повний system prompt або схеми інструментів.
У будь-якому випадку він показує розміри та найбільших учасників; він **не** вивантажує повний системний запит або схеми інструментів.
## Пов’язане
- [Context Engine](/concepts/context-engine) — власне впровадження контексту через plugins
- [Compaction](/concepts/compaction) — підсумовування довгих розмов
- [System Prompt](/concepts/system-prompt) — як будується system prompt
- [Agent Loop](/concepts/agent-loop) — повний цикл виконання агента
- [Context Engine](/uk/concepts/context-engine) — користувацьке впровадження контексту через плагіни
- [Компресія](/uk/concepts/compaction) — узагальнення довгих розмов
- [Системний запит](/uk/concepts/system-prompt) — як будується системний запит
- [Цикл агента](/uk/concepts/agent-loop) — повний цикл виконання агента

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,90 +1,96 @@
---
read_when:
- Ви створюєте новий plugin каналу повідомлень
- Ви створюєте новий плагін каналу обміну повідомленнями
- Ви хочете підключити OpenClaw до платформи обміну повідомленнями
- Вам потрібно зрозуміти поверхню адаптера ChannelPlugin
sidebarTitle: Channel Plugins
summary: Покроковий посібник зі створення plugin каналу повідомлень для OpenClaw
title: Створення plugin каналів
summary: Покроковий посібник зі створення плагіна каналу обміну повідомленнями для OpenClaw
title: Створення плагінів каналів
x-i18n:
generated_at: "2026-04-05T18:12:37Z"
generated_at: "2026-04-05T18:49:07Z"
model: gpt-5.4
provider: openai
source_hash: 68a6ad2c75549db8ce54f7e22ca9850d7ed68c5cd651c9bb41c9f73769f48aba
source_hash: 66b52c10945a8243d803af3bf7e1ea0051869ee92eda2af5718d9bb24fbb8552
source_path: plugins/sdk-channel-plugins.md
workflow: 15
---
# Створення plugin каналів
# Створення плагінів каналів
Цей посібник покроково пояснює створення plugin каналу, який підключає OpenClaw до
платформи обміну повідомленнями. Наприкінці ви матимете робочий канал із безпекою DM,
pairing, гілками відповідей і вихідними повідомленнями.
Цей посібник описує створення плагіна каналу, який підключає OpenClaw до
платформи обміну повідомленнями. Наприкінці у вас буде робочий канал із
захистом DM, паруванням, потоковістю відповідей і вихідними повідомленнями.
<Info>
Якщо ви ще не створювали жодного plugin для OpenClaw, спочатку прочитайте
[Getting Started](/plugins/building-plugins) про базову структуру пакета
Якщо ви раніше не створювали жодного плагіна OpenClaw, спочатку прочитайте
[Getting Started](/uk/plugins/building-plugins) про базову структуру пакета
та налаштування маніфесту.
</Info>
## Як працюють plugin каналів
## Як працюють плагіни каналів
Plugin каналів не потребують власних інструментів send/edit/react. OpenClaw зберігає один
спільний інструмент `message` у core. Ваш plugin відповідає за:
Плагінам каналів не потрібні власні інструменти send/edit/react. OpenClaw
зберігає один спільний інструмент `message` у core. Вашому плагіну належать:
- **Config** — визначення облікового запису та майстер налаштування
- **Security** — політику DM і allowlist
- **Pairing** — потік підтвердження DM
- **Граматику сесій** — те, як специфічні для провайдера ідентифікатори розмов зіставляються з базовими чатами, ідентифікаторами гілок і резервними батьківськими значеннями
- **Outbound** — надсилання тексту, медіа та опитувань на платформу
- **Threading** — як упорядковуються відповіді в гілках
- **Конфігурація** — визначення облікового запису та майстер налаштування
- **Безпека** — політика DM та allowlist-и
- **Парування** — процес підтвердження DM
- **Граматика сесій** — як conversation id, специфічні для провайдера, зіставляються з базовими чатами, id потоків і резервними батьківськими значеннями
- **Вихідні повідомлення** — надсилання тексту, медіа та опитувань на платформу
- **Потоковість** — як упорядковуються відповіді
Core відповідає за спільний інструмент message, підключення prompt, зовнішню форму ключа сесії,
загальний облік `:thread:` і диспетчеризацію.
Core належить спільний інструмент message, зв’язування prompt-ів, зовнішня
форма ключа сесії, загальний облік `:thread:` та диспетчеризація.
Якщо ваша платформа зберігає додаткову область в ідентифікаторах розмов, залиште цей розбір
у plugin через `messaging.resolveSessionConversation(...)`. Це
канонічний hook для зіставлення `rawId` з базовим ідентифікатором розмови, необов’язковим
ідентифікатором гілки, явним `baseConversationId` і будь-якими
Якщо ваша платформа зберігає додаткову область в межах conversation id,
залишайте цей розбір у плагіні через
`messaging.resolveSessionConversation(...)`. Це канонічний хук для
зіставлення `rawId` з базовим conversation id, необов’язковим id потоку,
явним `baseConversationId` і будь-якими
`parentConversationCandidates`.
Коли ви повертаєте `parentConversationCandidates`, зберігайте їх порядок
від найвужчого батьківського елемента до найширшої/базової розмови.
Коли ви повертаєте `parentConversationCandidates`, зберігайте їх порядок від
найвужчого батьківського значення до найширшої/базової розмови.
Bundled plugin, яким потрібен той самий розбір до запуску реєстру каналів,
також можуть надавати файл верхнього рівня `session-key-api.ts` із відповідним
експортом `resolveSessionConversation(...)`. Core використовує цю безпечну для bootstrap поверхню
лише тоді, коли реєстр runtime plugin ще недоступний.
Вбудовані плагіни, яким потрібен той самий розбір до запуску реєстру каналів,
також можуть експортувати файл верхнього рівня `session-key-api.ts` із
відповідним експортом `resolveSessionConversation(...)`. Core використовує цю
безпечну для bootstrap поверхню лише тоді, коли реєстр runtime-плагінів ще
недоступний.
`messaging.resolveParentConversationCandidates(...)` і далі доступний як
застарілий сумісний резервний механізм, коли plugin потрібні лише
резервні батьківські значення поверх загального/raw id. Якщо існують обидва hooks, core використовує
спочатку `resolveSessionConversation(...).parentConversationCandidates` і лише потім
повертається до `resolveParentConversationCandidates(...)`, якщо канонічний hook
`messaging.resolveParentConversationCandidates(...)` залишається доступним як
застарілий резервний механізм сумісності, коли плагіну потрібні лише резервні
батьківські значення поверх загального/сирого id. Якщо існують обидва хуки,
core спочатку використовує
`resolveSessionConversation(...).parentConversationCandidates` і повертається
до `resolveParentConversationCandidates(...)` лише тоді, коли канонічний хук
їх не надає.
## Підтвердження та можливості каналів
## Погодження та можливості каналів
Більшості plugin каналів не потрібен код, специфічний для підтверджень.
Більшості плагінів каналів не потрібен код, специфічний для погоджень.
- Core відповідає за `/approve` у тому самому чаті, спільні payload кнопок підтвердження та загальну резервну доставку.
- Надавайте перевагу одному об’єкту `approvalCapability` у plugin каналу, коли каналу потрібна специфічна для підтверджень поведінка.
- `approvalCapability.authorizeActorAction` і `approvalCapability.getActionAvailabilityState` — це канонічний шов авторизації підтверджень.
- Використовуйте `outbound.shouldSuppressLocalPayloadPrompt` або `outbound.beforeDeliverPayload` для поведінки життєвого циклу payload, специфічної для каналу, наприклад приховування дублікатів локальних prompt підтвердження або надсилання індикаторів набору тексту перед доставкою.
- Використовуйте `approvalCapability.delivery` лише для нативної маршрутизації підтверджень або придушення резервного механізму.
- Використовуйте `approvalCapability.render` лише тоді, коли каналу справді потрібні власні payload підтверджень замість спільного renderer.
- Якщо канал може виводити стабільні DM-ідентичності, подібні до власника, з наявного config, використовуйте `createResolvedApproverActionAuthAdapter` з `openclaw/plugin-sdk/approval-runtime`, щоб обмежити `/approve` у тому самому чаті без додавання специфічної для підтверджень логіки в core.
- Якщо каналу потрібна нативна доставка підтверджень, зосередьте код каналу на нормалізації цілей і транспортних hooks. Використовуйте `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver`, `createApproverRestrictedNativeApprovalCapability` і `createChannelNativeApprovalRuntime` з `openclaw/plugin-sdk/approval-runtime`, щоб core відповідав за фільтрацію запитів, маршрутизацію, дедуплікацію, термін дії та підписку gateway.
- Канали з нативними підтвердженнями мають маршрутизувати і `accountId`, і `approvalKind` через ці helper. `accountId` забезпечує прив’язку політики підтверджень для кількох облікових записів до правильного bot account, а `approvalKind` зберігає доступність поведінки exec і plugin для каналу без жорстко закодованих гілок у core.
- Зберігайте тип delivered approval id від початку до кінця. Нативні клієнти не повинні
вгадувати або переписувати маршрутизацію exec чи plugin підтверджень на основі локального стану каналу.
- Різні види підтверджень можуть навмисно відкривати різні нативні поверхні.
Поточні bundled приклади:
- Slack зберігає доступність нативної маршрутизації підтверджень і для exec, і для plugin id.
- Matrix зберігає нативну DM/канальну маршрутизацію лише для exec-підтверджень і залишає
plugin-підтвердження на спільному шляху `/approve` у тому самому чаті.
- `createApproverRestrictedNativeApprovalAdapter` і далі існує як сумісна обгортка, але новий код має віддавати перевагу builder можливостей і надавати `approvalCapability` у plugin.
- Core керує `/approve` у тому самому чаті, спільними payload-ами кнопок погодження та загальною резервною доставкою.
- Віддавайте перевагу одному об’єкту `approvalCapability` у плагіні каналу, коли каналу потрібна поведінка, специфічна для погоджень.
- `approvalCapability.authorizeActorAction` і `approvalCapability.getActionAvailabilityState` — це канонічний шар авторизації погоджень.
- Якщо ваш канал надає нативні погодження exec, реалізуйте `approvalCapability.getActionAvailabilityState` навіть якщо нативний транспорт повністю живе в `approvalCapability.native`. Core використовує цей хук доступності, щоб розрізняти `enabled` і `disabled`, визначати, чи підтримує ініціюючий канал нативні погодження, і включати канал до підказок резервного сценарію для нативного клієнта.
- Використовуйте `outbound.shouldSuppressLocalPayloadPrompt` або `outbound.beforeDeliverPayload` для поведінки життєвого циклу payload-ів, специфічної для каналу, наприклад приховування дубльованих локальних prompt-ів погодження або надсилання індикаторів набору тексту перед доставкою.
- Використовуйте `approvalCapability.delivery` лише для нативної маршрутизації погоджень або придушення резервного сценарію.
- Використовуйте `approvalCapability.render` лише тоді, коли каналу справді потрібні власні payload-и погодження замість спільного рендерера.
- Використовуйте `approvalCapability.describeExecApprovalSetup`, коли канал хоче, щоб відповідь у гілці disabled пояснювала точні параметри конфігурації, потрібні для ввімкнення нативних погоджень exec. Хук отримує `{ channel, channelLabel, accountId }`; канали з іменованими обліковими записами мають рендерити шляхи, прив’язані до облікового запису, наприклад `channels.<channel>.accounts.<id>.execApprovals.*`, замість значень верхнього рівня за замовчуванням.
- Якщо канал може вивести стабільні DM-ідентичності, подібні до власника, із наявної конфігурації, використовуйте `createResolvedApproverActionAuthAdapter` з `openclaw/plugin-sdk/approval-runtime`, щоб обмежити `/approve` у тому самому чаті без додавання логіки погоджень, специфічної для core.
- Якщо каналу потрібна нативна доставка погоджень, тримайте код каналу зосередженим на нормалізації цілі та транспортних хуках. Використовуйте `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver`, `createApproverRestrictedNativeApprovalCapability` і `createChannelNativeApprovalRuntime` з `openclaw/plugin-sdk/approval-runtime`, щоб core керував фільтрацією запитів, маршрутизацією, дедуплікацією, строком дії та підпискою gateway.
- Канали з нативними погодженнями мають маршрутизувати і `accountId`, і `approvalKind` через ці хелпери. `accountId` зберігає політику погоджень для кількох облікових записів у межах правильного облікового запису бота, а `approvalKind` зберігає поведінку погоджень exec і плагінів доступною для каналу без жорстко закодованих гілок у core.
- Зберігайте тип id доставленого погодження від початку до кінця. Нативні клієнти не повинні
вгадувати або переписувати маршрутизацію погоджень exec чи плагінів на основі локального стану каналу.
- Різні типи погоджень можуть навмисно відкривати різні нативні поверхні.
Поточні приклади вбудованих плагінів:
- Slack зберігає доступність нативної маршрутизації погоджень як для id exec, так і для id плагінів.
- Matrix зберігає нативну маршрутизацію DM/каналів лише для погоджень exec і залишає
погодження плагінів на спільному шляху `/approve` у тому самому чаті.
- `createApproverRestrictedNativeApprovalAdapter` усе ще існує як обгортка сумісності, але новий код має віддавати перевагу побудовнику можливостей і надавати `approvalCapability` у плагіні.
Для гарячих точок входу каналів надавайте перевагу вужчим runtime subpath, коли вам потрібна лише одна частина цієї сім’ї:
Для гарячих entrypoint-ів каналів віддавайте перевагу вужчим runtime-підшляхам,
коли вам потрібна лише одна частина цієї групи:
- `openclaw/plugin-sdk/approval-auth-runtime`
- `openclaw/plugin-sdk/approval-client-runtime`
@ -92,70 +98,74 @@ Bundled plugin, яким потрібен той самий розбір до з
- `openclaw/plugin-sdk/approval-native-runtime`
- `openclaw/plugin-sdk/approval-reply-runtime`
Так само надавайте перевагу `openclaw/plugin-sdk/setup-runtime`,
Так само віддавайте перевагу `openclaw/plugin-sdk/setup-runtime`,
`openclaw/plugin-sdk/setup-adapter-runtime`,
`openclaw/plugin-sdk/reply-runtime`,
`openclaw/plugin-sdk/reply-dispatch-runtime`,
`openclaw/plugin-sdk/reply-reference` і
`openclaw/plugin-sdk/reply-chunking`, коли вам не потрібна ширша umbrella-поверхня.
`openclaw/plugin-sdk/reply-chunking`, якщо вам не потрібна ширша
узагальнювальна поверхня.
Окремо для setup:
Зокрема для setup:
- `openclaw/plugin-sdk/setup-runtime` охоплює безпечні для runtime helper для setup:
безпечні для import адаптери patched setup (`createPatchedAccountSetupAdapter`,
- `openclaw/plugin-sdk/setup-runtime` охоплює безпечні для runtime хелпери setup:
безпечні для import адаптери патчів setup (`createPatchedAccountSetupAdapter`,
`createEnvPatchedAccountSetupAdapter`,
`createSetupInputPresenceValidator`), вивід приміток lookup,
`promptResolvedAllowFrom`, `splitSetupEntries` і delegated
builder setup-proxy
- `openclaw/plugin-sdk/setup-adapter-runtime` — це вузький env-aware adapter
seam для `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` охоплює builder optional-install setup
плюс кілька безпечних для setup примітивів:
`createSetupInputPresenceValidator`), вивід приміток пошуку,
`promptResolvedAllowFrom`, `splitSetupEntries` і делеговані
побудовники proxy для setup
- `openclaw/plugin-sdk/setup-adapter-runtime` — це вузький env-aware шар
адаптера для `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` охоплює побудовники setup для
необов’язкового встановлення, а також кілька безпечних для setup примітивів:
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled` і
`splitSetupEntries`
- використовуйте ширший seam `openclaw/plugin-sdk/setup` лише тоді, коли вам також потрібні
важчі спільні helper для setup/config, такі як
- використовуйте ширший шар `openclaw/plugin-sdk/setup` лише тоді, коли вам також потрібні
важчі спільні хелпери setup/config, наприклад
`moveSingleAccountChannelSectionToDefaultAccount(...)`
Якщо ваш канал хоче лише рекламувати "спочатку встановіть цей plugin" у поверхнях setup,
надавайте перевагу `createOptionalChannelSetupSurface(...)`. Згенеровані
adapter/wizard закриваються безпечно для записів config і фіналізації, а також повторно використовують
одне й те саме повідомлення про обов’язкове встановлення у валідації, finalize і тексті з посиланням на docs.
Якщо ваш канал хоче лише повідомляти "спочатку встановіть цей плагін" на
поверхнях setup, віддавайте перевагу `createOptionalChannelSetupSurface(...)`.
Згенеровані adapter/wizard працюють у режимі fail closed для записів у конфігурацію
та фіналізації й повторно використовують те саме повідомлення про необхідність
встановлення у валідації, finalize та тексті з посиланням на документацію.
Для інших гарячих шляхів каналів надавайте перевагу вузьким helper замість ширших застарілих
поверхонь:
Для інших гарячих шляхів каналу віддавайте перевагу вузьким хелперам замість
ширших застарілих поверхонь:
- `openclaw/plugin-sdk/account-core`,
`openclaw/plugin-sdk/account-id`,
`openclaw/plugin-sdk/account-resolution` і
`openclaw/plugin-sdk/account-helpers` для config із кількома обліковими записами та
резервного механізму account за замовчуванням
`openclaw/plugin-sdk/account-helpers` для конфігурації кількох
облікових записів і резервного повернення до облікового запису за
замовчуванням
- `openclaw/plugin-sdk/inbound-envelope` і
`openclaw/plugin-sdk/inbound-reply-dispatch` для маршруту/конверта вхідних повідомлень та
підключення запису і диспетчеризації
`openclaw/plugin-sdk/inbound-reply-dispatch` для маршрутизації/конвертів
вхідних повідомлень і зв’язування record-and-dispatch
- `openclaw/plugin-sdk/messaging-targets` для розбору/зіставлення цілей
- `openclaw/plugin-sdk/outbound-media` і
`openclaw/plugin-sdk/outbound-runtime` для завантаження медіа плюс delegate
вихідної ідентичності/надсилання
- `openclaw/plugin-sdk/thread-bindings-runtime` для життєвого циклу прив’язок гілок
і реєстрації adapter
`openclaw/plugin-sdk/outbound-runtime` для завантаження медіа та
делегатів ідентичності/надсилання вихідних повідомлень
- `openclaw/plugin-sdk/thread-bindings-runtime` для життєвого циклу
прив’язок потоків і реєстрації адаптерів
- `openclaw/plugin-sdk/agent-media-payload` лише тоді, коли все ще потрібна
застаріла схема полів payload агента/медіа
- `openclaw/plugin-sdk/telegram-command-config` для нормалізації власних команд Telegram,
валідації дублікатів/конфліктів і стабільного щодо резервного механізму контракту config команд
застаріла структура полів payload-ів agent/media
- `openclaw/plugin-sdk/telegram-command-config` для нормалізації
користувацьких команд Telegram, валідації дублікатів/конфліктів і
стабільного як резервний варіант контракту конфігурації команд
Канали лише з auth зазвичай можуть зупинитися на стандартному шляху: core обробляє підтвердження, а plugin просто надає можливості outbound/auth. Канали з нативними підтвердженнями, як-от Matrix, Slack, Telegram і custom chat transport, повинні використовувати спільні нативні helper замість власної реалізації життєвого циклу підтверджень.
Канали лише з auth зазвичай можуть зупинитися на стандартному шляху: core керує погодженнями, а плагін лише надає можливості outbound/auth. Канали з нативними погодженнями, такі як Matrix, Slack, Telegram і власні транспортні рішення для чатів, мають використовувати спільні нативні хелпери замість створення власного життєвого циклу погоджень.
## Покроковий розбір
## Покрокове проходження
<Steps>
<a id="step-1-package-and-manifest"></a>
<Step title="Пакет і маніфест">
Створіть стандартні файли plugin. Поле `channel` у `package.json`
робить цей plugin канальним plugin. Повний опис поверхні метаданих пакета
див. у [Plugin Setup and Config](/plugins/sdk-setup#openclawchannel):
Створіть стандартні файли плагіна. Поле `channel` у `package.json`
визначає, що це плагін каналу. Повну поверхню метаданих пакета див. у
[Plugin Setup and Config](/uk/plugins/sdk-setup#openclawchannel):
<CodeGroup>
```json package.json
@ -204,9 +214,9 @@ adapter/wizard закриваються безпечно для записів c
</Step>
<Step title="Створіть об’єкт plugin каналу">
Інтерфейс `ChannelPlugin` має багато необов’язкових поверхонь adapter. Почніть із
мінімуму — `id` і `setup`і додавайте adapter за потреби.
<Step title="Створіть об’єкт плагіна каналу">
Інтерфейс `ChannelPlugin` має багато необов’язкових поверхонь адаптерів. Почніть
з мінімуму — `id` і `setup`і додавайте адаптери за потреби.
Створіть `src/channel.ts`:
@ -216,7 +226,7 @@ adapter/wizard закриваються безпечно для записів c
createChannelPluginBase,
} from "openclaw/plugin-sdk/channel-core";
import type { OpenClawConfig } from "openclaw/plugin-sdk/channel-core";
import { acmeChatApi } from "./client.js"; // ваш клієнт API платформи
import { acmeChatApi } from "./client.js"; // your platform API client
type ResolvedAccount = {
accountId: string | null;
@ -257,7 +267,7 @@ adapter/wizard закриваються безпечно для записів c
},
}),
// Безпека DM: хто може писати боту
// DM security: who can message the bot
security: {
dm: {
channelKey: "acme-chat",
@ -267,7 +277,7 @@ adapter/wizard закриваються безпечно для записів c
},
},
// Pairing: потік підтвердження для нових контактів у DM
// Pairing: approval flow for new DM contacts
pairing: {
text: {
idLabel: "Acme Chat username",
@ -278,10 +288,10 @@ adapter/wizard закриваються безпечно для записів c
},
},
// Threading: як доставляються відповіді
// Threading: how replies are delivered
threading: { topLevelReplyToMode: "reply" },
// Outbound: надсилання повідомлень на платформу
// Outbound: send messages to the platform
outbound: {
attachedResults: {
sendText: async (params) => {
@ -302,23 +312,23 @@ adapter/wizard закриваються безпечно для записів c
```
<Accordion title="Що для вас робить createChatChannelPlugin">
Замість ручної реалізації низькорівневих інтерфейсів adapter ви передаєте
декларативні параметри, а builder компонує їх:
Замість ручної реалізації низькорівневих інтерфейсів адаптерів, ви
передаєте декларативні параметри, а побудовник компонує їх:
| Параметр | Що він підключає |
| Option | Що він підключає |
| --- | --- |
| `security.dm` | Scoped-резолвер безпеки DM з полів config |
| `pairing.text` | Потік pairing у DM на основі тексту з обміном кодами |
| `threading` | Резолвер режиму reply-to (фіксований, scoped за account або custom) |
| `outbound.attachedResults` | Функції надсилання, які повертають метадані результату (ідентифікатори повідомлень) |
| `security.dm` | Scoped-резолвер безпеки DM із полів конфігурації |
| `pairing.text` | Текстовий процес парування DM з обміном кодом |
| `threading` | Резолвер режиму reply-to (фіксований, прив’язаний до облікового запису або користувацький) |
| `outbound.attachedResults` | Функції надсилання, які повертають метадані результату (ID повідомлень) |
Ви також можете передавати сирі об’єкти adapter замість декларативних параметрів,
Ви також можете передавати сирі об’єкти адаптерів замість декларативних параметрів,
якщо вам потрібен повний контроль.
</Accordion>
</Step>
<Step title="Підключіть точку входу">
<Step title="Підключіть entry point">
Створіть `index.ts`:
```typescript index.ts
@ -354,22 +364,22 @@ adapter/wizard закриваються безпечно для записів c
});
```
Розміщуйте CLI descriptors, якими володіє канал, у `registerCliMetadata(...)`, щоб OpenClaw
Розміщуйте дескриптори CLI, що належать каналу, у `registerCliMetadata(...)`, щоб OpenClaw
міг показувати їх у кореневій довідці без активації повного runtime каналу,
а звичайні повні завантаження все одно підхоплювали ті самі descriptors для реєстрації реальних команд.
Залишайте `registerFull(...)` для роботи лише під час runtime.
Якщо `registerFull(...)` реєструє gateway RPC methods, використовуйте
prefix, специфічний для plugin. Простори імен адміністрування core (`config.*`,
тоді як звичайні повні завантаження все одно підхоплюватимуть ті самі дескриптори для реєстрації
реальних команд. Залишайте `registerFull(...)` для роботи, потрібної лише в runtime.
Якщо `registerFull(...)` реєструє gateway RPC-методи, використовуйте
префікс, специфічний для плагіна. Простори імен адмін-інтерфейсу core (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) залишаються зарезервованими і завжди
зіставляються з `operator.admin`.
`defineChannelPluginEntry` автоматично обробляє поділ режимів реєстрації. Див.
[Entry Points](/plugins/sdk-entrypoints#definechannelpluginentry) для всіх
параметрів.
`defineChannelPluginEntry` автоматично обробляє цей поділ режимів реєстрації. У
[Entry Points](/uk/plugins/sdk-entrypoints#definechannelpluginentry) див. усі
параметри.
</Step>
<Step title="Додайте setup entry">
Створіть `setup-entry.ts` для легкого завантаження під час onboarding:
Створіть `setup-entry.ts` для легкого завантаження під час онбордингу:
```typescript setup-entry.ts
import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
@ -378,28 +388,28 @@ adapter/wizard закриваються безпечно для записів c
export default defineSetupPluginEntry(acmeChatPlugin);
```
OpenClaw завантажує цей файл замість повної точки входу, коли канал вимкнено
або не налаштовано. Це дозволяє уникнути підтягування важкого runtime-коду під час потоків setup.
Подробиці див. у [Setup and Config](/plugins/sdk-setup#setup-entry).
OpenClaw завантажує це замість повного entry, коли канал вимкнений
або не налаштований. Це дає змогу не підтягувати важкий runtime-код під час процесів setup.
Докладніше див. у [Setup and Config](/uk/plugins/sdk-setup#setup-entry).
</Step>
<Step title="Обробляйте вхідні повідомлення">
Ваш plugin має отримувати повідомлення з платформи та пересилати їх до
OpenClaw. Типовий шаблон — webhook, який перевіряє запит і
диспетчеризує його через inbound handler вашого каналу:
Ваш плагін має отримувати повідомлення з платформи та переспрямовувати їх до
OpenClaw. Типовий шаблон — це webhook, який перевіряє запит і
диспетчеризує його через обробник вхідних повідомлень вашого каналу:
```typescript
registerFull(api) {
api.registerHttpRoute({
path: "/acme-chat/webhook",
auth: "plugin", // auth під керуванням plugin (перевіряйте підписи самостійно)
auth: "plugin", // plugin-managed auth (verify signatures yourself)
handler: async (req, res) => {
const event = parseWebhookPayload(req);
// Ваш inbound handler диспетчеризує повідомлення до OpenClaw.
// Точне підключення залежить від SDK вашої платформи
// див. реальний приклад у пакеті bundled plugin Microsoft Teams або Google Chat.
// Your inbound handler dispatches the message to OpenClaw.
// The exact wiring depends on your platform SDK
// see a real example in the bundled Microsoft Teams or Google Chat plugin package.
await handleAcmeChatInbound(api, event);
res.statusCode = 200;
@ -411,16 +421,16 @@ adapter/wizard закриваються безпечно для записів c
```
<Note>
Обробка вхідних повідомлень є специфічною для каналу. Кожен plugin каналу
володіє власним inbound-конвеєром. Подивіться на bundled plugin каналів
(наприклад пакет plugin Microsoft Teams або Google Chat), щоб побачити реальні шаблони.
Обробка вхідних повідомлень є специфічною для каналу. Кожен плагін каналу
володіє власним конвеєром вхідних повідомлень. Перегляньте вбудовані плагіни каналів
(наприклад пакет плагіна Microsoft Teams або Google Chat), щоб побачити реальні шаблони.
</Note>
</Step>
<a id="step-6-test"></a>
<Step title="Тестування">
Пишіть colocated-тести у `src/channel.test.ts`:
Пишіть колоковані тести у `src/channel.test.ts`:
```typescript src/channel.test.ts
import { describe, it, expect } from "vitest";
@ -458,7 +468,7 @@ adapter/wizard закриваються безпечно для записів c
pnpm test -- <bundled-plugin-root>/acme-chat/
```
Спільні helper для тестування див. у [Testing](/plugins/sdk-testing).
Спільні хелпери для тестування див. у [Testing](/uk/plugins/sdk-testing).
</Step>
</Steps>
@ -467,8 +477,8 @@ adapter/wizard закриваються безпечно для записів c
```
<bundled-plugin-root>/acme-chat/
├── package.json # Метадані openclaw.channel
├── openclaw.plugin.json # Маніфест зі схемою config
├── package.json # metadata openclaw.channel
├── openclaw.plugin.json # Маніфест зі схемою конфігурації
├── index.ts # defineChannelPluginEntry
├── setup-entry.ts # defineSetupPluginEntry
├── api.ts # Публічні експорти (необов’язково)
@ -476,37 +486,37 @@ adapter/wizard закриваються безпечно для записів c
└── src/
├── channel.ts # ChannelPlugin через createChatChannelPlugin
├── channel.test.ts # Тести
├── client.ts # Клієнт API платформи
└── runtime.ts # Сховище runtime (за потреби)
├── client.ts # API-клієнт платформи
└── runtime.ts # Runtime-сховище (за потреби)
```
## Розширені теми
<CardGroup cols={2}>
<Card title="Параметри threading" icon="git-branch" href="/plugins/sdk-entrypoints#registration-mode">
Фіксовані reply-режими, scoped за account або custom
<Card title="Параметри потоковості" icon="git-branch" href="/uk/plugins/sdk-entrypoints#registration-mode">
Фіксовані, прив’язані до облікового запису або користувацькі режими reply
</Card>
<Card title="Інтеграція інструмента message" icon="puzzle" href="/plugins/architecture#channel-plugins-and-the-shared-message-tool">
<Card title="Інтеграція інструмента message" icon="puzzle" href="/uk/plugins/architecture#channel-plugins-and-the-shared-message-tool">
describeMessageTool і виявлення дій
</Card>
<Card title="Визначення цілей" icon="crosshair" href="/plugins/architecture#channel-target-resolution">
<Card title="Визначення цілі" icon="crosshair" href="/uk/plugins/architecture#channel-target-resolution">
inferTargetChatType, looksLikeId, resolveTarget
</Card>
<Card title="Runtime helper" icon="settings" href="/plugins/sdk-runtime">
TTS, STT, медіа, subagent через api.runtime
<Card title="Runtime-хелпери" icon="settings" href="/uk/plugins/sdk-runtime">
TTS, STT, media, subagent через api.runtime
</Card>
</CardGroup>
<Note>
Деякі bundled helper seams і далі існують для підтримки bundled plugin і
сумісності. Це не рекомендований шаблон для нових plugin каналів;
надавайте перевагу загальним channel/setup/reply/runtime subpath зі спільної поверхні SDK,
якщо тільки ви безпосередньо не підтримуєте цю сім’ю bundled plugin.
Деякі вбудовані допоміжні шари все ще існують для супроводу вбудованих плагінів
та сумісності. Це не рекомендований шаблон для нових плагінів каналів;
віддавайте перевагу загальним підшляхам channel/setup/reply/runtime зі спільної
поверхні SDK, якщо тільки ви не супроводжуєте безпосередньо цю сім’ю вбудованих плагінів.
</Note>
## Наступні кроки
- [Provider Plugins](/plugins/sdk-provider-plugins) — якщо ваш plugin також надає моделі
- [SDK Overview](/plugins/sdk-overview) — повний довідник import subpath
- [SDK Testing](/plugins/sdk-testing) — утиліти тестування та контрактні тести
- [Plugin Manifest](/plugins/manifest) — повна схема маніфесту
- [Provider Plugins](/uk/plugins/sdk-provider-plugins) — якщо ваш плагін також надає моделі
- [SDK Overview](/uk/plugins/sdk-overview) — повний довідник з імпортів підшляхів
- [SDK Testing](/uk/plugins/sdk-testing) — тестові утиліти та контрактні тести
- [Plugin Manifest](/uk/plugins/manifest) — повна схема маніфесту

View File

@ -4,27 +4,27 @@ read_when:
- Вам потрібен довідник для всіх методів реєстрації в OpenClawPluginApi
- Ви шукаєте конкретний експорт SDK
sidebarTitle: SDK Overview
summary: Карта імпортів, довідник API реєстрації та архітектура SDK
summary: Карта імпорту, довідник API реєстрації та архітектура SDK
title: Огляд Plugin SDK
x-i18n:
generated_at: "2026-04-05T18:13:38Z"
generated_at: "2026-04-05T18:49:41Z"
model: gpt-5.4
provider: openai
source_hash: fb25f3f96ca1f522780f5a52eaedb85a8adf3cfb2934df625db3fe8b5f7e0666
source_hash: d70ea8cc1343b2dc1b4243b0562d19bebb1fdf7eb5065220b17e87cfd8aecc3e
source_path: plugins/sdk-overview.md
workflow: 15
---
# Огляд Plugin SDK
Plugin SDK — це типізований контракт між плагінами та core. Ця сторінка є
довідником для **що імпортувати** і **що ви можете реєструвати**.
Plugin SDK — це типізований контракт між plugins і ядром. Ця сторінка є
довідником про **що імпортувати** і **що можна реєструвати**.
<Tip>
**Шукаєте практичний посібник?**
- Перший плагін? Почніть із [Початок роботи](/plugins/building-plugins)
- Плагін каналу? Див. [Плагіни каналів](/plugins/sdk-channel-plugins)
- Плагін провайдера? Див. [Плагіни провайдерів](/plugins/sdk-provider-plugins)
**Шукаєте покроковий посібник?**
- Перший plugin? Почніть із [Getting Started](/uk/plugins/building-plugins)
- Plugin каналу? Дивіться [Channel Plugins](/uk/plugins/sdk-channel-plugins)
- Plugin постачальника? Дивіться [Provider Plugins](/uk/plugins/sdk-provider-plugins)
</Tip>
## Угода щодо імпорту
@ -36,39 +36,41 @@ import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
```
Кожен підшлях — це невеликий самодостатній модуль. Це зберігає швидкий запуск і
запобігає проблемам із циклічними залежностями. Для специфічних для каналів
допоміжних функцій entry/build віддавайте перевагу `openclaw/plugin-sdk/channel-core`; `openclaw/plugin-sdk/core` залишайте для
ширшої umbrella-поверхні та спільних допоміжних функцій, таких як
Кожен підшлях — це невеликий самодостатній модуль. Це забезпечує швидкий
запуск і запобігає проблемам із циклічними залежностями. Для специфічних для
каналів допоміжних засобів entry/build віддавайте перевагу
`openclaw/plugin-sdk/channel-core`; залишайте `openclaw/plugin-sdk/core` для
ширшої узагальненої поверхні та спільних помічників, таких як
`buildChannelConfigSchema`.
Не додавайте і не покладайтеся на зручні шви з іменами провайдерів, такі як
`openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`,
Не додавайте й не використовуйте зручні шви, названі на честь постачальників,
такі як `openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`,
`openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`, або
допоміжні шви з брендуванням каналу. Пакети вбудованих плагінів мають компонувати загальні
підшляхи SDK у власних barrel-файлах `api.ts` або `runtime-api.ts`, а core
має або використовувати ці локальні barrel-файли плагіна, або додавати вузький загальний контракт SDK, коли потреба справді є міжканальною.
допоміжні шви з брендуванням каналів. Вбудовані plugins мають компонувати
узагальнені підшляхи SDK у власних barrel-файлах `api.ts` або `runtime-api.ts`,
а ядро має або використовувати ці локальні barrel-файли plugin, або додавати
вузький узагальнений контракт SDK, коли потреба справді є міжканальною.
Згенерована карта експортів усе ще містить невеликий набір
допоміжних швів для вбудованих плагінів, таких як `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`,
Згенерована карта експортів усе ще містить невеликий набір допоміжних швів
вбудованих plugins, таких як `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`,
`plugin-sdk/zalo`, `plugin-sdk/zalo-setup` і `plugin-sdk/matrix*`. Ці
підшляхи існують лише для супроводу вбудованих плагінів і сумісності; їх
навмисно пропущено в загальній таблиці нижче, і вони не є рекомендованим
шляхом імпорту для нових сторонніх плагінів.
підшляхи існують лише для підтримки та сумісності вбудованих plugins; вони
навмисно не включені до загальної таблиці нижче і не є рекомендованим шляхом
імпорту для нових сторонніх plugins.
## Довідник підшляхів
Найуживаніші підшляхи, згруповані за призначенням. Згенерований повний список із
понад 200 підшляхів міститься в `scripts/lib/plugin-sdk-entrypoints.json`.
Найуживаніші підшляхи, згруповані за призначенням. Згенерований повний список
із понад 200 підшляхів міститься у `scripts/lib/plugin-sdk-entrypoints.json`.
Зарезервовані допоміжні підшляхи для вбудованих плагінів усе ще з’являються в цьому згенерованому списку.
Розглядайте їх як поверхні деталей реалізації/сумісності, якщо тільки сторінка документації
явно не просуває один із них як публічний.
Зарезервовані допоміжні підшляхи вбудованих plugins усе ще з’являються в цьому
згенерованому списку. Розглядайте їх як поверхні деталей реалізації/сумісності,
якщо лише сторінка документації явно не просуває одну з них як публічну.
### Entry плагіна
### Entry plugin
| Підшлях | Ключові експорти |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| Підшлях | Ключові експорти |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/plugin-entry` | `definePluginEntry` |
| `plugin-sdk/core` | `defineChannelPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `defineSetupPluginEntry`, `buildChannelConfigSchema` |
| `plugin-sdk/config-schema` | `OpenClawSchema` |
@ -81,259 +83,257 @@ import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
| `plugin-sdk/channel-core` | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
| `plugin-sdk/config-schema` | Експорт кореневої Zod-схеми `openclaw.json` (`OpenClawSchema`) |
| `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, а також `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/setup` | Спільні допоміжні функції майстра налаштування, запити allowlist, побудовники статусу налаштування |
| `plugin-sdk/setup` | Спільні помічники майстра налаштування, підказки списку дозволених, побудовники статусу налаштування |
| `plugin-sdk/setup-runtime` | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Допоміжні функції конфігурації/контролю дій для кількох облікових записів, допоміжні функції резервного переходу до типового облікового запису |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, допоміжні функції нормалізації ідентифікатора облікового запису |
| `plugin-sdk/account-resolution` | Допоміжні функції пошуку облікового запису + резервного переходу до типового |
| `plugin-sdk/account-helpers` | Вузькі допоміжні функції списку облікових записів/дій з обліковим записом |
| `plugin-sdk/account-core` | Помічники для конфігурації/обмеження дій для кількох облікових записів, помічники резервного переходу на типовий обліковий запис |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, помічники нормалізації id облікового запису |
| `plugin-sdk/account-resolution` | Помічники пошуку облікового запису + резервного переходу до типового |
| `plugin-sdk/account-helpers` | Вузькі помічники для списку облікових записів/дій з обліковими записами |
| `plugin-sdk/channel-pairing` | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | `createChannelReplyPipeline` |
| `plugin-sdk/channel-config-helpers` | `createHybridChannelConfigAdapter` |
| `plugin-sdk/channel-config-schema` | Типи схеми конфігурації каналу |
| `plugin-sdk/telegram-command-config` | Допоміжні функції нормалізації/валідації кастомних команд Telegram із резервним переходом до контракту вбудованого пакета |
| `plugin-sdk/telegram-command-config` | Помічники нормалізації/валідації користувацьких команд Telegram із резервною підтримкою вбудованого контракту |
| `plugin-sdk/channel-policy` | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-lifecycle` | `createAccountStatusSink` |
| `plugin-sdk/inbound-envelope` | Спільні допоміжні функції маршруту вхідних даних + побудовника envelope |
| `plugin-sdk/inbound-reply-dispatch` | Спільні допоміжні функції запису та диспетчеризації вхідних даних |
| `plugin-sdk/messaging-targets` | Допоміжні функції розбору/зіставлення цілей |
| `plugin-sdk/outbound-media` | Спільні допоміжні функції завантаження вихідних медіа |
| `plugin-sdk/outbound-runtime` | Допоміжні функції делегування вихідної ідентичності/надсилання |
| `plugin-sdk/thread-bindings-runtime` | Життєвий цикл прив’язок потоків та допоміжні функції адаптера |
| `plugin-sdk/agent-media-payload` | Застарілий побудовник медіапейлоада агента |
| `plugin-sdk/conversation-runtime` | Допоміжні функції прив’язки розмови/потоку, парування та налаштованої прив’язки |
| `plugin-sdk/runtime-config-snapshot` | Допоміжна функція знімка конфігурації runtime |
| `plugin-sdk/runtime-group-policy` | Допоміжні функції розв’язання політики груп runtime |
| `plugin-sdk/channel-status` | Спільні допоміжні функції знімка/підсумку стану каналу |
| `plugin-sdk/channel-config-primitives` | Вузькі примітиви схеми конфігурації каналу |
| `plugin-sdk/channel-config-writes` | Допоміжні функції авторизації запису конфігурації каналу |
| `plugin-sdk/channel-plugin-common` | Спільні експорти прелюдії плагіна каналу |
| `plugin-sdk/allowlist-config-edit` | Допоміжні функції редагування/читання конфігурації allowlist |
| `plugin-sdk/group-access` | Спільні допоміжні функції рішень щодо доступу до груп |
| `plugin-sdk/direct-dm` | Спільні допоміжні функції auth/guard для прямих DM |
| `plugin-sdk/interactive-runtime` | Допоміжні функції нормалізації/скорочення інтерактивного пейлоада відповіді |
| `plugin-sdk/channel-inbound` | Допоміжні функції debounce, зіставлення згадок, envelope |
| `plugin-sdk/inbound-envelope` | Спільні помічники для маршрутизації вхідних повідомлень + побудови envelope |
| `plugin-sdk/inbound-reply-dispatch` | Спільні помічники запису й диспетчеризації вхідних повідомлень |
| `plugin-sdk/messaging-targets` | Помічники розбору/зіставлення цілей |
| `plugin-sdk/outbound-media` | Спільні помічники завантаження вихідних медіа |
| `plugin-sdk/outbound-runtime` | Помічники вихідної ідентичності/делегування надсилання |
| `plugin-sdk/thread-bindings-runtime` | Помічники життєвого циклу та адаптерів прив’язок потоків |
| `plugin-sdk/agent-media-payload` | Застарілий побудовник медіа-пейлоаду агента |
| `plugin-sdk/conversation-runtime` | Помічники прив’язки розмови/потоку, pairing і configured-binding |
| `plugin-sdk/runtime-config-snapshot` | Помічник знімка конфігурації часу виконання |
| `plugin-sdk/runtime-group-policy` | Помічники визначення group-policy під час виконання |
| `plugin-sdk/channel-status` | Спільні помічники знімка/зведення статусу каналу |
| `plugin-sdk/channel-config-primitives` | Вузькі примітиви config-schema каналу |
| `plugin-sdk/channel-config-writes` | Помічники авторизації запису конфігурації каналу |
| `plugin-sdk/channel-plugin-common` | Спільні прелюд-експорти plugin каналу |
| `plugin-sdk/allowlist-config-edit` | Помічники редагування/читання конфігурації списку дозволених |
| `plugin-sdk/group-access` | Спільні помічники рішень щодо group-access |
| `plugin-sdk/direct-dm` | Спільні помічники auth/guard для прямих DM |
| `plugin-sdk/interactive-runtime` | Помічники нормалізації/скорочення пейлоаду інтерактивних відповідей |
| `plugin-sdk/channel-inbound` | Debounce, зіставлення згадок, помічники envelope |
| `plugin-sdk/channel-send-result` | Типи результатів відповіді |
| `plugin-sdk/channel-actions` | `createMessageToolButtonsSchema`, `createMessageToolCardSchema` |
| `plugin-sdk/channel-targets` | Допоміжні функції розбору/зіставлення цілей |
| `plugin-sdk/channel-targets` | Помічники розбору/зіставлення цілей |
| `plugin-sdk/channel-contract` | Типи контракту каналу |
| `plugin-sdk/channel-feedback` | Підключення feedback/reaction |
</Accordion>
<Accordion title="Підшляхи провайдерів">
<Accordion title="Підшляхи постачальників">
| Підшлях | Ключові експорти |
| --- | --- |
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
| `plugin-sdk/provider-setup` | Кураторські допоміжні функції налаштування локального/self-hosted провайдера |
| `plugin-sdk/self-hosted-provider-setup` | Сфокусовані допоміжні функції налаштування self-hosted провайдера, сумісного з OpenAI |
| `plugin-sdk/cli-backend` | Типові значення CLI backend + константи watchdog |
| `plugin-sdk/provider-auth-runtime` | Допоміжні функції runtime для розв’язання API-ключа для плагінів провайдерів |
| `plugin-sdk/provider-auth-api-key` | Допоміжні функції онбордингу/запису профілю API-ключа |
| `plugin-sdk/provider-setup` | Добірні помічники налаштування локальних/self-hosted постачальників |
| `plugin-sdk/self-hosted-provider-setup` | Сфокусовані помічники налаштування self-hosted постачальника, сумісного з OpenAI |
| `plugin-sdk/provider-auth-runtime` | Помічники визначення API-ключа під час виконання для plugins постачальників |
| `plugin-sdk/provider-auth-api-key` | Помічники онбордингу/запису профілю для API-ключів |
| `plugin-sdk/provider-auth-result` | Стандартний побудовник результату OAuth auth |
| `plugin-sdk/provider-auth-login` | Спільні допоміжні функції інтерактивного входу для плагінів провайдерів |
| `plugin-sdk/provider-env-vars` | Допоміжні функції пошуку env var для auth провайдера |
| `plugin-sdk/provider-auth-login` | Спільні помічники інтерактивного входу для plugins постачальників |
| `plugin-sdk/provider-env-vars` | Помічники пошуку env vars auth постачальника |
| `plugin-sdk/provider-auth` | `createProviderApiKeyAuthMethod`, `ensureApiKeyFromOptionEnvOrPrompt`, `upsertAuthProfile` |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, спільні побудовники політики повторення, допоміжні функції endpoint провайдера та допоміжні функції нормалізації model-id, такі як `normalizeNativeXaiModelId` |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, спільні побудовники replay-policy, помічники endpoint постачальників і помічники нормалізації model-id, такі як `normalizeNativeXaiModelId` |
| `plugin-sdk/provider-catalog-shared` | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-http` | Загальні допоміжні функції HTTP/можливостей endpoint провайдера |
| `plugin-sdk/provider-web-fetch` | Допоміжні функції реєстрації/кешу web-fetch провайдера |
| `plugin-sdk/provider-web-search` | Допоміжні функції реєстрації/кешу/конфігурації web-search провайдера |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, очищення схеми Gemini + діагностика та допоміжні функції сумісності xAI, такі як `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | `fetchClaudeUsage` та подібні |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, типи обгорток потоків і спільні допоміжні функції обгорток Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-onboard` | Допоміжні функції патчів конфігурації онбордингу |
| `plugin-sdk/global-singleton` | Допоміжні функції локальних для процесу singleton/map/cache |
| `plugin-sdk/provider-http` | Узагальнені помічники HTTP/можливостей endpoint постачальника |
| `plugin-sdk/provider-web-fetch` | Помічники реєстрації/кешу постачальника web-fetch |
| `plugin-sdk/provider-web-search` | Помічники реєстрації/кешу/конфігурації постачальника web-search |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, очищення схеми Gemini + діагностика та помічники сумісності xAI, такі як `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | `fetchClaudeUsage` та подібне |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, типи обгорток потоку та спільні помічники обгорток Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-onboard` | Помічники виправлення конфігурації онбордингу |
| `plugin-sdk/global-singleton` | Помічники локальних для процесу singleton/map/cache |
</Accordion>
<Accordion title="Підшляхи auth і безпеки">
| Підшлях | Ключові експорти |
| --- | --- |
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, допоміжні функції реєстру команд, допоміжні функції авторизації відправника |
| `plugin-sdk/approval-auth-runtime` | Допоміжні функції розв’язання approver і auth дій у тому самому чаті |
| `plugin-sdk/approval-client-runtime` | Допоміжні функції профілю/фільтра схвалення native exec |
| `plugin-sdk/approval-delivery-runtime` | Адаптери доставки/можливостей native approval |
| `plugin-sdk/approval-native-runtime` | Допоміжні функції native approval target + прив’язки облікового запису |
| `plugin-sdk/approval-reply-runtime` | Допоміжні функції пейлоада відповіді схвалення exec/plugin |
| `plugin-sdk/command-auth-native` | Допоміжні функції native command auth + native session-target |
| `plugin-sdk/command-detection` | Спільні допоміжні функції виявлення команд |
| `plugin-sdk/command-surface` | Допоміжні функції нормалізації тіла команди та поверхні команд |
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, помічники реєстру команд, помічники авторизації відправника |
| `plugin-sdk/approval-auth-runtime` | Помічники визначення approver і auth дій у тому самому чаті |
| `plugin-sdk/approval-client-runtime` | Помічники профілю/фільтра native exec approval |
| `plugin-sdk/approval-delivery-runtime` | Адаптери native approval capability/delivery |
| `plugin-sdk/approval-native-runtime` | Помічники native approval target + прив’язки облікового запису |
| `plugin-sdk/approval-reply-runtime` | Помічники пейлоаду відповіді exec/plugin approval |
| `plugin-sdk/command-auth-native` | Native command auth + помічники native session-target |
| `plugin-sdk/command-detection` | Спільні помічники визначення команд |
| `plugin-sdk/command-surface` | Помічники нормалізації тіла команди й командної поверхні |
| `plugin-sdk/allow-from` | `formatAllowFromLowercase` |
| `plugin-sdk/security-runtime` | Спільні допоміжні функції довіри, DM gating, зовнішнього вмісту та збору секретів |
| `plugin-sdk/ssrf-policy` | Допоміжні функції allowlist хостів і політики SSRF для приватної мережі |
| `plugin-sdk/ssrf-runtime` | Допоміжні функції pinned-dispatcher, fetch із захистом SSRF та політики SSRF |
| `plugin-sdk/secret-input` | Допоміжні функції розбору секретного вводу |
| `plugin-sdk/webhook-ingress` | Допоміжні функції запиту/цілі webhook |
| `plugin-sdk/webhook-request-guards` | Допоміжні функції розміру тіла запиту/таймауту |
| `plugin-sdk/security-runtime` | Спільні помічники довіри, DM gating, external-content і збору секретів |
| `plugin-sdk/ssrf-policy` | Помічники allowlist хостів і політики SSRF для приватної мережі |
| `plugin-sdk/ssrf-runtime` | Помічники pinned-dispatcher, fetch із захистом SSRF і політики SSRF |
| `plugin-sdk/secret-input` | Помічники розбору введення секретів |
| `plugin-sdk/webhook-ingress` | Помічники запитів/цілей webhook |
| `plugin-sdk/webhook-request-guards` | Помічники розміру тіла запиту/timeout |
</Accordion>
<Accordion title="Підшляхи runtime і сховища">
| Підшлях | Ключові експорти |
| --- | --- |
| `plugin-sdk/runtime` | Широкі допоміжні функції runtime/logging/backup/install плагінів |
| `plugin-sdk/runtime-env` | Вузькі допоміжні функції env, logger, timeout, retry і backoff для runtime |
| `plugin-sdk/runtime` | Широка поверхня помічників runtime/logging/backup/install plugin |
| `plugin-sdk/runtime-env` | Вузькі помічники env runtime, logger, timeout, retry і backoff |
| `plugin-sdk/runtime-store` | `createPluginRuntimeStore` |
| `plugin-sdk/plugin-runtime` | Спільні допоміжні функції команди/hook/http/interactive плагіна |
| `plugin-sdk/hook-runtime` | Спільні допоміжні функції конвеєра webhook/internal hook |
| `plugin-sdk/lazy-runtime` | Допоміжні функції lazy імпорту/прив’язки runtime, такі як `createLazyRuntimeModule`, `createLazyRuntimeMethod` і `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Допоміжні функції виконання процесів |
| `plugin-sdk/cli-runtime` | Допоміжні функції форматування CLI, очікування та версії |
| `plugin-sdk/gateway-runtime` | Клієнт Gateway і допоміжні функції патчів стану каналу |
| `plugin-sdk/config-runtime` | Допоміжні функції завантаження/запису конфігурації |
| `plugin-sdk/telegram-command-config` | Нормалізація імен/описів команд Telegram і перевірки дублювання/конфліктів, навіть коли поверхня контракту вбудованого Telegram недоступна |
| `plugin-sdk/approval-runtime` | Допоміжні функції схвалення exec/plugin, побудовники можливостей approval, auth/profile, native routing/runtime |
| `plugin-sdk/reply-runtime` | Спільні допоміжні функції runtime для вхідних даних/відповідей, chunking, dispatch, heartbeat, planner відповіді |
| `plugin-sdk/reply-dispatch-runtime` | Вузькі допоміжні функції dispatch/finalize відповіді |
| `plugin-sdk/reply-history` | Спільні допоміжні функції коротковіконної історії відповідей, такі як `buildHistoryContext`, `recordPendingHistoryEntry` і `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/plugin-runtime` | Спільні помічники команд/hook/http/interactive plugin |
| `plugin-sdk/hook-runtime` | Спільні помічники pipeline webhook/internal hook |
| `plugin-sdk/lazy-runtime` | Помічники лінивого імпорту/прив’язки runtime, такі як `createLazyRuntimeModule`, `createLazyRuntimeMethod` і `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Помічники виконання процесів |
| `plugin-sdk/cli-runtime` | Помічники форматування CLI, очікування та версії |
| `plugin-sdk/gateway-runtime` | Помічники клієнта gateway і виправлення статусу каналу |
| `plugin-sdk/config-runtime` | Помічники завантаження/запису конфігурації |
| `plugin-sdk/telegram-command-config` | Нормалізація імен/описів команд Telegram та перевірки дублікатів/конфліктів, навіть коли поверхня контракту вбудованого Telegram недоступна |
| `plugin-sdk/approval-runtime` | Помічники exec/plugin approval, побудовники approval-capability, помічники auth/profile, native routing/runtime |
| `plugin-sdk/reply-runtime` | Спільні помічники runtime для вхідних повідомлень/відповідей, chunking, dispatch, heartbeat, planner відповіді |
| `plugin-sdk/reply-dispatch-runtime` | Вузькі помічники dispatch/finalize відповіді |
| `plugin-sdk/reply-history` | Спільні помічники reply-history для коротких вікон, такі як `buildHistoryContext`, `recordPendingHistoryEntry` і `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/reply-reference` | `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Вузькі допоміжні функції chunking тексту/markdown |
| `plugin-sdk/session-store-runtime` | Допоміжні функції шляху до session store + updated-at |
| `plugin-sdk/state-paths` | Допоміжні функції шляхів до каталогів state/OAuth |
| `plugin-sdk/routing` | Допоміжні функції маршруту/ключа сесії/прив’язки облікового запису, такі як `resolveAgentRoute`, `buildAgentSessionKey` і `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Спільні допоміжні функції підсумку стану каналу/облікового запису, типові стани runtime і допоміжні функції метаданих issue |
| `plugin-sdk/target-resolver-runtime` | Спільні допоміжні функції розв’язання цілей |
| `plugin-sdk/string-normalization-runtime` | Допоміжні функції нормалізації slug/рядків |
| `plugin-sdk/request-url` | Видобування рядкових URL з вводів типу fetch/request |
| `plugin-sdk/run-command` | Запуск команди з таймером і нормалізованими результатами stdout/stderr |
| `plugin-sdk/param-readers` | Загальні рідери параметрів інструментів/CLI |
| `plugin-sdk/tool-send` | Видобування канонічних полів цілі надсилання з аргументів інструмента |
| `plugin-sdk/temp-path` | Спільні допоміжні функції шляхів для тимчасових завантажень |
| `plugin-sdk/logging-core` | Допоміжні функції logger підсистеми та редагування |
| `plugin-sdk/markdown-table-runtime` | Допоміжні функції режиму таблиць Markdown |
| `plugin-sdk/json-store` | Невеликі допоміжні функції читання/запису стану JSON |
| `plugin-sdk/file-lock` | Допоміжні функції повторно вхідного file lock |
| `plugin-sdk/persistent-dedupe` | Допоміжні функції дискового кешу дедуплікації |
| `plugin-sdk/acp-runtime` | Допоміжні функції runtime/сесії ACP і reply-dispatch |
| `plugin-sdk/agent-config-primitives` | Вузькі примітиви схеми конфігурації runtime агента |
| `plugin-sdk/boolean-param` | Рідер нечіткого boolean-параметра |
| `plugin-sdk/dangerous-name-runtime` | Допоміжні функції розв’язання збігів небезпечних імен |
| `plugin-sdk/device-bootstrap` | Допоміжні функції початкового налаштування пристрою та токенів парування |
| `plugin-sdk/extension-shared` | Спільні примітиви passive-channel і статусу |
| `plugin-sdk/models-provider-runtime` | Допоміжні функції відповіді провайдера/команди `/models` |
| `plugin-sdk/skill-commands-runtime` | Допоміжні функції списку команд Skills |
| `plugin-sdk/native-command-registry` | Допоміжні функції реєстру/build/serialize native-команд |
| `plugin-sdk/provider-zai-endpoint` | Допоміжні функції виявлення endpoint Z.AI |
| `plugin-sdk/infra-runtime` | Допоміжні функції системних подій/heartbeat |
| `plugin-sdk/collection-runtime` | Невеликі допоміжні функції обмеженого кешу |
| `plugin-sdk/diagnostic-runtime` | Допоміжні функції діагностичних прапорців і подій |
| `plugin-sdk/error-runtime` | Граф помилок, форматування, спільні допоміжні функції класифікації помилок, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Обгорнутий fetch, proxy і pinned lookup helpers |
| `plugin-sdk/host-runtime` | Допоміжні функції нормалізації hostname і SCP host |
| `plugin-sdk/retry-runtime` | Допоміжні функції конфігурації повторів і запуску повторів |
| `plugin-sdk/agent-runtime` | Допоміжні функції каталогу/ідентичності/робочого простору агента |
| `plugin-sdk/directory-runtime` | Запит/дедуплікація каталогів на основі конфігурації |
| `plugin-sdk/reply-chunking` | Вузькі помічники chunking тексту/markdown |
| `plugin-sdk/session-store-runtime` | Помічники шляху сховища сесії + updated-at |
| `plugin-sdk/state-paths` | Помічники шляхів до директорій state/OAuth |
| `plugin-sdk/routing` | Помічники маршруту/ключа сесії/прив’язки облікового запису, такі як `resolveAgentRoute`, `buildAgentSessionKey` і `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Спільні помічники зведення статусу каналу/облікового запису, типові значення runtime-state і помічники метаданих проблем |
| `plugin-sdk/target-resolver-runtime` | Спільні помічники визначення цілей |
| `plugin-sdk/string-normalization-runtime` | Помічники нормалізації slug/рядків |
| `plugin-sdk/request-url` | Витягуйте рядкові URL з вхідних даних на кшталт fetch/request |
| `plugin-sdk/run-command` | Виконавець команд із таймером і нормалізованими результатами stdout/stderr |
| `plugin-sdk/param-readers` | Загальні читачі параметрів tool/CLI |
| `plugin-sdk/tool-send` | Витягуйте канонічні поля цілі надсилання з аргументів tool |
| `plugin-sdk/temp-path` | Спільні помічники шляхів для тимчасових завантажень |
| `plugin-sdk/logging-core` | Помічники logger підсистеми та редагування |
| `plugin-sdk/markdown-table-runtime` | Помічники режиму таблиць Markdown |
| `plugin-sdk/json-store` | Невеликі помічники читання/запису стану JSON |
| `plugin-sdk/file-lock` | Помічники повторно вхідного file-lock |
| `plugin-sdk/persistent-dedupe` | Помічники дискового кешу дедуплікації |
| `plugin-sdk/acp-runtime` | Помічники runtime/session ACP і dispatch відповіді |
| `plugin-sdk/agent-config-primitives` | Вузькі примітиви config-schema runtime агента |
| `plugin-sdk/boolean-param` | Читач параметрів для нестрогих булевих значень |
| `plugin-sdk/dangerous-name-runtime` | Помічники визначення збігів небезпечних імен |
| `plugin-sdk/device-bootstrap` | Помічники bootstrap пристрою і токенів pairing |
| `plugin-sdk/extension-shared` | Спільні примітиви для passive-channel і статусних помічників |
| `plugin-sdk/models-provider-runtime` | Помічники `/models` command/provider reply |
| `plugin-sdk/skill-commands-runtime` | Помічники переліку команд Skills |
| `plugin-sdk/native-command-registry` | Помічники реєстру/build/serialize native command |
| `plugin-sdk/provider-zai-endpoint` | Помічники визначення endpoint Z.A.I |
| `plugin-sdk/infra-runtime` | Помічники системних подій/heartbeat |
| `plugin-sdk/collection-runtime` | Невеликі помічники обмеженого кешу |
| `plugin-sdk/diagnostic-runtime` | Помічники діагностичних прапорців і подій |
| `plugin-sdk/error-runtime` | Граф помилок, форматування, спільні помічники класифікації помилок, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Помічники обгорнутого fetch, proxy і pinned lookup |
| `plugin-sdk/host-runtime` | Помічники нормалізації hostname і SCP host |
| `plugin-sdk/retry-runtime` | Помічники конфігурації retry і виконавця retry |
| `plugin-sdk/agent-runtime` | Помічники директорії/ідентичності/workspace агента |
| `plugin-sdk/directory-runtime` | Запит/дедуплікація директорій на основі конфігурації |
| `plugin-sdk/keyed-async-queue` | `KeyedAsyncQueue` |
</Accordion>
<Accordion title="Підшляхи можливостей і тестування">
| Підшлях | Ключові експорти |
| --- | --- |
| `plugin-sdk/media-runtime` | Спільні допоміжні функції fetch/transform/store для медіа, а також побудовники медіапейлоадів |
| `plugin-sdk/media-understanding` | Типи провайдера media understanding, а також експорти допоміжних функцій зображень/аудіо для провайдерів |
| `plugin-sdk/text-runtime` | Спільні допоміжні функції тексту/markdown/logging, такі як вилучення видимого асистенту тексту, render/chunking/table helpers для markdown, допоміжні функції редагування, directive-tag helpers і safe-text utilities |
| `plugin-sdk/text-chunking` | Допоміжна функція chunking вихідного тексту |
| `plugin-sdk/speech` | Типи speech-провайдера, а також експорти directive, registry і validation для провайдерів |
| `plugin-sdk/speech-core` | Спільні типи speech-провайдера, registry, directive і normalization helpers |
| `plugin-sdk/realtime-transcription` | Типи провайдера realtime transcription і допоміжні функції registry |
| `plugin-sdk/realtime-voice` | Типи провайдера realtime voice і допоміжні функції registry |
| `plugin-sdk/image-generation` | Типи провайдера генерації зображень |
| `plugin-sdk/image-generation-core` | Спільні типи генерації зображень, failover, auth і допоміжні функції registry |
| `plugin-sdk/video-generation` | Типи провайдера/запиту/результату генерації відео |
| `plugin-sdk/video-generation-core` | Спільні типи генерації відео, допоміжні функції failover, пошуку провайдера та розбору model-ref |
| `plugin-sdk/webhook-targets` | Реєстр цілей webhook і допоміжні функції встановлення маршрутів |
| `plugin-sdk/webhook-path` | Допоміжні функції нормалізації шляху webhook |
| `plugin-sdk/web-media` | Спільні допоміжні функції завантаження віддалених/локальних медіа |
| `plugin-sdk/zod` | Реекспортований `zod` для споживачів Plugin SDK |
| `plugin-sdk/media-runtime` | Спільні помічники fetch/transform/store медіа, а також побудовники медіа-пейлоаду |
| `plugin-sdk/media-understanding` | Типи постачальників media understanding, а також експорти помічників зображень/аудіо для постачальників |
| `plugin-sdk/text-runtime` | Спільні помічники тексту/markdown/logging, такі як видалення видимого для асистента тексту, render/chunking/table-помічники markdown, помічники редагування, помічники тегів директив і утиліти безпечного тексту |
| `plugin-sdk/text-chunking` | Помічник chunking вихідного тексту |
| `plugin-sdk/speech` | Типи постачальників мовлення, а також помічники директив, реєстру та валідації для постачальників |
| `plugin-sdk/speech-core` | Спільні типи постачальників мовлення, реєстр, директиви та помічники нормалізації |
| `plugin-sdk/realtime-transcription` | Типи постачальників realtime transcription і помічники реєстру |
| `plugin-sdk/realtime-voice` | Типи постачальників realtime voice і помічники реєстру |
| `plugin-sdk/image-generation` | Типи постачальників генерації зображень |
| `plugin-sdk/image-generation-core` | Спільні типи генерації зображень, failover, auth і помічники реєстру |
| `plugin-sdk/video-generation` | Типи постачальників/запитів/результатів генерації відео |
| `plugin-sdk/video-generation-core` | Спільні типи генерації відео, помічники failover, пошук постачальника і розбір model-ref |
| `plugin-sdk/webhook-targets` | Помічники реєстру цілей webhook і встановлення маршрутів |
| `plugin-sdk/webhook-path` | Помічники нормалізації шляху webhook |
| `plugin-sdk/web-media` | Спільні помічники завантаження віддалених/локальних медіа |
| `plugin-sdk/zod` | Повторно експортований `zod` для користувачів plugin SDK |
| `plugin-sdk/testing` | `installCommonResolveTargetErrorCases`, `shouldAckReaction` |
</Accordion>
<Accordion title="Підшляхи пам’яті">
| Підшлях | Ключові експорти |
| --- | --- |
| `plugin-sdk/memory-core` | Поверхня допоміжних функцій bundled memory-core для manager/config/file/CLI helpers |
| `plugin-sdk/memory-core-engine-runtime` | Фасад runtime індексу/пошуку пам’яті |
| `plugin-sdk/memory-core` | Поверхня допоміжних засобів вбудованого memory-core для manager/config/file/CLI |
| `plugin-sdk/memory-core-engine-runtime` | Фасад runtime індексації/пошуку пам’яті |
| `plugin-sdk/memory-core-host-engine-foundation` | Експорти foundation engine хоста пам’яті |
| `plugin-sdk/memory-core-host-engine-embeddings` | Експорти engine embeddings хоста пам’яті |
| `plugin-sdk/memory-core-host-engine-qmd` | Експорти engine QMD хоста пам’яті |
| `plugin-sdk/memory-core-host-engine-storage` | Експорти engine storage хоста пам’яті |
| `plugin-sdk/memory-core-host-multimodal` | Допоміжні функції multimodal хоста пам’яті |
| `plugin-sdk/memory-core-host-query` | Допоміжні функції query хоста пам’яті |
| `plugin-sdk/memory-core-host-secret` | Допоміжні функції secret хоста пам’яті |
| `plugin-sdk/memory-core-host-status` | Допоміжні функції status хоста пам’яті |
| `plugin-sdk/memory-core-host-runtime-cli` | Допоміжні функції CLI runtime хоста пам’яті |
| `plugin-sdk/memory-core-host-runtime-core` | Допоміжні функції core runtime хоста пам’яті |
| `plugin-sdk/memory-core-host-runtime-files` | Допоміжні функції file/runtime хоста пам’яті |
| `plugin-sdk/memory-lancedb` | Поверхня допоміжних функцій bundled memory-lancedb |
| `plugin-sdk/memory-core-host-engine-embeddings` | Експорти embedding engine хоста пам’яті |
| `plugin-sdk/memory-core-host-engine-qmd` | Експорти QMD engine хоста пам’яті |
| `plugin-sdk/memory-core-host-engine-storage` | Експорти storage engine хоста пам’яті |
| `plugin-sdk/memory-core-host-multimodal` | Мультимодальні помічники хоста пам’яті |
| `plugin-sdk/memory-core-host-query` | Помічники запитів хоста пам’яті |
| `plugin-sdk/memory-core-host-secret` | Помічники секретів хоста пам’яті |
| `plugin-sdk/memory-core-host-status` | Помічники статусу хоста пам’яті |
| `plugin-sdk/memory-core-host-runtime-cli` | Помічники runtime CLI хоста пам’яті |
| `plugin-sdk/memory-core-host-runtime-core` | Помічники core runtime хоста пам’яті |
| `plugin-sdk/memory-core-host-runtime-files` | Помічники файлів/runtime хоста пам’яті |
| `plugin-sdk/memory-lancedb` | Поверхня допоміжних засобів вбудованого memory-lancedb |
</Accordion>
<Accordion title="Зарезервовані допоміжні підшляхи для вбудованих пакетів">
| Family | Поточні підшляхи | Призначення |
<Accordion title="Зарезервовані допоміжні підшляхи вбудованих компонентів">
| Сімейство | Поточні підшляхи | Призначене використання |
| --- | --- | --- |
| Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-support` | Допоміжні функції підтримки вбудованого browser-плагіна |
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Поверхня допоміжних функцій/runtime для вбудованого Matrix |
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Поверхня допоміжних функцій/runtime для вбудованого LINE |
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Поверхня допоміжних функцій для вбудованого IRC |
| Допоміжні функції, специфічні для каналів | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Шви сумісності/допоміжних функцій для вбудованих каналів |
| Допоміжні функції, специфічні для auth/плагінів | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Шви допоміжних функцій для вбудованих можливостей/плагінів; `plugin-sdk/github-copilot-token` наразі експортує `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken` і `resolveCopilotApiToken` |
| Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-support` | Допоміжні засоби підтримки вбудованого browser plugin |
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Поверхня helper/runtime вбудованого Matrix |
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Поверхня helper/runtime вбудованого LINE |
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Поверхня допоміжних засобів вбудованого IRC |
| Специфічні для каналу помічники | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Шви сумісності/допоміжні шви вбудованих каналів |
| Специфічні для auth/plugin помічники | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Допоміжні шви вбудованих можливостей/plugins; `plugin-sdk/github-copilot-token` наразі експортує `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken` і `resolveCopilotApiToken` |
</Accordion>
</AccordionGroup>
## API реєстрації
Зворотний виклик `register(api)` отримує об’єкт `OpenClawPluginApi` з такими
Колбек `register(api)` отримує об’єкт `OpenClawPluginApi` з такими
методами:
### Реєстрація можливостей
| Метод | Що він реєструє |
| ------------------------------------------------ | -------------------------------- |
| `api.registerProvider(...)` | Текстовий inference (LLM) |
| `api.registerCliBackend(...)` | Локальний CLI backend inference |
| `api.registerChannel(...)` | Канал повідомлень |
| `api.registerSpeechProvider(...)` | Синтез text-to-speech / STT |
| `api.registerRealtimeTranscriptionProvider(...)` | Потокова realtime transcription |
| `api.registerRealtimeVoiceProvider(...)` | Двобічні сеанси realtime voice |
| `api.registerMediaUnderstandingProvider(...)` | Аналіз зображень/аудіо/відео |
| `api.registerImageGenerationProvider(...)` | Генерація зображень |
| `api.registerVideoGenerationProvider(...)` | Генерація відео |
| `api.registerWebFetchProvider(...)` | Провайдер web fetch / scrape |
| Метод | Що реєструє |
| ------------------------------------------------ | ------------------------------ |
| `api.registerProvider(...)` | Текстовий inference (LLM) |
| `api.registerChannel(...)` | Канал повідомлень |
| `api.registerSpeechProvider(...)` | Синтез text-to-speech / STT |
| `api.registerRealtimeTranscriptionProvider(...)` | Потокова transcription realtime |
| `api.registerRealtimeVoiceProvider(...)` | Двобічні сесії realtime voice |
| `api.registerMediaUnderstandingProvider(...)` | Аналіз зображень/аудіо/відео |
| `api.registerImageGenerationProvider(...)` | Генерація зображень |
| `api.registerVideoGenerationProvider(...)` | Генерація відео |
| `api.registerWebFetchProvider(...)` | Постачальник web fetch / scrape |
| `api.registerWebSearchProvider(...)` | Вебпошук |
### Інструменти й команди
### Tools і команди
| Метод | Що він реєструє |
| ------------------------------- | --------------------------------------------- |
| `api.registerTool(tool, opts?)` | Інструмент агента (обов’язковий або `{ optional: true }`) |
| `api.registerCommand(def)` | Користувацька команда (обходить LLM) |
| Метод | Що реєструє |
| ------------------------------ | --------------------------------------------- |
| `api.registerTool(tool, opts?)` | Agent tool (обов’язковий або `{ optional: true }`) |
| `api.registerCommand(def)` | Користувацька команда (обходить LLM) |
### Інфраструктура
| Метод | Що він реєструє |
| ---------------------------------------------- | --------------------- |
| `api.registerHook(events, handler, opts?)` | Хук події |
| `api.registerHttpRoute(params)` | HTTP endpoint Gateway |
| `api.registerGatewayMethod(name, handler)` | Метод RPC Gateway |
| `api.registerCli(registrar, opts?)` | Підкоманда CLI |
| `api.registerService(service)` | Фонова служба |
| `api.registerInteractiveHandler(registration)` | Інтерактивний обробник |
| Метод | Що реєструє |
| --------------------------------------------- | --------------------- |
| `api.registerHook(events, handler, opts?)` | Hook події |
| `api.registerHttpRoute(params)` | HTTP endpoint gateway |
| `api.registerGatewayMethod(name, handler)` | RPC-метод gateway |
| `api.registerCli(registrar, opts?)` | Підкоманду CLI |
| `api.registerService(service)` | Фоновий сервіс |
| `api.registerInteractiveHandler(registration)` | Інтерактивний handler |
Зарезервовані простори імен core admin (`config.*`, `exec.approvals.*`, `wizard.*`,
`update.*`) завжди залишаються `operator.admin`, навіть якщо плагін намагається призначити
вужчу область gateway method. Для методів, що належать плагіну,
віддавайте перевагу префіксам, специфічним для плагіна.
`update.*`) завжди залишаються `operator.admin`, навіть якщо plugin намагається
призначити вужчу область gateway method. Для методів, що належать plugin,
віддавайте перевагу префіксам, специфічним для plugin.
### Метадані реєстрації CLI
`api.registerCli(registrar, opts?)` приймає два типи метаданих верхнього рівня:
- `commands`: явні корені команд, що належать реєстратору
- `descriptors`: дескриптори команд на етапі парсингу, що використовуються для кореневої довідки CLI,
маршрутизації та lazy-реєстрації CLI плагіна
- `commands`: явні корені команд, що належать registrar
- `descriptors`: дескриптори команд на етапі розбору, що використовуються для
довідки кореневого CLI, маршрутизації та лінивої реєстрації CLI plugin
Якщо ви хочете, щоб команда плагіна залишалася lazy-loaded у звичайному кореневому шляху CLI,
надайте `descriptors`, які охоплюють кожен корінь команди верхнього рівня, який відкриває
цей реєстратор.
Якщо ви хочете, щоб команда plugin залишалася ліниво завантажуваною в
звичайному шляху кореневого CLI, надайте `descriptors`, які охоплюють кожен
корінь команди верхнього рівня, що надається цим registrar.
```typescript
api.registerCli(
@ -353,116 +353,121 @@ api.registerCli(
);
```
Використовуйте лише `commands`, коли вам не потрібна lazy-реєстрація кореневого CLI.
Цей сумісний eager-шлях і далі підтримується, але він не встановлює
плейсхолдери на основі descriptor для lazy loading на етапі парсингу.
Використовуйте `commands` окремо лише тоді, коли вам не потрібна лінива
реєстрація кореневого CLI. Цей сумісний eager-шлях усе ще підтримується, але
він не встановлює placeholders на основі descriptor для лінивого завантаження
на етапі розбору.
### Ексклюзивні слоти
| Метод | Що він реєструє |
| ------------------------------------------ | ------------------------------------- |
| Метод | Що реєструє |
| ------------------------------------------ | ------------------------------------ |
| `api.registerContextEngine(id, factory)` | Context engine (одночасно активний лише один) |
| `api.registerMemoryPromptSection(builder)` | Побудовник секції prompt пам’яті |
| `api.registerMemoryFlushPlan(resolver)` | Resolver плану flush пам’яті |
| `api.registerMemoryRuntime(runtime)` | Адаптер runtime пам’яті |
| `api.registerMemoryPromptSection(builder)` | Побудовник секції prompt пам’яті |
| `api.registerMemoryFlushPlan(resolver)` | Resolver плану скидання пам’яті |
| `api.registerMemoryRuntime(runtime)` | Адаптер runtime пам’яті |
### Адаптери embedding пам’яті
### Адаптери embeddings пам’яті
| Метод | Що він реєструє |
| ---------------------------------------------- | ---------------------------------------------- |
| `api.registerMemoryEmbeddingProvider(adapter)` | Адаптер embedding пам’яті для активного плагіна |
| Метод | Що реєструє |
| ---------------------------------------------- | ------------------------------------------------ |
| `api.registerMemoryEmbeddingProvider(adapter)` | Адаптер embeddings пам’яті для активного plugin |
- `registerMemoryPromptSection`, `registerMemoryFlushPlan` і
`registerMemoryRuntime` є ексклюзивними для плагінів пам’яті.
- `registerMemoryEmbeddingProvider` дає активному плагіну пам’яті змогу реєструвати один
або більше ідентифікаторів адаптерів embedding (наприклад `openai`, `gemini` або користувацький
ідентифікатор, визначений плагіном).
`registerMemoryRuntime` є ексклюзивними для plugins пам’яті.
- `registerMemoryEmbeddingProvider` дозволяє активному plugin пам’яті
зареєструвати один або кілька id адаптерів embeddings (наприклад `openai`,
`gemini` або користувацький id, визначений plugin).
- Користувацька конфігурація, така як `agents.defaults.memorySearch.provider` і
`agents.defaults.memorySearch.fallback`, розв’язується відносно зареєстрованих ідентифікаторів
адаптерів.
`agents.defaults.memorySearch.fallback`, визначається відносно зареєстрованих
id цих адаптерів.
### Події та життєвий цикл
| Метод | Що він робить |
| -------------------------------------------- | ----------------------------- |
| `api.on(hookName, handler, opts?)` | Типізований хук життєвого циклу |
| `api.onConversationBindingResolved(handler)` | Зворотний виклик прив’язки розмови |
| Метод | Що робить |
| ------------------------------------------- | ---------------------------- |
| `api.on(hookName, handler, opts?)` | Типізований hook життєвого циклу |
| `api.onConversationBindingResolved(handler)` | Колбек прив’язки розмови |
### Семантика рішень hook
- `before_tool_call`: повернення `{ block: true }` є фінальним. Щойно будь-який обробник встановлює його, обробники нижчого пріоритету пропускаються.
- `before_tool_call`: повернення `{ block: false }` розглядається як відсутність рішення (так само, як і пропуск `block`), а не як перевизначення.
- `before_install`: повернення `{ block: true }` є фінальним. Щойно будь-який обробник встановлює його, обробники нижчого пріоритету пропускаються.
- `before_install`: повернення `{ block: false }` розглядається як відсутність рішення (так само, як і пропуск `block`), а не як перевизначення.
- `reply_dispatch`: повернення `{ handled: true, ... }` є фінальним. Щойно будь-який обробник бере на себе диспетчеризацію, обробники нижчого пріоритету й типовий шлях диспетчеризації моделі пропускаються.
- `message_sending`: повернення `{ cancel: true }` є фінальним. Щойно будь-який обробник встановлює його, обробники нижчого пріоритету пропускаються.
- `message_sending`: повернення `{ cancel: false }` розглядається як відсутність рішення (так само, як і пропуск `cancel`), а не як перевизначення.
- `before_tool_call`: повернення `{ block: true }` є термінальним. Щойно будь-який handler встановлює це значення, handlers із нижчим пріоритетом пропускаються.
- `before_tool_call`: повернення `{ block: false }` вважається відсутністю рішення (так само, як пропуск `block`), а не перевизначенням.
- `before_install`: повернення `{ block: true }` є термінальним. Щойно будь-який handler встановлює це значення, handlers із нижчим пріоритетом пропускаються.
- `before_install`: повернення `{ block: false }` вважається відсутністю рішення (так само, як пропуск `block`), а не перевизначенням.
- `reply_dispatch`: повернення `{ handled: true, ... }` є термінальним. Щойно будь-який handler бере диспетчеризацію на себе, handlers із нижчим пріоритетом і типовий шлях диспетчеризації моделі пропускаються.
- `message_sending`: повернення `{ cancel: true }` є термінальним. Щойно будь-який handler встановлює це значення, handlers із нижчим пріоритетом пропускаються.
- `message_sending`: повернення `{ cancel: false }` вважається відсутністю рішення (так само, як пропуск `cancel`), а не перевизначенням.
### Поля об’єкта API
| Поле | Тип | Опис |
| Поле | Тип | Опис |
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- |
| `api.id` | `string` | Ідентифікатор плагіна |
| `api.name` | `string` | Відображувана назва |
| `api.version` | `string?` | Версія плагіна (необов’язково) |
| `api.description` | `string?` | Опис плагіна (необов’язково) |
| `api.source` | `string` | Шлях до джерела плагіна |
| `api.rootDir` | `string?` | Кореневий каталог плагіна (необов’язково) |
| `api.config` | `OpenClawConfig` | Поточний знімок конфігурації (активний знімок runtime у пам’яті, коли доступний) |
| `api.pluginConfig` | `Record<string, unknown>` | Конфігурація, специфічна для плагіна, з `plugins.entries.<id>.config` |
| `api.runtime` | `PluginRuntime` | [Допоміжні функції runtime](/plugins/sdk-runtime) |
| `api.logger` | `PluginLogger` | Логер з областю видимості (`debug`, `info`, `warn`, `error`) |
| `api.id` | `string` | Id plugin |
| `api.name` | `string` | Відображувана назва |
| `api.version` | `string?` | Версія plugin (необов’язково) |
| `api.description` | `string?` | Опис plugin (необов’язково) |
| `api.source` | `string` | Шлях до джерела plugin |
| `api.rootDir` | `string?` | Коренева директорія plugin (необов’язково) |
| `api.config` | `OpenClawConfig` | Поточний знімок конфігурації (активний знімок runtime у пам’яті, коли доступний) |
| `api.pluginConfig` | `Record<string, unknown>` | Конфігурація plugin з `plugins.entries.<id>.config` |
| `api.runtime` | `PluginRuntime` | [Помічники runtime](/uk/plugins/sdk-runtime) |
| `api.logger` | `PluginLogger` | Logger з областю видимості (`debug`, `info`, `warn`, `error`) |
| `api.registrationMode` | `PluginRegistrationMode` | Поточний режим завантаження; `"setup-runtime"` — це полегшене вікно запуску/налаштування до повного entry |
| `api.resolvePath(input)` | `(string) => string` | Розв’язати шлях відносно кореня плагіна |
| `api.resolvePath(input)` | `(string) => string` | Визначити шлях відносно кореня plugin |
## Угода щодо внутрішніх модулів
Усередині вашого плагіна використовуйте локальні barrel-файли для внутрішніх імпортів:
Усередині вашого plugin використовуйте локальні barrel-файли для внутрішніх
імпортів:
```
my-plugin/
api.ts # Публічні експорти для зовнішніх споживачів
runtime-api.ts # Внутрішні експорти лише для runtime
index.ts # Точка входу плагіна
runtime-api.ts # Лише внутрішні експорти runtime
index.ts # Точка входу plugin
setup-entry.ts # Полегшений entry лише для налаштування (необов’язково)
```
<Warning>
Ніколи не імпортуйте власний плагін через `openclaw/plugin-sdk/<your-plugin>`
Ніколи не імпортуйте власний plugin через `openclaw/plugin-sdk/<your-plugin>`
у production-коді. Спрямовуйте внутрішні імпорти через `./api.ts` або
`./runtime-api.ts`. Шлях SDK — це лише зовнішній контракт.
`./runtime-api.ts`. Шлях SDK є лише зовнішнім контрактом.
</Warning>
Завантажувані через facade публічні поверхні вбудованих плагінів (`api.ts`, `runtime-api.ts`,
`index.ts`, `setup-entry.ts` та подібні публічні entry-файли) тепер віддають перевагу
активному знімку конфігурації runtime, коли OpenClaw уже працює. Якщо знімок runtime
ще не існує, вони повертаються до розв’язаного файлу конфігурації на диску.
Публічні поверхні вбудованих plugins, що завантажуються через facade (`api.ts`, `runtime-api.ts`,
`index.ts`, `setup-entry.ts` та подібні публічні entry-файли), тепер віддають
перевагу активному знімку конфігурації runtime, коли OpenClaw уже запущено. Якщо
знімка runtime ще немає, вони переходять до резервного варіанту з визначеним
файлом конфігурації на диску.
Плагіни провайдерів також можуть відкривати вузький локальний barrel-контракт плагіна, коли
допоміжна функція навмисно є специфічною для провайдера і ще не належить до загального підшляху SDK.
Поточний вбудований приклад: провайдер Anthropic зберігає свої допоміжні функції потоку Claude
у власному публічному шві `api.ts` / `contract-api.ts` замість того, щоб просувати логіку Anthropic beta-header і `service_tier`
до загального контракту `plugin-sdk/*`.
Plugins постачальників також можуть надавати вузький локальний barrel-контракт
plugin, коли помічник навмисно є специфічним для постачальника і ще не належить
до узагальненого підшляху SDK. Поточний вбудований приклад: постачальник
Anthropic зберігає свої помічники потоку Claude у власному публічному шві
`api.ts` / `contract-api.ts` замість того, щоб просувати логіку beta-header і
`service_tier` Anthropic до узагальненого контракту `plugin-sdk/*`.
Інші поточні вбудовані приклади:
- `@openclaw/openai-provider`: `api.ts` експортує побудовники провайдера,
допоміжні функції типових моделей і побудовники realtime-провайдера
- `@openclaw/openrouter-provider`: `api.ts` експортує побудовник провайдера плюс
допоміжні функції онбордингу/конфігурації
- `@openclaw/openai-provider`: `api.ts` експортує побудовники постачальника,
помічники типових моделей і побудовники realtime-постачальників
- `@openclaw/openrouter-provider`: `api.ts` експортує побудовник постачальника, а також
помічники онбордингу/конфігурації
<Warning>
Production-код розширення також має уникати імпортів `openclaw/plugin-sdk/<other-plugin>`.
Якщо допоміжна функція справді є спільною, підніміть її до нейтрального підшляху SDK,
такого як `openclaw/plugin-sdk/speech`, `.../provider-model-shared` або іншої
поверхні, орієнтованої на можливості, замість зчеплення двох плагінів між собою.
Production-код extensions також має уникати імпортів
`openclaw/plugin-sdk/<other-plugin>`. Якщо помічник справді є спільним,
просуньте його до нейтрального підшляху SDK, такого як
`openclaw/plugin-sdk/speech`, `.../provider-model-shared` або іншої
поверхні, орієнтованої на можливості, замість того щоб жорстко зв’язувати два plugins.
</Warning>
## Пов’язане
- [Точки входу](/plugins/sdk-entrypoints) — параметри `definePluginEntry` і `defineChannelPluginEntry`
- [Допоміжні функції runtime](/plugins/sdk-runtime) — повний довідник простору імен `api.runtime`
- [Налаштування та конфігурація](/plugins/sdk-setup) — пакування, маніфести, схеми конфігурації
- [Тестування](/plugins/sdk-testing) — утиліти тестування та правила lint
- [Міграція SDK](/plugins/sdk-migration) — міграція із застарілих поверхонь
- [Внутрішня будова плагінів](/plugins/architecture) — поглиблена архітектура й модель можливостей
- [Entry Points](/uk/plugins/sdk-entrypoints) — параметри `definePluginEntry` і `defineChannelPluginEntry`
- [Runtime Helpers](/uk/plugins/sdk-runtime) — повний довідник простору імен `api.runtime`
- [Setup and Config](/uk/plugins/sdk-setup) — пакування, маніфести, схеми конфігурації
- [Testing](/uk/plugins/sdk-testing) — утиліти тестування та правила lint
- [SDK Migration](/uk/plugins/sdk-migration) — міграція із застарілих поверхонь
- [Plugin Internals](/uk/plugins/architecture) — глибока архітектура та модель можливостей

View File

@ -1,30 +1,30 @@
---
read_when:
- Потрібно налагодити ідентифікатори сесій, JSONL транскриптів або поля sessions.json
- Ви змінюєте поведінку автоущільнення або додаєте підготовчі дії перед ущільненням
- Потрібно налагодити ідентифікатори сесій, JSONL транскрипту або поля в sessions.json
- Ви змінюєте поведінку автоущільнення або додаєте службові дії “перед ущільненням”
- Ви хочете реалізувати скидання пам’яті або тихі системні ходи
summary: 'Детальний розбір: сховище сесій + транскрипти, життєвий цикл і внутрішня логіка (авто)ущільнення'
title: Детальний розбір керування сесіями
summary: 'Глибокий розбір: сховище сесій і транскрипти, життєвий цикл та внутрішні механізми (авто)ущільнення'
title: Глибокий розбір керування сесіями
x-i18n:
generated_at: "2026-04-05T18:17:29Z"
generated_at: "2026-04-05T18:49:16Z"
model: gpt-5.4
provider: openai
source_hash: e379d624dd7808d3af25ed011079268ce6a9da64bb3f301598884ad4c46ab091
source_hash: e0d8c2d30be773eac0424f7a4419ab055fdd50daac8bc654e7d250c891f2c3b8
source_path: reference/session-management-compaction.md
workflow: 15
---
# Керування сесіями та ущільнення (детальний розбір)
# Керування сесіями та ущільнення (глибокий розбір)
У цьому документі пояснюється, як OpenClaw керує сесіями від початку до кінця:
У цьому документі пояснюється, як OpenClaw керує сесіями наскрізно:
- **Маршрутизація сесій** (як вхідні повідомлення зіставляються з `sessionKey`)
- **Сховище сесій** (`sessions.json`) і що в ньому відстежується
- **Збереження транскриптів** (`*.jsonl`) та їхня структура
- **Гігієна транскриптів** (специфічні для провайдера виправлення перед запусками)
- **Сховище сесій** (`sessions.json`) і що воно відстежує
- **Збереження транскрипту** (`*.jsonl`) та його структура
- **Гігієна транскрипту** (виправлення для конкретних провайдерів перед запусками)
- **Обмеження контексту** (вікно контексту проти відстежуваних токенів)
- **Ущільнення** (ручне + автоущільнення) і де підключати підготовчі дії перед ущільненням
- **Тихе службове обслуговування** (наприклад, записи в пам’ять, які не повинні створювати видимий для користувача вивід)
- **Ущільнення** (ручне + автоущільнення) і куди підключати роботу перед ущільненням
- **Тихі службові дії** (наприклад, запис пам’яті, який не повинен створювати видимий для користувача вивід)
Якщо спочатку потрібен огляд вищого рівня, почніть із:
@ -33,31 +33,31 @@ x-i18n:
- [/concepts/memory](/uk/concepts/memory)
- [/concepts/memory-search](/uk/concepts/memory-search)
- [/concepts/session-pruning](/uk/concepts/session-pruning)
- [/reference/transcript-hygiene](/reference/transcript-hygiene)
- [/reference/transcript-hygiene](/uk/reference/transcript-hygiene)
---
## Джерело істини: Gateway
OpenClaw спроєктований навколо єдиного **процесу Gateway**, який володіє станом сесій.
OpenClaw спроєктовано навколо єдиного **процесу Gateway**, який володіє станом сесій.
- Інтерфейси (macOS app, web Control UI, TUI) мають звертатися до Gateway по списки сесій і кількість токенів.
- У віддаленому режимі файли сесій знаходяться на віддаленому хості; «перевірка локальних файлів на Mac» не відображатиме те, що використовує Gateway.
- Інтерфейси (macOS app, веб-інтерфейс Control UI, TUI) мають запитувати в Gateway списки сесій і кількість токенів.
- У віддаленому режимі файли сесій розміщені на віддаленому хості; “перевірка локальних файлів на Mac” не покаже те, що використовує Gateway.
---
## Два рівні збереження
## Два шари збереження
OpenClaw зберігає сесії на двох рівнях:
OpenClaw зберігає сесії у двох шарах:
1. **Сховище сесій (`sessions.json`)**
- Карта ключ/значення: `sessionKey -> SessionEntry`
- Невелике, змінюване, безпечне для редагування (або видалення записів)
- Відстежує метадані сесії (поточний ідентифікатор сесії, останню активність, перемикачі, лічильники токенів тощо)
- Мапа ключ/значення: `sessionKey -> SessionEntry`
- Маленьке, змінюване, безпечно редагувати (або видаляти записи)
- Відстежує метадані сесії (поточний id сесії, останню активність, перемикачі, лічильники токенів тощо)
2. **Транскрипт (`<sessionId>.jsonl`)**
- Транскрипт із дозаписом і деревоподібною структурою (записи мають `id` + `parentId`)
- Зберігає фактичну розмову + виклики інструментів + підсумки ущільнення
- Транскрипт лише з додаванням записів із деревоподібною структурою (записи мають `id` + `parentId`)
- Зберігає фактичну розмову + виклики інструментів + зведення ущільнення
- Використовується для відновлення контексту моделі для майбутніх ходів
---
@ -74,27 +74,27 @@ OpenClaw визначає ці шляхи через `src/config/sessions.ts`.
---
## Обслуговування сховища та керування диском
## Обслуговування сховища та контроль диска
Збереження сесій має автоматичні механізми обслуговування (`session.maintenance`) для `sessions.json` і артефактів транскриптів:
- `mode`: `warn` (типово) або `enforce`
- `pruneAfter`: поріг давності для видалення застарілих записів (типово `30d`)
- `pruneAfter`: поріг віку застарілих записів для очищення (типово `30d`)
- `maxEntries`: обмеження кількості записів у `sessions.json` (типово `500`)
- `rotateBytes`: ротація `sessions.json`, коли файл стає завеликим (типово `10mb`)
- `resetArchiveRetention`: строк зберігання для архівів транскриптів `*.reset.<timestamp>` (типово: такий самий, як `pruneAfter`; `false` вимикає очищення)
- `maxDiskBytes`: необов’язковий ліміт для каталогу сесій
- `highWaterBytes`: необов’язкове цільове значення після очищення (типово `80%` від `maxDiskBytes`)
- `resetArchiveRetention`: термін зберігання архівів транскриптів `*.reset.<timestamp>` (типово: такий самий, як `pruneAfter`; `false` вимикає очищення)
- `maxDiskBytes`: необов’язковий бюджет каталогу sessions на диску
- `highWaterBytes`: необов’язкова ціль після очищення (типово `80%` від `maxDiskBytes`)
Порядок примусового очищення за бюджетом диска (`mode: "enforce"`):
Порядок примусового очищення для бюджету диска (`mode: "enforce"`):
1. Спочатку видалити найстаріші архівні або осиротілі артефакти транскриптів.
2. Якщо ціль і далі не досягнута, видаляти найстаріші записи сесій і їхні файли транскриптів.
3. Продовжувати, доки використання не стане меншим або рівним `highWaterBytes`.
1. Спочатку видалити найстаріші архівовані або осиротілі артефакти транскриптів.
2. Якщо все ще вище за ціль, витіснити найстаріші записи сесій і їхні файли транскриптів.
3. Продовжувати, доки використання не стане на рівні або нижче `highWaterBytes`.
У режимі `mode: "warn"` OpenClaw повідомляє про потенційні видалення, але не змінює сховище/файли.
У режимі `mode: "warn"` OpenClaw повідомляє про можливі витіснення, але не змінює сховище/файли.
Запустити обслуговування за потреби:
Запустити обслуговування на вимогу:
```bash
openclaw sessions cleanup --dry-run
@ -105,10 +105,10 @@ 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.sessionRetention` (типово `24h`) очищає старі сесії ізольованих запусків cron зі сховища сесій (`false` вимикає).
- `cron.runLog.maxBytes` + `cron.runLog.keepLines` обрізають файли `~/.openclaw/cron/runs/<jobId>.jsonl` (типові значення: `2_000_000` байтів і `2000` рядків).
---
@ -118,7 +118,7 @@ openclaw sessions cleanup --enforce
Поширені шаблони:
- Основний/прямий чат (на агента): `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>`
@ -132,12 +132,12 @@ openclaw sessions cleanup --enforce
Кожен `sessionKey` вказує на поточний `sessionId` (файл транскрипту, який продовжує розмову).
Орієнтовні правила:
Основні правила:
- **Скидання** (`/new`, `/reset`) створює новий `sessionId` для цього `sessionKey`.
- **Щоденне скидання** (типово о 4:00 за місцевим часом на хості gateway) створює новий `sessionId` при наступному повідомленні після межі скидання.
- **Завершення через неактивність** (`session.reset.idleMinutes` або застарілий `session.idleMinutes`) створює новий `sessionId`, коли повідомлення надходить після вікна неактивності. Якщо налаштовано і щоденне скидання, і неактивність, спрацьовує те, що настане раніше.
- **Захист від розгалуження батьківського транскрипту** (`session.parentForkMaxTokens`, типово `100000`) пропускає розгалуження батьківського транскрипту, якщо батьківська сесія вже надто велика; новий потік починається з нуля. Установіть `0`, щоб вимкнути.
- **Щоденне скидання** (типово о 4:00 ранку за місцевим часом на хості gateway) створює новий `sessionId` у наступному повідомленні після межі скидання.
- **Завершення через простій** (`session.reset.idleMinutes` або застаріле `session.idleMinutes`) створює новий `sessionId`, коли повідомлення надходить після вікна простою. Якщо налаштовано і щоденне скидання, і простій, спрацьовує те, що настане раніше.
- **Захист від форку батьківського ланцюжка** (`session.parentForkMaxTokens`, типово `100000`) пропускає форк батьківського транскрипту, коли батьківська сесія вже надто велика; новий потік починається з нуля. Установіть `0`, щоб вимкнути.
Деталь реалізації: рішення приймається в `initSessionState()` у `src/auto-reply/reply/session.ts`.
@ -147,25 +147,25 @@ openclaw sessions cleanup --enforce
Тип значення сховища — `SessionEntry` у `src/config/sessions.ts`.
Ключові поля (не вичерпно):
Ключові поля (не вичерпний список):
- `sessionId`: поточний ідентифікатор транскрипту (ім’я файлу походить із нього, якщо не задано `sessionFile`)
- `updatedAt`: час останньої активності
- `sessionFile`: необов’язкове явне перевизначення шляху до транскрипту
- `sessionId`: поточний id транскрипту (ім’я файлу виводиться з нього, якщо не задано `sessionFile`)
- `updatedAt`: мітка часу останньої активності
- `sessionFile`: необов’язкове явне перевизначення шляху транскрипту
- `chatType`: `direct | group | room` (допомагає інтерфейсам і політиці надсилання)
- `provider`, `subject`, `room`, `space`, `displayName`: метадані для позначення групи/каналу
- `provider`, `subject`, `room`, `space`, `displayName`: метадані для позначення груп/каналів
- Перемикачі:
- `thinkingLevel`, `verboseLevel`, `reasoningLevel`, `elevatedLevel`
- `sendPolicy` (перевизначення для конкретної сесії)
- Вибір моделі:
- `providerOverride`, `modelOverride`, `authProfileOverride`
- Лічильники токенів (найкраще наближення / залежать від провайдера):
- Лічильники токенів (best-effort / залежать від провайдера):
- `inputTokens`, `outputTokens`, `totalTokens`, `contextTokens`
- `compactionCount`: як часто автоущільнення завершувалося для цього ключа сесії
- `memoryFlushAt`: часовий штамп останнього скидання пам’яті перед ущільненням
- `compactionCount`: скільки разів автоущільнення завершувалося для цього ключа сесії
- `memoryFlushAt`: мітка часу останнього скидання пам’яті перед ущільненням
- `memoryFlushCompactionCount`: лічильник ущільнень, коли востаннє виконувався flush
Сховище безпечно редагувати, але джерелом істини є Gateway: під час роботи сесій він може перезаписувати або повторно гідратувати записи.
Сховище безпечно редагувати, але Gateway є джерелом істини: під час виконання сесій він може переписувати або повторно гідратувати записи.
---
@ -181,12 +181,12 @@ openclaw sessions cleanup --enforce
Помітні типи записів:
- `message`: повідомлення user/assistant/toolResult
- `custom_message`: повідомлення, вставлені розширенням, які _потрапляють_ у контекст моделі (можуть бути прихованими в інтерфейсі)
- `custom`: стан розширення, який е потрапляє_ в контекст моделі
- `compaction`: збережений підсумок ущільнення з `firstKeptEntryId` і `tokensBefore`
- `branch_summary`: збережений підсумок під час навігації по гілці дерева
- `custom_message`: повідомлення, інжектовані розширенням, які _потрапляють_ у контекст моделі (можуть бути приховані від UI)
- `custom`: стан розширення, який е потрапляє_ у контекст моделі
- `compaction`: збережене зведення ущільнення з `firstKeptEntryId` і `tokensBefore`
- `branch_summary`: збережене зведення під час навігації гілкою дерева
OpenClaw навмисно **не** «виправляє» транскрипти; Gateway використовує `SessionManager` для їх читання/запису.
OpenClaw навмисно **не** “виправляє” транскрипти; Gateway використовує `SessionManager` для їх читання/запису.
---
@ -195,39 +195,39 @@ OpenClaw навмисно **не** «виправляє» транскрипти
Важливі два різні поняття:
1. **Вікно контексту моделі**: жорстке обмеження для кожної моделі (токени, видимі моделі)
2. **Лічильники сховища сесій**: ковзні статистики, що записуються в `sessions.json` (використовуються для /status і панелей керування)
2. **Лічильники сховища сесій**: ковзна статистика, що записується в `sessions.json` (використовується для /status і панелей)
Якщо ви налаштовуєте ліміти:
Якщо ви налаштовуєте обмеження:
- Вікно контексту береться з каталогу моделей (і може бути перевизначене через конфігурацію).
- `contextTokens` у сховищі — це оцінка/значення для звітності під час виконання; не сприймайте його як сувору гарантію.
- `contextTokens` у сховищі — це оцінка/значення звітності під час виконання; не сприймайте його як сувору гарантію.
Докладніше див. у [/token-use](/reference/token-use).
Докладніше див. у [/token-use](/uk/reference/token-use).
---
## Ущільнення: що це таке
Ущільнення підсумовує старішу частину розмови в збережений запис `compaction` у транскрипті та зберігає недоторканими недавні повідомлення.
Ущільнення підсумовує старішу частину розмови в збережений запис `compaction` у транскрипті та залишає недоторканими недавні повідомлення.
Після ущільнення майбутні ходи бачать:
- Підсумок ущільнення
- Зведення ущільнення
- Повідомлення після `firstKeptEntryId`
Ущільнення є **постійним** (на відміну від обрізання сесій). Див. [/concepts/session-pruning](/uk/concepts/session-pruning).
Ущільнення є **постійним** (на відміну від очищення сесії). Див. [/concepts/session-pruning](/uk/concepts/session-pruning).
## Межі фрагментів ущільнення та парування інструментів
## Межі чанків ущільнення та поєднання інструментів
Коли OpenClaw розбиває довгий транскрипт на фрагменти для ущільнення, він зберігає
виклики інструментів помічником у парі з відповідними записами `toolResult`.
Коли OpenClaw розбиває довгий транскрипт на чанки для ущільнення, він зберігає
виклики інструментів асистента поєднаними з відповідними записами `toolResult`.
- Якщо поділ за часткою токенів припадає між викликом інструмента та його результатом, OpenClaw
зсуває межу до повідомлення помічника з викликом інструмента, замість того щоб
розділяти пару.
- Якщо кінцевий блок результатів інструмента інакше виштовхнув би фрагмент за цільовий розмір,
OpenClaw зберігає цей очікуваний блок інструмента та залишає неузагальнений хвіст недоторканим.
- Перервані/помилкові блоки викликів інструментів не утримують відкритою межу очікуваного поділу.
зміщує межу до повідомлення асистента з викликом інструмента, а не розділяє
пару.
- Якщо кінцевий блок результатів інструмента інакше перевищив би цільовий розмір чанка,
OpenClaw зберігає цей очікувальний блок інструмента і залишає неузагальнений хвіст недоторканим.
- Перервані/помилкові блоки викликів інструментів не утримують відкритим очікувальний поділ.
---
@ -239,7 +239,7 @@ OpenClaw навмисно **не** «виправляє» транскрипти
(`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` та подібні варіанти у стилі конкретного провайдера) → ущільнити → повторити.
exceeded` та подібні варіанти, характерні для конкретних провайдерів) → ущільнити → повторити спробу.
2. **Порогове обслуговування**: після успішного ходу, коли:
`contextTokens > contextWindow - reserveTokens`
@ -249,13 +249,13 @@ exceeded` та подібні варіанти у стилі конкретно
- `contextWindow` — це вікно контексту моделі
- `reserveTokens` — це запас токенів, зарезервований для промптів + наступного виводу моделі
Це семантика середовища Pi (OpenClaw споживає події, але Pi вирішує, коли виконувати ущільнення).
Це семантика середовища Pi (OpenClaw споживає події, але коли ущільнювати, вирішує Pi).
---
## Налаштування ущільнення (`reserveTokens`, `keepRecentTokens`)
Налаштування ущільнення Pi знаходяться в параметрах Pi:
Налаштування ущільнення Pi зберігаються в налаштуваннях Pi:
```json5
{
@ -267,14 +267,14 @@ exceeded` та подібні варіанти у стилі конкретно
}
```
OpenClaw також застосовує нижню межу безпеки для вбудованих запусків:
OpenClaw також застосовує мінімальний захисний поріг для вбудованих запусків:
- Якщо `compaction.reserveTokens < reserveTokensFloor`, OpenClaw підвищує це значення.
- Типове значення нижньої межі`20000` токенів.
- Установіть `agents.defaults.compaction.reserveTokensFloor: 0`, щоб вимкнути нижню межу.
- Якщо `compaction.reserveTokens < reserveTokensFloor`, OpenClaw підвищує значення.
- Типовий поріг`20000` токенів.
- Установіть `agents.defaults.compaction.reserveTokensFloor: 0`, щоб вимкнути цей поріг.
- Якщо значення вже вище, OpenClaw залишає його без змін.
Навіщо: залишити достатній запас для багатокрокового «службового обслуговування» (наприклад, записів у пам’ять), перш ніж ущільнення стане неминучим.
Чому: залишити достатньо запасу для багатокрокових “службових” дій (наприклад, записів пам’яті), перш ніж ущільнення стане неминучим.
Реалізація: `ensurePiCompactionReserveTokens()` у `src/agents/pi-settings.ts`
(викликається з `src/agents/pi-embedded-runner.ts`).
@ -283,46 +283,46 @@ OpenClaw також застосовує нижню межу безпеки дл
## Поверхні, видимі користувачу
Ви можете спостерігати ущільнення та стан сесії через:
Ви можете спостерігати ущільнення і стан сесії через:
- `/status` (у будь-якій сесії чату)
- `/status` (у будь-якому чаті сесії)
- `openclaw status` (CLI)
- `openclaw sessions` / `sessions --json`
- Докладний режим: `🧹 Auto-compaction complete` + кількість ущільнень
- Режим verbose: `🧹 Auto-compaction complete` + кількість ущільнень
---
## Тихе службове обслуговування (`NO_REPLY`)
## Тихі службові дії (`NO_REPLY`)
OpenClaw підтримує «тихі» ходи для фонових завдань, де користувач не повинен бачити проміжний вивід.
OpenClaw підтримує “тихі” ходи для фонових завдань, де користувач не повинен бачити проміжний вивід.
Домовленість:
Умова:
- Помічник починає свій вивід із точного тихого токена `NO_REPLY` /
`no_reply`, щоб позначити «не доставляти відповідь користувачу».
- OpenClaw видаляє/пригнічує це на рівні доставки.
- Пригнічення точного тихого токена не залежить від регістру, тож `NO_REPLY` і
`no_reply` зараховуються, коли весь вміст складається лише з тихого токена.
- Це призначено лише для справжніх фонових ходів без доставки; це не скорочення
для звичайних дієвих запитів користувача.
- Асистент починає свій вивід з точного тихого токена `NO_REPLY` /
`no_reply`, щоб позначити “не доставляти відповідь користувачу”.
- OpenClaw прибирає/приглушує це на рівні доставки.
- Приглушення точного тихого токена нечутливе до регістру, тож `NO_REPLY` і
`no_reply` обидва зараховуються, коли весь payload — це лише тихий токен.
- Це лише для справді фонових ходів/ходів без доставки; це не скорочений шлях
для звичайних практичних запитів користувача.
Починаючи з `2026.1.10`, OpenClaw також пригнічує **потокову передачу чернеток/набору**, коли
частковий фрагмент починається з `NO_REPLY`, щоб тихі операції не розкривали частковий
Починаючи з `2026.1.10`, OpenClaw також приглушує **чернетковий/набірний стримінг**, коли
частковий чанк починається з `NO_REPLY`, щоб тихі операції не видавали частковий
вивід посеред ходу.
---
## «Скидання пам’яті» перед ущільненням (реалізовано)
## "Скидання пам’яті" перед ущільненням (реалізовано)
Мета: перед тим як відбудеться автоущільнення, виконати тихий агентний хід, який запише довготривалий
Мета: перед тим як відбудеться автоущільнення, виконати тихий агентний хід, який записує стійкий
стан на диск (наприклад, `memory/YYYY-MM-DD.md` у робочому просторі агента), щоб ущільнення не могло
стерти критичний контекст.
OpenClaw використовує підхід **скидання перед порогом**:
OpenClaw використовує підхід **flush до порога**:
1. Відстежувати використання контексту сесії.
2. Коли воно перетинає «м’який поріг» (нижче від порога ущільнення Pi), виконати тиху
директиву «запиши пам’ять зараз» для агента.
2. Коли воно перетинає “м’який поріг” (нижчий за поріг ущільнення Pi), виконати тиху
директиву “запиши пам’ять зараз” для агента.
3. Використовувати точний тихий токен `NO_REPLY` / `no_reply`, щоб користувач
нічого не бачив.
@ -330,29 +330,29 @@ OpenClaw використовує підхід **скидання перед п
- `enabled` (типово: `true`)
- `softThresholdTokens` (типово: `4000`)
- `prompt` (повідомлення користувача для ходу flush)
- `systemPrompt` (додатковий системний промпт, доданий для ходу flush)
- `prompt` (повідомлення user для ходу flush)
- `systemPrompt` (додатковий системний промпт, який додається для ходу flush)
Примітки:
- Типові `prompt`/`systemPrompt` містять підказку `NO_REPLY` для пригнічення
- Типові значення prompt/system prompt містять підказку `NO_REPLY` для приглушення
доставки.
- Flush виконується один раз за цикл ущільнення (відстежується в `sessions.json`).
- Flush виконується лише для вбудованих сесій Pi (бекенди CLI його пропускають).
- Flush виконується лише для вбудованих сесій Pi.
- Flush пропускається, коли робочий простір сесії доступний лише для читання (`workspaceAccess: "ro"` або `"none"`).
- Див. [Memory](/uk/concepts/memory), щоб дізнатися про структуру файлів у робочому просторі та шаблони запису.
- Див. [Memory](/uk/concepts/memory) щодо структури файлів робочого простору та шаблонів запису.
Pi також надає хук `session_before_compact` в API розширень, але логіка
flush в OpenClaw сьогодні знаходиться на боці Gateway.
Pi також надає хук `session_before_compact` в API розширень, але логіка flush в OpenClaw
сьогодні живе на боці Gateway.
---
## Контрольний список для усунення несправностей
## Контрольний список усунення несправностей
- Неправильний ключ сесії? Почніть із [/concepts/session](/uk/concepts/session) і підтвердьте `sessionKey` у `/status`.
- Невідповідність між сховищем і транскриптом? Підтвердьте хост Gateway і шлях до сховища з `openclaw status`.
- Неправильний ключ сесії? Почніть із [/concepts/session](/uk/concepts/session) і перевірте `sessionKey` у `/status`.
- Невідповідність між сховищем і транскриптом? Перевірте хост Gateway і шлях до сховища з `openclaw status`.
- Спам ущільненням? Перевірте:
- вікно контексту моделі (замале)
- налаштування ущільнення (`reserveTokens`, занадто велике для вікна моделі, може спричиняти раніше ущільнення)
- роздування `toolResult`: увімкніть/налаштуйте обрізання сесій
- Тихі ходи «просочуються»? Переконайтеся, що відповідь починається з `NO_REPLY` (точний токен без урахування регістру) і що ви використовуєте збірку, яка містить виправлення для пригнічення потокової передачі.
- налаштування ущільнення (`reserveTokens` завелике для вікна моделі може спричиняти раніше ущільнення)
- роздуття tool-result: увімкніть/налаштуйте очищення сесії
- Тихі ходи протікають? Переконайтеся, що відповідь починається з `NO_REPLY` (нечутливий до регістру точний токен) і що у вас збірка, яка містить виправлення приглушення стримінгу.

View File

@ -1,230 +1,229 @@
---
read_when:
- Запуск coding harness через ACP
- Налаштування ACP-сесій, прив’язаних до розмов, у каналах обміну повідомленнями
- Прив’язка розмови в каналі повідомлень до постійної ACP-сесії
- Усунення проблем із бекендом ACP і wiring плагінів
- Керування командами /acp із чату
summary: Використовуйте runtime-сесії ACP для Codex, Claude Code, Cursor, Gemini CLI, OpenClaw ACP та інших harness-агентів
title: ACP-агенти
- Запуск harness-оточень для кодування через ACP
- Налаштування прив’язаних до розмови сеансів ACP у каналах обміну повідомленнями
- Прив’язування розмови в каналі повідомлень до постійного сеансу ACP
- Усунення несправностей бекенду ACP і підключення плагінів
- Керування командами /acp з чату
summary: Використовуйте сеанси середовища виконання ACP для Codex, Claude Code, Cursor, Gemini CLI, OpenClaw ACP та інших агентів harness
title: Агенти ACP
x-i18n:
generated_at: "2026-04-05T18:20:13Z"
generated_at: "2026-04-05T18:49:57Z"
model: gpt-5.4
provider: openai
source_hash: 99e4d5af60fe89314b53655bbad01494d972b55416cf5a529171c010a0b8547d
source_hash: 302f3fe25b1ffe0576592b6e0ad9e8a5781fa5702b31d508d9ba8908f7df33bd
source_path: tools/acp-agents.md
workflow: 15
---
# ACP-агенти
# Агенти ACP
Сесії [Agent Client Protocol (ACP)](https://agentclientprotocol.com/) дають OpenClaw змогу запускати зовнішні coding harness (наприклад Pi, Claude Code, Codex, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI та інші підтримувані ACPX harness) через плагін бекенда ACP.
Сеанси [Agent Client Protocol (ACP)](https://agentclientprotocol.com/) дають змогу OpenClaw запускати зовнішні harness-оточення для кодування (наприклад Pi, Claude Code, Codex, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI та інші підтримувані ACPX-harness-оточення) через плагін бекенду ACP.
Якщо ви просите OpenClaw звичайною мовою «запусти це в Codex» або «запусти Claude Code у треді», OpenClaw має спрямувати цей запит до runtime ACP (а не до нативного runtime субагента). Кожен запуск ACP-сесії відстежується як [фонове завдання](/uk/automation/tasks).
Якщо ви попросите OpenClaw звичайною мовою «запусти це в Codex» або «запусти Claude Code у гілці», OpenClaw має спрямувати цей запит до середовища виконання ACP (а не до нативного середовища виконання субагента). Кожен запуск сеансу ACP відстежується як [фонове завдання](/uk/automation/tasks).
Якщо ви хочете, щоб Codex або Claude Code підключалися як зовнішній MCP-клієнт безпосередньо
до наявних розмов OpenClaw у каналах, використовуйте [`openclaw mcp serve`](/cli/mcp)
до наявних розмов у каналах OpenClaw, використовуйте [`openclaw mcp serve`](/cli/mcp)
замість ACP.
## Яка сторінка мені потрібна?
## Яку сторінку мені потрібно?
Поруч є три схожі поверхні, які легко переплутати:
Поруч є три поверхні, які легко сплутати:
| Ви хочете... | Використовуйте це | Примітки |
| --------------------------------------------------------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Запускати Codex, Claude Code, Gemini CLI або інший зовнішній harness ерез_ OpenClaw | Ця сторінка: ACP-агенти | Сесії, прив’язані до чату, `/acp spawn`, `sessions_spawn({ runtime: "acp" })`, фонові завдання, runtime-керування |
| Експонувати сесію OpenClaw Gateway _як_ ACP-сервер для редактора або клієнта | [`openclaw acp`](/cli/acp) | Режим моста. IDE/клієнт спілкується з OpenClaw через ACP поверх stdio/WebSocket |
| Ви хочете... | Використовуйте це | Примітки |
| --------------------------------------------------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------- |
| Запускати Codex, Claude Code, Gemini CLI або інше зовнішнє harness-оточення ерез_ OpenClaw | Ця сторінка: агенти ACP | Прив’язані до чату сеанси, `/acp spawn`, `sessions_spawn({ runtime: "acp" })`, фонові завдання, елементи керування середовищем виконання |
| Відкрити сеанс OpenClaw Gateway _як_ ACP-сервер для редактора або клієнта | [`openclaw acp`](/cli/acp) | Режим мосту. IDE/клієнт спілкується з OpenClaw через ACP поверх stdio/WebSocket |
## Чи працює це одразу після встановлення?
## Це працює одразу після встановлення?
Зазвичай так.
- Нові встановлення тепер постачаються з комплектним runtime-плагіном `acpx`, увімкненим типово.
- Комплектний плагін `acpx` надає перевагу своєму локально закріпленому бінарнику `acpx`.
- Під час запуску OpenClaw перевіряє цей бінарник і за потреби самостійно відновлює його.
- Нові встановлення тепер постачаються з увімкненим за замовчуванням вбудованим плагіном середовища виконання `acpx`.
- Вбудований плагін `acpx` віддає перевагу своєму локально закріпленому бінарному файлу `acpx`.
- Під час запуску OpenClaw перевіряє цей бінарний файл і за потреби самостійно його відновлює.
- Почніть із `/acp doctor`, якщо хочете швидко перевірити готовність.
Що все ще може статися під час першого використання:
- Адаптер цільового harness може бути завантажений за вимогою через `npx` під час першого використання цього harness.
- На хості все одно має бути налаштована автентифікація постачальника для цього harness.
- Якщо хост не має доступу до npm/мережі, завантаження адаптера під час першого запуску може завершитися невдачею, доки кеші не буде прогріто або адаптер не буде встановлено іншим способом.
- Цільовий адаптер harness може бути завантажений за запитом через `npx` під час першого використання цього harness.
- На хості для цього harness все одно має бути наявна автентифікація постачальника.
- Якщо хост не має доступу до npm/мережі, перше завантаження адаптерів може завершитися помилкою, доки кеші не буде попередньо прогріто або адаптер не буде встановлено іншим способом.
Приклади:
- `/acp spawn codex`: OpenClaw має бути готовий ініціалізувати `acpx`, але адаптер Codex ACP усе ще може потребувати завантаження під час першого запуску.
- `/acp spawn claude`: та сама історія для адаптера Claude ACP, плюс автентифікація на боці Claude на цьому хості.
- `/acp spawn codex`: OpenClaw має бути готовий ініціалізувати `acpx`, але адаптер Codex ACP усе ще може потребувати першого завантаження.
- `/acp spawn claude`: те саме для адаптера Claude ACP, плюс автентифікація на боці Claude на цьому хості.
## Швидкий операторський сценарій
## Швидкий операторський потік
Використовуйте це, якщо вам потрібен практичний runbook для `/acp`:
Використовуйте це, якщо вам потрібна практична інструкція для `/acp`:
1. Створіть сесію:
1. Запустіть сеанс:
- `/acp spawn codex --bind here`
- `/acp spawn codex --mode persistent --thread auto`
2. Працюйте в прив’язаній розмові або треді (або явно вкажіть ключ цієї сесії).
3. Перевірте стан runtime:
2. Працюйте в прив’язаній розмові або гілці (або явно вкажіть ключ цього сеансу).
3. Перевірте стан середовища виконання:
- `/acp status`
4. За потреби налаштуйте параметри runtime:
4. За потреби налаштуйте параметри середовища виконання:
- `/acp model <provider/model>`
- `/acp permissions <profile>`
- `/acp timeout <seconds>`
5. Скоригуйте активну сесію без заміни контексту:
5. Скоригуйте активний сеанс без заміни контексту:
- `/acp steer tighten logging and continue`
6. Зупиніть роботу:
- `/acp cancel` (зупинити поточний хід), або
- `/acp close` (закрити сесію та прибрати прив’язки)
- `/acp close` (закрити сеанс і прибрати прив’язки)
## Швидкий старт для людей
Приклади природних запитів:
- «Прив’яжи цей канал Discord до Codex.»
- «Запусти постійну сесію Codex у треді тут і тримай її сфокусованою.»
- «Запусти це як одноразову ACP-сесію Claude Code і підсумуй результат.»
- «Прив’яжи цей чат iMessage до Codex і зберігай подальші повідомлення в тому самому workspace.»
- «Використай Gemini CLI для цього завдання в треді, а потім зберігай подальші повідомлення в цьому самому треді.»
- «Прив’яжи цей канал Discord до Codex».
- «Запусти тут постійний сеанс Codex у гілці й тримай його зосередженим».
- «Виконай це як одноразовий сеанс Claude Code ACP і підсумуй результат».
- «Прив’яжи цей чат iMessage до Codex і зберігай наступні повідомлення в тому самому робочому просторі».
- «Використай Gemini CLI для цього завдання в гілці, а потім зберігай наступні повідомлення в цій самій гілці».
Що має зробити OpenClaw:
1. Вибрати `runtime: "acp"`.
2. Визначити запитаний цільовий harness (`agentId`, наприклад `codex`).
3. Якщо запитується прив’язка до поточної розмови і активний канал це підтримує, прив’язати ACP-сесію до цієї розмови.
4. Інакше, якщо запитується прив’язка до треда і поточний канал це підтримує, прив’язати ACP-сесію до треда.
5. Маршрутизувати подальші прив’язані повідомлення до тієї самої ACP-сесії, доки її не буде розфокусовано/закрито/прострочено.
2. Визначити цільове harness-оточення (`agentId`, наприклад `codex`).
3. Якщо запитано прив’язку до поточної розмови й активний канал це підтримує, прив’язати сеанс ACP до цієї розмови.
4. Інакше, якщо запитано прив’язку до гілки й поточний канал це підтримує, прив’язати сеанс ACP до гілки.
5. Спрямовувати наступні прив’язані повідомлення до того самого сеансу ACP, доки він не буде розфокусований, закритий або прострочений.
## ACP проти субагентів
Використовуйте ACP, коли вам потрібен зовнішній harness runtime. Використовуйте субагентів, коли вам потрібні делеговані запуски, нативні для OpenClaw.
Використовуйте ACP, коли потрібне зовнішнє середовище виконання harness. Використовуйте субагентів, коли потрібні делеговані запуски OpenClaw.
| Область | ACP-сесія | Запуск субагента |
| ------------- | ------------------------------------- | ----------------------------------- |
| Runtime | Плагін бекенда ACP (наприклад acpx) | Нативний runtime субагента OpenClaw |
| Ключ сесії | `agent:<agentId>:acp:<uuid>` | `agent:<agentId>:subagent:<uuid>` |
| Основні команди | `/acp ...` | `/subagents ...` |
| Інструмент запуску | `sessions_spawn` з `runtime:"acp"` | `sessions_spawn` (типовий runtime) |
| Область | Сеанс ACP | Запуск субагента |
| ------------- | -------------------------------------- | ----------------------------------- |
| Середовище виконання | Плагін бекенду ACP (наприклад acpx) | Нативне середовище виконання субагента OpenClaw |
| Ключ сеансу | `agent:<agentId>:acp:<uuid>` | `agent:<agentId>:subagent:<uuid>` |
| Основні команди | `/acp ...` | `/subagents ...` |
| Інструмент запуску | `sessions_spawn` with `runtime:"acp"` | `sessions_spawn` (середовище виконання за замовчуванням) |
Див. також [Субагенти](/tools/subagents).
Див. також [Субагенти](/uk/tools/subagents).
## Як ACP запускає Claude Code
Для Claude Code через ACP стек такий:
1. Керувальна площина ACP-сесії OpenClaw
2. комплектний runtime-плагін `acpx`
1. Площина керування сеансом OpenClaw ACP
2. вбудований плагін середовища виконання `acpx`
3. адаптер Claude ACP
4. runtime/механізми сесій на боці Claude
4. механізм середовища виконання/сеансу на боці Claude
Важлива відмінність:
- ACP Claude — це harness-сесія з ACP-керуванням, відновленням сесій, відстеженням фонових завдань і необов’язковою прив’язкою до розмови/треда.
- ACP Claude — це сеанс harness з елементами керування ACP, відновленням сеансу, відстеженням фонових завдань і необов’язковою прив’язкою до розмови/гілки.
Для операторів практичне правило таке:
- потрібні `/acp spawn`, сесії з прив’язкою, runtime-керування або постійна робота harness: використовуйте ACP
- потрібен простий локальний текстовий fallback через сирий CLI: використовуйте CLI-бекенди
- якщо потрібні `/acp spawn`, сеанси з прив’язкою, елементи керування середовищем виконання або постійна робота harness — використовуйте ACP
## Прив’язані сесії
## Прив’язані сеанси
### Прив’язки до поточної розмови
Використовуйте `/acp spawn <harness> --bind here`, якщо хочете, щоб поточна розмова стала довготривалим ACP-workspace без створення дочірнього треда.
Використовуйте `/acp spawn <harness> --bind here`, коли хочете, щоб поточна розмова стала довговічним робочим простором ACP без створення дочірньої гілки.
Поведінка:
- OpenClaw продовжує керувати транспортом каналу, автентифікацією, безпекою та доставкою.
- Поточна розмова закріплюється за ключем створеної ACP-сесії.
- Подальші повідомлення в цій розмові маршрутизуються до тієї самої ACP-сесії.
- `/new` і `/reset` скидають цю саму прив’язану ACP-сесію на місці.
- `/acp close` закриває сесію та прибирає прив’язку поточної розмови.
- OpenClaw і далі керує транспортом каналу, автентифікацією, безпекою та доставкою.
- Поточна розмова закріплюється за ключем створеного сеансу ACP.
- Наступні повідомлення в цій розмові спрямовуються до того самого сеансу ACP.
- `/new` і `/reset` скидають той самий прив’язаний сеанс ACP на місці.
- `/acp close` закриває сеанс і прибирає прив’язку до поточної розмови.
Що це означає на практиці:
- `--bind here` зберігає ту саму поверхню чату. У Discord поточний канал залишається поточним каналом.
- `--bind here` все одно може створити нову ACP-сесію, якщо ви запускаєте нову роботу. Прив’язка приєднує цю сесію до поточної розмови.
- `--bind here` сам по собі не створює дочірній тред Discord або тему Telegram.
- Runtime ACP усе одно може мати власний робочий каталог (`cwd`) або workspace на диску, яким керує бекенд. Цей runtime-workspace відокремлений від поверхні чату і не означає створення нового треда повідомлень.
- Якщо ви створюєте сесію для іншого ACP-агента і не передаєте `--cwd`, OpenClaw типово успадковує workspace **цільового агента**, а не того, хто робить запит.
- Якщо цей успадкований шлях до workspace відсутній (`ENOENT`/`ENOTDIR`), OpenClaw повертається до типового cwd бекенда замість того, щоб непомітно повторно використати неправильне дерево.
- Якщо успадкований workspace існує, але до нього немає доступу (наприклад `EACCES`), запуск повертає реальну помилку доступу замість відкидання `cwd`.
- `--bind here` все одно може створити новий сеанс ACP, якщо ви запускаєте нову роботу. Прив’язка прикріплює цей сеанс до поточної розмови.
- `--bind here` сам по собі не створює дочірню гілку Discord або тему Telegram.
- Середовище виконання ACP все одно може мати власну робочу директорію (`cwd`) або робочий простір на диску, яким керує бекенд. Цей робочий простір середовища виконання є окремим від поверхні чату й не означає створення нової гілки повідомлень.
- Якщо ви запускаєте інший ACP-агент і не передаєте `--cwd`, OpenClaw за замовчуванням успадковує робочий простір **цільового агента**, а не запитувача.
- Якщо цей успадкований шлях до робочого простору відсутній (`ENOENT`/`ENOTDIR`), OpenClaw повертається до стандартного cwd бекенду замість того, щоб мовчки повторно використати неправильне дерево.
- Якщо успадкований робочий простір існує, але доступ до нього неможливий (наприклад `EACCES`), запуск повертає реальну помилку доступу замість відкидання `cwd`.
Ментальна модель:
- поверхня чату: де люди продовжують спілкуватися (`канал Discord`, `тема Telegram`, `чат iMessage`)
- ACP-сесія: довготривалий стан runtime Codex/Claude/Gemini, до якого маршрутизує OpenClaw
- дочірній тред/тема: необов’язкова додаткова поверхня повідомлень, яка створюється лише через `--thread ...`
- runtime-workspace: розташування у файловій системі, де виконується harness (`cwd`, checkout репозиторію, workspace бекенда)
- сеанс ACP: довговічний стан середовища виконання Codex/Claude/Gemini, до якого OpenClaw спрямовує запити
- дочірня гілка/тема: необов’язкова додаткова поверхня повідомлень, що створюється лише через `--thread ...`
- робочий простір середовища виконання: розташування у файловій системі, де працює harness (`cwd`, checkout репозиторію, робочий простір бекенду)
Приклади:
- `/acp spawn codex --bind here`: зберегти цей чат, створити або приєднати сесію Codex ACP і маршрутизувати до неї майбутні повідомлення звідси
- `/acp spawn codex --thread auto`: OpenClaw може створити дочірній тред/тему і прив’язати ACP-сесію там
- `/acp spawn codex --bind here --cwd /workspace/repo`: така сама прив’язка чату, як вище, але Codex працює в `/workspace/repo`
- `/acp spawn codex --bind here`: зберегти цей чат, створити або під’єднати сеанс Codex ACP і спрямовувати сюди майбутні повідомлення
- `/acp spawn codex --thread auto`: OpenClaw може створити дочірню гілку/тему і прив’язати там сеанс ACP
- `/acp spawn codex --bind here --cwd /workspace/repo`: та сама прив’язка до чату, що й вище, але Codex працює в `/workspace/repo`
Підтримка прив’язки поточної розмови:
Підтримка прив’язки до поточної розмови:
- Канали чату/повідомлень, які оголошують підтримку прив’язки поточної розмови, можуть використовувати `--bind here` через спільний шлях прив’язки розмов.
- Канали з нестандартною семантикою тредів/тем усе одно можуть надавати канало-специфічну канонікалізацію за тим самим спільним інтерфейсом.
- Чат-канали/канали повідомлень, які заявляють підтримку прив’язки до поточної розмови, можуть використовувати `--bind here` через спільний шлях прив’язки розмов.
- Канали з особливою семантикою гілок/тем усе одно можуть надавати канально-специфічну канонізацію за тим самим спільним інтерфейсом.
- `--bind here` завжди означає «прив’язати поточну розмову на місці».
- Узагальнені прив’язки поточної розмови використовують спільне сховище прив’язок OpenClaw і переживають звичайні перезапуски gateway.
- Загальні прив’язки до поточної розмови використовують спільне сховище прив’язок OpenClaw і зберігаються після звичайних перезапусків gateway.
Примітки:
- `--bind here` і `--thread ...` взаємовиключні в `/acp spawn`.
- У Discord `--bind here` прив’язує поточний канал або тред на місці. `spawnAcpSessions` потрібен лише тоді, коли OpenClaw має створити дочірній тред для `--thread auto|here`.
- Якщо активний канал не надає прив’язок ACP до поточної розмови, OpenClaw повертає зрозуміле повідомлення про непідтримуваність.
- `resume` і питання «нова сесія» — це питання ACP-сесії, а не каналу. Ви можете повторно використати або замінити стан runtime без зміни поточної поверхні чату.
- У Discord `--bind here` прив’язує поточний канал або гілку на місці. `spawnAcpSessions` потрібен лише тоді, коли OpenClaw має створити дочірню гілку для `--thread auto|here`.
- Якщо активний канал не надає ACP-прив’язок до поточної розмови, OpenClaw повертає зрозуміле повідомлення про непідтримку.
- `resume` і питання «нового сеансу» — це питання сеансу ACP, а не каналу. Ви можете повторно використовувати або замінювати стан середовища виконання, не змінюючи поточну поверхню чату.
### Сесії, прив’язані до треда
### Сеанси з прив’язкою до гілки
Коли для адаптера каналу ввімкнено прив’язки тредів, ACP-сесії можна прив’язувати до тредів:
Коли для адаптера каналу ввімкнено прив’язки до гілок, сеанси ACP можна прив’язувати до гілок:
- OpenClaw прив’язує тред до цільової ACP-сесії.
- Подальші повідомлення в цьому треді маршрутизуються до прив’язаної ACP-сесії.
- Вивід ACP доставляється назад у той самий тред.
- Розфокусування/закриття/архівування/тайм-аут бездіяльності або перевищення max-age прибирає прив’язку.
- OpenClaw прив’язує гілку до цільового сеансу ACP.
- Наступні повідомлення в цій гілці спрямовуються до прив’язаного сеансу ACP.
- Вивід ACP доставляється назад у ту саму гілку.
- Розфокусування, закриття, архівування, тайм-аут бездіяльності або завершення max-age прибирає прив’язку.
Підтримка прив’язки тредів залежить від адаптера. Якщо активний адаптер каналу не підтримує прив’язки тредів, OpenClaw повертає зрозуміле повідомлення про непідтримуваність/недоступність.
Підтримка прив’язки до гілки залежить від адаптера. Якщо активний адаптер каналу не підтримує прив’язки до гілки, OpenClaw повертає зрозуміле повідомлення про непідтримку/недоступність.
Потрібні feature flags для ACP, прив’язаного до тредів:
Необхідні прапорці функцій для ACP із прив’язкою до гілки:
- `acp.enabled=true`
- `acp.dispatch.enabled` типово увімкнено (встановіть `false`, щоб призупинити ACP-dispatch)
- Увімкнений прапорець створення ACP-тредів для адаптера каналу (залежить від адаптера)
- `acp.dispatch.enabled` увімкнено за замовчуванням (встановіть `false`, щоб призупинити диспетчеризацію ACP)
- Увімкнено прапорець запуску ACP у гілках адаптера каналу (залежить від адаптера)
- Discord: `channels.discord.threadBindings.spawnAcpSessions=true`
- Telegram: `channels.telegram.threadBindings.spawnAcpSessions=true`
### Канали з підтримкою тредів
### Канали з підтримкою гілок
- Будь-який адаптер каналу, який надає можливість прив’язки сесії/треда.
- Будь-який адаптер каналу, який надає можливість прив’язки сеансу/гілки.
- Поточна вбудована підтримка:
- треди/канали Discord
- теми Telegram (теми форуму в групах/супергрупах і DM-теми)
- гілки/канали Discord
- теми Telegram (форумні теми в групах/супергрупах і DM-теми)
- Канали-плагіни можуть додавати підтримку через той самий інтерфейс прив’язки.
## Налаштування для конкретних каналів
Для неепізодичних сценаріїв налаштовуйте постійні ACP-прив’язки у верхньорівневих записах `bindings[]`.
Для неепізодичних робочих процесів налаштуйте постійні ACP-прив’язки в записах верхнього рівня `bindings[]`.
### Модель прив’язки
- `bindings[].type="acp"` позначає постійну ACP-прив’язку розмови.
- `bindings[].match` ідентифікує цільову розмову:
- канал або тред Discord: `match.channel="discord"` + `match.peer.id="<channelOrThreadId>"`
- тема форуму Telegram: `match.channel="telegram"` + `match.peer.id="<chatId>:topic:<topicId>"`
- DM/груповий чат BlueBubbles: `match.channel="bluebubbles"` + `match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"`
Для стабільних прив’язок груп надавайте перевагу `chat_id:*` або `chat_identifier:*`.
- DM/груповий чат iMessage: `match.channel="imessage"` + `match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"`
Для стабільних прив’язок груп надавайте перевагу `chat_id:*`.
- `bindings[].agentId` — це id власника-агента OpenClaw.
- Необов’язкові ACP-перевизначення розміщуються в `bindings[].acp`:
- `bindings[].match` визначає цільову розмову:
- канал або гілка Discord: `match.channel="discord"` + `match.peer.id="<channelOrThreadId>"`
- форумна тема Telegram: `match.channel="telegram"` + `match.peer.id="<chatId>:topic:<topicId>"`
- чат BlueBubbles DM/груповий чат: `match.channel="bluebubbles"` + `match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"`
Для стабільних прив’язок груп віддавайте перевагу `chat_id:*` або `chat_identifier:*`.
- чат iMessage DM/груповий чат: `match.channel="imessage"` + `match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"`
Для стабільних прив’язок груп віддавайте перевагу `chat_id:*`.
- `bindings[].agentId` — це id агента OpenClaw-власника.
- Необов’язкові перевизначення ACP містяться в `bindings[].acp`:
- `mode` (`persistent` або `oneshot`)
- `label`
- `cwd`
- `backend`
### Типові значення runtime для агента
### Стандартні параметри середовища виконання для кожного агента
Використовуйте `agents.list[].runtime`, щоб один раз визначити типові значення ACP для кожного агента:
Використовуйте `agents.list[].runtime`, щоб один раз визначити стандартні параметри ACP для кожного агента:
- `agents.list[].runtime.type="acp"`
- `agents.list[].runtime.acp.agent` (id harness, наприклад `codex` або `claude`)
@ -232,11 +231,11 @@ x-i18n:
- `agents.list[].runtime.acp.mode`
- `agents.list[].runtime.acp.cwd`
Пріоритет перевизначень для прив’язаних ACP-сесій:
Пріоритет перевизначень для прив’язаних сеансів ACP:
1. `bindings[].acp.*`
2. `agents.list[].runtime.acp.*`
3. глобальні типові значення ACP (наприклад `acp.backend`)
3. глобальні стандартні параметри ACP (наприклад `acp.backend`)
Приклад:
@ -320,18 +319,18 @@ x-i18n:
Поведінка:
- OpenClaw гарантує існування налаштованої ACP-сесії перед використанням.
- Повідомлення в цьому каналі або темі маршрутизуються до налаштованої ACP-сесії.
- У прив’язаних розмовах `/new` і `/reset` скидають той самий ключ ACP-сесії на місці.
- Тимчасові runtime-прив’язки (наприклад створені потоками фокусування тредів) усе ще застосовуються там, де вони є.
- Для міжагентних ACP-запусків без явного `cwd` OpenClaw успадковує workspace цільового агента з конфігурації агента.
- Відсутні успадковані шляхи workspace повертаються до типового cwd бекенда; невідсутні помилки доступу повертаються як помилки запуску.
- OpenClaw гарантує, що налаштований сеанс ACP існує до початку використання.
- Повідомлення в цьому каналі або темі спрямовуються до налаштованого сеансу ACP.
- У прив’язаних розмовах `/new` і `/reset` скидають той самий ключ сеансу ACP на місці.
- Тимчасові прив’язки середовища виконання (наприклад створені потоками фокусування на гілці) усе ще застосовуються, де вони є.
- Для міжагентних запусків ACP без явного `cwd` OpenClaw успадковує робочий простір цільового агента з конфігурації агента.
- Відсутні успадковані шляхи до робочого простору призводять до повернення до стандартного cwd бекенду; невідсутні помилки доступу повертаються як помилки запуску.
## Запуск ACP-сесій (інтерфейси)
## Запуск сеансів ACP (інтерфейси)
### Із `sessions_spawn`
Використовуйте `runtime: "acp"`, щоб запустити ACP-сесію з ходу агента або виклику інструмента.
Використовуйте `runtime: "acp"`, щоб запустити сеанс ACP із ходу агента або виклику інструмента.
```json
{
@ -345,29 +344,29 @@ x-i18n:
Примітки:
- `runtime` типово дорівнює `subagent`, тому для ACP-сесій явно встановлюйте `runtime: "acp"`.
- Якщо `agentId` пропущено, OpenClaw використовує `acp.defaultAgent`, якщо його налаштовано.
- `runtime` за замовчуванням має значення `subagent`, тому для сеансів ACP явно встановлюйте `runtime: "acp"`.
- Якщо `agentId` не вказано, OpenClaw використовує `acp.defaultAgent`, якщо його налаштовано.
- `mode: "session"` вимагає `thread: true`, щоб зберегти постійну прив’язану розмову.
Подробиці інтерфейсу:
Відомості про інтерфейс:
- `task` (обов’язково): початковий запит, що надсилається до ACP-сесії.
- `task` (обов’язково): початковий промпт, надісланий до сеансу ACP.
- `runtime` (обов’язково для ACP): має бути `"acp"`.
- `agentId` (необов’язково): id цільового ACP-harness. Якщо не задано, використовується `acp.defaultAgent`.
- `thread` (необов’язково, типово `false`): запросити сценарій прив’язки до треда там, де він підтримується.
- `agentId` (необов’язково): id цільового harness ACP. Якщо не вказано, використовується `acp.defaultAgent`, якщо налаштовано.
- `thread` (необов’язково, за замовчуванням `false`): запитати потік прив’язки до гілки там, де це підтримується.
- `mode` (необов’язково): `run` (одноразовий) або `session` (постійний).
- типове значення — `run`
- якщо `thread: true` і `mode` не задано, OpenClaw може за runtime-шляхом типово обрати постійну поведінку
- за замовчуванням використовується `run`
- якщо `thread: true` і mode не вказано, OpenClaw може за замовчуванням використовувати постійну поведінку залежно від шляху середовища виконання
- `mode: "session"` вимагає `thread: true`
- `cwd` (необов’язково): запитаний робочий каталог runtime (перевіряється політикою бекенда/runtime). Якщо не задано, ACP-запуск успадковує workspace цільового агента, якщо його налаштовано; відсутні успадковані шляхи повертаються до типових значень бекенда, тоді як реальні помилки доступу повертаються назовні.
- `label` (необов’язково): операторська мітка, що використовується в тексті сесії/банера.
- `resumeSessionId` (необов’язково): відновити наявну ACP-сесію замість створення нової. Агент відтворює свою історію розмов через `session/load`. Потребує `runtime: "acp"`.
- `streamTo` (необов’язково): `"parent"` транслює підсумки прогресу початкового ACP-запуску назад до сесії-запитувача як системні події.
- Коли це доступно, прийняті відповіді можуть містити `streamLogPath`, що вказує на JSONL-журнал у межах сесії (`<sessionId>.acp-stream.jsonl`), який можна відстежувати для повної історії ретрансляції.
- `cwd` (необов’язково): запитувана робоча директорія середовища виконання (перевіряється політикою бекенду/середовища виконання). Якщо не вказано, під час запуску ACP успадковується робочий простір цільового агента, якщо він налаштований; відсутні успадковані шляхи повертаються до стандартних параметрів бекенду, а реальні помилки доступу повертаються.
- `label` (необов’язково): операторська мітка, що використовується в тексті сеансу/банера.
- `resumeSessionId` (необов’язково): відновити наявний сеанс ACP замість створення нового. Агент відтворює свою історію розмов через `session/load`. Вимагає `runtime: "acp"`.
- `streamTo` (необов’язково): `"parent"` передає підсумки прогресу початкового запуску ACP назад до сеансу-запитувача як системні події.
- За наявності прийнятні відповіді включають `streamLogPath`, який вказує на JSONL-журнал у межах сеансу (`<sessionId>.acp-stream.jsonl`), який можна відстежувати для повної історії ретрансляції.
### Відновлення наявної сесії
### Відновлення наявного сеансу
Використовуйте `resumeSessionId`, щоб продовжити попередню ACP-сесію замість нового запуску. Агент відтворює свою історію розмов через `session/load`, тож продовжує з повним контекстом попередніх подій.
Використовуйте `resumeSessionId`, щоб продовжити попередній сеанс ACP замість запуску з нуля. Агент відтворює свою історію розмов через `session/load`, тому відновлює роботу з повним контекстом попередніх дій.
```json
{
@ -378,43 +377,43 @@ x-i18n:
}
```
Поширені сценарії використання:
Типові сценарії використання:
- Передати сесію Codex із ноутбука на телефон — скажіть агенту продовжити звідти, де ви зупинилися
- Продовжити coding-сесію, яку ви почали інтерактивно в CLI, тепер у headless-режимі через агента
- Відновити роботу, перервану перезапуском gateway або тайм-аутом бездіяльності
- Передати сеанс Codex з ноутбука на телефон — попросіть агента продовжити з того місця, де ви зупинилися
- Продовжити сеанс кодування, який ви почали інтерактивно в CLI, а тепер хочете виконувати безголово через агента
- Відновити роботу, яку перервав перезапуск gateway або тайм-аут бездіяльності
Примітки:
- `resumeSessionId` вимагає `runtime: "acp"` — при використанні з runtime субагента повертається помилка.
- `resumeSessionId` відновлює upstream-історію розмов ACP; `thread` і `mode` усе одно застосовуються звичайним чином до нової сесії OpenClaw, яку ви створюєте, тому `mode: "session"` усе ще вимагає `thread: true`.
- Цільовий агент має підтримувати `session/load` (Codex і Claude Code підтримують).
- Якщо id сесії не знайдено, запуск завершується зрозумілою помилкою — без тихого fallback до нової сесії.
- `resumeSessionId` вимагає `runtime: "acp"` — повертає помилку, якщо використовується із середовищем виконання субагента.
- `resumeSessionId` відновлює історію вхідної ACP-розмови; `thread` і `mode` як і раніше застосовуються звичайним чином до нового сеансу OpenClaw, який ви створюєте, тож `mode: "session"` усе ще вимагає `thread: true`.
- Цільовий агент має підтримувати `session/load` (Codex і Claude Code це підтримують).
- Якщо id сеансу не знайдено, запуск завершиться зрозумілою помилкою — без тихого повернення до нового сеансу.
### Операторський smoke test
Використовуйте це після розгортання gateway, якщо хочете швидко перевірити наживо, що ACP-запуск
справді працює end-to-end, а не лише проходить unit-тести.
Використовуйте це після розгортання gateway, коли потрібна швидка жива перевірка того, що запуск ACP
справді працює наскрізь, а не лише проходить модульні тести.
Рекомендований gate:
Рекомендований бар’єр перевірки:
1. Перевірте версію/коміт розгорнутого gateway на цільовому хості.
2. Підтвердьте, що в розгорнутому source-коді є прийняття lineage ACP у
2. Підтвердьте, що розгорнуте джерело містить прийняття лінійності ACP у
`src/gateway/sessions-patch.ts` (`subagent:* or acp:* sessions`).
3. Відкрийте тимчасову сесію мосту ACPX до живого агента (наприклад
3. Відкрийте тимчасовий сеанс мосту ACPX до живого агента (наприклад
`razor(main)` на `jpclawhq`).
4. Попросіть цього агента викликати `sessions_spawn` із:
- `runtime: "acp"`
- `agentId: "codex"`
- `mode: "run"`
- завданням: `Reply with exactly LIVE-ACP-SPAWN-OK`
- task: `Reply with exactly LIVE-ACP-SPAWN-OK`
5. Переконайтеся, що агент повідомляє:
- `accepted=yes`
- реальний `childSessionKey`
- відсутність помилки валідатора
6. Приберіть тимчасову сесію мосту ACPX.
6. Приберіть тимчасовий сеанс мосту ACPX.
Приклад запиту до живого агента:
Приклад промпту для живого агента:
```text
Use the sessions_spawn tool now with runtime: "acp", agentId: "codex", and mode: "run".
@ -424,25 +423,25 @@ Then report only: accepted=<yes/no>; childSessionKey=<value or none>; error=<exa
Примітки:
- Тримайте цей smoke test у режимі `mode: "run"`, якщо ви не тестуєте навмисно
постійні ACP-сесії, прив’язані до тредів.
- Не вимагайте `streamTo: "parent"` для базового gate. Цей шлях залежить від
можливостей запитувача/сесії і є окремою інтеграційною перевіркою.
- Розглядайте тестування прив’язаного до треда `mode: "session"` як другий, багатший інтеграційний
прохід із реального треда Discord або теми Telegram.
- Для цього smoke test використовуйте `mode: "run"`, якщо тільки ви навмисно не тестуєте
постійні сеанси ACP із прив’язкою до гілки.
- Не вимагайте `streamTo: "parent"` для базового бар’єра. Цей шлях залежить від
можливостей запитувача/сеансу й є окремою інтеграційною перевіркою.
- Розглядайте тестування `mode: "session"` із прив’язкою до гілки як другу, ширшу інтеграційну
перевірку з реальної гілки Discord або теми Telegram.
## Сумісність із sandbox
ACP-сесії наразі виконуються в runtime хоста, а не всередині sandbox OpenClaw.
Наразі сеанси ACP працюють у середовищі виконання хоста, а не всередині sandbox OpenClaw.
Поточні обмеження:
- Якщо сесія-запитувач ізольована, ACP-запуски блокуються як для `sessions_spawn({ runtime: "acp" })`, так і для `/acp spawn`.
- Якщо сеанс-запитувач ізольований sandbox, запуски ACP блокуються як для `sessions_spawn({ runtime: "acp" })`, так і для `/acp spawn`.
- Помилка: `Sandboxed sessions cannot spawn ACP sessions because runtime="acp" runs on the host. Use runtime="subagent" from sandboxed sessions.`
- `sessions_spawn` з `runtime: "acp"` не підтримує `sandbox: "require"`.
- Помилка: `sessions_spawn sandbox="require" is unsupported for runtime="acp" because ACP sessions run outside the sandbox. Use runtime="subagent" or sandbox="inherit".`
Використовуйте `runtime: "subagent"`, коли вам потрібне виконання із примусовим sandbox.
Використовуйте `runtime: "subagent"`, коли потрібне виконання, примусово обмежене sandbox.
### Із команди `/acp`
@ -455,7 +454,7 @@ ACP-сесії наразі виконуються в runtime хоста, а н
/acp spawn codex --thread here
```
Ключові прапорці:
Основні прапорці:
- `--mode persistent|oneshot`
- `--bind here|off`
@ -463,11 +462,11 @@ ACP-сесії наразі виконуються в runtime хоста, а н
- `--cwd <absolute-path>`
- `--label <name>`
Див. [Слеш-команди](/tools/slash-commands).
Див. [Слеш-команди](/uk/tools/slash-commands).
## Визначення цілі сесії
## Визначення цілі сеансу
Більшість дій `/acp` приймають необов’язкову ціль сесії (`session-key`, `session-id` або `session-label`).
Більшість дій `/acp` приймають необов’язкову ціль сеансу (`session-key`, `session-id` або `session-label`).
Порядок визначення:
@ -475,48 +474,48 @@ ACP-сесії наразі виконуються в runtime хоста, а н
- спочатку пробує ключ
- потім session id у форматі UUID
- потім мітку
2. Поточна прив’язка треда (якщо ця розмова/тред прив’язана до ACP-сесії)
3. Fallback до поточної сесії запитувача
2. Прив’язка поточної гілки (якщо ця розмова/гілка прив’язана до сеансу ACP)
3. Резервний варіант: поточний сеанс запитувача
Прив’язки як до поточної розмови, так і до треда, беруть участь у кроці 2.
Прив’язки до поточної розмови та прив’язки до гілки беруть участь у кроці 2.
Якщо ціль не визначено, OpenClaw повертає зрозумілу помилку (`Unable to resolve session target: ...`).
Якщо жодної цілі не вдається визначити, OpenClaw повертає зрозумілу помилку (`Unable to resolve session target: ...`).
## Режими прив’язки під час запуску
`/acp spawn` підтримує `--bind here|off`.
| Режим | Поведінка |
| ------ | ----------------------------------------------------------------------- |
| `here` | Прив’язати поточну активну розмову на місці; завершити з помилкою, якщо активної немає. |
| `off` | Не створювати прив’язку до поточної розмови. |
| Режим | Поведінка |
| ------ | ---------------------------------------------------------------------- |
| `here` | Прив’язати поточну активну розмову на місці; помилка, якщо її немає. |
| `off` | Не створювати прив’язку до поточної розмови. |
Примітки:
- `--bind here` — найпростіший операторський шлях для сценарію «зробити цей канал або чат підкріпленим Codex».
- `--bind here` не створює дочірній тред.
- `--bind here` доступний лише на каналах, які надають підтримку прив’язки до поточної розмови.
- `--bind here` — найпростіший операторський шлях для «зробити цей канал або чат підкріпленим Codex».
- `--bind here` не створює дочірню гілку.
- `--bind here` доступний лише в каналах, які підтримують прив’язку до поточної розмови.
- `--bind` і `--thread` не можна поєднувати в одному виклику `/acp spawn`.
## Режими тредів під час запуску
## Режими гілок під час запуску
`/acp spawn` підтримує `--thread auto|here|off`.
| Режим | Поведінка |
| ------ | ---------------------------------------------------------------------------------------------------- |
| `auto` | У активному треді: прив’язати цей тред. Поза тредом: створити/прив’язати дочірній тред, якщо підтримується. |
| `here` | Вимагати поточний активний тред; завершити з помилкою, якщо ви не в треді. |
| `off` | Без прив’язки. Сесія запускається без прив’язки. |
| `auto` | В активній гілці: прив’язати цю гілку. Поза гілкою: створити/прив’язати дочірню гілку, якщо це підтримується. |
| `here` | Вимагає поточної активної гілки; помилка, якщо ви не в гілці. |
| `off` | Без прив’язки. Сеанс запускається без прив’язки. |
Примітки:
- На поверхнях без прив’язки тредів типова поведінка фактично дорівнює `off`.
- Запуск із прив’язкою треда вимагає підтримки політики каналу:
- На поверхнях без підтримки прив’язки до гілки поведінка за замовчуванням фактично дорівнює `off`.
- Запуск із прив’язкою до гілки вимагає підтримки політики каналу:
- Discord: `channels.discord.threadBindings.spawnAcpSessions=true`
- Telegram: `channels.telegram.threadBindings.spawnAcpSessions=true`
- Використовуйте `--bind here`, коли хочете закріпити поточну розмову без створення дочірнього треда.
- Використовуйте `--bind here`, якщо хочете закріпити поточну розмову без створення дочірньої гілки.
## Керування ACP
## Елементи керування ACP
Доступне сімейство команд:
@ -536,49 +535,49 @@ ACP-сесії наразі виконуються в runtime хоста, а н
- `/acp doctor`
- `/acp install`
`/acp status` показує ефективні параметри runtime і, коли доступно, ідентифікатори сесії як на рівні runtime, так і на рівні бекенда.
`/acp status` показує ефективні параметри середовища виконання і, за наявності, ідентифікатори сеансів як на рівні середовища виконання, так і на рівні бекенду.
Деякі елементи керування залежать від можливостей бекенда. Якщо бекенд не підтримує певний елемент керування, OpenClaw повертає зрозумілу помилку про непідтримуваний елемент керування.
Деякі елементи керування залежать від можливостей бекенду. Якщо бекенд не підтримує певний елемент керування, OpenClaw повертає зрозумілу помилку про непідтримуваний елемент керування.
## Кулінарна книга команд ACP
## Книга рецептів для команд ACP
| Команда | Що робить | Приклад |
| -------------------- | -------------------------------------------------------- | ------------------------------------------------------------- |
| `/acp spawn` | Створює ACP-сесію; необов’язкова прив’язка тут або до треда. | `/acp spawn codex --bind here --cwd /repo` |
| `/acp cancel` | Скасовує хід у процесі для цільової сесії. | `/acp cancel agent:codex:acp:<uuid>` |
| `/acp steer` | Надсилає інструкцію керування до запущеної сесії. | `/acp steer --session support inbox prioritize failing tests` |
| `/acp close` | Закриває сесію та відв’язує цілі тредів. | `/acp close` |
| `/acp status` | Показує бекенд, режим, стан, параметри runtime, можливості. | `/acp status` |
| `/acp set-mode` | Встановлює режим runtime для цільової сесії. | `/acp set-mode plan` |
| `/acp set` | Загальний запис параметра конфігурації runtime. | `/acp set model openai/gpt-5.4` |
| `/acp cwd` | Встановлює перевизначення робочого каталогу runtime. | `/acp cwd /Users/user/Projects/repo` |
| `/acp permissions` | Встановлює профіль політики схвалення. | `/acp permissions strict` |
| `/acp timeout` | Встановлює timeout runtime (секунди). | `/acp timeout 120` |
| `/acp model` | Встановлює перевизначення моделі runtime. | `/acp model anthropic/claude-opus-4-6` |
| `/acp reset-options` | Прибирає перевизначення параметрів runtime для сесії. | `/acp reset-options` |
| `/acp sessions` | Перелічує недавні ACP-сесії зі сховища. | `/acp sessions` |
| `/acp doctor` | Стан бекенда, можливості, дії для виправлення. | `/acp doctor` |
| `/acp install` | Виводить детерміновані кроки встановлення та ввімкнення. | `/acp install` |
| Команда | Що вона робить | Приклад |
| -------------------- | --------------------------------------------------------- | ------------------------------------------------------------- |
| `/acp spawn` | Створює сеанс ACP; необов’язкова поточна прив’язка або прив’язка до гілки. | `/acp spawn codex --bind here --cwd /repo` |
| `/acp cancel` | Скасовує поточний хід для цільового сеансу. | `/acp cancel agent:codex:acp:<uuid>` |
| `/acp steer` | Надсилає інструкцію коригування до запущеного сеансу. | `/acp steer --session support inbox prioritize failing tests` |
| `/acp close` | Закриває сеанс і відв’язує цілі гілок. | `/acp close` |
| `/acp status` | Показує бекенд, режим, стан, параметри середовища виконання, можливості. | `/acp status` |
| `/acp set-mode` | Встановлює режим середовища виконання для цільового сеансу. | `/acp set-mode plan` |
| `/acp set` | Загальний запис параметра конфігурації середовища виконання. | `/acp set model openai/gpt-5.4` |
| `/acp cwd` | Встановлює перевизначення робочої директорії середовища виконання. | `/acp cwd /Users/user/Projects/repo` |
| `/acp permissions` | Встановлює профіль політики схвалення. | `/acp permissions strict` |
| `/acp timeout` | Встановлює тайм-аут середовища виконання (секунди). | `/acp timeout 120` |
| `/acp model` | Встановлює перевизначення моделі середовища виконання. | `/acp model anthropic/claude-opus-4-6` |
| `/acp reset-options` | Прибирає перевизначення параметрів середовища виконання сеансу. | `/acp reset-options` |
| `/acp sessions` | Показує список нещодавніх сеансів ACP зі сховища. | `/acp sessions` |
| `/acp doctor` | Стан бекенду, можливості, практичні виправлення. | `/acp doctor` |
| `/acp install` | Виводить детерміновані кроки встановлення та ввімкнення. | `/acp install` |
`/acp sessions` читає сховище для поточної прив’язаної сесії або сесії запитувача. Команди, які приймають токени `session-key`, `session-id` або `session-label`, визначають цілі через пошук сесій gateway, включно з кастомними коренями `session.store` для окремих агентів.
`/acp sessions` читає сховище для поточного прив’язаного сеансу або сеансу запитувача. Команди, які приймають токени `session-key`, `session-id` або `session-label`, визначають цілі через виявлення сеансів gateway, включно з користувацькими коренями `session.store` для окремих агентів.
## Відображення параметрів runtime
## Відображення параметрів середовища виконання
`/acp` має зручні команди та універсальний setter.
`/acp` має зручні команди та загальний сеттер.
Еквівалентні операції:
- `/acp model <id>` відповідає ключу конфігурації runtime `model`.
- `/acp permissions <profile>` відповідає ключу конфігурації runtime `approval_policy`.
- `/acp timeout <seconds>` відповідає ключу конфігурації runtime `timeout`.
- `/acp cwd <path>` напряму оновлює перевизначення cwd runtime.
- `/acp set <key> <value>`універсальний шлях.
- Спеціальний випадок: `key=cwd` використовує шлях перевизначення cwd.
- `/acp reset-options` очищає всі перевизначення runtime для цільової сесії.
- `/acp model <id>` відповідає ключу конфігурації середовища виконання `model`.
- `/acp permissions <profile>` відповідає ключу конфігурації середовища виконання `approval_policy`.
- `/acp timeout <seconds>` відповідає ключу конфігурації середовища виконання `timeout`.
- `/acp cwd <path>` безпосередньо оновлює перевизначення cwd середовища виконання.
- `/acp set <key> <value>`це загальний шлях.
- Особливий випадок: `key=cwd` використовує шлях перевизначення cwd.
- `/acp reset-options` очищає всі перевизначення середовища виконання для цільового сеансу.
## Підтримка harness acpx (поточна)
Поточні вбудовані псевдоніми harness в acpx:
Поточні вбудовані псевдоніми harness acpx:
- `claude`
- `codex`
@ -595,12 +594,12 @@ ACP-сесії наразі виконуються в runtime хоста, а н
- `pi`
- `qwen`
Коли OpenClaw використовує бекенд acpx, надавайте перевагу цим значенням для `agentId`, якщо у вашій конфігурації acpx не визначено власні псевдоніми агентів.
Якщо ваша локальна інсталяція Cursor усе ще експонує ACP як `agent acp`, перевизначте команду агента `cursor` у своїй конфігурації acpx замість зміни вбудованого типового значення.
Коли OpenClaw використовує бекенд acpx, віддавайте перевагу цим значенням для `agentId`, якщо тільки у вашій конфігурації acpx не визначено користувацькі псевдоніми агентів.
Якщо ваш локальний Cursor усе ще показує ACP як `agent acp`, перевизначте команду агента `cursor` у своїй конфігурації acpx замість зміни вбудованого стандартного значення.
Пряме використання CLI acpx також може націлюватися на довільні адаптери через `--agent <command>`, але цей сирий escape hatch є можливістю CLI acpx (а не звичайного шляху OpenClaw через `agentId`).
Безпосереднє використання CLI acpx також може націлюватися на довільні адаптери через `--agent <command>`, але цей сирий обхідний шлях є функцією CLI acpx (а не звичайним шляхом `agentId` в OpenClaw).
## Обов’язкова конфігурація
## Необхідна конфігурація
Базова конфігурація ACP:
@ -608,7 +607,7 @@ ACP-сесії наразі виконуються в runtime хоста, а н
{
acp: {
enabled: true,
// Необов’язково. Типове значення true; встановіть false, щоб призупинити ACP-dispatch, зберігши /acp controls.
// Необов’язково. За замовчуванням true; встановіть false, щоб призупинити диспетчеризацію ACP, зберігши елементи керування /acp.
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "codex",
@ -640,7 +639,7 @@ ACP-сесії наразі виконуються в runtime хоста, а н
}
```
Конфігурація прив’язки тредів залежить від адаптера каналу. Приклад для Discord:
Конфігурація прив’язки до гілок залежить від адаптера каналу. Приклад для Discord:
```json5
{
@ -662,18 +661,18 @@ ACP-сесії наразі виконуються в runtime хоста, а н
}
```
Якщо запуск ACP із прив’язкою треда не працює, спершу перевірте feature flag адаптера:
Якщо запуск ACP із прив’язкою до гілки не працює, спочатку перевірте прапорець функції адаптера:
- Discord: `channels.discord.threadBindings.spawnAcpSessions=true`
Прив’язки до поточної розмови не вимагають створення дочірнього треда. Вони вимагають активного контексту розмови й адаптера каналу, який надає прив’язки ACP до розмови.
Прив’язки до поточної розмови не потребують створення дочірньої гілки. Вони потребують активного контексту розмови й адаптера каналу, який надає ACP-прив’язки розмов.
Див. [Довідник із конфігурації](/uk/gateway/configuration-reference).
## Налаштування плагіна для бекенда acpx
## Налаштування плагіна для бекенду acpx
Нові встановлення постачаються з комплектним runtime-плагіном `acpx`, увімкненим типово, тож ACP
зазвичай працює без ручного кроку встановлення плагіна.
Нові встановлення постачаються з увімкненим за замовчуванням вбудованим плагіном
середовища виконання `acpx`, тому ACP зазвичай працює без ручного кроку встановлення плагіна.
Почніть із:
@ -682,34 +681,34 @@ ACP-сесії наразі виконуються в runtime хоста, а н
```
Якщо ви вимкнули `acpx`, заборонили його через `plugins.allow` / `plugins.deny` або хочете
перемкнутися на локальний checkout для розробки, використовуйте явний шлях плагіна:
перейти на локальний checkout для розробки, скористайтеся явним шляхом плагіна:
```bash
openclaw plugins install acpx
openclaw config set plugins.entries.acpx.enabled true
```
Локальне встановлення workspace під час розробки:
Локальне встановлення робочого простору під час розробки:
```bash
openclaw plugins install ./path/to/local/acpx-plugin
```
Потім перевірте стан бекенда:
Після цього перевірте стан бекенду:
```text
/acp doctor
```
### Конфігурація команди та версії acpx
### Конфігурація команди й версії acpx
Типово комплектний плагін бекенда acpx (`acpx`) використовує локальний у плагіні закріплений бінарник:
За замовчуванням вбудований плагін бекенду acpx (`acpx`) використовує локальний закріплений бінарний файл плагіна:
1. Команда типово вказує на локальний у плагіні `node_modules/.bin/acpx` всередині пакета плагіна ACPX.
2. Очікувана версія типово дорівнює pin розширення.
3. Під час запуску OpenClaw негайно реєструє бекенд ACP як not-ready.
4. Фонове ensure-завдання перевіряє `acpx --version`.
5. Якщо локальний у плагіні бінарник відсутній або не збігається, виконується:
1. За замовчуванням команда вказує на локальний `node_modules/.bin/acpx` усередині пакета плагіна ACPX.
2. Очікувана версія за замовчуванням відповідає закріпленню розширення.
3. Під час запуску реєстрація бекенду ACP одразу позначається як not-ready.
4. Фонове завдання ensure перевіряє `acpx --version`.
5. Якщо локальний бінарний файл плагіна відсутній або не збігається за версією, виконується:
`npm install --omit=dev --no-save acpx@<pinned>` і повторна перевірка.
Ви можете перевизначити команду/версію в конфігурації плагіна:
@ -733,27 +732,27 @@ openclaw plugins install ./path/to/local/acpx-plugin
Примітки:
- `command` приймає абсолютний шлях, відносний шлях або ім’я команди (`acpx`).
- Відносні шляхи обчислюються від каталогу workspace OpenClaw.
- `expectedVersion: "any"` вимикає сувору перевірку збігу версії.
- Коли `command` вказує на кастомний бінарник/шлях, автоматичне локальне встановлення в плагіні вимикається.
- Запуск OpenClaw залишається неблокувальним, поки виконується перевірка стану бекенда.
- Відносні шляхи визначаються від директорії робочого простору OpenClaw.
- `expectedVersion: "any"` вимикає сувору перевірку відповідності версії.
- Коли `command` вказує на користувацький бінарний файл/шлях, автоматичне локальне встановлення плагіна вимикається.
- Запуск OpenClaw залишається неблокувальним, поки триває фонова перевірка стану бекенду.
Див. [Плагіни](/tools/plugin).
Див. [Плагіни](/uk/tools/plugin).
### Автоматичне встановлення залежностей
Коли ви встановлюєте OpenClaw глобально через `npm install -g openclaw`, runtime-залежності acpx
(платформозалежні бінарники) встановлюються автоматично
через postinstall-хук. Якщо автоматичне встановлення не вдається, gateway однаково запускається
нормально та повідомляє про відсутню залежність через `openclaw acp doctor`.
Коли ви встановлюєте OpenClaw глобально через `npm install -g openclaw`, залежності
середовища виконання acpx (платформозалежні бінарні файли) встановлюються автоматично
через хук postinstall. Якщо автоматичне встановлення завершується помилкою, gateway все одно запускається
нормально і повідомляє про відсутню залежність через `openclaw acp doctor`.
### MCP-міст для інструментів плагінів
### MCP-міст інструментів плагіна
Типово сесії ACPX **не** експонують зареєстровані в плагінах OpenClaw інструменти до
ACP-harness.
За замовчуванням сеанси ACPX **не** відкривають зареєстровані плагінами OpenClaw інструменти
для ACP-harness-оточення.
Якщо ви хочете, щоб ACP-агенти, такі як Codex або Claude Code, могли викликати встановлені
інструменти плагінів OpenClaw, наприклад memory recall/store, увімкніть спеціальний міст:
інструменти плагінів OpenClaw, такі як збереження/отримання пам’яті, увімкніть спеціальний міст:
```bash
openclaw config set plugins.entries.acpx.config.pluginToolsMcpBridge true
@ -761,49 +760,50 @@ openclaw config set plugins.entries.acpx.config.pluginToolsMcpBridge true
Що це робить:
- Інжектує в bootstrap сесії ACPX вбудований MCP-сервер з іменем `openclaw-plugin-tools`.
- Експонує інструменти плагінів, уже зареєстровані встановленими та увімкненими плагінами OpenClaw.
- Робить функцію явно ввімкненою та типово вимкненою.
- Вбудовує в bootstrap сеансу ACPX вбудований MCP-сервер з назвою `openclaw-plugin-tools`.
- Відкриває інструменти плагінів, уже зареєстровані встановленими та ввімкненими
плагінами OpenClaw.
- Робить цю функцію явною і вимкненою за замовчуванням.
Примітки щодо безпеки й довіри:
- Це розширює поверхню інструментів ACP-harness.
- ACP-агенти отримують доступ лише до інструментів плагінів, уже активних у gateway.
- Це розширює поверхню інструментів ACP-harness-оточення.
- ACP-агенти отримують доступ лише до інструментів плагінів, які вже активні в gateway.
- Розглядайте це як ту саму межу довіри, що й дозвіл цим плагінам виконуватися
в самому OpenClaw.
- Перегляньте встановлені плагіни перед увімкненням цього.
у самому OpenClaw.
- Перевіряйте встановлені плагіни перед увімкненням цієї функції.
Кастомні `mcpServers` і надалі працюють як раніше. Вбудований міст plugin-tools —
це додаткова зручність за явною згодою, а не заміна узагальненої конфігурації MCP-серверів.
Користувацькі `mcpServers` і надалі працюють як раніше. Вбудований міст інструментів плагінів є
додатковою зручною функцією за явним увімкненням, а не заміною загальної конфігурації MCP-сервера.
## Налаштування дозволів
## Конфігурація дозволів
ACP-сесії працюють неінтерактивно — немає TTY, у якому можна схвалювати або відхиляти запити на дозвіл на запис файлів і виконання shell-команд. Плагін acpx надає два ключі конфігурації, які визначають, як обробляються дозволи:
Сеанси ACP працюють неінтерактивно — TTY для схвалення або відхилення запитів дозволів на запис у файли й виконання shell-команд немає. Плагін acpx надає два ключі конфігурації, які керують обробкою дозволів:
Ці дозволи ACPX-harness відокремлені від схвалень exec в OpenClaw і від окремих прапорців обходу на боці CLI-бекенда, таких як Claude CLI `--permission-mode bypassPermissions`. ACPX `approve-all` — це аварійний перемикач на рівні harness для ACP-сесій.
Ці дозволи harness ACPX відокремлені від схвалень exec в OpenClaw і відокремлені від прапорців обходу постачальника в бекендах CLI, таких як Claude CLI `--permission-mode bypassPermissions`. ACPX `approve-all` — це аварійний перемикач на рівні harness для сеансів ACP.
### `permissionMode`
Керує тим, які операції агент harness може виконувати без запиту.
| Значення | Поведінка |
| --------------- | ---------------------------------------------------------- |
| `approve-all` | Автоматично схвалювати всі записи файлів і shell-команди. |
| `approve-reads` | Автоматично схвалювати лише читання; запис і exec вимагають запитів. |
| `deny-all` | Відхиляти всі запити на дозвіл. |
| Значення | Поведінка |
| --------------- | -------------------------------------------------------- |
| `approve-all` | Автоматично схвалює всі записи у файли та shell-команди. |
| `approve-reads` | Автоматично схвалює лише читання; запис і exec вимагають запитів. |
| `deny-all` | Відхиляє всі запити дозволів. |
### `nonInteractivePermissions`
Керує тим, що відбувається, коли мав би з’явитися запит на дозвіл, але інтерактивний TTY недоступний (що для ACP-сесій відбувається завжди).
Керує тим, що відбувається, коли мав би з’явитися запит на дозвіл, але інтерактивний TTY недоступний (а для сеансів ACP це завжди так).
| Значення | Поведінка |
| -------- | ----------------------------------------------------------------- |
| `fail` | Перервати сесію з `AcpRuntimeError`. **(типово)** |
| `deny` | Мовчки відхилити дозвіл і продовжити (плавна деградація). |
| Значення | Поведінка |
| -------- | ---------------------------------------------------------------- |
| `fail` | Перервати сеанс з `AcpRuntimeError`. **(за замовчуванням)** |
| `deny` | Мовчки відхилити дозвіл і продовжити роботу (плавна деградація). |
### Конфігурація
Установлюється через конфігурацію плагіна:
Налаштовується через конфігурацію плагіна:
```bash
openclaw config set plugins.entries.acpx.config.permissionMode approve-all
@ -812,27 +812,27 @@ openclaw config set plugins.entries.acpx.config.nonInteractivePermissions fail
Після зміни цих значень перезапустіть gateway.
> **Важливо:** OpenClaw наразі типово використовує `permissionMode=approve-reads` і `nonInteractivePermissions=fail`. У неінтерактивних ACP-сесіях будь-який запис або exec, що спричиняє запит на дозвіл, може завершитися помилкою `AcpRuntimeError: Permission prompt unavailable in non-interactive mode`.
> **Важливо:** OpenClaw наразі за замовчуванням використовує `permissionMode=approve-reads` і `nonInteractivePermissions=fail`. У неінтерактивних сеансах ACP будь-який запис або exec, що викликає запит дозволу, може завершитися помилкою `AcpRuntimeError: Permission prompt unavailable in non-interactive mode`.
>
> Якщо вам потрібно обмежити дозволи, установіть `nonInteractivePermissions` у `deny`, щоб сесії плавно деградували замість аварійного завершення.
> Якщо вам потрібно обмежити дозволи, встановіть `nonInteractivePermissions` у `deny`, щоб сеанси плавно деградували замість аварійного завершення.
## Усунення несправностей
| Симптом | Імовірна причина | Виправлення |
| --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ACP runtime backend is not configured` | Плагін бекенда відсутній або вимкнений. | Установіть і ввімкніть плагін бекенда, потім виконайте `/acp doctor`. |
| `ACP is disabled by policy (acp.enabled=false)` | ACP глобально вимкнено. | Установіть `acp.enabled=true`. |
| `ACP dispatch is disabled by policy (acp.dispatch.enabled=false)` | Dispatch із нормальних повідомлень треда вимкнено. | Установіть `acp.dispatch.enabled=true`. |
| `ACP agent "<id>" is not allowed by policy` | Агент відсутній у списку дозволених. | Використовуйте дозволений `agentId` або оновіть `acp.allowedAgents`. |
| `Unable to resolve session target: ...` | Неправильний токен ключа/id/мітки. | Виконайте `/acp sessions`, скопіюйте точний ключ/мітку та повторіть. |
| `--bind here requires running /acp spawn inside an active ... conversation` | `--bind here` використано без активної розмови, яку можна прив’язати. | Перейдіть до цільового чату/каналу й повторіть, або використайте запуск без прив’язки. |
| `Conversation bindings are unavailable for <channel>.` | Адаптер не має можливості ACP-прив’язки до поточної розмови. | Використовуйте `/acp spawn ... --thread ...`, де це підтримується, налаштуйте верхньорівневі `bindings[]` або перейдіть до підтримуваного каналу. |
| `--thread here requires running /acp spawn inside an active ... thread` | `--thread here` використано поза контекстом треда. | Перейдіть до цільового треда або використовуйте `--thread auto`/`off`. |
| `Only <user-id> can rebind this channel/conversation/thread.` | Інший користувач володіє активною ціллю прив’язки. | Переприв’яжіть як власник або використовуйте іншу розмову чи тред. |
| `Thread bindings are unavailable for <channel>.` | Адаптер не має можливості прив’язки тредів. | Використовуйте `--thread off` або перейдіть до підтримуваного адаптера/каналу. |
| `Sandboxed sessions cannot spawn ACP sessions ...` | Runtime ACP працює на боці хоста; сесія-запитувач ізольована. | Використовуйте `runtime="subagent"` з ізольованих сесій або запускайте ACP зі сесії без sandbox. |
| `sessions_spawn sandbox="require" is unsupported for runtime="acp" ...` | Для runtime ACP запитано `sandbox="require"`. | Використовуйте `runtime="subagent"` для обов’язкової ізоляції або ACP із `sandbox="inherit"` із сесії без sandbox. |
| Missing ACP metadata for bound session | Застарілі/видалені метадані ACP-сесії. | Створіть заново через `/acp spawn`, а потім переприв’яжіть/сфокусуйте тред. |
| `AcpRuntimeError: Permission prompt unavailable in non-interactive mode` | `permissionMode` блокує запис/exec у неінтерактивній ACP-сесії. | Установіть `plugins.entries.acpx.config.permissionMode` у `approve-all` і перезапустіть gateway. Див. [Налаштування дозволів](#permission-configuration). |
| ACP session fails early with little output | Запити на дозвіл блокуються через `permissionMode`/`nonInteractivePermissions`. | Перевірте журнали gateway на `AcpRuntimeError`. Для повних дозволів установіть `permissionMode=approve-all`; для плавної деградації `nonInteractivePermissions=deny`. |
| ACP session stalls indefinitely after completing work | Процес harness завершився, але ACP-сесія не повідомила про завершення. | Відстежуйте через `ps aux \| grep acpx`; вручну завершіть завислі процеси. |
| Симптом | Імовірна причина | Виправлення |
| --------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ACP runtime backend is not configured` | Плагін бекенду відсутній або вимкнений. | Встановіть і ввімкніть плагін бекенду, потім виконайте `/acp doctor`. |
| `ACP is disabled by policy (acp.enabled=false)` | ACP глобально вимкнено. | Встановіть `acp.enabled=true`. |
| `ACP dispatch is disabled by policy (acp.dispatch.enabled=false)` | Диспетчеризацію зі звичайних повідомлень у гілках вимкнено. | Встановіть `acp.dispatch.enabled=true`. |
| `ACP agent "<id>" is not allowed by policy` | Агента немає у списку дозволених. | Використовуйте дозволений `agentId` або оновіть `acp.allowedAgents`. |
| `Unable to resolve session target: ...` | Неправильний токен ключа/id/мітки. | Виконайте `/acp sessions`, скопіюйте точний ключ/мітку й повторіть спробу. |
| `--bind here requires running /acp spawn inside an active ... conversation` | `--bind here` використано без активної розмови, до якої можна прив’язатися. | Перейдіть у цільовий чат/канал і повторіть спробу або використайте запуск без прив’язки. |
| `Conversation bindings are unavailable for <channel>.` | Адаптер не має можливості ACP-прив’язки до поточної розмови. | Використовуйте `/acp spawn ... --thread ...`, де це підтримується, налаштуйте верхньорівневі `bindings[]` або перейдіть у підтримуваний канал. |
| `--thread here requires running /acp spawn inside an active ... thread` | `--thread here` використано поза контекстом гілки. | Перейдіть у цільову гілку або використайте `--thread auto`/`off`. |
| `Only <user-id> can rebind this channel/conversation/thread.` | Активна ціль прив’язки належить іншому користувачу. | Переприв’яжіть як власник або використайте іншу розмову чи гілку. |
| `Thread bindings are unavailable for <channel>.` | Адаптер не має можливості прив’язки до гілки. | Використовуйте `--thread off` або перейдіть у підтримуваний адаптер/канал. |
| `Sandboxed sessions cannot spawn ACP sessions ...` | Середовище виконання ACP працює на хості; сеанс-запитувач ізольований sandbox. | Використовуйте `runtime="subagent"` з ізольованих sandbox сеансів або запускайте ACP з неізольованого сеансу. |
| `sessions_spawn sandbox="require" is unsupported for runtime="acp" ...` | Для середовища виконання ACP запитано `sandbox="require"`. | Використовуйте `runtime="subagent"` для обов’язкової ізоляції sandbox або ACP із `sandbox="inherit"` з неізольованого сеансу. |
| Missing ACP metadata for bound session | Застарілі/видалені метадані сеансу ACP. | Створіть заново через `/acp spawn`, потім повторно прив’яжіть/сфокусуйте гілку. |
| `AcpRuntimeError: Permission prompt unavailable in non-interactive mode` | `permissionMode` блокує запис/exec у неінтерактивному сеансі ACP. | Встановіть `plugins.entries.acpx.config.permissionMode` у `approve-all` і перезапустіть gateway. Див. [Конфігурація дозволів](#конфігурація-дозволів). |
| ACP session fails early with little output | Запити дозволів блокуються через `permissionMode`/`nonInteractivePermissions`. | Перевірте журнали gateway на `AcpRuntimeError`. Для повних дозволів встановіть `permissionMode=approve-all`; для плавної деградації встановіть `nonInteractivePermissions=deny`. |
| ACP session stalls indefinitely after completing work | Процес harness завершився, але сеанс ACP не повідомив про завершення. | Відстежуйте за допомогою `ps aux \| grep acpx`; вручну завершіть завислі процеси. |