chore(i18n): refresh uk translations
This commit is contained in:
parent
073aadcb11
commit
d9d8aad22a
@ -4,40 +4,40 @@ read_when:
|
||||
summary: Налаштування Slack і поведінка під час виконання (режим сокетів + URL-адреси HTTP-запитів)
|
||||
title: Slack
|
||||
x-i18n:
|
||||
generated_at: "2026-04-28T11:05:14Z"
|
||||
generated_at: "2026-04-29T03:16:22Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 22e33ea77f81c7f1f79a26e73fd9341ec2d44f86620e8acf37e41eb70e8b7793
|
||||
source_hash: 4cad48c342c4edf0857d79264e5a3213e58b8f5cde6bd04fa11eca1c969a8f1a
|
||||
source_path: channels/slack.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
Готово для продакшену для DM і каналів через інтеграції застосунку Slack. Режим за замовчуванням — Socket Mode; HTTP Request URLs також підтримуються.
|
||||
Готово для виробництва для DM і каналів через інтеграції Slack app. Типовий режим — Socket Mode; HTTP Request URLs також підтримуються.
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Сполучення" icon="link" href="/uk/channels/pairing">
|
||||
DM Slack за замовчуванням використовують режим сполучення.
|
||||
Slack DM типово використовують режим сполучення.
|
||||
</Card>
|
||||
<Card title="Slash-команди" icon="terminal" href="/uk/tools/slash-commands">
|
||||
Нативна поведінка команд і каталог команд.
|
||||
</Card>
|
||||
<Card title="Усунення несправностей каналів" icon="wrench" href="/uk/channels/troubleshooting">
|
||||
Міжканальна діагностика та інструкції з відновлення.
|
||||
Міжканальна діагностика та playbook-и відновлення.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Швидке налаштування
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Socket Mode (за замовчуванням)">
|
||||
<Tab title="Socket Mode (типово)">
|
||||
<Steps>
|
||||
<Step title="Створіть новий застосунок Slack">
|
||||
У налаштуваннях застосунку Slack натисніть кнопку **[Create New App](https://api.slack.com/apps/new)**:
|
||||
<Step title="Створіть новий Slack app">
|
||||
У налаштуваннях Slack app натисніть кнопку **[Create New App](https://api.slack.com/apps/new)**:
|
||||
|
||||
- виберіть **from a manifest** і виберіть робочий простір для свого застосунку
|
||||
- виберіть **from a manifest** і виберіть workspace для вашого app
|
||||
- вставте [приклад маніфесту](#manifest-and-scope-checklist) нижче й продовжте створення
|
||||
- згенеруйте **App-Level Token** (`xapp-...`) з `connections:write`
|
||||
- установіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
|
||||
- встановіть app і скопіюйте показаний **Bot Token** (`xoxb-...`)
|
||||
|
||||
</Step>
|
||||
|
||||
@ -56,7 +56,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
Резервне значення env (лише обліковий запис за замовчуванням):
|
||||
Резервний env-варіант (лише типовий обліковий запис):
|
||||
|
||||
```bash
|
||||
SLACK_APP_TOKEN=xapp-...
|
||||
@ -65,7 +65,7 @@ SLACK_BOT_TOKEN=xoxb-...
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Запустіть gateway">
|
||||
<Step title="Запустіть Gateway">
|
||||
|
||||
```bash
|
||||
openclaw gateway
|
||||
@ -78,13 +78,13 @@ openclaw gateway
|
||||
|
||||
<Tab title="HTTP Request URLs">
|
||||
<Steps>
|
||||
<Step title="Створіть новий застосунок Slack">
|
||||
У налаштуваннях застосунку Slack натисніть кнопку **[Create New App](https://api.slack.com/apps/new)**:
|
||||
<Step title="Створіть новий Slack app">
|
||||
У налаштуваннях Slack app натисніть кнопку **[Create New App](https://api.slack.com/apps/new)**:
|
||||
|
||||
- виберіть **from a manifest** і виберіть робочий простір для свого застосунку
|
||||
- вставте [приклад маніфесту](#manifest-and-scope-checklist) й оновіть URL-адреси перед створенням
|
||||
- виберіть **from a manifest** і виберіть workspace для вашого app
|
||||
- вставте [приклад маніфесту](#manifest-and-scope-checklist) і оновіть URL перед створенням
|
||||
- збережіть **Signing Secret** для перевірки запитів
|
||||
- установіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
|
||||
- встановіть app і скопіюйте показаний **Bot Token** (`xoxb-...`)
|
||||
|
||||
</Step>
|
||||
|
||||
@ -105,14 +105,14 @@ openclaw gateway
|
||||
```
|
||||
|
||||
<Note>
|
||||
Використовуйте унікальні шляхи webhook для багатьох облікових записів HTTP
|
||||
Використовуйте унікальні шляхи Webhook для HTTP із кількома обліковими записами
|
||||
|
||||
Надайте кожному обліковому запису окремий `webhookPath` (типово `/slack/events`), щоб реєстрації не конфліктували.
|
||||
</Note>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Запустіть gateway">
|
||||
<Step title="Запустіть Gateway">
|
||||
|
||||
```bash
|
||||
openclaw gateway
|
||||
@ -126,7 +126,7 @@ openclaw gateway
|
||||
|
||||
## Налаштування транспорту Socket Mode
|
||||
|
||||
OpenClaw за замовчуванням установлює для клієнта Slack SDK час очікування pong 15 секунд для Socket Mode. Перевизначайте транспортні налаштування лише тоді, коли потрібне налаштування під конкретний робочий простір або хост:
|
||||
OpenClaw типово встановлює для клієнта Slack SDK тайм-аут pong 15 секунд для Socket Mode. Перевизначайте налаштування транспорту лише тоді, коли потрібне налаштування під конкретний workspace або хост:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -143,13 +143,13 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
}
|
||||
```
|
||||
|
||||
Використовуйте це лише для робочих просторів Socket Mode, які журналюють тайм-аути Slack websocket pong/server-ping, або працюють на хостах із відомим виснаженням event loop. `clientPingTimeout` — це очікування pong після того, як SDK надсилає client ping; `serverPingTimeout` — очікування server ping від Slack. Повідомлення й події застосунку залишаються станом застосунку, а не сигналами життєздатності транспорту.
|
||||
Використовуйте це лише для workspace-ів Socket Mode, які логують тайм-аути Slack websocket pong/server-ping, або працюють на хостах із відомим голодуванням event loop. `clientPingTimeout` — це очікування pong після того, як SDK надсилає клієнтський ping; `serverPingTimeout` — це очікування ping-ів від сервера Slack. Повідомлення app і події залишаються станом застосунку, а не сигналами справності транспорту.
|
||||
|
||||
## Контрольний список маніфесту та scope
|
||||
## Контрольний список маніфесту та scope-ів
|
||||
|
||||
Базовий маніфест застосунку Slack однаковий для Socket Mode і HTTP Request URLs. Відрізняється лише блок `settings` (і `url` для slash-команди).
|
||||
Базовий маніфест Slack app однаковий для Socket Mode і HTTP Request URLs. Відрізняється лише блок `settings` (і `url` slash-команди).
|
||||
|
||||
Базовий маніфест (Socket Mode за замовчуванням):
|
||||
Базовий маніфест (типово Socket Mode):
|
||||
|
||||
```json
|
||||
{
|
||||
@ -221,7 +221,7 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
}
|
||||
```
|
||||
|
||||
Для режиму **HTTP Request URLs** замініть `settings` на HTTP-варіант і додайте `url` до кожної slash-команди. Потрібна публічна URL-адреса:
|
||||
Для режиму **HTTP Request URLs** замініть `settings` на HTTP-варіант і додайте `url` до кожної slash-команди. Потрібен публічний URL:
|
||||
|
||||
```json
|
||||
{
|
||||
@ -253,12 +253,12 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
|
||||
### Додаткові налаштування маніфесту
|
||||
|
||||
Відкривають різні функції, що розширюють наведені вище значення за замовчуванням.
|
||||
Показуйте різні функції, які розширюють наведені вище типові значення.
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Необов’язкові нативні slash-команди">
|
||||
|
||||
Кілька [нативних slash-команд](#commands-and-slash-behavior) можна використовувати замість однієї налаштованої команди з нюансами:
|
||||
Кілька [нативних slash-команд](#commands-and-slash-behavior) можна використовувати замість однієї налаштованої команди з певними нюансами:
|
||||
|
||||
- Використовуйте `/agentstatus` замість `/status`, оскільки команда `/status` зарезервована.
|
||||
- Одночасно можна зробити доступними не більше ніж 25 slash-команд.
|
||||
@ -266,7 +266,7 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
Замініть наявний розділ `features.slash_commands` підмножиною [доступних команд](/uk/tools/slash-commands#command-list):
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Socket Mode (за замовчуванням)">
|
||||
<Tab title="Socket Mode (типово)">
|
||||
|
||||
```json
|
||||
"slash_commands": [
|
||||
@ -406,14 +406,14 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
</Tabs>
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Необов’язкові scope авторства (операції запису)">
|
||||
Додайте bot scope `chat:write.customize`, якщо хочете, щоб вихідні повідомлення використовували активну ідентичність агента (користувацьке ім’я користувача та іконку) замість типової ідентичності застосунку Slack.
|
||||
<Accordion title="Необов’язкові scope-и авторства (операції запису)">
|
||||
Додайте bot-scope `chat:write.customize`, якщо хочете, щоб вихідні повідомлення використовували ідентичність активного агента (власне ім’я користувача та іконку) замість типової ідентичності Slack app.
|
||||
|
||||
Якщо ви використовуєте іконку emoji, Slack очікує синтаксис `:emoji_name:`.
|
||||
Якщо ви використовуєте emoji-іконку, Slack очікує синтаксис `:emoji_name:`.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Необов’язкові scope user-token (операції читання)">
|
||||
Якщо ви налаштовуєте `channels.slack.userToken`, типовими scope для читання є:
|
||||
<Accordion title="Необов’язкові user-token scope-и (операції читання)">
|
||||
Якщо ви налаштовуєте `channels.slack.userToken`, типові scope-и читання:
|
||||
|
||||
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
|
||||
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
|
||||
@ -421,7 +421,7 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
- `reactions:read`
|
||||
- `pins:read`
|
||||
- `emoji:read`
|
||||
- `search:read` (якщо ви залежите від читання через пошук Slack)
|
||||
- `search:read` (якщо ви залежите від читання пошуку Slack)
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
@ -430,52 +430,52 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
|
||||
- `botToken` + `appToken` потрібні для Socket Mode.
|
||||
- HTTP-режим потребує `botToken` + `signingSecret`.
|
||||
- `botToken`, `appToken`, `signingSecret` і `userToken` приймають відкриті
|
||||
рядки або об’єкти SecretRef.
|
||||
- Токени конфігурації перевизначають резервні значення env.
|
||||
- Резервне значення env `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` застосовується лише до облікового запису за замовчуванням.
|
||||
- `userToken` (`xoxp-...`) доступний лише в конфігурації (без резервного значення env) і за замовчуванням має поведінку лише для читання (`userTokenReadOnly: true`).
|
||||
- `botToken`, `appToken`, `signingSecret` і `userToken` приймають plaintext-рядки
|
||||
або об’єкти SecretRef.
|
||||
- Токени конфігурації перевизначають резервний env-варіант.
|
||||
- Резервний env-варіант `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` застосовується лише до типового облікового запису.
|
||||
- `userToken` (`xoxp-...`) налаштовується лише в конфігурації (без резервного env-варіанту) і типово використовує поведінку лише для читання (`userTokenReadOnly: true`).
|
||||
|
||||
Поведінка знімка стану:
|
||||
|
||||
- Перевірка облікового запису Slack відстежує поля `*Source` і `*Status`
|
||||
для кожних облікових даних (`botToken`, `appToken`, `signingSecret`, `userToken`).
|
||||
- Статус має значення `available`, `configured_unavailable` або `missing`.
|
||||
- Перевірка облікового запису Slack відстежує поля `*Source` і `*Status` для кожних облікових даних
|
||||
(`botToken`, `appToken`, `signingSecret`, `userToken`).
|
||||
- Статус — це `available`, `configured_unavailable` або `missing`.
|
||||
- `configured_unavailable` означає, що обліковий запис налаштовано через SecretRef
|
||||
або інше неінлайн-джерело секрету, але поточний шлях команди/середовища виконання
|
||||
не зміг отримати фактичне значення.
|
||||
- У режимі HTTP включено `signingSecretStatus`; у Socket Mode
|
||||
або інше неінлайнове джерело секретів, але поточний шлях команди/runtime
|
||||
не зміг визначити фактичне значення.
|
||||
- У режимі HTTP включається `signingSecretStatus`; у Socket Mode
|
||||
обов’язкова пара — `botTokenStatus` + `appTokenStatus`.
|
||||
|
||||
<Tip>
|
||||
Для дій/читання каталогів можна надавати перевагу токену користувача, якщо його налаштовано. Для записів перевага й надалі надається токену бота; записи через токен користувача дозволені лише коли `userTokenReadOnly: false` і токен бота недоступний.
|
||||
Для дій/читання каталогу токен користувача може мати перевагу, коли його налаштовано. Для записів перевага й надалі надається токену бота; записи через токен користувача дозволені лише коли `userTokenReadOnly: false`, а токен бота недоступний.
|
||||
</Tip>
|
||||
|
||||
## Дії та шлюзи
|
||||
|
||||
Дії Slack керуються через `channels.slack.actions.*`.
|
||||
Дії Slack керуються `channels.slack.actions.*`.
|
||||
|
||||
Доступні групи дій у поточному інструментарії Slack:
|
||||
|
||||
| Група | За замовчуванням |
|
||||
| ---------- | ---------------- |
|
||||
| messages | увімкнено |
|
||||
| reactions | увімкнено |
|
||||
| pins | увімкнено |
|
||||
| memberInfo | увімкнено |
|
||||
| emojiList | увімкнено |
|
||||
| ---------- | ------- |
|
||||
| messages | увімкнено |
|
||||
| reactions | увімкнено |
|
||||
| pins | увімкнено |
|
||||
| memberInfo | увімкнено |
|
||||
| emojiList | увімкнено |
|
||||
|
||||
Поточні дії повідомлень Slack включають `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` і `emoji-list`. `download-file` приймає ідентифікатори файлів Slack, показані у вхідних заповнювачах файлів, і повертає попередні перегляди для зображень або метадані локального файлу для інших типів файлів.
|
||||
Поточні дії повідомлень Slack включають `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` і `emoji-list`. `download-file` приймає ID файлів Slack, показані у вхідних заповнювачах файлів, і повертає попередні перегляди зображень для зображень або метадані локального файла для інших типів файлів.
|
||||
|
||||
## Керування доступом і маршрутизація
|
||||
## Контроль доступу та маршрутизація
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Політика DM">
|
||||
`channels.slack.dmPolicy` керує доступом до DM (застаріле: `channels.slack.dm.policy`):
|
||||
`channels.slack.dmPolicy` керує доступом DM (застаріле: `channels.slack.dm.policy`):
|
||||
|
||||
- `pairing` (за замовчуванням)
|
||||
- `allowlist`
|
||||
- `open` (вимагає, щоб `channels.slack.allowFrom` містив `"*"`; застаріле: `channels.slack.dm.allowFrom`)
|
||||
- `open` (потрібно, щоб `channels.slack.allowFrom` містив `"*"`; застаріле: `channels.slack.dm.allowFrom`)
|
||||
- `disabled`
|
||||
|
||||
Прапорці DM:
|
||||
@ -489,42 +489,42 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
Пріоритет для кількох облікових записів:
|
||||
|
||||
- `channels.slack.accounts.default.allowFrom` застосовується лише до облікового запису `default`.
|
||||
- Іменовані облікові записи успадковують `channels.slack.allowFrom`, коли їхній власний `allowFrom` не задано.
|
||||
- Іменовані облікові записи успадковують `channels.slack.allowFrom`, коли власний `allowFrom` не задано.
|
||||
- Іменовані облікові записи не успадковують `channels.slack.accounts.default.allowFrom`.
|
||||
|
||||
Pairing у DM використовує `openclaw pairing approve slack <code>`.
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="Політика каналів">
|
||||
<Tab title="Політика каналу">
|
||||
`channels.slack.groupPolicy` керує обробкою каналів:
|
||||
|
||||
- `open`
|
||||
- `allowlist`
|
||||
- `disabled`
|
||||
|
||||
Allowlist каналів розміщується в `channels.slack.channels` і має використовувати стабільні ідентифікатори каналів.
|
||||
Allowlist каналів розміщується в `channels.slack.channels` і має використовувати стабільні ID каналів.
|
||||
|
||||
Примітка щодо середовища виконання: якщо `channels.slack` повністю відсутній (налаштування лише через env), середовище виконання повертається до `groupPolicy="allowlist"` і записує попередження в журнал (навіть якщо задано `channels.defaults.groupPolicy`).
|
||||
Примітка щодо runtime: якщо `channels.slack` повністю відсутній (налаштування лише через env), runtime повертається до `groupPolicy="allowlist"` і записує попередження в журнал (навіть якщо задано `channels.defaults.groupPolicy`).
|
||||
|
||||
Розпізнавання імен/ID:
|
||||
|
||||
- записи allowlist каналів і записи allowlist DM розпізнаються під час запуску, коли доступ токена це дозволяє
|
||||
- нерозпізнані записи імен каналів зберігаються як налаштовані, але за замовчуванням ігноруються для маршрутизації
|
||||
- вхідна авторизація та маршрутизація каналів за замовчуванням спершу використовують ID; пряме зіставлення з іменем користувача/slug вимагає `channels.slack.dangerouslyAllowNameMatching: true`
|
||||
- нерозпізнані записи з іменами каналів зберігаються як налаштовані, але за замовчуванням ігноруються для маршрутизації
|
||||
- вхідна авторизація та маршрутизація каналів за замовчуванням спершу використовують ID; пряме зіставлення за іменем користувача/slug потребує `channels.slack.dangerouslyAllowNameMatching: true`
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="Згадки та користувачі каналів">
|
||||
Повідомлення каналів за замовчуванням обмежені згадками.
|
||||
<Tab title="Згадки та користувачі каналу">
|
||||
Повідомлення каналу за замовчуванням проходять через шлюз згадок.
|
||||
|
||||
Джерела згадок:
|
||||
|
||||
- явна згадка застосунку (`<@botId>`)
|
||||
- regex-шаблони згадок (`agents.list[].groupChat.mentionPatterns`, запасний варіант `messages.groupChat.mentionPatterns`)
|
||||
- неявна поведінка відповіді на потік бота (вимкнено, коли `thread.requireExplicitMention` дорівнює `true`)
|
||||
- regex-шаблони згадок (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
|
||||
- неявна поведінка гілки reply-to-bot (вимкнено, коли `thread.requireExplicitMention` дорівнює `true`)
|
||||
|
||||
Керування для окремих каналів (`channels.slack.channels.<id>`; імена лише через розпізнавання під час запуску або `dangerouslyAllowNameMatching`):
|
||||
Поканальні елементи керування (`channels.slack.channels.<id>`; імена лише через розпізнавання під час запуску або `dangerouslyAllowNameMatching`):
|
||||
|
||||
- `requireMention`
|
||||
- `users` (allowlist)
|
||||
@ -538,21 +538,21 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Потоки, сесії та теги відповідей
|
||||
## Гілки, сесії та теги відповідей
|
||||
|
||||
- DM маршрутизуються як `direct`; канали як `channel`; MPIM як `group`.
|
||||
- Із типовим `session.dmScope=main` DM Slack згортаються до основної сесії агента.
|
||||
- З типовим `session.dmScope=main` DM Slack згортаються до головної сесії агента.
|
||||
- Сесії каналів: `agent:<agentId>:slack:channel:<channelId>`.
|
||||
- Відповіді в потоках можуть створювати суфікси сесій потоків (`:thread:<threadTs>`), коли це застосовно.
|
||||
- Відповіді в гілках можуть створювати суфікси сесій гілок (`:thread:<threadTs>`), коли це застосовно.
|
||||
- Типове значення `channels.slack.thread.historyScope` — `thread`; типове значення `thread.inheritParent` — `false`.
|
||||
- `channels.slack.thread.initialHistoryLimit` керує кількістю наявних повідомлень потоку, які отримуються під час запуску нової сесії потоку (за замовчуванням `20`; задайте `0`, щоб вимкнути).
|
||||
- `channels.slack.thread.requireExplicitMention` (за замовчуванням `false`): коли `true`, пригнічує неявні згадки в потоках, щоб бот відповідав лише на явні згадки `@bot` усередині потоків, навіть якщо бот уже брав участь у потоці. Без цього відповіді в потоці, де брав участь бот, обходять обмеження `requireMention`.
|
||||
- `channels.slack.thread.initialHistoryLimit` керує кількістю наявних повідомлень гілки, які отримуються під час запуску нової сесії гілки (за замовчуванням `20`; задайте `0`, щоб вимкнути).
|
||||
- `channels.slack.thread.requireExplicitMention` (за замовчуванням `false`): коли `true`, пригнічує неявні згадки в гілці, щоб бот відповідав лише на явні згадки `@bot` у гілках, навіть якщо бот уже брав участь у гілці. Без цього відповіді в гілці, де брав участь бот, обходять шлюз `requireMention`.
|
||||
|
||||
Керування потоками відповідей:
|
||||
Елементи керування відповідями в гілках:
|
||||
|
||||
- `channels.slack.replyToMode`: `off|first|all|batched` (за замовчуванням `off`)
|
||||
- `channels.slack.replyToModeByChatType`: для кожного `direct|group|channel`
|
||||
- застарілий запасний варіант для прямих чатів: `channels.slack.dm.replyToMode`
|
||||
- застарілий fallback для прямих чатів: `channels.slack.dm.replyToMode`
|
||||
|
||||
Підтримуються ручні теги відповідей:
|
||||
|
||||
@ -560,45 +560,45 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
- `[[reply_to:<id>]]`
|
||||
|
||||
<Note>
|
||||
`replyToMode="off"` вимикає **всі** потоки відповідей у Slack, зокрема явні теги `[[reply_to_*]]`. Це відрізняється від Telegram, де явні теги й надалі враховуються в режимі `"off"`. Потоки Slack приховують повідомлення з каналу, тоді як відповіді Telegram залишаються видимими в рядку.
|
||||
`replyToMode="off"` вимикає **всі** відповіді в гілках у Slack, включно з явними тегами `[[reply_to_*]]`. Це відрізняється від Telegram, де явні теги й надалі враховуються в режимі `"off"`. Гілки Slack приховують повідомлення з каналу, тоді як відповіді Telegram залишаються видимими inline.
|
||||
</Note>
|
||||
|
||||
## Реакції підтвердження
|
||||
## Ack-реакції
|
||||
|
||||
`ackReaction` надсилає емодзі підтвердження, поки OpenClaw обробляє вхідне повідомлення.
|
||||
|
||||
Порядок розпізнавання:
|
||||
Порядок розв’язання:
|
||||
|
||||
- `channels.slack.accounts.<accountId>.ackReaction`
|
||||
- `channels.slack.ackReaction`
|
||||
- `messages.ackReaction`
|
||||
- запасний емодзі ідентичності агента (`agents.list[].identity.emoji`, інакше "👀")
|
||||
- fallback емодзі ідентичності агента (`agents.list[].identity.emoji`, інакше "👀")
|
||||
|
||||
Примітки:
|
||||
|
||||
- Slack очікує shortcode (наприклад, `"eyes"`).
|
||||
- Slack очікує shortcodes (наприклад `"eyes"`).
|
||||
- Використовуйте `""`, щоб вимкнути реакцію для облікового запису Slack або глобально.
|
||||
|
||||
## Потокове передавання тексту
|
||||
## Текстовий streaming
|
||||
|
||||
`channels.slack.streaming` керує поведінкою live preview:
|
||||
|
||||
- `off`: вимкнути потокове передавання live preview.
|
||||
- `partial` (за замовчуванням): замінювати текст preview найновішим частковим виводом.
|
||||
- `block`: додавати chunked-оновлення preview.
|
||||
- `progress`: показувати текст статусу прогресу під час генерації, потім надсилати фінальний текст.
|
||||
- `streaming.preview.toolProgress`: коли draft preview активний, спрямовувати оновлення інструментів/прогресу в те саме редаговане повідомлення preview (за замовчуванням: `true`). Задайте `false`, щоб залишати окремі повідомлення інструментів/прогресу.
|
||||
- `off`: вимкнути streaming live preview.
|
||||
- `partial` (за замовчуванням): замінювати текст попереднього перегляду найновішим частковим виводом.
|
||||
- `block`: додавати chunked-оновлення попереднього перегляду.
|
||||
- `progress`: показувати текст статусу прогресу під час генерації, а потім надсилати фінальний текст.
|
||||
- `streaming.preview.toolProgress`: коли активний чернетковий попередній перегляд, спрямовує оновлення інструментів/прогресу в те саме редаговане повідомлення попереднього перегляду (за замовчуванням: `true`). Задайте `false`, щоб зберігати окремі повідомлення інструментів/прогресу.
|
||||
|
||||
`channels.slack.streaming.nativeTransport` керує нативним потоковим передаванням тексту Slack, коли `channels.slack.streaming.mode` дорівнює `partial` (за замовчуванням: `true`).
|
||||
`channels.slack.streaming.nativeTransport` керує нативним текстовим streaming Slack, коли `channels.slack.streaming.mode` дорівнює `partial` (за замовчуванням: `true`).
|
||||
|
||||
- Для появи нативного потокового передавання тексту та статусу потоку асистента Slack має бути доступний потік відповідей. Вибір потоку й надалі відповідає `replyToMode`.
|
||||
- Кореневі повідомлення каналів і групових чатів усе ще можуть використовувати звичайний draft preview, коли нативне потокове передавання недоступне.
|
||||
- DM Slack верхнього рівня за замовчуванням залишаються поза потоком, тому вони не показують preview у стилі потоку; використовуйте відповіді в потоках або `typingReaction`, якщо хочете мати там видимий прогрес.
|
||||
- Медіа та нетекстові payload повертаються до звичайної доставки.
|
||||
- Фінальні медіа/помилки скасовують очікувані редагування preview; придатні фінальні текстові/block-відповіді скидаються лише тоді, коли можуть редагувати preview на місці.
|
||||
- Якщо потокове передавання завершується помилкою посеред відповіді, OpenClaw повертається до звичайної доставки для решти payload.
|
||||
- Для появи нативного текстового streaming і статусу гілки Slack assistant має бути доступна гілка відповіді. Вибір гілки й надалі дотримується `replyToMode`.
|
||||
- Корені каналів і групових чатів можуть і надалі використовувати звичайний чернетковий попередній перегляд, коли нативний streaming недоступний.
|
||||
- DM Slack верхнього рівня за замовчуванням залишаються поза гілками, тому не показують попередній перегляд у стилі гілки; використовуйте відповіді в гілці або `typingReaction`, якщо хочете бачити там видимий прогрес.
|
||||
- Медіа та нетекстові payload-и повертаються до звичайної доставки.
|
||||
- Фінальні медіа/помилки скасовують очікувані редагування попереднього перегляду; придатні фінальні текстові/block-повідомлення скидаються лише коли можуть редагувати попередній перегляд на місці.
|
||||
- Якщо streaming завершується помилкою посеред відповіді, OpenClaw повертається до звичайної доставки для решти payload-ів.
|
||||
|
||||
Використовуйте draft preview замість нативного потокового передавання тексту Slack:
|
||||
Використовуйте чернетковий попередній перегляд замість нативного текстового streaming Slack:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -619,37 +619,37 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
- boolean `channels.slack.streaming` автоматично мігрується до `channels.slack.streaming.mode` і `channels.slack.streaming.nativeTransport`.
|
||||
- застарілий `channels.slack.nativeStreaming` автоматично мігрується до `channels.slack.streaming.nativeTransport`.
|
||||
|
||||
## Запасна реакція набору тексту
|
||||
## Fallback реакції набору тексту
|
||||
|
||||
`typingReaction` додає тимчасову реакцію до вхідного повідомлення Slack, поки OpenClaw обробляє відповідь, а потім видаляє її після завершення запуску. Це найкорисніше поза відповідями в потоках, які використовують типовий індикатор статусу "is typing...".
|
||||
`typingReaction` додає тимчасову реакцію до вхідного повідомлення Slack, поки OpenClaw обробляє відповідь, а потім видаляє її після завершення запуску. Це найкорисніше поза відповідями в гілках, які використовують типовий індикатор статусу "is typing...".
|
||||
|
||||
Порядок розпізнавання:
|
||||
Порядок розв’язання:
|
||||
|
||||
- `channels.slack.accounts.<accountId>.typingReaction`
|
||||
- `channels.slack.typingReaction`
|
||||
|
||||
Примітки:
|
||||
|
||||
- Slack очікує shortcode (наприклад, `"hourglass_flowing_sand"`).
|
||||
- Реакція виконується best-effort, а очищення автоматично виконується після завершення відповіді або шляху помилки.
|
||||
- Slack очікує shortcodes (наприклад `"hourglass_flowing_sand"`).
|
||||
- Реакція виконується best-effort, а cleanup автоматично виконується після завершення відповіді або шляху помилки.
|
||||
|
||||
## Медіа, поділ на частини та доставка
|
||||
## Медіа, chunking і доставка
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Вхідні вкладення">
|
||||
Файлові вкладення Slack завантажуються з приватних URL, розміщених у Slack (потік запитів з автентифікацією токеном), і записуються до сховища медіа, коли отримання успішне й обмеження розміру це дозволяють. Заповнювачі файлів містять Slack `fileId`, щоб агенти могли отримати оригінальний файл через `download-file`.
|
||||
Вкладення файлів Slack завантажуються з приватних URL, розміщених у Slack (потік запиту з автентифікацією токеном), і записуються до сховища медіа, коли отримання успішне й обмеження розміру це дозволяють. Заповнювачі файлів включають `fileId` Slack, щоб агенти могли отримати оригінальний файл через `download-file`.
|
||||
|
||||
Завантаження використовують обмежені тайм-аути бездіяльності та загальні тайм-аути. Якщо отримання файлу Slack зависає або завершується помилкою, OpenClaw продовжує обробляти повідомлення й повертається до заповнювача файлу.
|
||||
Завантаження використовують обмежені idle-таймаути й загальні таймаути. Якщо отримання файлу Slack зависає або завершується помилкою, OpenClaw продовжує обробляти повідомлення й повертається до заповнювача файла.
|
||||
|
||||
Типове обмеження розміру вхідних даних у середовищі виконання — `20MB`, якщо його не перевизначено через `channels.slack.mediaMaxMb`.
|
||||
Runtime-ліміт розміру вхідних даних за замовчуванням становить `20MB`, якщо його не перевизначено через `channels.slack.mediaMaxMb`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Вихідний текст і файли">
|
||||
- текстові частини використовують `channels.slack.textChunkLimit` (за замовчуванням 4000)
|
||||
- текстові chunks використовують `channels.slack.textChunkLimit` (за замовчуванням 4000)
|
||||
- `channels.slack.chunkMode="newline"` вмикає поділ із пріоритетом абзаців
|
||||
- надсилання файлів використовує API завантаження Slack і може включати відповіді в потоках (`thread_ts`)
|
||||
- обмеження вихідних медіа відповідає `channels.slack.mediaMaxMb`, коли налаштовано; інакше надсилання в канал використовує типові значення MIME-kind із медіаконвеєра
|
||||
- надсилання файлів використовує API завантаження Slack і може включати відповіді в гілках (`thread_ts`)
|
||||
- ліміт вихідних медіа дотримується `channels.slack.mediaMaxMb`, коли налаштовано; інакше надсилання в канали використовує типові значення MIME-kind з медіаконвеєра
|
||||
|
||||
</Accordion>
|
||||
|
||||
@ -659,14 +659,14 @@ OpenClaw за замовчуванням установлює для клієн
|
||||
- `user:<id>` для DM
|
||||
- `channel:<id>` для каналів
|
||||
|
||||
DM Slack відкриваються через API розмов Slack під час надсилання до цілей користувача.
|
||||
DM Slack відкриваються через API розмов Slack під час надсилання до цілей користувачів.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Команди та поведінка slash
|
||||
## Команди та slash-поведінка
|
||||
|
||||
Slash-команди відображаються в Slack або як одна налаштована команда, або як кілька нативних команд. Налаштуйте `channels.slack.slashCommand`, щоб змінити типові параметри команди:
|
||||
Slash-команди з’являються в Slack як одна налаштована команда або кілька нативних команд. Налаштуйте `channels.slack.slashCommand`, щоб змінити типові параметри команд:
|
||||
|
||||
- `enabled: false`
|
||||
- `name: "openclaw"`
|
||||
@ -677,7 +677,7 @@ Slash-команди відображаються в Slack або як одна
|
||||
/openclaw /help
|
||||
```
|
||||
|
||||
Нативні команди вимагають [додаткових налаштувань маніфесту](#additional-manifest-settings) у вашому застосунку Slack і натомість вмикаються через `channels.slack.commands.native: true` або `commands.native: true` у глобальних конфігураціях.
|
||||
Нативні команди потребують [додаткових параметрів маніфесту](#additional-manifest-settings) у вашому застосунку Slack і натомість вмикаються через `channels.slack.commands.native: true` або `commands.native: true` у глобальних конфігураціях.
|
||||
|
||||
- Автоматичний режим нативних команд **вимкнено** для Slack, тому `commands.native: "auto"` не вмикає нативні команди Slack.
|
||||
|
||||
@ -685,22 +685,22 @@ Slash-команди відображаються в Slack або як одна
|
||||
/help
|
||||
```
|
||||
|
||||
Нативні меню аргументів використовують адаптивну стратегію рендерингу, яка показує модальне підтвердження перед надсиланням вибраного значення опції:
|
||||
Меню нативних аргументів використовують адаптивну стратегію рендерингу, яка показує модальне підтвердження перед відправленням вибраного значення опції:
|
||||
|
||||
- до 5 опцій: блоки кнопок
|
||||
- 6-100 опцій: статичне меню вибору
|
||||
- понад 100 опцій: зовнішній вибір з асинхронною фільтрацією опцій, коли доступні обробники опцій інтерактивності
|
||||
- перевищені обмеження Slack: закодовані значення опцій повертаються до кнопок
|
||||
- до 5 опцій: button blocks
|
||||
- 6-100 опцій: static select menu
|
||||
- понад 100 опцій: external select з async-фільтрацією опцій, коли доступні handlers опцій interactivity
|
||||
- перевищені ліміти Slack: закодовані значення опцій повертаються до buttons
|
||||
|
||||
```txt
|
||||
/think
|
||||
```
|
||||
|
||||
Slash-сесії використовують ізольовані ключі на кшталт `agent:<agentId>:slack:slash:<userId>` і й надалі маршрутизують виконання команд до цільової сесії розмови за допомогою `CommandTargetSessionKey`.
|
||||
Slash-сесії використовують ізольовані ключі, як-от `agent:<agentId>:slack:slash:<userId>`, і надалі маршрутизують виконання команд до цільової сесії розмови за допомогою `CommandTargetSessionKey`.
|
||||
|
||||
## Інтерактивні відповіді
|
||||
|
||||
Slack може рендерити створені агентом інтерактивні елементи керування відповідями, але ця функція за замовчуванням вимкнена.
|
||||
Slack може рендерити створені агентом елементи керування інтерактивними відповідями, але ця функція за замовчуванням вимкнена.
|
||||
|
||||
Увімкніть її глобально:
|
||||
|
||||
@ -716,7 +716,7 @@ Slack може рендерити створені агентом інтерак
|
||||
}
|
||||
```
|
||||
|
||||
Або увімкніть її лише для одного облікового запису Slack:
|
||||
Або ввімкніть її лише для одного облікового запису Slack:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -739,39 +739,39 @@ Slack може рендерити створені агентом інтерак
|
||||
- `[[slack_buttons: Approve:approve, Reject:reject]]`
|
||||
- `[[slack_select: Choose a target | Canary:canary, Production:production]]`
|
||||
|
||||
Ці директиви компілюються в Slack Block Kit і маршрутизують натискання або вибори назад через наявний шлях подій взаємодії Slack.
|
||||
Ці директиви компілюються у Slack Block Kit і маршрутизують кліки або вибори назад через наявний шлях подій взаємодії Slack.
|
||||
|
||||
Примітки:
|
||||
|
||||
- Це UI, специфічний для Slack. Інші канали не перетворюють директиви Slack Block Kit на власні системи кнопок.
|
||||
- Значення інтерактивних зворотних викликів є непрозорими токенами, згенерованими OpenClaw, а не необробленими значеннями, створеними агентом.
|
||||
- Якщо згенеровані інтерактивні блоки перевищували б обмеження Slack Block Kit, OpenClaw повертається до початкової текстової відповіді замість надсилання недійсного корисного навантаження блоків.
|
||||
- Це специфічний для Slack UI. Інші канали не перекладають директиви Slack Block Kit у власні системи кнопок.
|
||||
- Значення інтерактивних callback є непрозорими токенами, згенерованими OpenClaw, а не сирими значеннями, створеними агентом.
|
||||
- Якщо згенеровані інтерактивні блоки перевищили б ліміти Slack Block Kit, OpenClaw повертається до початкової текстової відповіді замість надсилання недійсного payload блоків.
|
||||
|
||||
## Схвалення Exec у Slack
|
||||
## Схвалення exec у Slack
|
||||
|
||||
Slack може працювати як нативний клієнт схвалень з інтерактивними кнопками й взаємодіями, замість повернення до вебінтерфейсу або термінала.
|
||||
Slack може працювати як нативний клієнт схвалень з інтерактивними кнопками та взаємодіями, замість повернення до Web UI або термінала.
|
||||
|
||||
- Схвалення Exec використовують `channels.slack.execApprovals.*` для нативної маршрутизації DM/каналу.
|
||||
- Схвалення Plugin все ще можуть вирішуватися через ту саму нативну для Slack поверхню кнопок, коли запит уже надходить у Slack, а вид ідентифікатора схвалення — `plugin:`.
|
||||
- Авторизація схвалювачів усе ще застосовується: лише користувачі, визначені як схвалювачі, можуть схвалювати або відхиляти запити через Slack.
|
||||
- Схвалення exec використовують `channels.slack.execApprovals.*` для нативної маршрутизації DM/каналу.
|
||||
- Схвалення Plugin усе ще можуть оброблятися через ту саму нативну для Slack поверхню кнопок, коли запит уже потрапляє в Slack і тип approval id є `plugin:`.
|
||||
- Авторизація схвалювача все ще застосовується: лише користувачі, визначені як схвалювачі, можуть схвалювати або відхиляти запити через Slack.
|
||||
|
||||
Це використовує ту саму спільну поверхню кнопок схвалення, що й інші канали. Коли `interactivity` увімкнено в налаштуваннях вашого застосунку Slack, запити на схвалення відображаються як кнопки Block Kit безпосередньо в розмові.
|
||||
Це використовує ту саму спільну поверхню кнопок схвалення, що й інші канали. Коли `interactivity` увімкнено в налаштуваннях вашої програми Slack, запити на схвалення відображаються як кнопки Block Kit безпосередньо в розмові.
|
||||
Коли ці кнопки присутні, вони є основним UX схвалення; OpenClaw
|
||||
має включати ручну команду `/approve` лише тоді, коли результат інструмента каже, що схвалення в чаті
|
||||
недоступні або ручне схвалення є єдиним шляхом.
|
||||
має включати ручну команду `/approve` лише тоді, коли результат інструмента каже, що схвалення
|
||||
в чаті недоступні або ручне схвалення є єдиним шляхом.
|
||||
|
||||
Шлях конфігурації:
|
||||
|
||||
- `channels.slack.execApprovals.enabled`
|
||||
- `channels.slack.execApprovals.approvers` (необов’язково; за можливості повертається до `commands.ownerAllowFrom`)
|
||||
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, типово: `dm`)
|
||||
- `channels.slack.execApprovals.approvers` (необов’язково; повертається до `commands.ownerAllowFrom`, коли можливо)
|
||||
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, стандартно: `dm`)
|
||||
- `agentFilter`, `sessionFilter`
|
||||
|
||||
Slack автоматично вмикає нативні схвалення exec, коли `enabled` не задано або має значення `"auto"` і принаймні один
|
||||
схвалювач визначається. Задайте `enabled: false`, щоб явно вимкнути Slack як нативний клієнт схвалень.
|
||||
Задайте `enabled: true`, щоб примусово ввімкнути нативні схвалення, коли схвалювачі визначаються.
|
||||
схвалювач визначається. Установіть `enabled: false`, щоб явно вимкнути Slack як нативний клієнт схвалень.
|
||||
Установіть `enabled: true`, щоб примусово ввімкнути нативні схвалення, коли схвалювачі визначаються.
|
||||
|
||||
Типова поведінка без явної конфігурації схвалень exec для Slack:
|
||||
Стандартна поведінка без явної конфігурації схвалення exec у Slack:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -781,7 +781,7 @@ Slack автоматично вмикає нативні схвалення exec
|
||||
}
|
||||
```
|
||||
|
||||
Явна нативна для Slack конфігурація потрібна лише тоді, коли ви хочете перевизначити схвалювачів, додати фільтри або
|
||||
Явна нативна для Slack конфігурація потрібна лише тоді, коли потрібно перевизначити схвалювачів, додати фільтри або
|
||||
увімкнути доставку в чат походження:
|
||||
|
||||
```json5
|
||||
@ -798,39 +798,39 @@ Slack автоматично вмикає нативні схвалення exec
|
||||
}
|
||||
```
|
||||
|
||||
Спільне переспрямування `approvals.exec` є окремим. Використовуйте його лише тоді, коли запити на схвалення exec також мають
|
||||
маршрутизуватися до інших чатів або явних позасмугових цілей. Спільне переспрямування `approvals.plugin` також
|
||||
окреме; нативні для Slack кнопки все ще можуть вирішувати схвалення Plugin, коли ці запити вже надходять
|
||||
Спільне перенаправлення `approvals.exec` є окремим. Використовуйте його лише тоді, коли запити на схвалення exec також мають
|
||||
маршрутизуватися в інші чати або явні позасмугові цілі. Спільне перенаправлення `approvals.plugin` також
|
||||
є окремим; нативні для Slack кнопки все ще можуть обробляти схвалення Plugin, коли ці запити вже потрапляють
|
||||
у Slack.
|
||||
|
||||
Same-chat `/approve` також працює в каналах Slack і DM, які вже підтримують команди. Див. [Схвалення Exec](/uk/tools/exec-approvals) для повної моделі переспрямування схвалень.
|
||||
Same-chat `/approve` також працює в каналах Slack і DM, які вже підтримують команди. Див. [Схвалення exec](/uk/tools/exec-approvals), щоб переглянути повну модель перенаправлення схвалень.
|
||||
|
||||
## Події та операційна поведінка
|
||||
|
||||
- Редагування/видалення повідомлень відображаються в системні події.
|
||||
- Трансляції в гілку (відповіді в гілці з "Also send to channel") обробляються як звичайні повідомлення користувача.
|
||||
- Трансляції тредів (відповіді в тредах "Also send to channel") обробляються як звичайні повідомлення користувачів.
|
||||
- Події додавання/видалення реакцій відображаються в системні події.
|
||||
- Події приєднання/виходу учасника, створення/перейменування каналу та додавання/видалення закріплення відображаються в системні події.
|
||||
- `channel_id_changed` може мігрувати ключі конфігурації каналу, коли `configWrites` увімкнено.
|
||||
- Метадані теми/призначення каналу розглядаються як ненадійний контекст і можуть бути впроваджені в контекст маршрутизації.
|
||||
- Стартове повідомлення гілки та початкове засівання контексту історії гілки фільтруються налаштованими списками дозволених відправників, коли це застосовно.
|
||||
- Дії блоків і модальні взаємодії створюють структуровані системні події `Slack interaction: ...` із багатими полями корисного навантаження:
|
||||
- дії блоків: вибрані значення, мітки, значення вибирачів і метадані `workflow_*`
|
||||
- події modal `view_submission` і `view_closed` із маршрутизованими метаданими каналу та введеними даними форми
|
||||
- `channel_id_changed` може переносити ключі конфігурації каналу, коли `configWrites` увімкнено.
|
||||
- Метадані теми/призначення каналу вважаються недовіреним контекстом і можуть бути впроваджені в контекст маршрутизації.
|
||||
- Автор треду та початкове наповнення контексту історією треду фільтруються налаштованими allowlist відправників, коли це застосовно.
|
||||
- Дії блоків і модальні взаємодії породжують структуровані системні події `Slack interaction: ...` з багатими полями payload:
|
||||
- дії блоків: вибрані значення, мітки, значення picker і метадані `workflow_*`
|
||||
- події модальних `view_submission` і `view_closed` з метаданими маршрутизованого каналу та введеннями форми
|
||||
|
||||
## Довідник конфігурації
|
||||
|
||||
Основний довідник: [Довідник конфігурації - Slack](/uk/gateway/config-channels#slack).
|
||||
|
||||
<Accordion title="Високосигнальні поля Slack">
|
||||
<Accordion title="Важливі поля Slack">
|
||||
|
||||
- режим/автентифікація: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
|
||||
- mode/auth: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
|
||||
- доступ до DM: `dm.enabled`, `dmPolicy`, `allowFrom` (застаріле: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
|
||||
- перемикач сумісності: `dangerouslyAllowNameMatching` (аварійний режим; тримайте вимкненим, якщо не потрібно)
|
||||
- перемикач сумісності: `dangerouslyAllowNameMatching` (break-glass; тримайте вимкненим, якщо не потрібно)
|
||||
- доступ до каналу: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention`
|
||||
- гілки/історія: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
|
||||
- треди/історія: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
|
||||
- доставка: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`, `streaming.preview.toolProgress`
|
||||
- операції/функції: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
|
||||
- ops/функції: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
|
||||
|
||||
</Accordion>
|
||||
|
||||
@ -841,9 +841,9 @@ Same-chat `/approve` також працює в каналах Slack і DM, як
|
||||
Перевірте по черзі:
|
||||
|
||||
- `groupPolicy`
|
||||
- список дозволених каналів (`channels.slack.channels`)
|
||||
- allowlist каналу (`channels.slack.channels`)
|
||||
- `requireMention`
|
||||
- поканальний список дозволених `users`
|
||||
- allowlist `users` для окремого каналу
|
||||
|
||||
Корисні команди:
|
||||
|
||||
@ -860,9 +860,9 @@ openclaw doctor
|
||||
|
||||
- `channels.slack.dm.enabled`
|
||||
- `channels.slack.dmPolicy` (або застаріле `channels.slack.dm.policy`)
|
||||
- схвалення сполучення / записи списку дозволених
|
||||
- схвалення pairings / записи allowlist
|
||||
- події Slack Assistant DM: докладні журнали зі згадкою `drop message_changed`
|
||||
зазвичай означають, що Slack надіслав відредаговану подію гілки Assistant без
|
||||
зазвичай означають, що Slack надіслав відредаговану подію Assistant-thread без
|
||||
відновлюваного людського відправника в метаданих повідомлення
|
||||
|
||||
```bash
|
||||
@ -872,51 +872,115 @@ openclaw pairing list slack
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Socket mode не підключається">
|
||||
Перевірте токени бота й застосунку та ввімкнення Socket Mode у налаштуваннях застосунку Slack.
|
||||
Перевірте токени bot + app і ввімкнення Socket Mode у налаштуваннях програми Slack.
|
||||
|
||||
Якщо `openclaw channels status --probe --json` показує `botTokenStatus` або
|
||||
`appTokenStatus: "configured_unavailable"`, обліковий запис Slack
|
||||
налаштовано, але поточне середовище виконання не змогло визначити
|
||||
значення на основі SecretRef.
|
||||
налаштовано, але поточний runtime не зміг визначити значення, підкріплене SecretRef.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="HTTP mode не отримує події">
|
||||
Перевірте:
|
||||
|
||||
- секрет підпису
|
||||
- шлях Webhook
|
||||
- signing secret
|
||||
- шлях webhook
|
||||
- Slack Request URLs (Events + Interactivity + Slash Commands)
|
||||
- унікальний `webhookPath` для кожного HTTP-облікового запису
|
||||
|
||||
Якщо `signingSecretStatus: "configured_unavailable"` з’являється у знімках
|
||||
облікового запису, HTTP-обліковий запис налаштовано, але поточне середовище виконання не змогло
|
||||
визначити секрет підпису на основі SecretRef.
|
||||
Якщо `signingSecretStatus: "configured_unavailable"` з’являється в snapshots
|
||||
облікового запису, HTTP-обліковий запис налаштовано, але поточний runtime не зміг
|
||||
визначити signing secret, підкріплений SecretRef.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Нативні/slash-команди не спрацьовують">
|
||||
<Accordion title="Native/slash команди не спрацьовують">
|
||||
Перевірте, що саме ви мали на увазі:
|
||||
|
||||
- режим нативних команд (`channels.slack.commands.native: true`) з відповідними slash-командами, зареєстрованими в Slack
|
||||
- нативний режим команд (`channels.slack.commands.native: true`) з відповідними slash-командами, зареєстрованими в Slack
|
||||
- або режим однієї slash-команди (`channels.slack.slashCommand.enabled: true`)
|
||||
|
||||
Також перевірте `commands.useAccessGroups` і списки дозволених каналів/користувачів.
|
||||
Також перевірте `commands.useAccessGroups` і allowlist каналів/користувачів.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Довідник щодо vision для вкладень
|
||||
|
||||
Slack може прикріплювати завантажені медіа до ходу агента, коли завантаження файлів Slack успішні й ліміти розміру це дозволяють. Файли зображень можуть передаватися через шлях розуміння медіа або безпосередньо до моделі відповіді з підтримкою vision; інші файли зберігаються як завантажуваний файловий контекст, а не обробляються як вхідні зображення.
|
||||
|
||||
### Підтримувані типи медіа
|
||||
|
||||
| Тип медіа | Джерело | Поточна поведінка | Примітки |
|
||||
| ------------------------------ | -------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
|
||||
| Зображення JPEG / PNG / GIF / WebP | URL файлу Slack | Завантажується та прикріплюється до ходу для обробки з підтримкою vision | Ліміт на файл: `channels.slack.mediaMaxMb` (стандартно 20 MB) |
|
||||
| Файли PDF | URL файлу Slack | Завантажується і надається як файловий контекст для інструментів, таких як `download-file` або `pdf` | Вхідний потік Slack не перетворює PDF на вхід image-vision автоматично |
|
||||
| Інші файли | URL файлу Slack | Завантажуються, коли можливо, і надаються як файловий контекст | Бінарні файли не обробляються як вхідні зображення |
|
||||
| Відповіді в треді | Файли автора треду | Файли кореневого повідомлення можуть бути завантажені як контекст, коли відповідь не має прямих медіа | Автори лише з файлами використовують placeholder вкладення |
|
||||
| Повідомлення з кількома зображеннями | Кілька файлів Slack | Кожен файл оцінюється незалежно | Обробка Slack обмежена вісьмома файлами на повідомлення |
|
||||
|
||||
### Вхідний pipeline
|
||||
|
||||
Коли надходить повідомлення Slack із файловими вкладеннями:
|
||||
|
||||
1. OpenClaw завантажує файл із приватного URL Slack, використовуючи токен bot (`xoxb-...`).
|
||||
2. Файл успішно записується до media store.
|
||||
3. Шляхи завантажених медіа та типи вмісту додаються до вхідного контексту.
|
||||
4. Шляхи моделі/інструмента з підтримкою зображень можуть використовувати вкладення зображень із цього контексту.
|
||||
5. Файли, що не є зображеннями, залишаються доступними як файлові метадані або медіапосилання для інструментів, які можуть їх обробляти.
|
||||
|
||||
### Успадкування вкладень кореня треду
|
||||
|
||||
Коли повідомлення надходить у треді (має батьківський `thread_ts`):
|
||||
|
||||
- Якщо сама відповідь не має прямих медіа, а включене кореневе повідомлення має файли, Slack може завантажити кореневі файли як контекст автора треду.
|
||||
- Прямі вкладення відповіді мають пріоритет над вкладеннями кореневого повідомлення.
|
||||
- Кореневе повідомлення, яке має лише файли й не має тексту, представляється placeholder вкладення, щоб fallback усе ще міг включити його файли.
|
||||
|
||||
### Обробка кількох вкладень
|
||||
|
||||
Коли одне повідомлення Slack містить кілька файлових вкладень:
|
||||
|
||||
- Кожне вкладення обробляється незалежно через media pipeline.
|
||||
- Посилання на завантажені медіа агрегуються в контекст повідомлення.
|
||||
- Порядок обробки відповідає порядку файлів Slack у payload події.
|
||||
- Збій завантаження одного вкладення не блокує інші.
|
||||
|
||||
### Ліміти розміру, завантаження та моделі
|
||||
|
||||
- **Ліміт розміру**: стандартно 20 MB на файл. Налаштовується через `channels.slack.mediaMaxMb`.
|
||||
- **Збої завантаження**: файли, які Slack не може надати, URL із простроченим терміном дії, недоступні файли, надто великі файли та HTML-відповіді Slack auth/login пропускаються замість повідомлення як непідтримувані формати.
|
||||
- **Vision модель**: аналіз зображень використовує активну модель відповіді, коли вона підтримує vision, або модель зображень, налаштовану в `agents.defaults.imageModel`.
|
||||
|
||||
### Відомі обмеження
|
||||
|
||||
| Сценарій | Поточна поведінка | Обхідний шлях |
|
||||
| -------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
|
||||
| URL файлу Slack із простроченим терміном дії | Файл пропущено; помилка не показується | Повторно завантажте файл у Slack |
|
||||
| Vision модель не налаштована | Вкладення зображень зберігаються як медіапосилання, але не аналізуються як зображення | Налаштуйте `agents.defaults.imageModel` або використовуйте модель відповіді з підтримкою vision |
|
||||
| Дуже великі зображення (> 20 MB стандартно) | Пропускаються відповідно до ліміту розміру | Збільште `channels.slack.mediaMaxMb`, якщо Slack дозволяє |
|
||||
| Переслані/поширені вкладення | Текст і розміщені в Slack медіа зображень/файлів обробляються за принципом best-effort | Повторно поділіться безпосередньо в треді OpenClaw |
|
||||
| PDF-вкладення | Зберігаються як файловий/медіаконтекст, не маршрутизуються автоматично через image vision | Використовуйте `download-file` для файлових метаданих або інструмент `pdf` для аналізу PDF |
|
||||
|
||||
### Пов’язана документація
|
||||
|
||||
- [Конвеєр розуміння медіа](/uk/nodes/media-understanding)
|
||||
- [Інструмент PDF](/uk/tools/pdf)
|
||||
- Епік: [#51349](https://github.com/openclaw/openclaw/issues/51349) — увімкнення візуального аналізу вкладень Slack
|
||||
- Регресійні тести: [#51353](https://github.com/openclaw/openclaw/issues/51353)
|
||||
- Перевірка в реальному середовищі: [#51354](https://github.com/openclaw/openclaw/issues/51354)
|
||||
|
||||
## Пов’язане
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Сполучення" icon="link" href="/uk/channels/pairing">
|
||||
Сполучіть користувача Slack із gateway.
|
||||
Сполучіть користувача Slack зі шлюзом.
|
||||
</Card>
|
||||
<Card title="Групи" icon="users" href="/uk/channels/groups">
|
||||
Поведінка каналу та групового DM.
|
||||
Поведінка каналів і групових особистих повідомлень.
|
||||
</Card>
|
||||
<Card title="Маршрутизація каналів" icon="route" href="/uk/channels/channel-routing">
|
||||
Маршрутизуйте вхідні повідомлення до агентів.
|
||||
Спрямовуйте вхідні повідомлення агентам.
|
||||
</Card>
|
||||
<Card title="Безпека" icon="shield" href="/uk/gateway/security">
|
||||
Модель загроз і посилення захисту.
|
||||
|
||||
@ -6,10 +6,10 @@ sidebarTitle: Control UI
|
||||
summary: Браузерний інтерфейс керування для Gateway (чат, вузли, конфігурація)
|
||||
title: Інтерфейс керування
|
||||
x-i18n:
|
||||
generated_at: "2026-04-28T11:29:12Z"
|
||||
generated_at: "2026-04-29T03:16:24Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 1ebfb9ade82821cfb1fbbb15cea95e23581856d8eafa87bd43883ebf699819c9
|
||||
source_hash: 4e8b3d8b346748a6fb1112d7c6e53e8ca7a87d1d974fcd44772997393c395c08
|
||||
source_path: web/control-ui.md
|
||||
workflow: 16
|
||||
---
|
||||
@ -17,13 +17,13 @@ x-i18n:
|
||||
Інтерфейс керування — це невеликий односторінковий застосунок **Vite + Lit**, який обслуговується Gateway:
|
||||
|
||||
- типово: `http://<host>:18789/`
|
||||
- необов’язковий префікс: задайте `gateway.controlUi.basePath` (наприклад, `/openclaw`)
|
||||
- необов'язковий префікс: задайте `gateway.controlUi.basePath` (наприклад, `/openclaw`)
|
||||
|
||||
Він взаємодіє **безпосередньо з Gateway WebSocket** на тому самому порту.
|
||||
|
||||
## Швидке відкриття (локально)
|
||||
|
||||
Якщо Gateway запущено на тому самому комп’ютері, відкрийте:
|
||||
Якщо Gateway запущено на тому самому комп'ютері, відкрийте:
|
||||
|
||||
- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (або [http://localhost:18789/](http://localhost:18789/))
|
||||
|
||||
@ -36,115 +36,115 @@ x-i18n:
|
||||
- заголовки ідентичності Tailscale Serve, коли `gateway.auth.allowTailscale: true`
|
||||
- заголовки ідентичності довіреного проксі, коли `gateway.auth.mode: "trusted-proxy"`
|
||||
|
||||
Панель налаштувань дашборда зберігає токен для поточного сеансу вкладки браузера та вибраної URL-адреси Gateway; паролі не зберігаються. Під час онбордингу зазвичай створюється токен Gateway для автентифікації зі спільним секретом під час першого підключення, але автентифікація паролем також працює, коли `gateway.auth.mode` має значення `"password"`.
|
||||
Панель налаштувань дашборда зберігає токен для поточного сеансу вкладки браузера та вибраної URL-адреси Gateway; паролі не зберігаються. Онбординг зазвичай створює токен Gateway для автентифікації зі спільним секретом під час першого підключення, але автентифікація паролем також працює, коли `gateway.auth.mode` має значення `"password"`.
|
||||
|
||||
## Сполучення пристрою (перше підключення)
|
||||
## Спарювання пристрою (перше підключення)
|
||||
|
||||
Коли ви підключаєтеся до інтерфейсу керування з нового браузера або пристрою, Gateway зазвичай вимагає **одноразового підтвердження сполучення**. Це захід безпеки для запобігання несанкціонованому доступу.
|
||||
Коли ви підключаєтеся до інтерфейсу керування з нового браузера або пристрою, Gateway зазвичай вимагає **одноразового підтвердження спарювання**. Це захід безпеки для запобігання несанкціонованому доступу.
|
||||
|
||||
**Що ви побачите:** "disconnected (1008): pairing required"
|
||||
|
||||
<Steps>
|
||||
<Step title="Перелічити очікувані запити">
|
||||
<Step title="Список запитів в очікуванні">
|
||||
```bash
|
||||
openclaw devices list
|
||||
```
|
||||
</Step>
|
||||
<Step title="Схвалити за ID запиту">
|
||||
<Step title="Схвалення за ID запиту">
|
||||
```bash
|
||||
openclaw devices approve <requestId>
|
||||
```
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
Якщо браузер повторює спробу сполучення зі зміненими даними автентифікації (роль/області дії/публічний ключ), попередній очікуваний запит замінюється, і створюється новий `requestId`. Перед схваленням повторно виконайте `openclaw devices list`.
|
||||
Якщо браузер повторно пробує спарювання зі зміненими даними автентифікації (роль/області доступу/публічний ключ), попередній запит в очікуванні замінюється, і створюється новий `requestId`. Перед схваленням повторно виконайте `openclaw devices list`.
|
||||
|
||||
Якщо браузер уже сполучено, і ви змінюєте доступ із читання на запис/адміністрування, це розглядається як підвищення схвалення, а не як тихе повторне підключення. OpenClaw зберігає старе схвалення активним, блокує ширше повторне підключення й просить явно схвалити новий набір областей дії.
|
||||
Якщо браузер уже спарений і ви змінюєте його з доступу для читання на доступ для запису/адміністрування, це обробляється як підвищення схвалення, а не як тихе повторне підключення. OpenClaw залишає старе схвалення активним, блокує повторне підключення з ширшими правами та просить вас явно схвалити новий набір областей доступу.
|
||||
|
||||
Після схвалення пристрій запам’ятовується й не потребуватиме повторного схвалення, якщо ви не відкличете його за допомогою `openclaw devices revoke --device <id> --role <role>`. Див. [CLI пристроїв](/uk/cli/devices) щодо ротації та відкликання токенів.
|
||||
Після схвалення пристрій запам'ятовується й не потребуватиме повторного схвалення, якщо ви не відкличете його через `openclaw devices revoke --device <id> --role <role>`. Див. [CLI пристроїв](/uk/cli/devices) для ротації та відкликання токенів.
|
||||
|
||||
<Note>
|
||||
- Прямі браузерні підключення через local loopback (`127.0.0.1` / `localhost`) схвалюються автоматично.
|
||||
- Tailscale Serve може пропустити цикл сполучення для операторських сеансів інтерфейсу керування, коли `gateway.auth.allowTailscale: true`, ідентичність Tailscale перевірено, а браузер надає ідентичність свого пристрою.
|
||||
- Прямі прив’язки Tailnet, браузерні підключення через LAN і профілі браузера без ідентичності пристрою все одно потребують явного схвалення.
|
||||
- Кожен профіль браузера генерує унікальний ID пристрою, тож перемикання браузерів або очищення даних браузера вимагатиме повторного сполучення.
|
||||
- Tailscale Serve може пропускати цикл спарювання для операторських сеансів інтерфейсу керування, коли `gateway.auth.allowTailscale: true`, ідентичність Tailscale перевірена, а браузер надає ідентичність свого пристрою.
|
||||
- Прямі прив'язки Tailnet, підключення браузера через LAN і профілі браузера без ідентичності пристрою все одно потребують явного схвалення.
|
||||
- Кожен профіль браузера генерує унікальний ID пристрою, тому перемикання браузерів або очищення даних браузера вимагатиме повторного спарювання.
|
||||
|
||||
</Note>
|
||||
|
||||
## Особиста ідентичність (локальна для браузера)
|
||||
|
||||
Інтерфейс керування підтримує особисту ідентичність для кожного браузера (відображуване ім’я та аватар), яка додається до вихідних повідомлень для атрибуції у спільних сеансах. Вона зберігається в сховищі браузера, обмежена поточним профілем браузера й не синхронізується з іншими пристроями та не зберігається на сервері, окрім звичайних метаданих авторства стенограми для повідомлень, які ви фактично надсилаєте. Очищення даних сайту або перемикання браузерів скидає її до порожнього значення.
|
||||
Інтерфейс керування підтримує особисту ідентичність для кожного браузера (відображуване ім'я та аватар), яка додається до вихідних повідомлень для атрибуції у спільних сеансах. Вона зберігається у сховищі браузера, обмежена поточним профілем браузера й не синхронізується з іншими пристроями та не зберігається на сервері, окрім звичайних метаданих авторства транскрипту в повідомленнях, які ви фактично надсилаєте. Очищення даних сайту або перемикання браузерів скидає її до порожнього значення.
|
||||
|
||||
Такий самий локальний для браузера шаблон застосовується до перевизначення аватара асистента. Завантажені аватари асистента накладаються на ідентичність, визначену Gateway, лише в локальному браузері й ніколи не проходять туди й назад через `config.patch`. Спільне поле конфігурації `ui.assistant.avatar` усе ще доступне для не-UI клієнтів, які записують поле напряму (наприклад, скриптові Gateway або власні дашборди).
|
||||
Такий самий локальний для браузера шаблон застосовується до перевизначення аватара асистента. Завантажені аватари асистента накладаються на ідентичність, визначену Gateway, лише в локальному браузері й ніколи не проходять через `config.patch`. Спільне поле конфігурації `ui.assistant.avatar` все ще доступне для клієнтів не з UI, які записують це поле безпосередньо (наприклад, скриптових шлюзів або власних дашбордів).
|
||||
|
||||
## Ендпоінт конфігурації часу виконання
|
||||
## Ендпоінт конфігурації під час виконання
|
||||
|
||||
Інтерфейс керування отримує свої налаштування часу виконання з `/__openclaw/control-ui-config.json`. Цей ендпоінт захищено тією самою автентифікацією Gateway, що й решту HTTP-поверхні: неавтентифіковані браузери не можуть його отримати, а успішне отримання вимагає або вже чинного токена/пароля Gateway, ідентичності Tailscale Serve, або ідентичності довіреного проксі.
|
||||
Інтерфейс керування отримує свої налаштування під час виконання з `/__openclaw/control-ui-config.json`. Цей ендпоінт захищено тією самою автентифікацією Gateway, що й решту HTTP-поверхні: неавтентифіковані браузери не можуть його отримати, а успішне отримання потребує або вже чинного токена/пароля Gateway, ідентичності Tailscale Serve, або ідентичності довіреного проксі.
|
||||
|
||||
## Підтримка мов
|
||||
|
||||
Інтерфейс керування може локалізуватися під час першого завантаження на основі локалі вашого браузера. Щоб змінити це пізніше, відкрийте **Огляд -> Доступ до Gateway -> Мова**. Вибір локалі розташований у картці доступу до Gateway, а не в розділі зовнішнього вигляду.
|
||||
Інтерфейс керування може локалізуватися під час першого завантаження на основі локалі вашого браузера. Щоб перевизначити її пізніше, відкрийте **Огляд -> Доступ до Gateway -> Мова**. Вибір локалі розміщено в картці доступу до Gateway, а не в розділі вигляду.
|
||||
|
||||
- Підтримувані локалі: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `tr`, `uk`, `id`, `pl`, `th`
|
||||
- Переклади неанглійськими мовами ліниво завантажуються в браузері.
|
||||
- Вибрана локаль зберігається в сховищі браузера й повторно використовується під час майбутніх відвідувань.
|
||||
- Вибрана локаль зберігається у сховищі браузера та повторно використовується під час майбутніх відвідувань.
|
||||
- Відсутні ключі перекладу повертаються до англійської.
|
||||
|
||||
## Теми зовнішнього вигляду
|
||||
## Теми вигляду
|
||||
|
||||
Панель зовнішнього вигляду зберігає вбудовані теми Claw, Knot і Dash, а також один локальний для браузера слот імпорту tweakcn. Щоб імпортувати тему, відкрийте [теми tweakcn](https://tweakcn.com/themes), виберіть або створіть тему, натисніть **Поділитися** й вставте скопійоване посилання на тему в розділ зовнішнього вигляду. Імпортер також приймає URL-адреси реєстру `https://tweakcn.com/r/themes/<id>`, URL-адреси редактора на кшталт `https://tweakcn.com/editor/theme?theme=amethyst-haze`, відносні шляхи `/themes/<id>`, сирі ID тем і типові назви тем, як-от `amethyst-haze`.
|
||||
Панель вигляду містить вбудовані теми Claw, Knot і Dash, а також один локальний для браузера слот імпорту tweakcn. Щоб імпортувати тему, відкрийте [теми tweakcn](https://tweakcn.com/themes), виберіть або створіть тему, натисніть **Поділитися** та вставте скопійоване посилання на тему в розділ вигляду. Імпортер також приймає URL-адреси реєстру `https://tweakcn.com/r/themes/<id>`, URL-адреси редактора на кшталт `https://tweakcn.com/editor/theme?theme=amethyst-haze`, відносні шляхи `/themes/<id>`, сирі ID тем і типові назви тем, як-от `amethyst-haze`.
|
||||
|
||||
Імпортовані теми зберігаються лише в поточному профілі браузера. Вони не записуються в конфігурацію Gateway і не синхронізуються між пристроями. Заміна імпортованої теми оновлює один локальний слот; очищення перемикає активну тему назад на Claw, якщо було вибрано імпортовану тему.
|
||||
Імпортовані теми зберігаються лише в поточному профілі браузера. Вони не записуються в конфігурацію Gateway і не синхронізуються між пристроями. Заміна імпортованої теми оновлює один локальний слот; її очищення перемикає активну тему назад на Claw, якщо імпортовану тему було вибрано.
|
||||
|
||||
## Що він може робити (сьогодні)
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Чат і розмова">
|
||||
- Спілкуватися з моделлю через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
|
||||
- Розмовляти через браузерні realtime-сеанси. OpenAI використовує прямий WebRTC, Google Live використовує обмежений одноразовий браузерний токен через WebSocket, а Plugin для realtime-голосу лише на бекенді використовують ретрансляційний транспорт Gateway. Ретранслятор зберігає облікові дані провайдера на Gateway, поки браузер передає PCM з мікрофона через RPC `talk.realtime.relay*` і надсилає виклики інструмента `openclaw_agent_consult` назад через `chat.send` для більшої налаштованої моделі OpenClaw.
|
||||
- Потоково передавати виклики інструментів і live-картки виводу інструментів у чаті (події агента).
|
||||
- Спілкування з моделлю через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
|
||||
- Розмова через браузерні сеанси реального часу. OpenAI використовує прямий WebRTC, Google Live використовує обмежений одноразовий браузерний токен через WebSocket, а голосові plugins реального часу лише для бекенда використовують релейний транспорт Gateway. Релей зберігає облікові дані провайдера на Gateway, тоді як браузер транслює PCM з мікрофона через RPC `talk.realtime.relay*` і надсилає виклики інструмента `openclaw_agent_consult` назад через `chat.send` для більшої налаштованої моделі OpenClaw.
|
||||
- Потокове передавання викликів інструментів і карток живого виводу інструментів у чаті (події агента).
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Канали, екземпляри, сеанси, сни">
|
||||
- Канали: вбудовані плюс стан каналів bundled/external Plugin, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`).
|
||||
- Канали: вбудовані, а також статус каналів bundled/зовнішніх plugin, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`).
|
||||
- Екземпляри: список присутності + оновлення (`system-presence`).
|
||||
- Сеанси: список + перевизначення моделі/мислення/швидкого режиму/докладності/трасування/міркування для кожного сеансу (`sessions.list`, `sessions.patch`).
|
||||
- Сни: стан Dreaming, перемикач увімкнення/вимкнення та читач Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
|
||||
- Сни: статус dreaming, перемикач увімкнення/вимкнення та читач Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Cron, Skills, Node, схвалення exec">
|
||||
<Accordion title="Cron, skills, nodes, схвалення exec">
|
||||
- Завдання Cron: список/додавання/редагування/запуск/увімкнення/вимкнення + історія запусків (`cron.*`).
|
||||
- Skills: стан, увімкнення/вимкнення, встановлення, оновлення API-ключів (`skills.*`).
|
||||
- Node: список + можливості (`node.list`).
|
||||
- Схвалення exec: редагування allowlist Gateway або Node + політика запиту для `exec host=gateway/node` (`exec.approvals.*`).
|
||||
- Skills: статус, увімкнення/вимкнення, встановлення, оновлення API-ключів (`skills.*`).
|
||||
- Вузли: список + можливості (`node.list`).
|
||||
- Схвалення exec: редагування allowlist Gateway або вузла + політика запиту для `exec host=gateway/node` (`exec.approvals.*`).
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Конфігурація">
|
||||
- Перегляд/редагування `~/.openclaw/openclaw.json` (`config.get`, `config.set`).
|
||||
- Застосування + перезапуск із валідацією (`config.apply`) і пробудження останнього активного сеансу.
|
||||
- Записи містять захист базовим хешем, щоб запобігти перезапису паралельних редагувань.
|
||||
- Записи (`config.set`/`config.apply`/`config.patch`) виконують попередню перевірку розв’язання активних SecretRef для посилань у надісланому конфігураційному payload; нерозв’язані активні надіслані посилання відхиляються до запису.
|
||||
- Схема + рендеринг форми (`config.schema` / `config.schema.lookup`, включно з полями `title` / `description`, відповідними підказками UI, зведеннями безпосередніх дочірніх елементів, метаданими документації на вкладених вузлах object/wildcard/array/composition, а також схемами Plugin + каналів, коли доступні); редактор сирого JSON доступний лише тоді, коли знімок має безпечний сирий round-trip.
|
||||
- Якщо знімок не може безпечно виконати round-trip сирого тексту, інтерфейс керування примусово вмикає режим форми й вимикає сирий режим для цього знімка.
|
||||
- Команда редактора сирого JSON "Скинути до збереженого" зберігає сиро-авторську форму (форматування, коментарі, макет `$include`) замість повторного рендерингу сплощеного знімка, тож зовнішні редагування переживають скидання, коли знімок може безпечно виконати round-trip.
|
||||
- Структуровані об’єктні значення SecretRef відображаються лише для читання в текстових полях форми, щоб запобігти випадковому пошкодженню об’єкта в рядок.
|
||||
- Записи (`config.set`/`config.apply`/`config.patch`) попередньо перевіряють розв'язання активних SecretRef для посилань у надісланому payload конфігурації; нерозв'язані активні надіслані посилання відхиляються до запису.
|
||||
- Схема + рендеринг форми (`config.schema` / `config.schema.lookup`, включно з полями `title` / `description`, зіставленими підказками UI, зведеннями безпосередніх дочірніх елементів, метаданими документації на вкладених вузлах object/wildcard/array/composition, а також схемами plugin + каналів, коли доступні); редактор Raw JSON доступний лише тоді, коли знімок має безпечний raw round-trip.
|
||||
- Якщо знімок не може безпечно виконати raw round-trip тексту, інтерфейс керування примусово вмикає режим форми та вимикає raw-режим для цього знімка.
|
||||
- У редакторі Raw JSON "Скинути до збереженого" зберігає raw-створену форму (форматування, коментарі, структуру `$include`) замість повторного рендерингу сплющеного знімка, тож зовнішні редагування переживають скидання, коли знімок може безпечно виконати round-trip.
|
||||
- Структуровані об'єктні значення SecretRef рендеряться лише для читання в текстових полях форми, щоб запобігти випадковому пошкодженню об'єкта в рядок.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Налагодження, журнали, оновлення">
|
||||
- Налагодження: знімки стану/працездатності/моделей + журнал подій + ручні RPC-виклики (`status`, `health`, `models.list`).
|
||||
- Журнали: live-tail файлових журналів Gateway із фільтром/експортом (`logs.tail`).
|
||||
- Оновлення: запуск оновлення package/git + перезапуск (`update.run`) зі звітом про перезапуск, потім опитування `update.status` після повторного підключення для перевірки версії запущеного Gateway.
|
||||
- Налагодження: знімки статусу/здоров'я/моделей + журнал подій + ручні виклики RPC (`status`, `health`, `models.list`).
|
||||
- Журнали: живий tail файлових журналів Gateway із фільтром/експортом (`logs.tail`).
|
||||
- Оновлення: запуск оновлення package/git + перезапуск (`update.run`) зі звітом про перезапуск, потім опитування `update.status` після повторного підключення, щоб перевірити версію запущеного Gateway.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Примітки панелі завдань Cron">
|
||||
<Accordion title="Нотатки панелі завдань Cron">
|
||||
- Для ізольованих завдань доставка типово оголошує зведення. Ви можете перемкнути на none, якщо потрібні лише внутрішні запуски.
|
||||
- Поля каналу/цілі з’являються, коли вибрано оголошення.
|
||||
- Режим Webhook використовує `delivery.mode = "webhook"` із `delivery.to`, установленим на чинну HTTP(S) URL-адресу Webhook.
|
||||
- Для завдань основного сеансу доступні режими доставки Webhook і none.
|
||||
- Розширені елементи редагування включають видалення після запуску, очищення перевизначення агента, точні/ступінчасті параметри Cron, перевизначення моделі/мислення агента та best-effort перемикачі доставки.
|
||||
- Валідація форми вбудована з помилками на рівні полів; недійсні значення вимикають кнопку збереження, доки їх не буде виправлено.
|
||||
- Установіть `cron.webhookToken`, щоб надсилати виділений bearer-токен; якщо опущено, Webhook надсилається без заголовка автентифікації.
|
||||
- Застарілий fallback: збережені legacy-завдання з `notify: true` усе ще можуть використовувати `cron.webhook`, доки їх не буде мігровано.
|
||||
- Поля каналу/цілі з'являються, коли вибрано оголошення.
|
||||
- Режим Webhook використовує `delivery.mode = "webhook"` з `delivery.to`, заданим як чинна URL-адреса HTTP(S) webhook.
|
||||
- Для завдань основного сеансу доступні режими доставки webhook і none.
|
||||
- Розширені елементи керування редагуванням містять delete-after-run, очищення перевизначення агента, параметри cron exact/stagger, перевизначення моделі/мислення агента та перемикачі best-effort доставки.
|
||||
- Валідація форми виконується inline з помилками на рівні полів; некоректні значення вимикають кнопку збереження, доки їх не виправлено.
|
||||
- Задайте `cron.webhookToken`, щоб надсилати окремий bearer-токен; якщо його пропущено, webhook надсилається без заголовка автентифікації.
|
||||
- Застарілий fallback: збережені legacy-завдання з `notify: true` все ще можуть використовувати `cron.webhook`, доки їх не мігровано.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
@ -152,81 +152,81 @@ x-i18n:
|
||||
## Поведінка чату
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Семантика надсилання та історії">
|
||||
- `chat.send` є **неблокувальним**: він одразу підтверджує запит через `{ runId, status: "started" }`, а відповідь передається потоком через події `chat`.
|
||||
- Завантаження в чат приймають зображення та невідеофайли. Зображення зберігають нативний шлях до зображення; інші файли зберігаються як керовані медіа й показуються в історії як посилання на вкладення.
|
||||
- Повторне надсилання з тим самим `idempotencyKey` повертає `{ status: "in_flight" }` під час виконання та `{ status: "ok" }` після завершення.
|
||||
- Відповіді `chat.history` обмежуються за розміром для безпеки UI. Коли записи стенограми завеликі, Gateway може обрізати довгі текстові поля, пропускати важкі блоки метаданих і замінювати надмірно великі повідомлення заповнювачем (`[chat.history omitted: message too large]`).
|
||||
- Зображення від асистента або згенеровані зображення зберігаються як посилання на керовані медіа й повертаються через автентифіковані медіа-URL Gateway, тому перезавантаження не залежать від того, чи залишаються сирі base64-навантаження зображень у відповіді історії чату.
|
||||
- `chat.history` також вилучає з видимого тексту асистента вбудовані теги директив лише для відображення (наприклад, `[[reply_to_*]]` і `[[audio_as_voice]]`), текстові XML-навантаження викликів інструментів (зокрема `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` і обрізані блоки викликів інструментів), а також витеклі ASCII/повноширинні керівні токени моделі, і пропускає записи асистента, чий увесь видимий текст є лише точним тихим токеном `NO_REPLY` / `no_reply`.
|
||||
- Під час активного надсилання та фінального оновлення історії подання чату залишає видимими локальні оптимістичні повідомлення користувача/асистента, якщо `chat.history` на короткий час повертає старіший знімок; канонічна стенограма замінює ці локальні повідомлення, щойно історія Gateway наздоганяє.
|
||||
- `chat.inject` додає нотатку асистента до стенограми сеансу та транслює подію `chat` для оновлень лише в UI (без запуску агента, без доставки каналом).
|
||||
- Вибирачі моделі та режиму мислення в заголовку чату негайно змінюють активний сеанс через `sessions.patch`; це сталі перевизначення сеансу, а не параметри надсилання лише для одного ходу.
|
||||
- Вибирач моделі чату запитує налаштоване подання моделей Gateway. Якщо наявний `agents.defaults.models`, цей список дозволених моделей керує вибирачем. Інакше вибирач показує явні записи `models.providers.*.models`, перш ніж повернутися до повного каталогу для нових інсталяцій.
|
||||
- Коли свіжі звіти Gateway про використання сеансу показують високий тиск контексту, область композитора чату показує повідомлення про контекст, а на рекомендованих рівнях Compaction — кнопку ущільнення, яка запускає звичайний шлях Compaction сеансу. Застарілі знімки токенів приховуються, доки Gateway знову не повідомить свіже використання.
|
||||
<Accordion title="Семантика надсилання й історії">
|
||||
- `chat.send` є **неблокувальним**: він одразу підтверджує отримання через `{ runId, status: "started" }`, а відповідь передається потоково через події `chat`.
|
||||
- Завантаження в чат приймають зображення та невідеофайли. Зображення зберігають нативний шлях до зображення; інші файли зберігаються як керовані медіа та відображаються в історії як посилання-вкладення.
|
||||
- Повторне надсилання з тим самим `idempotencyKey` повертає `{ status: "in_flight" }`, доки виконання триває, і `{ status: "ok" }` після завершення.
|
||||
- Відповіді `chat.history` обмежені за розміром для безпеки UI. Коли записи транскрипту завеликі, Gateway може обрізати довгі текстові поля, пропускати великі блоки метаданих і замінювати надмірно великі повідомлення заповнювачем (`[chat.history omitted: message too large]`).
|
||||
- Зображення від асистента або згенеровані зображення зберігаються як керовані медіапосилання та повертаються через автентифіковані медіа-URL Gateway, тому перезавантаження не залежать від того, чи залишаються сирі base64-навантаження зображень у відповіді історії чату.
|
||||
- `chat.history` також прибирає з видимого тексту асистента лише-для-відображення вбудовані теги директив (наприклад, `[[reply_to_*]]` і `[[audio_as_voice]]`), текстові XML-навантаження викликів інструментів (зокрема `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` і обрізані блоки викликів інструментів), а також витоки ASCII/повноширинних керівних токенів моделі, і пропускає записи асистента, весь видимий текст яких є лише точним беззвучним токеном `NO_REPLY` / `no_reply`.
|
||||
- Під час активного надсилання та фінального оновлення історії подання чату залишає локальні оптимістичні повідомлення користувача/асистента видимими, якщо `chat.history` на мить повертає старіший знімок; канонічний транскрипт замінює ці локальні повідомлення, щойно історія Gateway наздоганяє.
|
||||
- `chat.inject` додає нотатку асистента до транскрипту сесії та транслює подію `chat` для оновлень лише UI (без запуску агента, без доставки в канал).
|
||||
- Перемикачі моделі й режиму мислення в заголовку чату негайно змінюють активну сесію через `sessions.patch`; це сталі перевизначення сесії, а не одноразові параметри надсилання.
|
||||
- Перемикач моделі чату запитує налаштоване подання моделей у Gateway. Якщо `agents.defaults.models` присутній, цей allowlist керує перемикачем. Інакше перемикач показує явні записи `models.providers.*.models`, перш ніж повертатися до повного каталогу для свіжих установлень.
|
||||
- Коли свіжі звіти використання сесії Gateway показують високий тиск контексту, область композитора чату показує повідомлення про контекст і, на рекомендованих рівнях Compaction, компактну кнопку, яка запускає звичайний шлях Compaction сесії. Застарілі знімки токенів приховані, доки Gateway знову не повідомить свіже використання.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Режим розмови (браузерний realtime)">
|
||||
Режим розмови використовує зареєстрованого realtime-провайдера голосу. Налаштуйте OpenAI через `talk.provider: "openai"` плюс `talk.providers.openai.apiKey` або налаштуйте Google через `talk.provider: "google"` плюс `talk.providers.google.apiKey`; конфігурацію realtime-провайдера голосових викликів усе ще можна повторно використати як резервну. Браузер ніколи не отримує стандартний API-ключ провайдера. OpenAI отримує ефемерний клієнтський секрет Realtime для WebRTC. Google Live отримує одноразовий обмежений токен автентифікації Live API для браузерного сеансу WebSocket, з інструкціями та деклараціями інструментів, зафіксованими в токені Gateway. Провайдери, які надають лише бекендний realtime-міст, працюють через ретрансляційний транспорт Gateway, тож облікові дані та сокети постачальника залишаються на сервері, а браузерне аудіо передається через автентифіковані RPC Gateway. Підказку сеансу Realtime збирає Gateway; `talk.realtime.session` не приймає надані викликачем перевизначення інструкцій.
|
||||
<Accordion title="Режим розмови (реальний час у браузері)">
|
||||
Режим розмови використовує зареєстрованого провайдера голосу реального часу. Налаштуйте OpenAI через `talk.provider: "openai"` разом із `talk.providers.openai.apiKey` або налаштуйте Google через `talk.provider: "google"` разом із `talk.providers.google.apiKey`; конфігурацію провайдера реального часу Voice Call усе ще можна повторно використати як резервну. Браузер ніколи не отримує стандартний API-ключ провайдера. OpenAI отримує ефемерний клієнтський секрет Realtime для WebRTC. Google Live отримує одноразовий обмежений токен авторизації Live API для браузерної WebSocket-сесії, з інструкціями та деклараціями інструментів, зафіксованими в токені Gateway. Провайдери, які надають лише серверний міст реального часу, працюють через relay-транспорт Gateway, тож облікові дані та сокети постачальника залишаються на сервері, а аудіо браузера проходить через автентифіковані RPC Gateway. Підказку Realtime-сесії збирає Gateway; `talk.realtime.session` не приймає перевизначення інструкцій від викликача.
|
||||
|
||||
У композиторі чату елемент керування розмовою — це кнопка з хвилями поруч із кнопкою диктування мікрофоном. Коли розмова починається, рядок стану композитора показує `Connecting Talk...`, потім `Talk live`, поки аудіо підключене, або `Asking OpenClaw...`, поки realtime-виклик інструмента консультується з налаштованою більшою моделлю через `chat.send`.
|
||||
У композиторі чату елемент керування розмовою — це кнопка з хвилями поруч із кнопкою диктування через мікрофон. Коли розмова починається, рядок стану композитора показує `Connecting Talk...`, потім `Talk live`, доки аудіо під'єднано, або `Asking OpenClaw...`, доки виклик інструмента реального часу звертається до налаштованої більшої моделі через `chat.send`.
|
||||
|
||||
Live smoke для супровідників: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` перевіряє браузерний обмін SDP WebRTC OpenAI, налаштування браузерного WebSocket Google Live з обмеженим токеном і браузерний адаптер ретрансляції Gateway з фальшивим медіа мікрофона. Команда друкує лише стан провайдера й не записує секрети в журнал.
|
||||
Maintainer live smoke: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` перевіряє обмін SDP WebRTC браузера OpenAI, налаштування браузерного WebSocket Google Live з обмеженим токеном і браузерний адаптер relay Gateway з фейковим мікрофонним медіа. Команда друкує лише статус провайдера й не записує секрети в журнал.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Зупинка та переривання">
|
||||
- Натисніть **Stop** (викликає `chat.abort`).
|
||||
- Поки запуск активний, звичайні наступні повідомлення стають у чергу. Натисніть **Steer** на повідомленні в черзі, щоб вставити це наступне повідомлення в поточний хід.
|
||||
- Поки запуск активний, звичайні подальші повідомлення стають у чергу. Натисніть **Steer** на повідомленні в черзі, щоб вставити це подальше повідомлення в поточний хід виконання.
|
||||
- Введіть `/stop` (або окремі фрази переривання, як-от `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`), щоб перервати поза основним потоком.
|
||||
- `chat.abort` підтримує `{ sessionKey }` (без `runId`), щоб перервати всі активні запуски для цього сеансу.
|
||||
- `chat.abort` підтримує `{ sessionKey }` (без `runId`), щоб перервати всі активні запуски для цієї сесії.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Збереження часткового результату після переривання">
|
||||
- Коли запуск перервано, частковий текст асистента все ще може показуватися в UI.
|
||||
- Gateway зберігає перерваний частковий текст асистента в історію стенограми, коли існує буферизований вивід.
|
||||
- Збережені записи містять метадані переривання, щоб споживачі стенограми могли відрізняти часткові результати переривання від звичайного виводу завершення.
|
||||
<Accordion title="Збереження часткових даних після переривання">
|
||||
- Коли запуск перервано, частковий текст асистента все ще може відображатися в UI.
|
||||
- Gateway зберігає перерваний частковий текст асистента в історію транскрипту, коли є буферизований вивід.
|
||||
- Збережені записи містять метадані переривання, щоб споживачі транскрипту могли відрізнити часткові результати переривання від звичайного завершеного виводу.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Установлення PWA та web push
|
||||
## Встановлення PWA та вебpush
|
||||
|
||||
Інтерфейс керування постачається з `manifest.webmanifest` і service worker, тому сучасні браузери можуть установити його як самостійну PWA. Web Push дає Gateway змогу будити встановлену PWA сповіщеннями, навіть коли вкладку або вікно браузера не відкрито.
|
||||
Control UI постачається з `manifest.webmanifest` і service worker, тому сучасні браузери можуть встановити його як автономний PWA. Вебpush дає Gateway змогу будити встановлений PWA сповіщеннями, навіть коли вкладка або вікно браузера не відкриті.
|
||||
|
||||
| Поверхня | Що вона робить |
|
||||
| ----------------------------------------------------- | ------------------------------------------------------------------ |
|
||||
| `ui/public/manifest.webmanifest` | Маніфест PWA. Браузери пропонують "Install app", щойно він стає доступним. |
|
||||
| `ui/public/sw.js` | Service worker, який обробляє події `push` і кліки сповіщень. |
|
||||
| `push/vapid-keys.json` (у каталозі стану OpenClaw) | Автоматично згенерована пара ключів VAPID для підписування Web Push-навантажень. |
|
||||
| `push/web-push-subscriptions.json` | Збережені кінцеві точки браузерних підписок. |
|
||||
| Поверхня | Що вона робить |
|
||||
| ----------------------------------------------------- | ---------------------------------------------------------------- |
|
||||
| `ui/public/manifest.webmanifest` | Маніфест PWA. Браузери пропонують "Install app", щойно він доступний. |
|
||||
| `ui/public/sw.js` | Service worker, який обробляє події `push` і натискання сповіщень. |
|
||||
| `push/vapid-keys.json` (у директорії стану OpenClaw) | Автоматично згенерована пара ключів VAPID, що використовується для підписування вебpush-навантажень. |
|
||||
| `push/web-push-subscriptions.json` | Збережені кінцеві точки браузерних підписок. |
|
||||
|
||||
Перевизначте пару ключів VAPID через змінні середовища процесу Gateway, коли потрібно зафіксувати ключі (для розгортань на кількох хостах, ротації секретів або тестів):
|
||||
Перевизначте пару ключів VAPID через змінні середовища в процесі Gateway, коли потрібно зафіксувати ключі (для розгортань на кількох хостах, ротації секретів або тестів):
|
||||
|
||||
- `OPENCLAW_VAPID_PUBLIC_KEY`
|
||||
- `OPENCLAW_VAPID_PRIVATE_KEY`
|
||||
- `OPENCLAW_VAPID_SUBJECT` (за замовчуванням `mailto:openclaw@localhost`)
|
||||
- `OPENCLAW_VAPID_SUBJECT` (типово `mailto:openclaw@localhost`)
|
||||
|
||||
Інтерфейс керування використовує ці обмежені областю методи Gateway для реєстрації та тестування браузерних підписок:
|
||||
Control UI використовує ці обмежені областю методи Gateway, щоб реєструвати й тестувати браузерні підписки:
|
||||
|
||||
- `push.web.vapidPublicKey` — отримує активний відкритий ключ VAPID.
|
||||
- `push.web.vapidPublicKey` — отримує активний публічний ключ VAPID.
|
||||
- `push.web.subscribe` — реєструє `endpoint` разом із `keys.p256dh`/`keys.auth`.
|
||||
- `push.web.unsubscribe` — видаляє зареєстровану кінцеву точку.
|
||||
- `push.web.test` — надсилає тестове сповіщення до підписки викликача.
|
||||
|
||||
<Note>
|
||||
Web Push не залежить від шляху ретрансляції iOS APNS (див. [Конфігурація](/uk/gateway/configuration) для push із підтримкою ретрансляції) і наявного методу `push.test`, які націлені на нативне мобільне спарювання.
|
||||
Вебpush не залежить від шляху relay iOS APNS (див. [Конфігурація](/uk/gateway/configuration) для push із relay-підтримкою) і наявного методу `push.test`, які націлені на нативне мобільне сполучення.
|
||||
</Note>
|
||||
|
||||
## Розміщені вбудовування
|
||||
## Вбудовані розміщені елементи
|
||||
|
||||
Повідомлення асистента можуть відображати розміщений вебвміст безпосередньо через shortcode `[embed ...]`. Політика пісочниці iframe контролюється `gateway.controlUi.embedSandbox`:
|
||||
Повідомлення асистента можуть відображати розміщений вебвміст inline за допомогою shortcode `[embed ...]`. Політику sandbox для iframe контролює `gateway.controlUi.embedSandbox`:
|
||||
|
||||
<Tabs>
|
||||
<Tab title="strict">
|
||||
Вимикає виконання скриптів усередині розміщених вбудовувань.
|
||||
Вимикає виконання скриптів усередині розміщених вбудованих елементів.
|
||||
</Tab>
|
||||
<Tab title="scripts (default)">
|
||||
Дозволяє інтерактивні вбудовування, зберігаючи ізоляцію походження; це значення за замовчуванням і зазвичай його достатньо для самодостатніх браузерних ігор/віджетів.
|
||||
<Tab title="scripts (типово)">
|
||||
Дозволяє інтерактивні вбудовані елементи, зберігаючи ізоляцію origin; це типове значення, і його зазвичай достатньо для самодостатніх браузерних ігор/віджетів.
|
||||
</Tab>
|
||||
<Tab title="trusted">
|
||||
Додає `allow-same-origin` поверх `allow-scripts` для документів того самого сайту, яким навмисно потрібні сильніші привілеї.
|
||||
@ -246,10 +246,10 @@ Web Push не залежить від шляху ретрансляції iOS AP
|
||||
```
|
||||
|
||||
<Warning>
|
||||
Використовуйте `trusted` лише тоді, коли вбудований документ справді потребує поведінки same-origin. Для більшості згенерованих агентом ігор та інтерактивних полотен `scripts` є безпечнішим вибором.
|
||||
Використовуйте `trusted` лише тоді, коли вбудованому документу справді потрібна поведінка same-origin. Для більшості згенерованих агентом ігор та інтерактивних полотен `scripts` є безпечнішим вибором.
|
||||
</Warning>
|
||||
|
||||
Абсолютні зовнішні URL вбудовування `http(s)` за замовчуванням залишаються заблокованими. Якщо ви навмисно хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, установіть `gateway.controlUi.allowExternalEmbedUrls: true`.
|
||||
Абсолютні зовнішні URL вбудовування `http(s)` типово залишаються заблокованими. Якщо ви навмисно хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, встановіть `gateway.controlUi.allowExternalEmbedUrls: true`.
|
||||
|
||||
## Доступ через tailnet (рекомендовано)
|
||||
|
||||
@ -263,11 +263,11 @@ Web Push не залежить від шляху ретрансляції iOS AP
|
||||
|
||||
Відкрийте:
|
||||
|
||||
- `https://<magicdns>/` (або ваш налаштований `gateway.controlUi.basePath`)
|
||||
- `https://<magicdns>/` (або налаштований вами `gateway.controlUi.basePath`)
|
||||
|
||||
За замовчуванням запити інтерфейсу керування/WebSocket Serve можуть автентифікуватися через заголовки ідентичності Tailscale (`tailscale-user-login`), коли `gateway.auth.allowTailscale` має значення `true`. OpenClaw перевіряє ідентичність, розв'язуючи адресу `x-forwarded-for` за допомогою `tailscale whois` і зіставляючи її із заголовком, і приймає їх лише тоді, коли запит потрапляє на local loopback із заголовками `x-forwarded-*` від Tailscale. Для операторських сеансів інтерфейсу керування з ідентичністю браузерного пристрою цей перевірений шлях Serve також пропускає обхід спарювання пристрою; браузери без пристрою та з'єднання з роллю вузла все ще проходять звичайні перевірки пристрою. Установіть `gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані спільного секрету навіть для трафіку Serve. Тоді використовуйте `gateway.auth.mode: "token"` або `"password"`.
|
||||
Типово запити Control UI/WebSocket Serve можуть автентифікуватися через заголовки ідентичності Tailscale (`tailscale-user-login`), коли `gateway.auth.allowTailscale` має значення `true`. OpenClaw перевіряє ідентичність, розв'язуючи адресу `x-forwarded-for` через `tailscale whois` і зіставляючи її із заголовком, і приймає їх лише тоді, коли запит потрапляє на local loopback із заголовками `x-forwarded-*` від Tailscale. Для операторських сесій Control UI з ідентичністю браузерного пристрою цей перевірений шлях Serve також пропускає цикл сполучення пристрою; браузери без пристрою та з'єднання з роллю node усе ще проходять звичайні перевірки пристрою. Встановіть `gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані зі спільним секретом навіть для трафіку Serve. Потім використовуйте `gateway.auth.mode: "token"` або `"password"`.
|
||||
|
||||
Для цього асинхронного шляху ідентичності Serve невдалі спроби автентифікації для тієї самої IP-адреси клієнта й області автентифікації серіалізуються перед записами обмеження частоти. Через це одночасні невдалі повтори з того самого браузера можуть показати `retry later` на другому запиті замість двох звичайних невідповідностей, що змагаються паралельно.
|
||||
Для цього асинхронного шляху ідентичності Serve невдалі спроби автентифікації для тієї самої IP-адреси клієнта й області автентифікації серіалізуються перед записами обмеження частоти. Тому одночасні невдалі повторні спроби з того самого браузера можуть показати `retry later` на другому запиті замість двох простих невідповідностей, що виконуються паралельно.
|
||||
|
||||
<Warning>
|
||||
Автентифікація Serve без токена припускає, що хост gateway є довіреним. Якщо на цьому хості може виконуватися недовірений локальний код, вимагайте автентифікацію токеном/паролем.
|
||||
@ -281,7 +281,7 @@ Web Push не залежить від шляху ретрансляції iOS AP
|
||||
|
||||
Потім відкрийте:
|
||||
|
||||
- `http://<tailscale-ip>:18789/` (або ваш налаштований `gateway.controlUi.basePath`)
|
||||
- `http://<tailscale-ip>:18789/` (або налаштований вами `gateway.controlUi.basePath`)
|
||||
|
||||
Вставте відповідний спільний секрет у налаштування UI (надсилається як `connect.params.auth.token` або `connect.params.auth.password`).
|
||||
|
||||
@ -290,12 +290,12 @@ Web Push не залежить від шляху ретрансляції iOS AP
|
||||
|
||||
## Небезпечний HTTP
|
||||
|
||||
Якщо ви відкриваєте панель керування через звичайний HTTP (`http://<lan-ip>` або `http://<tailscale-ip>`), браузер працює в **незахищеному контексті** й блокує WebCrypto. За замовчуванням OpenClaw **блокує** підключення інтерфейсу керування без ідентичності пристрою.
|
||||
Якщо відкрити панель керування через звичайний HTTP (`http://<lan-ip>` або `http://<tailscale-ip>`), браузер працює в **незахищеному контексті** та блокує WebCrypto. Типово OpenClaw **блокує** підключення Control UI без ідентичності пристрою.
|
||||
|
||||
Задокументовані винятки:
|
||||
|
||||
- сумісність небезпечного HTTP лише для localhost з `gateway.controlUi.allowInsecureAuth=true`
|
||||
- успішна автентифікація операторського інтерфейсу керування через `gateway.auth.mode: "trusted-proxy"`
|
||||
- сумісність незахищеного HTTP лише для localhost із `gateway.controlUi.allowInsecureAuth=true`
|
||||
- успішна автентифікація операторського Control UI через `gateway.auth.mode: "trusted-proxy"`
|
||||
- аварійний `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
|
||||
|
||||
**Рекомендоване виправлення:** використовуйте HTTPS (Tailscale Serve) або відкрийте UI локально:
|
||||
@ -304,7 +304,7 @@ Web Push не залежить від шляху ретрансляції iOS AP
|
||||
- `http://127.0.0.1:18789/` (на хості gateway)
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Поведінка перемикача небезпечної автентифікації">
|
||||
<Accordion title="Поведінка перемикача незахищеної автентифікації">
|
||||
```json5
|
||||
{
|
||||
gateway: {
|
||||
@ -317,9 +317,9 @@ Web Push не залежить від шляху ретрансляції iOS AP
|
||||
|
||||
`allowInsecureAuth` є лише локальним перемикачем сумісності:
|
||||
|
||||
- Він дозволяє сеансам інтерфейсу керування localhost продовжуватися без ідентичності пристрою в незахищених HTTP-контекстах.
|
||||
- Він не обходить перевірки спарювання.
|
||||
- Він не послаблює вимоги до ідентичності пристрою для віддалених (не localhost) підключень.
|
||||
- Він дозволяє сесіям Control UI на localhost продовжуватися без ідентичності пристрою в незахищених HTTP-контекстах.
|
||||
- Він не обходить перевірки сполучення.
|
||||
- Він не послаблює вимоги до ідентичності віддаленого (не localhost) пристрою.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Лише аварійний доступ">
|
||||
@ -334,42 +334,42 @@ Web Push не залежить від шляху ретрансляції iOS AP
|
||||
```
|
||||
|
||||
<Warning>
|
||||
`dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою інтерфейсу керування та є серйозним зниженням безпеки. Швидко скасуйте після аварійного використання.
|
||||
`dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою Control UI і є серйозним зниженням безпеки. Після аварійного використання швидко поверніть попередні налаштування.
|
||||
</Warning>
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Trusted-proxy note">
|
||||
- Успішна автентифікація trusted-proxy може допускати сеанси Control UI **оператора** без ідентичності пристрою.
|
||||
- Це **не** поширюється на сеанси Control UI з роллю node.
|
||||
- Зворотні проксі same-host loopback все одно не задовольняють автентифікацію trusted-proxy; див. [Автентифікація довіреного проксі](/uk/gateway/trusted-proxy-auth).
|
||||
<Accordion title="Примітка щодо довіреного проксі">
|
||||
- Успішна автентифікація через довірений проксі може допускати сеанси інтерфейсу керування **оператора** без ідентичності пристрою.
|
||||
- Це **не** поширюється на сеанси інтерфейсу керування з роллю вузла.
|
||||
- Зворотні проксі same-host loopback усе ще не задовольняють автентифікацію через довірений проксі; див. [Автентифікація через довірений проксі](/uk/gateway/trusted-proxy-auth).
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
Див. [Tailscale](/uk/gateway/tailscale), щоб отримати вказівки з налаштування HTTPS.
|
||||
Див. [Tailscale](/uk/gateway/tailscale) для порад із налаштування HTTPS.
|
||||
|
||||
## Політика безпеки вмісту
|
||||
|
||||
Control UI постачається зі строгою політикою `img-src`: дозволені лише ресурси **same-origin**, URL-адреси `data:` і локально згенеровані URL-адреси `blob:`. Віддалені URL-адреси зображень `http(s)` і protocol-relative відхиляються браузером і не створюють мережевих запитів.
|
||||
Інтерфейс керування постачається зі строгою політикою `img-src`: дозволені лише ресурси **того самого джерела**, URL-адреси `data:` і локально згенеровані URL-адреси `blob:`. Віддалені URL-адреси зображень `http(s)` і відносні до протоколу відхиляються браузером і не ініціюють мережевих запитів.
|
||||
|
||||
Що це означає на практиці:
|
||||
|
||||
- Аватари й зображення, що подаються за відносними шляхами (наприклад `/avatars/<id>`), усе ще відображаються, зокрема автентифіковані маршрути аватарів, які UI отримує та перетворює на локальні URL-адреси `blob:`.
|
||||
- Вбудовані URL-адреси `data:image/...` усе ще відображаються (корисно для payloads у протоколі).
|
||||
- Локальні URL-адреси `blob:`, створені Control UI, усе ще відображаються.
|
||||
- Віддалені URL-адреси аватарів, що надходять із метаданих каналу, вилучаються допоміжними засобами аватарів Control UI і замінюються вбудованим логотипом/бейджем, тож скомпрометований або зловмисний канал не може примусити браузер оператора виконувати довільні віддалені запити зображень.
|
||||
- Аватари й зображення, що обслуговуються за відносними шляхами (наприклад, `/avatars/<id>`), і далі відображаються, включно з автентифікованими маршрутами аватарів, які UI отримує та перетворює на локальні URL-адреси `blob:`.
|
||||
- Вбудовані URL-адреси `data:image/...` і далі відображаються (корисно для корисних навантажень у межах протоколу).
|
||||
- Локальні URL-адреси `blob:`, створені інтерфейсом керування, і далі відображаються.
|
||||
- Віддалені URL-адреси аватарів, які передаються метаданими каналу, вилучаються допоміжними засобами аватарів інтерфейсу керування та замінюються вбудованим логотипом/бейджем, тож скомпрометований або зловмисний канал не може примусити браузер оператора виконувати довільні віддалені запити зображень.
|
||||
|
||||
Щоб отримати цю поведінку, нічого змінювати не потрібно — вона завжди ввімкнена й не налаштовується.
|
||||
Вам не потрібно нічого змінювати, щоб отримати таку поведінку — вона завжди ввімкнена й не налаштовується.
|
||||
|
||||
## Автентифікація маршруту аватара
|
||||
|
||||
Коли автентифікацію gateway налаштовано, endpoint аватарів Control UI вимагає той самий токен gateway, що й решта API:
|
||||
Коли автентифікацію Gateway налаштовано, кінцева точка аватарів інтерфейсу керування потребує того самого токена Gateway, що й решта API:
|
||||
|
||||
- `GET /avatar/<agentId>` повертає зображення аватара лише автентифікованим викликам. `GET /avatar/<agentId>?meta=1` повертає метадані аватара за тим самим правилом.
|
||||
- Неавтентифіковані запити до будь-якого з цих маршрутів відхиляються (відповідно до спорідненого маршруту assistant-media). Це запобігає витоку ідентичності агента через маршрут аватара на хостах, які інакше захищені.
|
||||
- Сам Control UI пересилає токен gateway як bearer-заголовок під час отримання аватарів і використовує автентифіковані blob-URL, щоб зображення все одно відображалося на dashboard.
|
||||
- `GET /avatar/<agentId>` повертає зображення аватара лише автентифікованим викликачам. `GET /avatar/<agentId>?meta=1` повертає метадані аватара за тим самим правилом.
|
||||
- Неавтентифіковані запити до будь-якого з цих маршрутів відхиляються (так само, як і для сусіднього маршруту assistant-media). Це запобігає витоку ідентичності агента через маршрут аватара на хостах, які інакше захищені.
|
||||
- Сам інтерфейс керування пересилає токен Gateway як bearer-заголовок під час отримання аватарів і використовує автентифіковані URL-адреси blob, щоб зображення й далі відображалося на панелях.
|
||||
|
||||
Якщо вимкнути автентифікацію gateway (не рекомендовано на спільних хостах), маршрут аватара також стає неавтентифікованим, відповідно до решти gateway.
|
||||
Якщо вимкнути автентифікацію Gateway (не рекомендовано на спільних хостах), маршрут аватара також стає неавтентифікованим, відповідно до решти Gateway.
|
||||
|
||||
## Збирання UI
|
||||
|
||||
@ -385,50 +385,51 @@ pnpm ui:build
|
||||
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
|
||||
```
|
||||
|
||||
Для локальної розробки (окремий dev server):
|
||||
Для локальної розробки (окремий dev-сервер):
|
||||
|
||||
```bash
|
||||
pnpm ui:dev
|
||||
```
|
||||
|
||||
Потім спрямуйте UI на URL Gateway WS (наприклад `ws://127.0.0.1:18789`).
|
||||
Потім спрямуйте UI на URL Gateway WS (наприклад, `ws://127.0.0.1:18789`).
|
||||
|
||||
## Налагодження/тестування: dev server + віддалений Gateway
|
||||
## Налагодження/тестування: dev-сервер + віддалений Gateway
|
||||
|
||||
Control UI — це статичні файли; ціль WebSocket налаштовується й може відрізнятися від HTTP origin. Це зручно, коли локально потрібен Vite dev server, але Gateway працює в іншому місці.
|
||||
Інтерфейс керування — це статичні файли; ціль WebSocket налаштовується й може відрізнятися від HTTP-джерела. Це зручно, коли локально потрібен dev-сервер Vite, а Gateway працює в іншому місці.
|
||||
|
||||
<Steps>
|
||||
<Step title="Start the UI dev server">
|
||||
<Step title="Запустіть dev-сервер UI">
|
||||
```bash
|
||||
pnpm ui:dev
|
||||
```
|
||||
</Step>
|
||||
<Step title="Open with gatewayUrl">
|
||||
<Step title="Відкрийте з gatewayUrl">
|
||||
```text
|
||||
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
|
||||
http://localhost:5173/?gatewayUrl=ws%3A%2F%2F<gateway-host>%3A18789
|
||||
```
|
||||
|
||||
Необов’язкова одноразова автентифікація (за потреби):
|
||||
|
||||
```text
|
||||
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789#token=<gateway-token>
|
||||
http://localhost:5173/?gatewayUrl=wss%3A%2F%2F<gateway-host>%3A18789#token=<gateway-token>
|
||||
```
|
||||
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Notes">
|
||||
- `gatewayUrl` зберігається в localStorage після завантаження й вилучається з URL.
|
||||
- `token` слід передавати через фрагмент URL (`#token=...`) щоразу, коли це можливо. Фрагменти не надсилаються на сервер, що запобігає витоку в журналах запитів і Referer. Застарілі query params `?token=` усе ще одноразово імпортуються для сумісності, але лише як fallback, і негайно вилучаються після bootstrap.
|
||||
<Accordion title="Примітки">
|
||||
- `gatewayUrl` зберігається в localStorage після завантаження та вилучається з URL-адреси.
|
||||
- Якщо ви передаєте повну кінцеву точку `ws://` або `wss://` через `gatewayUrl`, URL-кодуйте значення `gatewayUrl`, щоб браузер правильно розібрав рядок запиту.
|
||||
- `token` слід передавати через фрагмент URL (`#token=...`), коли це можливо. Фрагменти не надсилаються на сервер, що запобігає витоку через журнали запитів і Referer. Застарілі параметри запиту `?token=` усе ще імпортуються один раз для сумісності, але лише як резервний варіант, і вилучаються одразу після bootstrap.
|
||||
- `password` зберігається лише в пам’яті.
|
||||
- Коли `gatewayUrl` задано, UI не повертається до облікових даних із конфігурації або середовища. Надайте `token` (або `password`) явно. Відсутність явних облікових даних є помилкою.
|
||||
- Використовуйте `wss://`, коли Gateway розташований за TLS (Tailscale Serve, HTTPS proxy тощо).
|
||||
- `gatewayUrl` приймається лише у вікні верхнього рівня (не у вбудованому), щоб запобігти clickjacking.
|
||||
- Розгортання Control UI не на loopback мають явно задавати `gateway.controlUi.allowedOrigins` (повні origins). Це включає віддалені dev-налаштування.
|
||||
- Запуск Gateway може додавати локальні origins, як-от `http://localhost:<port>` і `http://127.0.0.1:<port>`, з ефективних runtime bind і port, але віддаленим browser origins усе одно потрібні явні записи.
|
||||
- Не використовуйте `gateway.controlUi.allowedOrigins: ["*"]`, окрім ретельно контрольованого локального тестування. Це означає дозволити будь-який browser origin, а не "зіставити з будь-яким host, який я використовую."
|
||||
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим Host-header origin fallback, але це небезпечний режим безпеки.
|
||||
- Коли `gatewayUrl` задано, UI не повертається до облікових даних із конфігурації або середовища. Явно надайте `token` (або `password`). Відсутність явних облікових даних є помилкою.
|
||||
- Використовуйте `wss://`, коли Gateway розміщено за TLS (Tailscale Serve, HTTPS-проксі тощо).
|
||||
- `gatewayUrl` приймається лише у вікні верхнього рівня (не вбудованому), щоб запобігти clickjacking.
|
||||
- Розгортання інтерфейсу керування не через loopback мають явно задавати `gateway.controlUi.allowedOrigins` (повні джерела). Це включає віддалені dev-налаштування.
|
||||
- Запуск Gateway може додавати локальні джерела, як-от `http://localhost:<port>` і `http://127.0.0.1:<port>`, на основі ефективної runtime-прив’язки та порту, але віддалені джерела браузера все одно потребують явних записів.
|
||||
- Не використовуйте `gateway.controlUi.allowedOrigins: ["*"]`, окрім жорстко контрольованого локального тестування. Це означає дозволити будь-яке джерело браузера, а не «відповідати будь-якому хосту, який я використовую».
|
||||
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим fallback для джерела з Host-заголовка, але це небезпечний режим безпеки.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
@ -445,11 +446,11 @@ Control UI — це статичні файли; ціль WebSocket налашт
|
||||
}
|
||||
```
|
||||
|
||||
Докладніше про налаштування віддаленого доступу: [Віддалений доступ](/uk/gateway/remote).
|
||||
Докладні відомості про налаштування віддаленого доступу: [Віддалений доступ](/uk/gateway/remote).
|
||||
|
||||
## Пов’язане
|
||||
|
||||
- [Dashboard](/uk/web/dashboard) — dashboard gateway
|
||||
- [Health Checks](/uk/gateway/health) — моніторинг стану gateway
|
||||
- [Панель](/uk/web/dashboard) — панель Gateway
|
||||
- [Перевірки справності](/uk/gateway/health) — моніторинг справності Gateway
|
||||
- [TUI](/uk/web/tui) — термінальний інтерфейс користувача
|
||||
- [WebChat](/uk/web/webchat) — браузерний інтерфейс чату
|
||||
|
||||
Loading…
Reference in New Issue
Block a user