From b82c96ca42567593cd290d48d55ef61dd96c45bf Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Wed, 29 Apr 2026 23:09:07 +0000 Subject: [PATCH] chore(i18n): refresh uk translations --- docs/uk/channels/whatsapp.md | 338 +++++++++++++++++------------------ 1 file changed, 161 insertions(+), 177 deletions(-) diff --git a/docs/uk/channels/whatsapp.md b/docs/uk/channels/whatsapp.md index f5b143c23..5dc6c2075 100644 --- a/docs/uk/channels/whatsapp.md +++ b/docs/uk/channels/whatsapp.md @@ -1,28 +1,28 @@ --- read_when: - - Робота з поведінкою WhatsApp/вебканалу або маршрутизацією вхідних повідомлень + - Робота над поведінкою каналу WhatsApp/веб або маршрутизацією вхідних повідомлень summary: Підтримка каналу WhatsApp, контроль доступу, поведінка доставки та експлуатація title: WhatsApp x-i18n: - generated_at: "2026-04-29T11:03:42Z" + generated_at: "2026-04-29T23:07:38Z" model: gpt-5.5 provider: openai - source_hash: f5acfebb37e16c4a3602ead7c9a4f2e16315d07612dc1e929f30fb7b1bc37761 + source_hash: bf363ec2cc7100635ee6b0a7b0e7bb956521d0203b445fd38b5a75a13e8918a6 source_path: channels/whatsapp.md workflow: 16 --- -Status: готово до production через WhatsApp Web (Baileys). Gateway володіє пов’язаними сеансами. +Стан: готовий до production через WhatsApp Web (Baileys). Gateway володіє пов’язаними сеансами. -## Встановлення (на вимогу) +## Встановлення (за потреби) - Onboarding (`openclaw onboard`) і `openclaw channels add --channel whatsapp` - пропонують установити WhatsApp plugin під час першого вибору. -- `openclaw channels login --channel whatsapp` також пропонує потік установлення, коли - plugin ще відсутній. -- Dev channel + git checkout: за замовчуванням використовує локальний шлях plugin. -- Stable/Beta: використовує npm-пакет `@openclaw/whatsapp`, коли поточний пакет - опубліковано. + пропонують встановити WhatsApp plugin під час першого вибору. +- `openclaw channels login --channel whatsapp` також пропонує процес встановлення, коли + plugin ще не встановлено. +- Dev-канал + git checkout: типово використовує локальний шлях plugin. +- Stable/Beta: використовує npm-пакет `@openclaw/whatsapp`, коли опубліковано + поточний пакет. Ручне встановлення залишається доступним: @@ -31,18 +31,18 @@ openclaw plugins install @openclaw/whatsapp ``` Якщо npm повідомляє, що пакет, який належить OpenClaw, застарілий або відсутній, використовуйте -поточну пакетовану збірку OpenClaw або локальний checkout, доки npm-пакетний потік +поточну пакетовану збірку OpenClaw або локальний checkout, доки черга npm-пакетів не наздожене. - - Типова політика DM для невідомих відправників — сполучення. + + Стандартна політика DM — зв’язування для невідомих відправників. - - Міжканальна діагностика та playbook-и відновлення. + + Міжканальна діагностика та інструкції з відновлення. - Повні шаблони й приклади конфігурації каналів. + Повні шаблони та приклади конфігурації каналу. @@ -66,7 +66,7 @@ openclaw plugins install @openclaw/whatsapp - + ```bash openclaw channels login --channel whatsapp @@ -78,7 +78,7 @@ openclaw channels login --channel whatsapp openclaw channels login --channel whatsapp --account work ``` - Щоб підключити наявний/власний каталог автентифікації WhatsApp Web перед входом: + Щоб під’єднати наявний/користувацький каталог автентифікації WhatsApp Web перед входом: ```bash openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-auth @@ -95,30 +95,30 @@ openclaw gateway - + ```bash openclaw pairing list whatsapp openclaw pairing approve whatsapp ``` - Запити на сполучення спливають через 1 годину. Кількість очікуваних запитів обмежена 3 на канал. + Запити на зв’язування спливають через 1 годину. Очікувані запити обмежені 3 на канал. -OpenClaw рекомендує за можливості запускати WhatsApp на окремому номері. (Метадані каналу й потік налаштування оптимізовані для такого налаштування, але налаштування з особистим номером також підтримуються.) +OpenClaw рекомендує за можливості запускати WhatsApp на окремому номері. (Метадані каналу та процес налаштування оптимізовані для такого налаштування, але налаштування з особистим номером також підтримуються.) ## Шаблони розгортання - + Це найчистіший операційний режим: - окрема ідентичність WhatsApp для OpenClaw - - чіткіші allowlist-и DM і межі маршрутизації + - зрозуміліші списки дозволів DM і межі маршрутизації - нижча ймовірність плутанини із self-chat Мінімальний шаблон політики: @@ -137,13 +137,13 @@ OpenClaw рекомендує за можливості запускати Whats - Onboarding підтримує режим особистого номера й записує базовий варіант, дружній до self-chat: + Onboarding підтримує режим особистого номера й записує базову конфігурацію, дружню до self-chat: - `dmPolicy: "allowlist"` - `allowFrom` містить ваш особистий номер - `selfChatMode: true` - Під час виконання захист self-chat базується на пов’язаному власному номері та `allowFrom`. + Під час виконання захисти self-chat спираються на пов’язаний власний номер і `allowFrom`. @@ -158,22 +158,22 @@ OpenClaw рекомендує за можливості запускати Whats ## Модель виконання - Gateway володіє сокетом WhatsApp і циклом повторного підключення. -- Watchdog повторного підключення використовує активність транспорту WhatsApp Web, а не лише обсяг вхідних повідомлень застосунку, тому тихий сеанс пов’язаного пристрою не перезапускається лише через те, що останнім часом ніхто не надсилав повідомлення. Довший ліміт тиші застосунку все одно примусово виконує повторне підключення, якщо транспортні кадри продовжують надходити, але протягом вікна watchdog не обробляються повідомлення застосунку; після тимчасового повторного підключення для нещодавно активного сеансу ця перевірка тиші застосунку використовує звичайний тайм-аут повідомлень для першого вікна відновлення. -- Таймінги сокета Baileys явно задані в `web.whatsapp.*`: `keepAliveIntervalMs` керує ping-ами застосунку WhatsApp Web, `connectTimeoutMs` керує тайм-аутом початкового handshake, а `defaultQueryTimeoutMs` керує тайм-аутами запитів Baileys. +- Сторож повторного підключення використовує активність транспорту WhatsApp Web, а не лише обсяг вхідних повідомлень застосунку, тому тихий сеанс пов’язаного пристрою не перезапускається тільки через те, що останнім часом ніхто не надсилав повідомлень. Довше обмеження тиші застосунку все ще примусово запускає повторне підключення, якщо транспортні кадри продовжують надходити, але повідомлення застосунку не обробляються протягом вікна сторожа; після тимчасового повторного підключення для нещодавно активного сеансу ця перевірка тиші застосунку використовує звичайний тайм-аут повідомлень для першого вікна відновлення. +- Таймінги сокета Baileys явно задаються в `web.whatsapp.*`: `keepAliveIntervalMs` керує ping-повідомленнями застосунку WhatsApp Web, `connectTimeoutMs` керує тайм-аутом початкового рукостискання, а `defaultQueryTimeoutMs` керує тайм-аутами запитів Baileys. - Вихідні надсилання потребують активного слухача WhatsApp для цільового облікового запису. -- Чати статусів і розсилок ігноруються (`@status`, `@broadcast`). -- Watchdog повторного підключення відстежує активність транспорту WhatsApp Web, а не лише обсяг вхідних повідомлень застосунку: тихі сеанси пов’язаних пристроїв залишаються активними, доки транспортні кадри продовжують надходити, але зупинка транспорту примушує повторне підключення значно раніше за пізніший шлях віддаленого від’єднання. -- Прямі чати використовують правила сеансів DM (`session.dmScope`; стандартне `main` зводить DM до головного сеансу агента). +- Чати статусу й трансляцій ігноруються (`@status`, `@broadcast`). +- Сторож повторного підключення відстежує активність транспорту WhatsApp Web, а не лише обсяг вхідних повідомлень застосунку: тихі сеанси пов’язаних пристроїв залишаються активними, доки транспортні кадри продовжують надходити, але зупинка транспорту примусово запускає повторне підключення задовго до пізнішого шляху віддаленого від’єднання. +- Прямі чати використовують правила DM-сеансів (`session.dmScope`; типове `main` згортає DM до головного сеансу агента). - Групові сеанси ізольовані (`agent::whatsapp:group:`). -- Транспорт WhatsApp Web поважає стандартні змінні середовища proxy на хості gateway (`HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY` / варіанти в нижньому регістрі). Надавайте перевагу proxy-конфігурації на рівні хоста над специфічними для каналу налаштуваннями proxy WhatsApp. +- Транспорт WhatsApp Web враховує стандартні змінні середовища proxy на хості gateway (`HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY` / варіанти в нижньому регістрі). Надавайте перевагу конфігурації proxy на рівні хоста замість специфічних для каналу налаштувань proxy WhatsApp. - Коли `messages.removeAckAfterReply` увімкнено, OpenClaw очищає ack-реакцію WhatsApp після доставлення видимої відповіді. -## Hook-и plugin і приватність +## Хуки Plugin і приватність Вхідні повідомлення WhatsApp можуть містити особистий вміст повідомлень, номери телефонів, -ідентифікатори груп, імена відправників і поля кореляції сеансів. З цієї причини -WhatsApp не транслює вхідні payload-и hook `message_received` до plugins, -якщо ви явно не ввімкнете це: +ідентифікатори груп, імена відправників і поля кореляції сеансів. Через це +WhatsApp не транслює вхідні payload-и хуку `message_received` до plugins, +якщо ви явно не погодитеся: ```json5 { @@ -187,7 +187,7 @@ WhatsApp не транслює вхідні payload-и hook `message_received` } ``` -Можна обмежити opt-in одним обліковим записом: +Ви можете обмежити згоду одним обліковим записом: ```json5 { @@ -205,8 +205,8 @@ WhatsApp не транслює вхідні payload-и hook `message_received` } ``` -Увімкніть це лише для plugins, яким ви довіряєте отримувати вміст вхідних повідомлень -WhatsApp та ідентифікатори. +Увімкніть це лише для plugins, яким ви довіряєте отримання вхідного вмісту повідомлень +WhatsApp та ідентифікаторів. ## Контроль доступу й активація @@ -214,7 +214,7 @@ WhatsApp та ідентифікатори. `channels.whatsapp.dmPolicy` керує доступом до прямих чатів: - - `pairing` (за замовчуванням) + - `pairing` (типово) - `allowlist` - `open` (потребує, щоб `allowFrom` містив `"*"`) - `disabled` @@ -225,73 +225,73 @@ WhatsApp та ідентифікатори. Подробиці поведінки під час виконання: - - сполучення зберігаються в allow-store каналу та об’єднуються з налаштованим `allowFrom` - - якщо allowlist не налаштовано, пов’язаний власний номер дозволено за замовчуванням - - OpenClaw ніколи автоматично не сполучає вихідні DM `fromMe` (повідомлення, які ви надсилаєте собі з пов’язаного пристрою) + - зв’язування зберігаються в allow-store каналу й об’єднуються з налаштованим `allowFrom` + - якщо allowlist не налаштовано, пов’язаний власний номер дозволено типово + - OpenClaw ніколи автоматично не зв’язує вихідні DM `fromMe` (повідомлення, які ви надсилаєте собі з пов’язаного пристрою) - + Доступ до груп має два рівні: - 1. **Allowlist членства в групах** (`channels.whatsapp.groups`) - - якщо `groups` пропущено, усі групи придатні - - якщо `groups` наявний, він діє як allowlist груп (`"*"` дозволено) + 1. **Список дозволених учасників груп** (`channels.whatsapp.groups`) + - якщо `groups` пропущено, усі групи підходять + - якщо `groups` присутній, він діє як список дозволених груп (`"*"` дозволено) 2. **Політика відправників групи** (`channels.whatsapp.groupPolicy` + `groupAllowFrom`) - - `open`: allowlist відправників обходиться - - `allowlist`: відправник має збігатися з `groupAllowFrom` (або `*`) + - `open`: список дозволів відправників обходиться + - `allowlist`: відправник має відповідати `groupAllowFrom` (або `*`) - `disabled`: блокувати всі групові вхідні повідомлення - Резервний варіант allowlist відправників: + Резервний список дозволів відправників: - - якщо `groupAllowFrom` не задано, runtime повертається до `allowFrom`, коли він доступний - - allowlist-и відправників оцінюються до активації за згадкою/відповіддю + - якщо `groupAllowFrom` не задано, під час виконання використовується `allowFrom`, коли він доступний + - списки дозволів відправників оцінюються перед активацією через згадку/відповідь - Примітка: якщо блок `channels.whatsapp` взагалі відсутній, резервна групова політика runtime — `allowlist` (із попередженням у журналі), навіть якщо задано `channels.defaults.groupPolicy`. + Примітка: якщо блок `channels.whatsapp` взагалі відсутній, резервна політика груп під час виконання — `allowlist` (із журналом-попередженням), навіть якщо задано `channels.defaults.groupPolicy`. - Групові відповіді за замовчуванням потребують згадки. + Відповіді в групах типово потребують згадки. - Виявлення згадок охоплює: + Виявлення згадок включає: - явні згадки WhatsApp ідентичності бота - - налаштовані шаблони regex згадок (`agents.list[].groupChat.mentionPatterns`, резервний варіант `messages.groupChat.mentionPatterns`) + - налаштовані regex-шаблони згадок (`agents.list[].groupChat.mentionPatterns`, резервно `messages.groupChat.mentionPatterns`) - транскрипти вхідних голосових нотаток для авторизованих групових повідомлень - неявне виявлення відповіді боту (відправник відповіді збігається з ідентичністю бота) - Примітка щодо безпеки: + Примітка з безпеки: - - цитата/відповідь лише задовольняє перевірку згадки; вона **не** надає авторизацію відправнику - - з `groupPolicy: "allowlist"` відправники поза allowlist усе одно блокуються, навіть якщо відповідають на повідомлення користувача з allowlist + - цитата/відповідь лише задовольняє шлюз згадки; вона **не** надає авторизацію відправника + - з `groupPolicy: "allowlist"` відправники не з allowlist усе одно блокуються, навіть якщо вони відповідають на повідомлення користувача з allowlist Команда активації на рівні сеансу: - `/activation mention` - `/activation always` - `activation` оновлює стан сеансу (не глобальну конфігурацію). Вона обмежена власником. + `activation` оновлює стан сеансу (не глобальну конфігурацію). Доступ обмежено власником. ## Поведінка особистого номера й self-chat -Коли пов’язаний власний номер також присутній у `allowFrom`, активуються запобіжники WhatsApp self-chat: +Коли пов’язаний власний номер також присутній у `allowFrom`, активуються захисти self-chat WhatsApp: -- пропускати прочитані квитанції для self-chat ходів -- ігнорувати поведінку автозапуску mention-JID, яка інакше ping-увала б вас -- якщо `messages.responsePrefix` не задано, відповіді self-chat за замовчуванням мають вигляд `[{identity.name}]` або `[openclaw]` +- пропускати сповіщення про прочитання для ходів self-chat +- ігнорувати поведінку автоматичного запуску через mention-JID, яка інакше ping-нула б вас +- якщо `messages.responsePrefix` не задано, відповіді self-chat типово мають вигляд `[{identity.name}]` або `[openclaw]` ## Нормалізація повідомлень і контекст - - Вхідні повідомлення WhatsApp обгортаються у спільний вхідний envelope. + + Вхідні повідомлення WhatsApp обгортаються у спільний вхідний конверт. - Якщо існує процитована відповідь, контекст додається в такій формі: + Якщо існує цитована відповідь, контекст додається в такому форматі: ```text [Replying to id:] @@ -303,8 +303,8 @@ WhatsApp та ідентифікатори. - - Вхідні повідомлення лише з медіа нормалізуються з placeholder-ами, такими як: + + Вхідні повідомлення лише з медіа нормалізуються з плейсхолдерами, такими як: - `` - `` @@ -312,32 +312,32 @@ WhatsApp та ідентифікатори. - `` - `` - Авторизовані групові голосові нотатки транскрибуються перед перевіркою згадки, коли - body — лише ``, тож промовляння згадки бота в голосовій нотатці може - викликати відповідь. Якщо транскрипт усе ще не згадує бота, його - зберігають в очікуваній історії групи замість raw placeholder. + Авторизовані групові голосові нотатки транскрибуються перед шлюзом згадки, коли + тіло містить лише ``, тому промовляння згадки бота в голосовій нотатці може + запустити відповідь. Якщо транскрипт усе ще не згадує бота, + транскрипт зберігається в очікуваній історії групи замість сирого плейсхолдера. - Тіла локацій використовують стислий координатний текст. Позначки/коментарі локацій і подробиці контактів/vCard рендеряться як fenced недовірені метадані, а не inline prompt text. + Тіла локацій використовують стислий текст координат. Мітки/коментарі локацій і деталі контакту/vCard відображаються як fenced недовірені метадані, а не як inline-текст prompt. - - Для груп необроблені повідомлення можуть буферизуватися й ін’єктуватися як контекст, коли бот нарешті запускається. + + Для груп необроблені повідомлення можуть буферизуватися й вставлятися як контекст, коли бот зрештою запускається. - - стандартний ліміт: `50` + - типове обмеження: `50` - конфігурація: `channels.whatsapp.historyLimit` - - резервний варіант: `messages.groupChat.historyLimit` + - резерв: `messages.groupChat.historyLimit` - `0` вимикає - Маркери ін’єкції: + Маркери вставлення: - `[Chat messages since your last reply - for context]` - `[Current message - respond to this]` - - Прочитані квитанції ввімкнено за замовчуванням для прийнятих вхідних повідомлень WhatsApp. + + Сповіщення про прочитання типово ввімкнені для прийнятих вхідних повідомлень WhatsApp. Вимкнути глобально: @@ -367,61 +367,45 @@ WhatsApp та ідентифікатори. } ``` - Ходи self-chat пропускають прочитані квитанції, навіть коли їх увімкнено глобально. + Ходи self-chat пропускають сповіщення про прочитання, навіть коли вони глобально ввімкнені. -## Доставлення, розбиття на частини та медіа +## Доставлення, поділ на фрагменти та медіа - - - стандартний ліміт частини: `channels.whatsapp.textChunkLimit = 4000` + + - типове обмеження фрагмента: `channels.whatsapp.textChunkLimit = 4000` - `channels.whatsapp.chunkMode = "length" | "newline"` - - режим `newline` надає перевагу межам абзаців (порожнім рядкам), а потім повертається до безпечного за довжиною розбиття + - режим `newline` віддає перевагу межам абзаців (порожнім рядкам), потім переходить до безпечного за довжиною поділу - - - підтримує зображення, відео, аудіо (голосову нотатку PTT) і документні payloads - - аудіомедіа надсилається через payload Baileys `audio` з `ptt: true`, тому клієнти WhatsApp відображають його як голосову нотатку push-to-talk - - payloads відповідей зберігають `audioAsVoice`; вивід голосових нотаток TTS для WhatsApp залишається на цьому шляху PTT, навіть коли provider повертає MP3 або WebM + + - підтримує зображення, відео, аудіо (голосову нотатку PTT) і document payloads + - аудіомедіа надсилається через Baileys `audio` payload з `ptt: true`, тому клієнти WhatsApp відображають його як голосову нотатку push-to-talk + - reply payloads зберігають `audioAsVoice`; вивід голосової нотатки TTS для WhatsApp залишається на цьому шляху PTT, навіть коли provider повертає MP3 або WebM - нативне аудіо Ogg/Opus надсилається як `audio/ogg; codecs=opus` для сумісності з голосовими нотатками - аудіо не у форматі Ogg, зокрема вивід Microsoft Edge TTS MP3/WebM, перекодовується за допомогою `ffmpeg` у моно Ogg/Opus 48 кГц перед доставкою PTT - - `/tts latest` надсилає останню відповідь асистента як одну голосову нотатку й пригнічує повторні надсилання для тієї самої відповіді; `/tts chat on|off|default` керує авто-TTS для поточного чату WhatsApp + - `/tts latest` надсилає останню відповідь асистента як одну голосову нотатку та пригнічує повторні надсилання для тієї самої відповіді; `/tts chat on|off|default` керує auto-TTS для поточного чату WhatsApp - відтворення анімованих GIF підтримується через `gifPlayback: true` під час надсилання відео - - підписи застосовуються до першого медіаелемента під час надсилання payloads відповіді з кількома медіа, крім голосових нотаток PTT: для них аудіо надсилається першим, а видимий текст окремо, бо клієнти WhatsApp не завжди узгоджено відображають підписи голосових нотаток + - captions застосовуються до першого медіаелемента під час надсилання multi-media reply payloads, окрім голосових нотаток PTT: вони надсилають аудіо першим, а видимий текст окремо, бо клієнти WhatsApp не відображають captions голосових нотаток стабільно - джерелом медіа може бути HTTP(S), `file://` або локальні шляхи - - - ліміт збереження вхідних медіа: `channels.whatsapp.mediaMaxMb` (типово `50`) - - ліміт надсилання вихідних медіа: `channels.whatsapp.mediaMaxMb` (типово `50`) - - перевизначення для окремого облікового запису використовують `channels.whatsapp.accounts..mediaMaxMb` - - зображення автоматично оптимізуються (зміна розміру/підбір якості), щоб вписатися в ліміти - - у разі помилки надсилання медіа fallback для першого елемента надсилає текстове попередження замість беззвучного відкидання відповіді + + - обмеження збереження вхідних медіа: `channels.whatsapp.mediaMaxMb` (типово `50`) + - обмеження надсилання вихідних медіа: `channels.whatsapp.mediaMaxMb` (типово `50`) + - перевизначення для окремих облікових записів використовують `channels.whatsapp.accounts..mediaMaxMb` + - зображення автоматично оптимізуються (зміна розміру/підбір якості), щоб уміститися в обмеження + - у разі помилки надсилання медіа fallback для першого елемента надсилає текстове попередження замість тихого відкидання відповіді -## Видимість помилок - -`channels.whatsapp.exposeErrorText` керує тим, чи текст помилки агента/provider доставляється назад у WhatsApp. Типове значення — `true`. Установіть його в `false`, щоб помилки в WhatsApp лишалися тихими, зберігаючи поведінку інших каналів. - -```json5 -{ - channels: { - whatsapp: { - exposeErrorText: false, - }, - }, -} -``` - -Перевизначення для окремого облікового запису використовують `channels.whatsapp.accounts..exposeErrorText`. - -## Цитування відповідей +## Цитування відповіді WhatsApp підтримує нативне цитування відповідей, коли вихідні відповіді видимо цитують вхідне повідомлення. Керуйте цим за допомогою `channels.whatsapp.replyToMode`. @@ -430,9 +414,9 @@ WhatsApp підтримує нативне цитування відповіде | `"off"` | Ніколи не цитувати; надсилати як звичайне повідомлення | | `"first"` | Цитувати лише перший фрагмент вихідної відповіді | | `"all"` | Цитувати кожен фрагмент вихідної відповіді | -| `"batched"` | Цитувати поставлені в чергу пакетні відповіді, залишаючи негайні відповіді без цитування | +| `"batched"` | Цитувати поставлені в чергу batched replies, залишаючи негайні відповіді без цитування | -Типово — `"off"`. Перевизначення для окремого облікового запису використовують `channels.whatsapp.accounts..replyToMode`. +Типове значення — `"off"`. Перевизначення для окремих облікових записів використовують `channels.whatsapp.accounts..replyToMode`. ```json5 { @@ -446,18 +430,18 @@ WhatsApp підтримує нативне цитування відповіде ## Рівень реакцій -`channels.whatsapp.reactionLevel` керує тим, наскільки широко агент використовує емодзі-реакції у WhatsApp: +`channels.whatsapp.reactionLevel` керує тим, наскільки широко агент використовує emoji reactions у WhatsApp: -| Рівень | Ack-реакції | Реакції, ініційовані агентом | Опис | -| ------------- | ----------- | ---------------------------- | ------------------------------------------------ | -| `"off"` | Ні | Ні | Реакцій немає взагалі | -| `"ack"` | Так | Ні | Лише Ack-реакції (підтвердження перед відповіддю) | -| `"minimal"` | Так | Так (обережно) | Ack + реакції агента з обережними настановами | -| `"extensive"` | Так | Так (заохочується) | Ack + реакції агента із заохочувальними настановами | +| Рівень | Ack reactions | Реакції, ініційовані агентом | Опис | +| ------------- | ------------- | ---------------------------- | ------------------------------------------------ | +| `"off"` | Ні | Ні | Жодних реакцій | +| `"ack"` | Так | Ні | Лише ack reactions (підтвердження перед відповіддю) | +| `"minimal"` | Так | Так (консервативно) | Ack + реакції агента з консервативними настановами | +| `"extensive"` | Так | Так (заохочується) | Ack + реакції агента із заохочувальними настановами | Типово: `"minimal"`. -Перевизначення для окремого облікового запису використовують `channels.whatsapp.accounts..reactionLevel`. +Перевизначення для окремих облікових записів використовують `channels.whatsapp.accounts..reactionLevel`. ```json5 { @@ -471,8 +455,8 @@ WhatsApp підтримує нативне цитування відповіде ## Реакції підтвердження -WhatsApp підтримує негайні Ack-реакції після отримання вхідного повідомлення через `channels.whatsapp.ackReaction`. -Ack-реакції обмежуються `reactionLevel` — вони пригнічуються, коли `reactionLevel` має значення `"off"`. +WhatsApp підтримує негайні ack reactions після отримання вхідного повідомлення через `channels.whatsapp.ackReaction`. +Ack reactions обмежуються `reactionLevel` — вони пригнічуються, коли `reactionLevel` має значення `"off"`. ```json5 { @@ -492,30 +476,30 @@ Ack-реакції обмежуються `reactionLevel` — вони приг - надсилається негайно після прийняття вхідного повідомлення (перед відповіддю) - помилки журналюються, але не блокують звичайну доставку відповіді -- режим групи `mentions` реагує на ходи, спричинені згадкою; активація групи `always` діє як обхід цієї перевірки -- WhatsApp використовує `channels.whatsapp.ackReaction` (застаріле `messages.ackReaction` тут не використовується) +- режим групи `mentions` реагує на звернення, запущені згадкою; активація групи `always` працює як обхід цієї перевірки +- WhatsApp використовує `channels.whatsapp.ackReaction` (legacy `messages.ackReaction` тут не використовується) ## Кілька облікових записів і облікові дані - + - ідентифікатори облікових записів походять із `channels.whatsapp.accounts` - - типовий вибір облікового запису: `default`, якщо наявний, інакше перший налаштований ідентифікатор облікового запису (відсортований) + - типовий вибір облікового запису: `default`, якщо він є, інакше перший налаштований ідентифікатор облікового запису (відсортовано) - ідентифікатори облікових записів внутрішньо нормалізуються для пошуку - + - поточний шлях автентифікації: `~/.openclaw/credentials/whatsapp//creds.json` - файл резервної копії: `creds.json.bak` - - спадкова типова автентифікація в `~/.openclaw/credentials/` досі розпізнається/мігрується для потоків типового облікового запису + - legacy default auth у `~/.openclaw/credentials/` досі розпізнається/мігрується для потоків default-account - - `openclaw channels logout --channel whatsapp [--account ]` очищає стан автентифікації WhatsApp для цього облікового запису. + + `openclaw channels logout --channel whatsapp [--account ]` очищує стан автентифікації WhatsApp для цього облікового запису. - У спадкових каталогах автентифікації `oauth.json` зберігається, а файли автентифікації Baileys видаляються. + У legacy auth directories `oauth.json` зберігається, а auth-файли Baileys видаляються. @@ -523,16 +507,16 @@ Ack-реакції обмежуються `reactionLevel` — вони приг ## Інструменти, дії та записи конфігурації - Підтримка інструментів агента включає дію реакції WhatsApp (`react`). -- Шлюзи дій: +- Обмеження дій: - `channels.whatsapp.actions.reactions` - `channels.whatsapp.actions.polls` -- Записи конфігурації, ініційовані каналом, увімкнено типово (вимикайте через `channels.whatsapp.configWrites=false`). +- Записи конфігурації, ініційовані каналом, увімкнені типово (вимкнути через `channels.whatsapp.configWrites=false`). ## Усунення несправностей - - Симптом: стан каналу повідомляє, що його не пов’язано. + + Симптом: стан каналу повідомляє, що його не прив’язано. Виправлення: @@ -543,17 +527,17 @@ Ack-реакції обмежуються `reactionLevel` — вони приг - - Симптом: пов’язаний обліковий запис із повторними відключеннями або спробами перепідключення. + + Симптом: прив’язаний обліковий запис із повторними від’єднаннями або спробами повторного підключення. - Тихі облікові записи можуть залишатися підключеними після звичайного тайм-ауту повідомлень; watchdog - перезапускається, коли транспортна активність WhatsApp Web зупиняється, сокет закривається або - активність на рівні застосунку залишається беззвучною довше за розширене безпечне вікно. + Тихі облікові записи можуть залишатися підключеними довше за звичайний таймаут повідомлень; watchdog + перезапускається, коли активність транспорту WhatsApp Web зупиняється, socket закривається або + активність на рівні застосунку залишається тихою довше за довше захисне вікно. Якщо журнали показують повторюване `status=408 Request Time-out Connection was lost`, налаштуйте - таймінги сокета Baileys у `web.whatsapp`. Почніть зі скорочення - `keepAliveIntervalMs` нижче тайм-ауту простою вашої мережі та збільшення - `connectTimeoutMs` для повільних або нестабільних з’єднань: + таймінги socket Baileys у `web.whatsapp`. Почніть зі скорочення + `keepAliveIntervalMs` нижче за idle timeout вашої мережі та збільшення + `connectTimeoutMs` на повільних або нестабільних з’єднаннях: ```json5 { @@ -574,70 +558,70 @@ Ack-реакції обмежуються `reactionLevel` — вони приг openclaw logs --follow ``` - За потреби повторно пов’яжіть через `channels login`. + За потреби повторно прив’яжіть за допомогою `channels login`. - - Симптом: `openclaw channels login --channel whatsapp` завершується помилкою до показу придатного QR-коду з `status=408 Request Time-out` або відключенням TLS-сокета. + + Симптом: `openclaw channels login --channel whatsapp` завершується помилкою до показу придатного QR-коду з `status=408 Request Time-out` або від’єднанням TLS socket. - Вхід у WhatsApp Web використовує стандартне proxy-середовище хоста Gateway (`HTTPS_PROXY`, `HTTP_PROXY`, варіанти в нижньому регістрі та `NO_PROXY`). Переконайтеся, що процес Gateway успадковує proxy env і що `NO_PROXY` не відповідає `mmg.whatsapp.net`. + Вхід у WhatsApp Web використовує стандартне proxy-середовище Gateway-хоста (`HTTPS_PROXY`, `HTTP_PROXY`, варіанти в нижньому регістрі та `NO_PROXY`). Перевірте, що процес Gateway успадковує proxy env і що `NO_PROXY` не збігається з `mmg.whatsapp.net`. - - Вихідні надсилання швидко завершуються помилкою, коли для цільового облікового запису немає активного слухача gateway. + + Вихідні надсилання швидко завершуються помилкою, коли для цільового облікового запису немає активного listener Gateway. - Переконайтеся, що gateway запущено, а обліковий запис пов’язано. + Переконайтеся, що Gateway запущено, а обліковий запис прив’язано. - - Перевірте в такому порядку: + + Перевіряйте в такому порядку: - `groupPolicy` - `groupAllowFrom` / `allowFrom` - записи allowlist у `groups` - - gating згадок (`requireMention` + шаблони згадок) - - дублікати ключів у `openclaw.json` (JSON5): пізніші записи перевизначають попередні, тому тримайте один `groupPolicy` на scope + - mention gating (`requireMention` + mention patterns) + - дубльовані ключі в `openclaw.json` (JSON5): пізніші записи перевизначають попередні, тому тримайте один `groupPolicy` на scope - - Runtime Gateway для WhatsApp має використовувати Node. Bun позначено як несумісний для стабільної роботи gateway WhatsApp/Telegram. + + Runtime Gateway для WhatsApp має використовувати Node. Bun позначено як несумісний для стабільної роботи Gateway WhatsApp/Telegram. ## Системні prompts -WhatsApp підтримує системні prompts у стилі Telegram для груп і прямих чатів через мапи `groups` і `direct`. +WhatsApp підтримує системні prompts у стилі Telegram для груп і прямих чатів через maps `groups` і `direct`. Ієрархія розв’язання для групових повідомлень: -Ефективна мапа `groups` визначається першою: якщо обліковий запис визначає власні `groups`, вона повністю замінює кореневу мапу `groups` (без глибокого злиття). Потім пошук prompt виконується в отриманій єдиній мапі: +Ефективний map `groups` визначається першим: якщо обліковий запис визначає власний `groups`, він повністю замінює кореневий map `groups` (без deep merge). Потім пошук prompt виконується в отриманому єдиному map: -1. **Системний prompt для конкретної групи** (`groups[""].systemPrompt`): використовується, коли конкретний запис групи існує в мапі **і** його ключ `systemPrompt` визначено. Якщо `systemPrompt` є порожнім рядком (`""`), wildcard пригнічується й системний prompt не застосовується. -2. **Системний prompt wildcard для груп** (`groups["*"].systemPrompt`): використовується, коли конкретний запис групи повністю відсутній у мапі або коли він існує, але не визначає ключ `systemPrompt`. +1. **Системний prompt для конкретної групи** (`groups[""].systemPrompt`): використовується, коли конкретний запис групи існує в map **і** його ключ `systemPrompt` визначено. Якщо `systemPrompt` є порожнім рядком (`""`), wildcard пригнічується і системний prompt не застосовується. +2. **Wildcard системний prompt групи** (`groups["*"].systemPrompt`): використовується, коли конкретний запис групи повністю відсутній у map або коли він існує, але не визначає ключ `systemPrompt`. Ієрархія розв’язання для прямих повідомлень: -Ефективна мапа `direct` визначається першою: якщо обліковий запис визначає власну `direct`, вона повністю замінює кореневу мапу `direct` (без глибокого злиття). Потім пошук prompt виконується в отриманій єдиній мапі: +Ефективний map `direct` визначається першим: якщо обліковий запис визначає власний `direct`, він повністю замінює кореневий map `direct` (без deep merge). Потім пошук prompt виконується в отриманому єдиному map: -1. **Системний prompt для конкретного прямого чату** (`direct[""].systemPrompt`): використовується, коли конкретний запис peer існує в мапі **і** його ключ `systemPrompt` визначено. Якщо `systemPrompt` є порожнім рядком (`""`), wildcard пригнічується й системний prompt не застосовується. -2. **Системний prompt wildcard для прямих чатів** (`direct["*"].systemPrompt`): використовується, коли конкретний запис peer повністю відсутній у мапі або коли він існує, але не визначає ключ `systemPrompt`. +1. **Системний prompt для конкретного direct** (`direct[""].systemPrompt`): використовується, коли конкретний запис peer існує в map **і** його ключ `systemPrompt` визначено. Якщо `systemPrompt` є порожнім рядком (`""`), wildcard пригнічується і системний prompt не застосовується. +2. **Wildcard системний prompt direct** (`direct["*"].systemPrompt`): використовується, коли конкретний запис peer повністю відсутній у map або коли він існує, але не визначає ключ `systemPrompt`. -`dms` залишається легким bucket перевизначення історії для окремих DM (`dms..historyLimit`). Перевизначення prompt розміщуються в `direct`. +`dms` залишається легким bucket перевизначення історії для окремих DM (`dms..historyLimit`). Перевизначення prompt живуть у `direct`. -**Відмінність від поведінки Telegram із кількома обліковими записами:** У Telegram кореневі `groups` навмисно пригнічуються для всіх облікових записів у конфігурації з кількома обліковими записами — навіть для облікових записів, які не визначають власних `groups`, — щоб запобігти отриманню ботом групових повідомлень із груп, до яких він не належить. WhatsApp не застосовує цей захист: кореневі `groups` і коренева `direct` завжди успадковуються обліковими записами, які не визначають перевизначення на рівні облікового запису, незалежно від кількості налаштованих облікових записів. У конфігурації WhatsApp із кількома обліковими записами, якщо вам потрібні групові або прямі prompts для окремих облікових записів, визначайте повну мапу під кожним обліковим записом явно, а не покладайтеся на типові значення кореневого рівня. +**Відмінність від поведінки кількох облікових записів у Telegram:** У Telegram кореневий `groups` навмисно пригнічується для всіх облікових записів у конфігурації з кількома обліковими записами — навіть для облікових записів, які не визначають власний `groups`, — щоб не дати боту отримувати групові повідомлення для груп, до яких він не належить. WhatsApp не застосовує цей захист: кореневі `groups` і `direct` завжди успадковуються обліковими записами, які не визначають перевизначення на рівні облікового запису, незалежно від кількості налаштованих облікових записів. У конфігурації WhatsApp з кількома обліковими записами, якщо вам потрібні групові або direct prompts для кожного облікового запису, явно визначте повний map під кожним обліковим записом замість покладання на root-level defaults. Важлива поведінка: -- `channels.whatsapp.groups` є і мапою конфігурації для окремих груп, і allowlist груп на рівні чату. У кореневому scope або scope облікового запису `groups["*"]` означає "допущено всі групи" для цього scope. -- Додавайте wildcard-групу `systemPrompt` лише тоді, коли ви вже хочете, щоб цей scope допускав усі групи. Якщо ви все ще хочете, щоб придатним був лише фіксований набір group IDs, не використовуйте `groups["*"]` для типового prompt. Натомість повторіть prompt у кожному явно внесеному до allowlist записі групи. -- Допуск групи та авторизація відправника є окремими перевірками. `groups["*"]` розширює набір груп, які можуть дійти до обробки груп, але саме по собі не авторизує кожного відправника в цих групах. Доступ відправника й далі окремо контролюється `channels.whatsapp.groupPolicy` і `channels.whatsapp.groupAllowFrom`. -- `channels.whatsapp.direct` не має такого самого побічного ефекту для DM. `direct["*"]` лише надає типову конфігурацію прямого чату після того, як DM уже допущено правилами `dmPolicy` плюс `allowFrom` або pairing-store. +- `channels.whatsapp.groups` є водночас map конфігурації для окремих груп і allowlist груп на рівні чату. На кореневому scope або scope облікового запису `groups["*"]` означає "усі групи допускаються" для цього scope. +- Додавайте wildcard group `systemPrompt` лише тоді, коли ви вже хочете, щоб цей scope допускав усі групи. Якщо ви все ще хочете, щоб лише фіксований набір group IDs був придатним, не використовуйте `groups["*"]` для prompt default. Натомість повторіть prompt у кожному явно внесеному до allowlist записі групи. +- Допуск групи й авторизація відправника — це окремі перевірки. `groups["*"]` розширює набір груп, які можуть потрапити до group handling, але сам собою не авторизує кожного відправника в цих групах. Доступ відправника все ще окремо контролюється `channels.whatsapp.groupPolicy` і `channels.whatsapp.groupAllowFrom`. +- `channels.whatsapp.direct` не має такого самого побічного ефекту для DM. `direct["*"]` лише надає типову конфігурацію direct-chat після того, як DM вже допущено правилами `dmPolicy` плюс `allowFrom` або pairing-store. Приклад: @@ -685,14 +669,14 @@ WhatsApp підтримує системні prompts у стилі Telegram дл - [Довідник конфігурації - WhatsApp](/uk/gateway/config-channels#whatsapp) -Найважливіші поля WhatsApp: +Ключові поля WhatsApp: - доступ: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups` -- доставлення: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `sendReadReceipts`, `ackReaction`, `reactionLevel`, `exposeErrorText` +- доставка: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `sendReadReceipts`, `ackReaction`, `reactionLevel` - кілька облікових записів: `accounts..enabled`, `accounts..authDir`, перевизначення на рівні облікового запису - операції: `configWrites`, `debounceMs`, `web.enabled`, `web.heartbeatSeconds`, `web.reconnect.*`, `web.whatsapp.*` - поведінка сеансу: `session.dmScope`, `historyLimit`, `dmHistoryLimit`, `dms..historyLimit` -- промпти: `groups..systemPrompt`, `groups["*"].systemPrompt`, `direct..systemPrompt`, `direct["*"].systemPrompt` +- підказки: `groups..systemPrompt`, `groups["*"].systemPrompt`, `direct..systemPrompt`, `direct["*"].systemPrompt` ## Пов’язане