chore(i18n): refresh uk translations
This commit is contained in:
parent
b62b80e7c3
commit
fa9e06956e
@ -1,29 +1,29 @@
|
||||
---
|
||||
read_when:
|
||||
- Налаштування Slack або налагодження режиму Slack socket/HTTP
|
||||
- Налаштування Slack або налагодження режиму socket/HTTP у Slack
|
||||
summary: Налаштування Slack і поведінка під час виконання (Socket Mode + HTTP Request URLs)
|
||||
title: Slack
|
||||
x-i18n:
|
||||
generated_at: "2026-04-07T00:08:10Z"
|
||||
generated_at: "2026-04-08T05:00:50Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 2b8fd2cc6c638ee82069f0af2c2b6f6f49c87da709b941433a0343724a9907ea
|
||||
source_hash: cad132131ddce688517def7c14703ad314441c67aacc4cc2a2a721e1d1c01942
|
||||
source_path: channels/slack.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Slack
|
||||
|
||||
Статус: готово до продакшну для приватних повідомлень і каналів через інтеграції застосунку Slack. Типовий режим — Socket Mode; HTTP Request URLs також підтримуються.
|
||||
Статус: готовий до production для DM + каналів через інтеграції застосунку Slack. Режим за замовчуванням — Socket Mode; HTTP Request URLs також підтримуються.
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Сполучення" icon="link" href="/uk/channels/pairing">
|
||||
Приватні повідомлення Slack типово працюють у режимі сполучення.
|
||||
Для Slack DM за замовчуванням використовується режим сполучення.
|
||||
</Card>
|
||||
<Card title="Slash-команди" icon="terminal" href="/uk/tools/slash-commands">
|
||||
Нативна поведінка команд і каталог команд.
|
||||
Власна поведінка команд і каталог команд.
|
||||
</Card>
|
||||
<Card title="Усунення проблем із каналами" icon="wrench" href="/uk/channels/troubleshooting">
|
||||
<Card title="Усунення проблем каналів" icon="wrench" href="/uk/channels/troubleshooting">
|
||||
Міжканальна діагностика та сценарії відновлення.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
@ -31,15 +31,15 @@ x-i18n:
|
||||
## Швидке налаштування
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Socket Mode (типово)">
|
||||
<Tab title="Socket Mode (за замовчуванням)">
|
||||
<Steps>
|
||||
<Step title="Створіть новий застосунок Slack">
|
||||
У налаштуваннях застосунку Slack натисніть кнопку **[Create New App](https://api.slack.com/apps/new)**:
|
||||
|
||||
- виберіть **from a manifest** і виберіть робочий простір для вашого застосунку
|
||||
- виберіть **from a manifest** і виберіть workspace для вашого застосунку
|
||||
- вставте [приклад manifest](#manifest-and-scope-checklist) нижче та продовжте створення
|
||||
- згенеруйте **App-Level Token** (`xapp-...`) з `connections:write`
|
||||
- установіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
|
||||
- встановіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
|
||||
</Step>
|
||||
|
||||
<Step title="Налаштуйте OpenClaw">
|
||||
@ -57,7 +57,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
Резервне джерело через env (лише для типового облікового запису):
|
||||
Резервне значення env (лише для облікового запису за замовчуванням):
|
||||
|
||||
```bash
|
||||
SLACK_APP_TOKEN=xapp-...
|
||||
@ -82,10 +82,10 @@ openclaw gateway
|
||||
<Step title="Створіть новий застосунок Slack">
|
||||
У налаштуваннях застосунку Slack натисніть кнопку **[Create New App](https://api.slack.com/apps/new)**:
|
||||
|
||||
- виберіть **from a manifest** і виберіть робочий простір для вашого застосунку
|
||||
- виберіть **from a manifest** і виберіть workspace для вашого застосунку
|
||||
- вставте [приклад manifest](#manifest-and-scope-checklist) і оновіть URL-адреси перед створенням
|
||||
- збережіть **Signing Secret** для перевірки запитів
|
||||
- установіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
|
||||
- встановіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
|
||||
|
||||
</Step>
|
||||
|
||||
@ -106,9 +106,9 @@ openclaw gateway
|
||||
```
|
||||
|
||||
<Note>
|
||||
Використовуйте унікальні шляхи webhook для багатьох HTTP-облікових записів
|
||||
Використовуйте унікальні webhook path для багатьох HTTP-облікових записів
|
||||
|
||||
Надайте кожному обліковому запису окремий `webhookPath` (типово `/slack/events`), щоб реєстрації не конфліктували.
|
||||
Надайте кожному обліковому запису окремий `webhookPath` (за замовчуванням `/slack/events`), щоб реєстрації не конфліктували.
|
||||
</Note>
|
||||
|
||||
</Step>
|
||||
@ -128,7 +128,7 @@ openclaw gateway
|
||||
## Контрольний список manifest і scope
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Socket Mode (типово)">
|
||||
<Tab title="Socket Mode (за замовчуванням)">
|
||||
|
||||
```json
|
||||
{
|
||||
@ -291,12 +291,12 @@ openclaw gateway
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Необов’язкові scopes авторства (операції запису)">
|
||||
Додайте bot scope `chat:write.customize`, якщо хочете, щоб вихідні повідомлення використовували ідентичність активного агента (власне ім’я користувача та значок) замість типової ідентичності застосунку Slack.
|
||||
Додайте bot scope `chat:write.customize`, якщо хочете, щоб вихідні повідомлення використовували ідентичність активного агента (власне ім’я користувача та піктограму) замість стандартної ідентичності застосунку Slack.
|
||||
|
||||
Якщо ви використовуєте значок emoji, Slack очікує синтаксис `:emoji_name:`.
|
||||
Якщо ви використовуєте піктограму emoji, Slack очікує синтаксис `:emoji_name:`.
|
||||
</Accordion>
|
||||
<Accordion title="Необов’язкові scopes user token (операції читання)">
|
||||
Якщо ви налаштовуєте `channels.slack.userToken`, типовими scopes для читання є:
|
||||
<Accordion title="Необов’язкові scopes токена користувача (операції читання)">
|
||||
Якщо ви налаштували `channels.slack.userToken`, типовими scopes читання є:
|
||||
|
||||
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
|
||||
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
|
||||
@ -304,44 +304,45 @@ openclaw gateway
|
||||
- `reactions:read`
|
||||
- `pins:read`
|
||||
- `emoji:read`
|
||||
- `search:read` (якщо ви залежите від читання через Slack search)
|
||||
- `search:read` (якщо ви залежите від читання пошуку Slack)
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Модель токенів
|
||||
|
||||
- `botToken` + `appToken` обов’язкові для Socket Mode.
|
||||
- Для режиму HTTP потрібні `botToken` + `signingSecret`.
|
||||
- `botToken`, `appToken`, `signingSecret` і `userToken` приймають відкриті
|
||||
- `botToken` + `appToken` потрібні для Socket Mode.
|
||||
- Для HTTP mode потрібні `botToken` + `signingSecret`.
|
||||
- `botToken`, `appToken`, `signingSecret` і `userToken` приймають звичайні
|
||||
рядки або об’єкти SecretRef.
|
||||
- Токени в конфігурації мають пріоритет над резервним джерелом через env.
|
||||
- Резервне джерело через env `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` застосовується лише до типового облікового запису.
|
||||
- `userToken` (`xoxp-...`) доступний лише в конфігурації (без резервного джерела через env) і типово працює в режимі лише для читання (`userTokenReadOnly: true`).
|
||||
- Токени конфігурації мають пріоритет над резервними значеннями env.
|
||||
- Резервні значення env `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` застосовуються лише до облікового запису за замовчуванням.
|
||||
- `userToken` (`xoxp-...`) доступний лише в конфігурації (без резервного значення env) і за замовчуванням працює в режимі лише для читання (`userTokenReadOnly: true`).
|
||||
|
||||
Поведінка знімка статусу:
|
||||
Поведінка знімка стану:
|
||||
|
||||
- Перевірка облікового запису Slack відстежує поля `*Source` і `*Status`
|
||||
для кожного облікового запису (`botToken`, `appToken`, `signingSecret`, `userToken`).
|
||||
- Перевірка облікового запису Slack відстежує для кожного облікового
|
||||
даного поля `*Source` і `*Status`
|
||||
(`botToken`, `appToken`, `signingSecret`, `userToken`).
|
||||
- Статус може бути `available`, `configured_unavailable` або `missing`.
|
||||
- `configured_unavailable` означає, що обліковий запис налаштовано через SecretRef
|
||||
або інше не вбудоване джерело секрету, але поточна команда/шлях виконання
|
||||
- `configured_unavailable` означає, що обліковий запис налаштований через SecretRef
|
||||
або інше не-inline джерело секретів, але поточний шлях команди/виконання
|
||||
не зміг визначити фактичне значення.
|
||||
- У режимі HTTP включається `signingSecretStatus`; у Socket Mode
|
||||
обов’язковою парою є `botTokenStatus` + `appTokenStatus`.
|
||||
- У HTTP mode додається `signingSecretStatus`; у Socket Mode
|
||||
потрібною парою є `botTokenStatus` + `appTokenStatus`.
|
||||
|
||||
<Tip>
|
||||
Для дій/читання каталогу user token може мати пріоритет, якщо його налаштовано. Для запису bot token залишається пріоритетним; запис через user token дозволено лише коли `userTokenReadOnly: false` і bot token недоступний.
|
||||
Для дій/читання каталогу може надаватися перевага user token, якщо його налаштовано. Для запису перевага зберігається за bot token; запис через user token дозволений лише коли `userTokenReadOnly: false`, а bot token недоступний.
|
||||
</Tip>
|
||||
|
||||
## Дії та обмеження
|
||||
|
||||
Дії Slack контролюються через `channels.slack.actions.*`.
|
||||
Дії Slack керуються через `channels.slack.actions.*`.
|
||||
|
||||
Доступні групи дій у поточному інструментарії Slack:
|
||||
|
||||
| Група | Типово |
|
||||
| ---------- | ------- |
|
||||
| Група | За замовчуванням |
|
||||
| ---------- | ---------------- |
|
||||
| messages | увімкнено |
|
||||
| reactions | увімкнено |
|
||||
| pins | увімкнено |
|
||||
@ -350,32 +351,32 @@ openclaw gateway
|
||||
|
||||
Поточні дії з повідомленнями Slack включають `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` і `emoji-list`.
|
||||
|
||||
## Керування доступом і маршрутизація
|
||||
## Контроль доступу та маршрутизація
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Політика приватних повідомлень">
|
||||
`channels.slack.dmPolicy` керує доступом до приватних повідомлень (застаріле: `channels.slack.dm.policy`):
|
||||
<Tab title="Політика DM">
|
||||
`channels.slack.dmPolicy` керує доступом до DM (застаріле: `channels.slack.dm.policy`):
|
||||
|
||||
- `pairing` (типово)
|
||||
- `pairing` (за замовчуванням)
|
||||
- `allowlist`
|
||||
- `open` (потрібно, щоб `channels.slack.allowFrom` містив `"*"`; застаріле: `channels.slack.dm.allowFrom`)
|
||||
- `open` (потребує, щоб `channels.slack.allowFrom` містив `"*"`; застаріле: `channels.slack.dm.allowFrom`)
|
||||
- `disabled`
|
||||
|
||||
Прапорці для приватних повідомлень:
|
||||
Прапорці DM:
|
||||
|
||||
- `dm.enabled` (типово true)
|
||||
- `dm.enabled` (за замовчуванням true)
|
||||
- `channels.slack.allowFrom` (рекомендовано)
|
||||
- `dm.allowFrom` (застаріле)
|
||||
- `dm.groupEnabled` (групові приватні повідомлення типово false)
|
||||
- `dm.groupEnabled` (групові DM за замовчуванням false)
|
||||
- `dm.groupChannels` (необов’язковий allowlist MPIM)
|
||||
|
||||
Пріоритет для кількох облікових записів:
|
||||
Пріоритет для багатьох облікових записів:
|
||||
|
||||
- `channels.slack.accounts.default.allowFrom` застосовується лише до облікового запису `default`.
|
||||
- Іменовані облікові записи успадковують `channels.slack.allowFrom`, якщо їхній власний `allowFrom` не задано.
|
||||
- Іменовані облікові записи не успадковують `channels.slack.accounts.default.allowFrom`.
|
||||
|
||||
Для сполучення в приватних повідомленнях використовується `openclaw pairing approve slack <code>`.
|
||||
Для сполучення в DM використовується `openclaw pairing approve slack <code>`.
|
||||
|
||||
</Tab>
|
||||
|
||||
@ -388,26 +389,26 @@ openclaw gateway
|
||||
|
||||
Allowlist каналів розміщується в `channels.slack.channels` і має використовувати стабільні ID каналів.
|
||||
|
||||
Примітка щодо виконання: якщо `channels.slack` повністю відсутній (налаштування лише через env), під час виконання використовується резервне значення `groupPolicy="allowlist"` і записується попередження в журнал (навіть якщо встановлено `channels.defaults.groupPolicy`).
|
||||
Примітка щодо виконання: якщо `channels.slack` повністю відсутній (налаштування лише через env), під час виконання використовується резервне значення `groupPolicy="allowlist"` і записується попередження в журнал (навіть якщо задано `channels.defaults.groupPolicy`).
|
||||
|
||||
Визначення імен/ID:
|
||||
|
||||
- записи allowlist каналів і allowlist приватних повідомлень визначаються під час запуску, якщо доступ токена це дозволяє
|
||||
- записи з невизначеними іменами каналів зберігаються як налаштовані, але типово ігноруються для маршрутизації
|
||||
- вхідна авторизація та маршрутизація каналів типово орієнтовані на ID; пряме зіставлення за ім’ям користувача/slug потребує `channels.slack.dangerouslyAllowNameMatching: true`
|
||||
- записи allowlist каналів і DM allowlist визначаються під час запуску, якщо доступ токена це дозволяє
|
||||
- нерозв’язані записи назв каналів зберігаються як налаштовані, але за замовчуванням ігноруються для маршрутизації
|
||||
- вхідна авторизація та маршрутизація каналів за замовчуванням орієнтуються на ID; пряме зіставлення імені користувача/slug потребує `channels.slack.dangerouslyAllowNameMatching: true`
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="Згадки та користувачі каналів">
|
||||
Повідомлення в каналах типово обмежуються згадками.
|
||||
<Tab title="Згадки та користувачі каналу">
|
||||
Повідомлення в каналах за замовчуванням обмежуються згадками.
|
||||
|
||||
Джерела згадок:
|
||||
|
||||
- явна згадка застосунку (`<@botId>`)
|
||||
- шаблони regex для згадок (`agents.list[].groupChat.mentionPatterns`, резервно `messages.groupChat.mentionPatterns`)
|
||||
- неявна поведінка reply-to-bot у тредах (вимикається, коли `thread.requireExplicitMention` має значення `true`)
|
||||
- шаблони regex для згадок (`agents.list[].groupChat.mentionPatterns`, резервне значення `messages.groupChat.mentionPatterns`)
|
||||
- неявна поведінка відповіді в треді на бота (вимикається, коли `thread.requireExplicitMention` має значення `true`)
|
||||
|
||||
Елементи керування для кожного каналу (`channels.slack.channels.<id>`; імена лише через визначення під час запуску або `dangerouslyAllowNameMatching`):
|
||||
Керування для кожного каналу (`channels.slack.channels.<id>`; імена лише через визначення під час запуску або `dangerouslyAllowNameMatching`):
|
||||
|
||||
- `requireMention`
|
||||
- `users` (allowlist)
|
||||
@ -415,36 +416,36 @@ openclaw gateway
|
||||
- `skills`
|
||||
- `systemPrompt`
|
||||
- `tools`, `toolsBySender`
|
||||
- формат ключів `toolsBySender`: `id:`, `e164:`, `username:`, `name:` або шаблон `"*"`
|
||||
- формат ключа `toolsBySender`: `id:`, `e164:`, `username:`, `name:` або шаблон `"*"`
|
||||
(застарілі ключі без префікса все ще зіставляються лише з `id:`)
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Треди, сесії та теги reply
|
||||
## Треди, сесії та теги відповіді
|
||||
|
||||
- Приватні повідомлення маршрутизуються як `direct`; канали — як `channel`; MPIM — як `group`.
|
||||
- Із типовим `session.dmScope=main` приватні повідомлення Slack згортаються в основну сесію агента.
|
||||
- DM маршрутизуються як `direct`; канали — як `channel`; MPIM — як `group`.
|
||||
- Із типовим `session.dmScope=main` Slack DM згортаються до основної сесії агента.
|
||||
- Сесії каналів: `agent:<agentId>:slack:channel:<channelId>`.
|
||||
- Відповіді в тредах можуть створювати суфікси сесій тредів (`:thread:<threadTs>`), де це застосовно.
|
||||
- Типове значення `channels.slack.thread.historyScope` — `thread`; типове значення `thread.inheritParent` — `false`.
|
||||
- `channels.slack.thread.initialHistoryLimit` керує кількістю наявних повідомлень треду, які отримуються під час запуску нової сесії треду (типово `20`; установіть `0`, щоб вимкнути).
|
||||
- `channels.slack.thread.requireExplicitMention` (типово `false`): коли має значення `true`, пригнічує неявні згадки в тредах, тож бот відповідає лише на явні згадки `@bot` усередині тредів, навіть якщо бот уже брав участь у треді. Без цього відповіді в треді, де брав участь бот, обходять обмеження `requireMention`.
|
||||
- Відповіді в треді можуть створювати суфікси сесії треду (`: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.replyToMode`: `off|first|all|batched` (типово `off`)
|
||||
- `channels.slack.replyToMode`: `off|first|all|batched` (за замовчуванням `off`)
|
||||
- `channels.slack.replyToModeByChatType`: для кожного `direct|group|channel`
|
||||
- застаріле резервне значення для прямих чатів: `channels.slack.dm.replyToMode`
|
||||
|
||||
Підтримуються ручні теги reply:
|
||||
Підтримуються ручні теги відповіді:
|
||||
|
||||
- `[[reply_to_current]]`
|
||||
- `[[reply_to:<id>]]`
|
||||
|
||||
Примітка: `replyToMode="off"` вимикає **усі** треди відповідей у Slack, включно з явними тегами `[[reply_to_*]]`. Це відрізняється від Telegram, де явні теги все одно враховуються в режимі `"off"`. Різниця відображає моделі тредів платформ: у Slack треди приховують повідомлення з каналу, тоді як у Telegram replies залишаються видимими в основному потоці чату.
|
||||
Примітка: `replyToMode="off"` вимикає **усі** треди відповідей у Slack, включно з явними тегами `[[reply_to_*]]`. Це відрізняється від Telegram, де явні теги все одно враховуються в режимі `"off"`. Різниця відображає моделі тредів на цих платформах: у Slack треди приховують повідомлення з каналу, тоді як у Telegram відповіді залишаються видимими в основному потоці чату.
|
||||
|
||||
## Ack-реакції
|
||||
## Реакції підтвердження
|
||||
|
||||
`ackReaction` надсилає emoji-підтвердження, поки OpenClaw обробляє вхідне повідомлення.
|
||||
|
||||
@ -453,36 +454,40 @@ openclaw gateway
|
||||
- `channels.slack.accounts.<accountId>.ackReaction`
|
||||
- `channels.slack.ackReaction`
|
||||
- `messages.ackReaction`
|
||||
- резервне значення emoji з ідентичності агента (`agents.list[].identity.emoji`, інакше "👀")
|
||||
- резервне значення emoji ідентичності агента (`agents.list[].identity.emoji`, інакше `"👀"`)
|
||||
|
||||
Примітки:
|
||||
|
||||
- Slack очікує shortcodes (наприклад, `"eyes"`).
|
||||
- Slack очікує короткі коди (наприклад, `"eyes"`).
|
||||
- Використовуйте `""`, щоб вимкнути реакцію для облікового запису Slack або глобально.
|
||||
|
||||
## Потокова передача тексту
|
||||
|
||||
`channels.slack.streaming` керує поведінкою live preview:
|
||||
|
||||
- `off`: вимкнути live preview streaming.
|
||||
- `partial` (типово): замінювати текст попереднього перегляду останнім частковим виводом.
|
||||
- `off`: вимкнути потокову live preview.
|
||||
- `partial` (за замовчуванням): замінювати текст попереднього перегляду останнім частковим виводом.
|
||||
- `block`: додавати фрагментовані оновлення попереднього перегляду.
|
||||
- `progress`: показувати текст стану прогресу під час генерації, а потім надсилати фінальний текст.
|
||||
- `progress`: показувати текст статусу прогресу під час генерації, а потім надсилати остаточний текст.
|
||||
|
||||
`channels.slack.nativeStreaming` керує нативною потоковою передачею тексту Slack, коли `streaming` має значення `partial` (типово: `true`).
|
||||
`channels.slack.streaming.nativeTransport` керує нативною потоковою передачею тексту Slack, коли `channels.slack.streaming.mode` має значення `partial` (за замовчуванням: `true`).
|
||||
|
||||
- Щоб з’явилася нативна потокова передача тексту, має бути доступний тред відповіді. Вибір треду, як і раніше, підпорядковується `replyToMode`. Без нього використовується звичайний чернетковий попередній перегляд.
|
||||
- Медіа та нетекстові корисні навантаження повертаються до звичайної доставки.
|
||||
- Якщо потокова передача зламається посеред відповіді, OpenClaw повернеться до звичайної доставки для решти корисних навантажень.
|
||||
- Для нативної потокової передачі тексту та відображення статусу треду Slack assistant має бути доступний тред відповіді. Вибір треду все одно підпорядковується `replyToMode`.
|
||||
- Кореневі повідомлення каналів і групових чатів усе ще можуть використовувати звичайний чернетковий preview, коли нативна потокова передача недоступна.
|
||||
- DM у Slack верхнього рівня за замовчуванням залишаються поза тредом, тому не показують preview у стилі треду; використовуйте відповіді в треді або `typingReaction`, якщо хочете бачити прогрес там.
|
||||
- Для медіа та не текстових payload використовується звичайна доставка.
|
||||
- Якщо потокова передача зламається посеред відповіді, OpenClaw повернеться до звичайної доставки для решти payload.
|
||||
|
||||
Використовуйте чернетковий попередній перегляд замість нативної потокової передачі тексту Slack:
|
||||
Використовуйте чернетковий preview замість нативної потокової передачі тексту Slack:
|
||||
|
||||
```json5
|
||||
{
|
||||
channels: {
|
||||
slack: {
|
||||
streaming: "partial",
|
||||
nativeStreaming: false,
|
||||
streaming: {
|
||||
mode: "partial",
|
||||
nativeTransport: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@ -490,12 +495,13 @@ openclaw gateway
|
||||
|
||||
Застарілі ключі:
|
||||
|
||||
- `channels.slack.streamMode` (`replace | status_final | append`) автоматично мігрує до `channels.slack.streaming`.
|
||||
- булевий `channels.slack.streaming` автоматично мігрує до `channels.slack.nativeStreaming`.
|
||||
- `channels.slack.streamMode` (`replace | status_final | append`) автоматично мігрується до `channels.slack.streaming.mode`.
|
||||
- булеве `channels.slack.streaming` автоматично мігрується до `channels.slack.streaming.mode` і `channels.slack.streaming.nativeTransport`.
|
||||
- застаріле `channels.slack.nativeStreaming` автоматично мігрується до `channels.slack.streaming.nativeTransport`.
|
||||
|
||||
## Резервний варіант з typing reaction
|
||||
## Резервна реакція введення
|
||||
|
||||
`typingReaction` додає тимчасову реакцію до вхідного повідомлення Slack, поки OpenClaw обробляє відповідь, а потім видаляє її після завершення виконання. Це найкорисніше поза відповідями в тредах, де використовується типовий індикатор стану "is typing...".
|
||||
`typingReaction` додає тимчасову реакцію до вхідного повідомлення Slack, поки OpenClaw обробляє відповідь, а потім видаляє її, коли виконання завершується. Це особливо корисно поза відповідями в тредах, які використовують типовий індикатор статусу "is typing...".
|
||||
|
||||
Порядок визначення:
|
||||
|
||||
@ -504,50 +510,50 @@ openclaw gateway
|
||||
|
||||
Примітки:
|
||||
|
||||
- Slack очікує shortcodes (наприклад, `"hourglass_flowing_sand"`).
|
||||
- Реакція надсилається за принципом best-effort, а очищення автоматично намагається виконатися після відповіді або завершення шляху помилки.
|
||||
- Slack очікує короткі коди (наприклад, `"hourglass_flowing_sand"`).
|
||||
- Реакція є best-effort, а спроба очищення автоматично виконується після завершення відповіді або сценарію помилки.
|
||||
|
||||
## Медіа, розбиття на частини та доставка
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Вхідні вкладення">
|
||||
Файлові вкладення Slack завантажуються з приватних URL-адрес, розміщених у Slack (потік запитів з автентифікацією токеном), і записуються до сховища медіа, якщо отримання успішне та дозволяють обмеження розміру.
|
||||
Файлові вкладення Slack завантажуються з приватних URL, розміщених у Slack (потік запитів з автентифікацією токеном), і записуються до сховища медіа, якщо отримання успішне та дозволяють обмеження розміру.
|
||||
|
||||
Типове обмеження розміру вхідних даних під час виконання — `20MB`, якщо не перевизначено через `channels.slack.mediaMaxMb`.
|
||||
Обмеження розміру вхідних даних під час виконання за замовчуванням становить `20MB`, якщо не перевизначено через `channels.slack.mediaMaxMb`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Вихідний текст і файли">
|
||||
- текстові фрагменти використовують `channels.slack.textChunkLimit` (типово 4000)
|
||||
- текстові частини використовують `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 з media pipeline
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Цілі доставки">
|
||||
Бажані явні цілі:
|
||||
Рекомендовані явні цілі:
|
||||
|
||||
- `user:<id>` для приватних повідомлень
|
||||
- `user:<id>` для DM
|
||||
- `channel:<id>` для каналів
|
||||
|
||||
Приватні повідомлення Slack відкриваються через API бесід Slack під час надсилання до цілей користувача.
|
||||
Slack DM відкриваються через API розмов Slack під час надсилання до цілей користувача.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Команди та поведінка slash
|
||||
|
||||
- Нативний автоматичний режим команд для Slack **вимкнено** (`commands.native: "auto"` не вмикає нативні команди Slack).
|
||||
- Автоматичний режим нативних команд **вимкнено** для Slack (`commands.native: "auto"` не вмикає нативні команди Slack).
|
||||
- Увімкніть нативні обробники команд Slack через `channels.slack.commands.native: true` (або глобально `commands.native: true`).
|
||||
- Коли нативні команди ввімкнено, зареєструйте відповідні slash-команди у Slack (імена `/<command>`), з одним винятком:
|
||||
- зареєструйте `/agentstatus` для команди status (Slack резервує `/status`)
|
||||
- Якщо нативні команди не ввімкнено, можна запускати одну налаштовану slash-команду через `channels.slack.slashCommand`.
|
||||
- Нативні меню аргументів тепер адаптують свою стратегію відображення:
|
||||
- Коли нативні команди ввімкнено, зареєструйте відповідні slash-команди у Slack (імена `/<command>`), за одним винятком:
|
||||
- зареєструйте `/agentstatus` для команди статусу (Slack резервує `/status`)
|
||||
- Якщо нативні команди не ввімкнено, ви можете запускати одну налаштовану slash-команду через `channels.slack.slashCommand`.
|
||||
- Нативні меню аргументів тепер адаптують свою стратегію рендерингу:
|
||||
- до 5 варіантів: блоки кнопок
|
||||
- 6-100 варіантів: статичне меню вибору
|
||||
- понад 100 варіантів: зовнішній вибір з асинхронною фільтрацією варіантів, якщо доступні обробники параметрів interactivity
|
||||
- понад 100 варіантів: зовнішній вибір з асинхронною фільтрацією варіантів, коли доступні обробники параметрів interactivity
|
||||
- якщо закодовані значення варіантів перевищують обмеження Slack, потік повертається до кнопок
|
||||
- Для довгих корисних навантажень варіантів меню аргументів slash-команд використовують діалог підтвердження перед відправленням вибраного значення.
|
||||
- Для довгих payload варіантів меню аргументів slash-команд використовують діалог підтвердження перед відправленням вибраного значення.
|
||||
|
||||
Типові параметри slash-команд:
|
||||
|
||||
@ -560,11 +566,11 @@ openclaw gateway
|
||||
|
||||
- `agent:<agentId>:slack:slash:<userId>`
|
||||
|
||||
і все ще маршрутизують виконання команд відносно сесії цільової бесіди (`CommandTargetSessionKey`).
|
||||
і все одно маршрутизують виконання команд до сесії цільової розмови (`CommandTargetSessionKey`).
|
||||
|
||||
## Інтерактивні відповіді
|
||||
|
||||
Slack може відображати інтерактивні елементи керування відповідями, створеними агентом, але цю функцію типово вимкнено.
|
||||
Slack може відображати інтерактивні елементи відповіді, створені агентом, але ця можливість за замовчуванням вимкнена.
|
||||
|
||||
Увімкніть її глобально:
|
||||
|
||||
@ -580,7 +586,7 @@ Slack може відображати інтерактивні елементи
|
||||
}
|
||||
```
|
||||
|
||||
Або ввімкніть її лише для одного облікового запису Slack:
|
||||
Або увімкніть її лише для одного облікового запису Slack:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -598,7 +604,7 @@ Slack може відображати інтерактивні елементи
|
||||
}
|
||||
```
|
||||
|
||||
Коли функцію ввімкнено, агенти можуть надсилати директиви відповідей лише для Slack:
|
||||
Коли можливість увімкнено, агенти можуть виводити директиви відповіді лише для Slack:
|
||||
|
||||
- `[[slack_buttons: Approve:approve, Reject:reject]]`
|
||||
- `[[slack_select: Choose a target | Canary:canary, Production:production]]`
|
||||
@ -609,33 +615,32 @@ Slack може відображати інтерактивні елементи
|
||||
|
||||
- Це UI, специфічний для Slack. Інші канали не перекладають директиви Slack Block Kit у власні системи кнопок.
|
||||
- Значення інтерактивних callback — це непрозорі токени, згенеровані OpenClaw, а не необроблені значення, створені агентом.
|
||||
- Якщо згенеровані інтерактивні блоки перевищать обмеження Slack Block Kit, OpenClaw повернеться до початкової текстової відповіді замість надсилання недійсного корисного навантаження blocks.
|
||||
- Якщо згенеровані інтерактивні блоки перевищують обмеження Slack Block Kit, OpenClaw повертається до початкової текстової відповіді замість надсилання невалідного payload блоків.
|
||||
|
||||
## Погодження exec у Slack
|
||||
## Exec approvals у Slack
|
||||
|
||||
Slack може діяти як нативний клієнт погодження з інтерактивними кнопками та взаємодіями замість повернення до Web UI або термінала.
|
||||
Slack може діяти як нативний клієнт схвалення з інтерактивними кнопками та взаємодіями замість повернення до Web UI або термінала.
|
||||
|
||||
- Погодження exec використовують `channels.slack.execApprovals.*` для нативної маршрутизації до приватних повідомлень/каналів.
|
||||
- Погодження plugin також можуть визначатися через ту саму поверхню нативних кнопок Slack, коли запит уже надходить у Slack, а тип ID погодження — `plugin:`.
|
||||
- Авторизація того, хто погоджує, як і раніше, примусово застосовується: лише користувачі, визначені як approvers, можуть погоджувати або відхиляти запити через Slack.
|
||||
- Для нативної маршрутизації в DM/каналах exec approvals використовують `channels.slack.execApprovals.*`.
|
||||
- Схвалення плагінів усе ще можуть визначатися через ту саму поверхню нативних кнопок Slack, коли запит уже надходить у Slack і вид ID схвалення є `plugin:`.
|
||||
- Авторизація того, хто схвалює, усе ще примусово застосовується: лише користувачі, визначені як approvers, можуть схвалювати або відхиляти запити через Slack.
|
||||
|
||||
Це використовує ту саму спільну поверхню кнопок погодження, що й інші канали. Коли `interactivity` увімкнено в налаштуваннях вашого застосунку Slack, запити на погодження відображаються як кнопки Block Kit безпосередньо в бесіді.
|
||||
Коли ці кнопки присутні, вони є основним UX погодження; OpenClaw
|
||||
має включати ручну команду `/approve` лише тоді, коли результат інструмента вказує, що
|
||||
погодження в чаті недоступні або ручне погодження є єдиним шляхом.
|
||||
Це використовує ту саму спільну поверхню кнопок схвалення, що й інші канали. Коли у налаштуваннях застосунку Slack увімкнено `interactivity`, запити на схвалення відображаються як кнопки Block Kit безпосередньо в розмові.
|
||||
Коли ці кнопки присутні, вони є основним UX схвалення; OpenClaw
|
||||
має включати ручну команду `/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"` і визначається принаймні один
|
||||
approver. Установіть `enabled: false`, щоб явно вимкнути Slack як нативний клієнт погодження.
|
||||
Установіть `enabled: true`, щоб примусово ввімкнути нативні погодження, коли approvers визначаються.
|
||||
Slack автоматично вмикає нативні exec approvals, коли `enabled` не задано або має значення `"auto"` і визначається принаймні один
|
||||
approver. Встановіть `enabled: false`, щоб явно вимкнути Slack як нативний клієнт схвалення.
|
||||
Встановіть `enabled: true`, щоб примусово ввімкнути нативні схвалення, коли визначаються approvers.
|
||||
|
||||
Типова поведінка без явної конфігурації погодження exec для Slack:
|
||||
Поведінка за замовчуванням без явної конфігурації Slack exec approval:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -646,7 +651,7 @@ approver. Установіть `enabled: false`, щоб явно вимкнут
|
||||
```
|
||||
|
||||
Явна нативна конфігурація Slack потрібна лише тоді, коли ви хочете перевизначити approvers, додати фільтри або
|
||||
вибрати доставку в чат походження:
|
||||
використовувати доставку до чату-джерела:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -662,38 +667,38 @@ approver. Установіть `enabled: false`, щоб явно вимкнут
|
||||
}
|
||||
```
|
||||
|
||||
Спільне переспрямування `approvals.exec` є окремим. Використовуйте його лише тоді, коли запити на погодження exec також мають
|
||||
маршрутизуватися до інших чатів або явних цілей поза основним каналом. Спільне переспрямування `approvals.plugin` також є
|
||||
окремим; нативні кнопки Slack усе ще можуть визначати погодження plugin, коли ці запити вже надходять
|
||||
Спільне пересилання `approvals.exec` є окремим. Використовуйте його лише тоді, коли запити на exec approval також мають
|
||||
маршрутизуватися до інших чатів або явних цілей поза основним каналом. Спільне пересилання `approvals.plugin` також є
|
||||
окремим; нативні кнопки Slack усе ще можуть визначати схвалення плагінів, коли ці запити вже надходять
|
||||
у Slack.
|
||||
|
||||
Команда `/approve` у тому самому чаті також працює в каналах і приватних повідомленнях Slack, які вже підтримують команди. Див. [Погодження exec](/uk/tools/exec-approvals), щоб ознайомитися з повною моделлю переспрямування погоджень.
|
||||
Така сама `/approve` у тому самому чаті також працює в каналах і DM Slack, які вже підтримують команди. Див. [Exec approvals](/uk/tools/exec-approvals), щоб ознайомитися з повною моделлю пересилання схвалень.
|
||||
|
||||
## Події та операційна поведінка
|
||||
|
||||
- Редагування/видалення повідомлень і трансляції тредів зіставляються із системними подіями.
|
||||
- Редагування/видалення повідомлень і thread broadcast зіставляються із системними подіями.
|
||||
- Події додавання/видалення реакцій зіставляються із системними подіями.
|
||||
- Події входу/виходу учасників, створення/перейменування каналів і додавання/видалення закріплень зіставляються із системними подіями.
|
||||
- Події приєднання/виходу учасника, створення/перейменування каналу та додавання/видалення pin зіставляються із системними подіями.
|
||||
- `channel_id_changed` може мігрувати ключі конфігурації каналу, коли ввімкнено `configWrites`.
|
||||
- Метадані теми/призначення каналу вважаються недовіреним контекстом і можуть бути ін’єктовані в контекст маршрутизації.
|
||||
- Початкове повідомлення треду та початкове заповнення контексту історії треду фільтруються відповідно до налаштованих allowlist відправників, де це застосовно.
|
||||
- Дії block і взаємодії modal створюють структуровані системні події `Slack interaction: ...` із насиченими полями корисного навантаження:
|
||||
- Метадані topic/purpose каналу вважаються ненадійним контекстом і можуть бути впроваджені в контекст маршрутизації.
|
||||
- Початок треду й початкове заповнення контексту історії треду фільтруються відповідно до налаштованих allowlist відправників, якщо це застосовно.
|
||||
- Дії block і взаємодії modal створюють структуровані системні події `Slack interaction: ...` з насиченими полями payload:
|
||||
- дії block: вибрані значення, мітки, значення picker і метадані `workflow_*`
|
||||
- події modal `view_submission` і `view_closed` з маршрутизованими метаданими каналу та введеними значеннями форми
|
||||
- події modal `view_submission` і `view_closed` з маршрутизованими метаданими каналу та введеними даними форми
|
||||
|
||||
## Вказівники на довідкову конфігурацію
|
||||
## Вказівники на довідник конфігурації
|
||||
|
||||
Основне посилання:
|
||||
Основний довідник:
|
||||
|
||||
- [Довідник конфігурації - Slack](/uk/gateway/configuration-reference#slack)
|
||||
|
||||
Високосигнальні поля Slack:
|
||||
Основні поля Slack:
|
||||
- mode/auth: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
|
||||
- доступ до приватних повідомлень: `dm.enabled`, `dmPolicy`, `allowFrom` (застаріле: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
|
||||
- перемикач сумісності: `dangerouslyAllowNameMatching` (аварійний варіант; тримайте вимкненим, якщо не потрібно)
|
||||
- доступ до DM: `dm.enabled`, `dmPolicy`, `allowFrom` (застаріле: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
|
||||
- перемикач сумісності: `dangerouslyAllowNameMatching` (аварійний варіант; залишайте вимкненим, якщо немає потреби)
|
||||
- доступ до каналів: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention`
|
||||
- треди/історія: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
|
||||
- доставка: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `nativeStreaming`
|
||||
- доставка: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`
|
||||
- операції/можливості: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
|
||||
|
||||
## Усунення проблем
|
||||
@ -705,7 +710,7 @@ approver. Установіть `enabled: false`, щоб явно вимкнут
|
||||
- `groupPolicy`
|
||||
- allowlist каналів (`channels.slack.channels`)
|
||||
- `requireMention`
|
||||
- allowlist `users` для конкретного каналу
|
||||
- allowlist `users` для кожного каналу
|
||||
|
||||
Корисні команди:
|
||||
|
||||
@ -717,12 +722,12 @@ openclaw doctor
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Повідомлення в приватних повідомленнях ігноруються">
|
||||
<Accordion title="Повідомлення DM ігноруються">
|
||||
Перевірте:
|
||||
|
||||
- `channels.slack.dm.enabled`
|
||||
- `channels.slack.dmPolicy` (або застаріле `channels.slack.dm.policy`)
|
||||
- дозволи сполучення / записи allowlist
|
||||
- схвалення сполучення / записи allowlist
|
||||
|
||||
```bash
|
||||
openclaw pairing list slack
|
||||
@ -730,32 +735,32 @@ openclaw pairing list slack
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Режим socket не підключається">
|
||||
<Accordion title="Socket mode не підключається">
|
||||
Перевірте bot token + app token і ввімкнення Socket Mode в налаштуваннях застосунку Slack.
|
||||
|
||||
Якщо `openclaw channels status --probe --json` показує `botTokenStatus` або
|
||||
`appTokenStatus: "configured_unavailable"`, обліковий запис Slack
|
||||
налаштовано, але поточне середовище виконання не змогло визначити значення,
|
||||
що підтримується SecretRef.
|
||||
що використовує SecretRef.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Режим HTTP не отримує події">
|
||||
<Accordion title="HTTP mode не отримує події">
|
||||
Перевірте:
|
||||
|
||||
- signing secret
|
||||
- шлях webhook
|
||||
- webhook path
|
||||
- Slack Request URLs (Events + Interactivity + Slash Commands)
|
||||
- унікальний `webhookPath` для кожного HTTP-облікового запису
|
||||
|
||||
Якщо `signingSecretStatus: "configured_unavailable"` з’являється у знімках
|
||||
облікового запису, HTTP-обліковий запис налаштовано, але поточне середовище виконання не змогло
|
||||
визначити signing secret, що підтримується SecretRef.
|
||||
визначити signing secret, що використовує SecretRef.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Нативні/slash-команди не спрацьовують">
|
||||
Перевірте, чи ви справді мали на увазі:
|
||||
Перевірте, який режим ви мали на увазі:
|
||||
|
||||
- режим нативних команд (`channels.slack.commands.native: true`) з відповідними slash-командами, зареєстрованими у Slack
|
||||
- або режим однієї slash-команди (`channels.slack.slashCommand.enabled: true`)
|
||||
@ -765,7 +770,7 @@ openclaw pairing list slack
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Пов’язані розділи
|
||||
## Пов’язане
|
||||
|
||||
- [Сполучення](/uk/channels/pairing)
|
||||
- [Групи](/uk/channels/groups)
|
||||
|
||||
@ -1,34 +1,34 @@
|
||||
---
|
||||
read_when:
|
||||
- Пояснення того, як працює streaming або chunking у каналах
|
||||
- Зміна поведінки block streaming або channel chunking
|
||||
- Налагодження дубльованих/передчасних блокових відповідей або preview streaming у каналах
|
||||
summary: Поведінка streaming + chunking (блокові відповіді, preview-streaming у каналах, зіставлення режимів)
|
||||
title: Streaming і chunking
|
||||
- Пояснення того, як потокове передавання або розбиття на частини працює в каналах
|
||||
- Зміна поведінки потокового передавання блоків або розбиття на частини в каналах
|
||||
- Налагодження дубльованих/передчасних блокових відповідей або потокового передавання попереднього перегляду в каналах
|
||||
summary: Поведінка потокового передавання та розбиття на частини (блокові відповіді, потокове передавання попереднього перегляду в каналах, зіставлення режимів)
|
||||
title: Потокове передавання та розбиття на частини
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T18:02:19Z"
|
||||
generated_at: "2026-04-08T04:59:57Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 44b0d08c7eafcb32030ef7c8d5719c2ea2d34e4bac5fdad8cc8b3f4e9e9fad97
|
||||
source_hash: a8e847bb7da890818cd79dec7777f6ae488e6d6c0468e948e56b6b6c598e0000
|
||||
source_path: concepts/streaming.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Streaming + chunking
|
||||
# Потокове передавання та розбиття на частини
|
||||
|
||||
OpenClaw має два окремі шари streaming:
|
||||
OpenClaw має два окремі шари потокового передавання:
|
||||
|
||||
- **Block streaming (канали):** надсилає завершені **блоки**, поки асистент пише. Це звичайні повідомлення каналу (не дельти токенів).
|
||||
- **Preview streaming (Telegram/Discord/Slack):** оновлює тимчасове **preview message** під час генерації.
|
||||
- **Потокове передавання блоків (канали):** надсилає завершені **блоки**, поки помічник пише. Це звичайні повідомлення каналу (не дельти токенів).
|
||||
- **Потокове передавання попереднього перегляду (Telegram/Discord/Slack):** оновлює тимчасове **повідомлення попереднього перегляду** під час генерації.
|
||||
|
||||
Справжнього streaming дельт токенів до повідомлень каналу сьогодні **немає**. Preview streaming працює на рівні повідомлень (надсилання + редагування/додавання).
|
||||
Справжнього **потокового передавання дельт токенів** у повідомлення каналів наразі **немає**. Потокове передавання попереднього перегляду є повідомлень-орієнтованим (надсилання + редагування/додавання).
|
||||
|
||||
## Block streaming (повідомлення каналу)
|
||||
## Потокове передавання блоків (повідомлення каналів)
|
||||
|
||||
Block streaming надсилає вихід асистента грубими фрагментами в міру його появи.
|
||||
Потокове передавання блоків надсилає вивід помічника великими частинами в міру його появи.
|
||||
|
||||
```
|
||||
Model output
|
||||
Вивід моделі
|
||||
└─ text_delta/events
|
||||
├─ (blockStreamingBreak=text_end)
|
||||
│ └─ chunker emits blocks as buffer grows
|
||||
@ -39,130 +39,131 @@ Model output
|
||||
|
||||
Легенда:
|
||||
|
||||
- `text_delta/events`: події потоку моделі (можуть бути рідкісними для моделей без streaming).
|
||||
- `chunker`: `EmbeddedBlockChunker`, який застосовує мінімальні/максимальні межі + пріоритет розриву.
|
||||
- `text_delta/events`: події потоку моделі (можуть бути рідкісними для моделей без потокового передавання).
|
||||
- `chunker`: `EmbeddedBlockChunker`, що застосовує мінімальні/максимальні межі + пріоритет розриву.
|
||||
- `channel send`: фактичні вихідні повідомлення (блокові відповіді).
|
||||
|
||||
**Керування:**
|
||||
|
||||
- `agents.defaults.blockStreamingDefault`: `"on"`/`"off"` (типово вимкнено).
|
||||
- Перевизначення для каналів: `*.blockStreaming` (і варіанти для окремих облікових записів), щоб примусово задати `"on"`/`"off"` для кожного каналу.
|
||||
- Перевизначення для каналів: `*.blockStreaming` (і варіанти для окремих облікових записів), щоб примусово встановити `"on"`/`"off"` для кожного каналу.
|
||||
- `agents.defaults.blockStreamingBreak`: `"text_end"` або `"message_end"`.
|
||||
- `agents.defaults.blockStreamingChunk`: `{ minChars, maxChars, breakPreference? }`.
|
||||
- `agents.defaults.blockStreamingCoalesce`: `{ minChars?, maxChars?, idleMs? }` (об’єднання блоків streaming перед надсиланням).
|
||||
- `agents.defaults.blockStreamingCoalesce`: `{ minChars?, maxChars?, idleMs? }` (об’єднання потокових блоків перед надсиланням).
|
||||
- Жорстке обмеження каналу: `*.textChunkLimit` (наприклад, `channels.whatsapp.textChunkLimit`).
|
||||
- Режим chunking каналу: `*.chunkMode` (`length` типово, `newline` ділить за порожніми рядками (межами абзаців) перед chunking за довжиною).
|
||||
- М’яке обмеження Discord: `channels.discord.maxLinesPerMessage` (типово 17) ділить високі відповіді, щоб уникнути обрізання в UI.
|
||||
- Режим розбиття на частини для каналу: `*.chunkMode` (`length` типово, `newline` розбиває за порожніми рядками (межами абзаців) перед розбиттям за довжиною).
|
||||
- М’яке обмеження Discord: `channels.discord.maxLinesPerMessage` (типово 17) розбиває високі відповіді, щоб уникнути обрізання в інтерфейсі.
|
||||
|
||||
**Семантика меж:**
|
||||
|
||||
- `text_end`: передавати блоки в потоці, щойно їх видає chunker; flush на кожному `text_end`.
|
||||
- `message_end`: чекати, доки повідомлення асистента завершиться, а потім flush буферизований вихід.
|
||||
- `text_end`: передавати блоки потоком щойно `chunker` їх видає; скидати буфер на кожному `text_end`.
|
||||
- `message_end`: чекати, доки повідомлення помічника завершиться, а потім скидати буферизований вивід.
|
||||
|
||||
`message_end` усе одно використовує chunker, якщо буферизований текст перевищує `maxChars`, тому наприкінці він може видати кілька chunk.
|
||||
`message_end` усе одно використовує `chunker`, якщо буферизований текст перевищує `maxChars`, тому наприкінці він може видати кілька частин.
|
||||
|
||||
## Алгоритм chunking (нижня/верхня межі)
|
||||
## Алгоритм розбиття на частини (нижня/верхня межа)
|
||||
|
||||
Block chunking реалізовано через `EmbeddedBlockChunker`:
|
||||
Розбиття блоків на частини реалізовано в `EmbeddedBlockChunker`:
|
||||
|
||||
- **Нижня межа:** не видавати, доки буфер не досягне `minChars` (якщо не примусово).
|
||||
- **Верхня межа:** намагатися розривати до `maxChars`; якщо примусово, розривати на `maxChars`.
|
||||
- **Нижня межа:** не видавати нічого, доки буфер не стане >= `minChars` (якщо не примусово).
|
||||
- **Верхня межа:** намагатися розбивати до `maxChars`; якщо примусово, розбивати на `maxChars`.
|
||||
- **Пріоритет розриву:** `paragraph` → `newline` → `sentence` → `whitespace` → жорсткий розрив.
|
||||
- **Code fences:** ніколи не розривати всередині fence; якщо розрив на `maxChars` примусовий, fence закривається й знову відкривається, щоб Markdown залишався коректним.
|
||||
- **Огородження коду:** ніколи не розбивати всередині огороджень; у разі примусового розриву на `maxChars` огородження закривається й знову відкривається, щоб Markdown залишався коректним.
|
||||
|
||||
`maxChars` обмежується значенням `textChunkLimit` каналу, тому перевищити ліміти каналу не можна.
|
||||
`maxChars` обмежується значенням `textChunkLimit` каналу, тому перевищити обмеження для конкретного каналу неможливо.
|
||||
|
||||
## Coalescing (об’єднання блоків streaming)
|
||||
## Об’єднання (злиття потокових блоків)
|
||||
|
||||
Коли block streaming увімкнено, OpenClaw може **об’єднувати послідовні блокові chunk**
|
||||
перед їх надсиланням. Це зменшує «спам з однорядкових повідомлень», водночас
|
||||
зберігаючи поступовий вивід.
|
||||
Коли потокове передавання блоків увімкнене, OpenClaw може **об’єднувати послідовні блокові частини**
|
||||
перед їх надсиланням. Це зменшує «спам з одного рядка», водночас зберігаючи
|
||||
поступовий вивід.
|
||||
|
||||
- Coalescing чекає **пауз без активності** (`idleMs`) перед flush.
|
||||
- Буфери обмежені `maxChars` і будуть скинуті, якщо перевищать його.
|
||||
- `minChars` не дає надсилати крихітні фрагменти, доки не накопичиться достатньо тексту
|
||||
(під час фінального flush залишковий текст надсилається завжди).
|
||||
- Joiner виводиться з `blockStreamingChunk.breakPreference`
|
||||
- Об’єднання чекає на **паузи бездіяльності** (`idleMs`) перед скиданням.
|
||||
- Буфери обмежуються значенням `maxChars` і буде виконано скидання, якщо їх перевищено.
|
||||
- `minChars` не дає надсилати дрібні фрагменти, доки не накопичиться достатньо тексту
|
||||
(підсумкове скидання завжди надсилає решту тексту).
|
||||
- Роздільник визначається з `blockStreamingChunk.breakPreference`
|
||||
(`paragraph` → `\n\n`, `newline` → `\n`, `sentence` → пробіл).
|
||||
- Для каналів доступні перевизначення через `*.blockStreamingCoalesce` (зокрема у конфігураціях для окремих облікових записів).
|
||||
- Перевизначення для каналів доступні через `*.blockStreamingCoalesce` (зокрема в конфігураціях окремих облікових записів).
|
||||
- Типове значення coalesce `minChars` підвищується до 1500 для Signal/Slack/Discord, якщо не перевизначено.
|
||||
|
||||
## Людиноподібний темп між блоками
|
||||
|
||||
Коли block streaming увімкнено, ви можете додати **випадкову паузу** між
|
||||
блоковими відповідями (після першого блока). Це робить багатобульбашкові відповіді
|
||||
Коли потокове передавання блоків увімкнене, можна додати **випадкову паузу** між
|
||||
блоковими відповідями (після першого блоку). Це робить відповіді з кількох бульбашок
|
||||
природнішими.
|
||||
|
||||
- Конфігурація: `agents.defaults.humanDelay` (можна перевизначити для окремого агента через `agents.list[].humanDelay`).
|
||||
- Режими: `off` (типово), `natural` (800–2500 мс), `custom` (`minMs`/`maxMs`).
|
||||
- Конфігурація: `agents.defaults.humanDelay` (перевизначення для агента через `agents.list[].humanDelay`).
|
||||
- Режими: `off` (типово), `natural` (800–2500ms), `custom` (`minMs`/`maxMs`).
|
||||
- Застосовується лише до **блокових відповідей**, а не до фінальних відповідей чи підсумків інструментів.
|
||||
|
||||
## "Передавати chunk-и чи все одразу"
|
||||
## «Передавати частинами чи все одразу»
|
||||
|
||||
Це зіставляється так:
|
||||
|
||||
- **Передавати chunk-и:** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"` (видавати під час генерації). Для каналів, окрім Telegram, також потрібно `*.blockStreaming: true`.
|
||||
- **Передати все наприкінці:** `blockStreamingBreak: "message_end"` (одноразовий flush, можливо з кількома chunk, якщо текст дуже довгий).
|
||||
- **Без block streaming:** `blockStreamingDefault: "off"` (лише фінальна відповідь).
|
||||
- **Передавати частинами:** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"` (передавання в міру надходження). Для каналів, крім Telegram, також потрібно `*.blockStreaming: true`.
|
||||
- **Передати все наприкінці:** `blockStreamingBreak: "message_end"` (одноразове скидання, можливо кількома частинами, якщо відповідь дуже довга).
|
||||
- **Без потокового передавання блоків:** `blockStreamingDefault: "off"` (лише фінальна відповідь).
|
||||
|
||||
**Примітка про канал:** Block streaming **вимкнено, якщо тільки**
|
||||
`*.blockStreaming` явно не задано як `true`. Канали можуть вести live preview streaming
|
||||
**Примітка щодо каналів:** Потокове передавання блоків **вимкнене, доки**
|
||||
`*.blockStreaming` явно не встановлено в `true`. Канали можуть передавати живий попередній перегляд
|
||||
(`channels.<channel>.streaming`) без блокових відповідей.
|
||||
|
||||
Нагадування про місце конфігурації: типові значення `blockStreaming*` розміщуються в
|
||||
Нагадування про розташування конфігурації: типові параметри `blockStreaming*` знаходяться в
|
||||
`agents.defaults`, а не в корені конфігурації.
|
||||
|
||||
## Режими preview streaming
|
||||
## Режими потокового передавання попереднього перегляду
|
||||
|
||||
Канонічний ключ: `channels.<channel>.streaming`
|
||||
|
||||
Режими:
|
||||
|
||||
- `off`: вимкнути preview streaming.
|
||||
- `partial`: одне preview, яке замінюється найновішим текстом.
|
||||
- `block`: preview оновлюється chunk-ами/додаваннями.
|
||||
- `progress`: preview прогресу/статусу під час генерації, фінальна відповідь після завершення.
|
||||
- `off`: вимкнути потокове передавання попереднього перегляду.
|
||||
- `partial`: один попередній перегляд, який замінюється найновішим текстом.
|
||||
- `block`: оновлення попереднього перегляду поетапно, частинами/додаванням.
|
||||
- `progress`: попередній перегляд прогресу/стану під час генерації, фінальна відповідь після завершення.
|
||||
|
||||
### Зіставлення каналів
|
||||
|
||||
| Канал | `off` | `partial` | `block` | `progress` |
|
||||
| -------- | ----- | --------- | ------- | ----------------- |
|
||||
| Канал | `off` | `partial` | `block` | `progress` |
|
||||
| ------- | ----- | --------- | ------- | ----------------- |
|
||||
| Telegram | ✅ | ✅ | ✅ | зіставляється з `partial` |
|
||||
| Discord | ✅ | ✅ | ✅ | зіставляється з `partial` |
|
||||
| Slack | ✅ | ✅ | ✅ | ✅ |
|
||||
|
||||
Лише для Slack:
|
||||
|
||||
- `channels.slack.nativeStreaming` перемикає нативні виклики API streaming Slack, коли `streaming=partial` (типово: `true`).
|
||||
- `channels.slack.streaming.nativeTransport` перемикає виклики нативного API потокового передавання Slack, коли `channels.slack.streaming.mode="partial"` (типово: `true`).
|
||||
- Нативне потокове передавання Slack і статус у потоці помічника Slack вимагають цільового потоку відповіді; DM верхнього рівня не показують такий попередній перегляд у стилі потоку.
|
||||
|
||||
Міграція застарілих ключів:
|
||||
|
||||
- Telegram: `streamMode` + булевий `streaming` автоматично мігрують до enum `streaming`.
|
||||
- Discord: `streamMode` + булевий `streaming` автоматично мігрують до enum `streaming`.
|
||||
- Slack: `streamMode` автоматично мігрує до enum `streaming`; булевий `streaming` автоматично мігрує до `nativeStreaming`.
|
||||
- Telegram: `streamMode` і булеве `streaming` автоматично мігрують у enum `streaming`.
|
||||
- Discord: `streamMode` і булеве `streaming` автоматично мігрують у enum `streaming`.
|
||||
- Slack: `streamMode` автоматично мігрує до `streaming.mode`; булеве `streaming` автоматично мігрує до `streaming.mode` плюс `streaming.nativeTransport`; застаріле `nativeStreaming` автоматично мігрує до `streaming.nativeTransport`.
|
||||
|
||||
### Поведінка runtime
|
||||
### Поведінка під час виконання
|
||||
|
||||
Telegram:
|
||||
|
||||
- Використовує `sendMessage` + `editMessageText` для оновлення preview у DM і групах/темах.
|
||||
- Preview streaming пропускається, якщо block streaming Telegram явно увімкнено (щоб уникнути подвійного streaming).
|
||||
- `/reasoning stream` може записувати міркування в preview.
|
||||
- Використовує оновлення попереднього перегляду через `sendMessage` + `editMessageText` у DM та групах/темах.
|
||||
- Потокове передавання попереднього перегляду пропускається, якщо для Telegram явно ввімкнено потокове передавання блоків (щоб уникнути подвійного потокового передавання).
|
||||
- `/reasoning stream` може записувати міркування в попередній перегляд.
|
||||
|
||||
Discord:
|
||||
|
||||
- Використовує надсилання + редагування preview message.
|
||||
- Режим `block` використовує chunking чернетки (`draftChunk`).
|
||||
- Preview streaming пропускається, якщо block streaming Discord явно увімкнено.
|
||||
- Використовує надсилання + редагування повідомлень попереднього перегляду.
|
||||
- Режим `block` використовує чернеткове розбиття на частини (`draftChunk`).
|
||||
- Потокове передавання попереднього перегляду пропускається, якщо для Discord явно ввімкнено потокове передавання блоків.
|
||||
|
||||
Slack:
|
||||
|
||||
- `partial` може використовувати нативний streaming Slack (`chat.startStream`/`append`/`stop`), коли доступно.
|
||||
- `block` використовує preview чернетки у стилі append.
|
||||
- `progress` використовує preview тексту статусу, а потім фінальну відповідь.
|
||||
- `partial` може використовувати нативне потокове передавання Slack (`chat.startStream`/`append`/`stop`), коли воно доступне.
|
||||
- `block` використовує попередні перегляди чернеток у стилі додавання.
|
||||
- `progress` використовує текст попереднього перегляду стану, а потім фінальну відповідь.
|
||||
|
||||
## Пов’язане
|
||||
|
||||
- [Повідомлення](/concepts/messages) — життєвий цикл і доставка повідомлень
|
||||
- [Повторні спроби](/concepts/retry) — поведінка повторних спроб у разі збою доставки
|
||||
- [Канали](/channels) — підтримка streaming для окремих каналів
|
||||
- [Повідомлення](/uk/concepts/messages) — життєвий цикл і доставка повідомлень
|
||||
- [Повторна спроба](/uk/concepts/retry) — поведінка повторних спроб у разі помилки доставки
|
||||
- [Канали](/uk/channels) — підтримка потокового передавання для кожного каналу
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user