diff --git a/docs/uk/channels/discord.md b/docs/uk/channels/discord.md index a47cdb36a..68ee46a99 100644 --- a/docs/uk/channels/discord.md +++ b/docs/uk/channels/discord.md @@ -1,69 +1,69 @@ --- read_when: - Робота над функціями каналу Discord -summary: Статус підтримки бота Discord, можливості та конфігурація +summary: Статус підтримки бота Discord, можливості та налаштування title: Discord x-i18n: - generated_at: "2026-04-22T17:02:05Z" + generated_at: "2026-04-22T19:55:18Z" model: gpt-5.4 provider: openai - source_hash: 2aa0a6d60984cf5cc41f86fdf16d1c409b94605ff36d59c265acadebb4240b45 + source_hash: 1a500da6a2aa080f1c38efd3510bef000abc61059fdc0ff3cb14a62ad292cf9a source_path: channels/discord.md workflow: 15 --- # Discord (Bot API) -Статус: готово для прямих повідомлень і каналів гільдій через офіційний шлюз Discord. +Статус: готово до DM і каналів гільдій через офіційний шлюз Discord. - - Для Discord DM за замовчуванням використовується режим сполучення. + + Для Discord DM типово використовується режим зіставлення. Нативна поведінка команд і каталог команд. - + Міжканальна діагностика та процес відновлення. ## Швидке налаштування -Вам потрібно створити новий застосунок із ботом, додати бота на свій сервер і сполучити його з OpenClaw. Ми рекомендуємо додати бота на власний приватний сервер. Якщо у вас його ще немає, [спочатку створіть його](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (виберіть **Create My Own > For me and my friends**). +Вам потрібно створити новий застосунок із ботом, додати бота на свій сервер і зіставити його з OpenClaw. Ми рекомендуємо додати бота на власний приватний сервер. Якщо у вас його ще немає, [спочатку створіть його](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (виберіть **Create My Own > For me and my friends**). - - Перейдіть у [Discord Developer Portal](https://discord.com/developers/applications) і натисніть **New Application**. Назвіть його, наприклад, "OpenClaw". + + Перейдіть до [Discord Developer Portal](https://discord.com/developers/applications) і натисніть **New Application**. Назвіть його, наприклад, "OpenClaw". - На бічній панелі натисніть **Bot**. У полі **Username** вкажіть ім’я, яким ви називаєте свого агента OpenClaw. + На бічній панелі натисніть **Bot**. Установіть **Username** на ту назву, якою ви називаєте свого агента OpenClaw. - - На сторінці **Bot** прокрутіть вниз до **Privileged Gateway Intents** і увімкніть: + + Залишаючись на сторінці **Bot**, прокрутіть до **Privileged Gateway Intents** і ввімкніть: - **Message Content Intent** (обов’язково) - **Server Members Intent** (рекомендовано; обов’язково для allowlist ролей і зіставлення імені з ID) - - **Presence Intent** (необов’язково; потрібне лише для оновлень статусу) + - **Presence Intent** (необов’язково; потрібне лише для оновлень присутності) - Поверніться вгору сторінки **Bot** і натисніть **Reset Token**. + Прокрутіть угору на сторінці **Bot** і натисніть **Reset Token**. Попри назву, це генерує ваш перший токен — нічого не «скидається». - Скопіюйте токен і збережіть його десь. Це ваш **Bot Token**, і він незабаром знадобиться. + Скопіюйте токен і збережіть його десь. Це ваш **Bot Token**, і він незабаром вам знадобиться. - - На бічній панелі натисніть **OAuth2**. Ви згенеруєте URL запрошення з правильними дозволами для додавання бота на сервер. + + На бічній панелі натисніть **OAuth2**. Ви згенеруєте URL-запрошення з правильними дозволами, щоб додати бота на свій сервер. - Прокрутіть вниз до **OAuth2 URL Generator** і увімкніть: + Прокрутіть до **OAuth2 URL Generator** і ввімкніть: - `bot` - `applications.commands` @@ -79,8 +79,8 @@ x-i18n: - Attach Files - Add Reactions (необов’язково) - Це базовий набір для звичайних текстових каналів. Якщо ви плануєте публікувати в гілках Discord, зокрема у сценаріях форумів або медіаканалів, де створюється чи продовжується гілка, також увімкніть **Send Messages in Threads**. - Скопіюйте згенерований URL внизу, вставте його в браузер, виберіть свій сервер і натисніть **Continue**, щоб підключити. Тепер ви маєте побачити свого бота на сервері Discord. + Це базовий набір для звичайних текстових каналів. Якщо ви плануєте публікувати в потоках Discord, зокрема у сценаріях форумів або медіаканалів, які створюють або продовжують потік, також увімкніть **Send Messages in Threads**. + Скопіюйте згенерований URL внизу, вставте його у свій браузер, виберіть сервер і натисніть **Continue**, щоб підключити. Тепер ви маєте бачити свого бота на сервері Discord. @@ -88,22 +88,22 @@ x-i18n: Повернувшись у застосунок Discord, вам потрібно ввімкнути Developer Mode, щоб можна було копіювати внутрішні ID. 1. Натисніть **User Settings** (значок шестерні поруч із вашим аватаром) → **Advanced** → увімкніть **Developer Mode** - 2. Клацніть правою кнопкою миші свій **значок сервера** на бічній панелі → **Copy Server ID** - 3. Клацніть правою кнопкою миші свій **аватар** → **Copy User ID** + 2. Клацніть правою кнопкою миші на **значку сервера** на бічній панелі → **Copy Server ID** + 3. Клацніть правою кнопкою миші на **власному аватарі** → **Copy User ID** - Збережіть **Server ID** і **User ID** разом із Bot Token — на наступному кроці ви передасте всі три значення в OpenClaw. + Збережіть свій **Server ID** і **User ID** разом із Bot Token — на наступному кроці ви надішлете всі три до OpenClaw. - Щоб сполучення працювало, Discord має дозволяти вашому боту надсилати вам DM. Клацніть правою кнопкою миші **значок сервера** → **Privacy Settings** → увімкніть **Direct Messages**. + Щоб зіставлення працювало, Discord має дозволяти вашому боту надсилати вам DM. Клацніть правою кнопкою миші на **значку сервера** → **Privacy Settings** → увімкніть **Direct Messages**. - Це дозволяє учасникам сервера (включно з ботами) надсилати вам DM. Залишайте це ввімкненим, якщо хочете використовувати Discord DM з OpenClaw. Якщо ви плануєте використовувати лише канали гільдії, після сполучення DM можна вимкнути. + Це дозволяє учасникам сервера (зокрема ботам) надсилати вам DM. Залишайте це ввімкненим, якщо хочете використовувати Discord DM з OpenClaw. Якщо ви плануєте використовувати лише канали гільдії, можна вимкнути DM після зіставлення. - - Токен вашого Discord-бота — це секретні дані (як пароль). Задайте його на машині, де запущено OpenClaw, перш ніж писати своєму агенту. + + Токен вашого бота Discord — це секрет (як пароль). Задайте його на машині, де працює OpenClaw, перш ніж надсилати повідомлення своєму агенту. ```bash export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN" @@ -117,13 +117,13 @@ openclaw gateway - + - Поспілкуйтеся зі своїм агентом OpenClaw на будь-якому наявному каналі (наприклад, у Telegram) і повідомте це. Якщо Discord — ваш перший канал, натомість використайте вкладку CLI / config. + Напишіть своєму агенту OpenClaw у будь-якому наявному каналі (наприклад, Telegram) і повідомте це. Якщо Discord — ваш перший канал, натомість використайте вкладку CLI / config. - > "Я вже задав токен свого Discord-бота в конфігурації. Будь ласка, заверши налаштування Discord із User ID `` і Server ID ``." + > "Я вже задав токен свого бота Discord у конфігурації. Будь ласка, заверши налаштування Discord з User ID `` і Server ID ``." Якщо ви віддаєте перевагу файловій конфігурації, задайте: @@ -143,7 +143,7 @@ openclaw gateway } ``` - Резервне значення env для облікового запису за замовчуванням: + Резервне env-значення для типового облікового запису: ```bash DISCORD_BOT_TOKEN=... @@ -156,14 +156,14 @@ DISCORD_BOT_TOKEN=... - - Дочекайтеся, доки шлюз запуститься, а потім надішліть DM своєму боту в Discord. Він відповість кодом сполучення. + + Дочекайтеся, поки шлюз запуститься, а потім надішліть DM своєму боту в Discord. Він відповість кодом зіставлення. - Надішліть код сполучення своєму агенту на наявному каналі: + Надішліть код зіставлення своєму агенту в наявному каналі: - > "Схвали цей код сполучення Discord: ``" + > "Підтвердь цей код зіставлення Discord: ``" @@ -175,31 +175,31 @@ openclaw pairing approve discord - Термін дії кодів сполучення спливає через 1 годину. + Термін дії кодів зіставлення спливає через 1 годину. - Тепер ви маєте мати змогу спілкуватися зі своїм агентом у Discord через DM. + Тепер ви маєте змогу спілкуватися зі своїм агентом у Discord через DM. -Розв’язання токенів враховує обліковий запис. Значення токена в конфігурації мають пріоритет над резервним значенням env. `DISCORD_BOT_TOKEN` використовується лише для облікового запису за замовчуванням. -Для розширених вихідних викликів (інструмент повідомлень/дії каналу) явний `token` використовується лише для цього виклику. Це стосується дій надсилання та дій читання/перевірки (наприклад, read/search/fetch/thread/pins/permissions). Налаштування політик облікового запису/повторних спроб і далі беруться з вибраного облікового запису в активному знімку середовища виконання. +Визначення токена враховує обліковий запис. Значення токена з конфігурації мають пріоритет над резервним env-значенням. `DISCORD_BOT_TOKEN` використовується лише для типового облікового запису. +Для розширених вихідних викликів (дії інструмента повідомлень/каналу) явний `token` для виклику використовується саме для цього виклику. Це стосується дій надсилання і читання/перевірки (наприклад read/search/fetch/thread/pins/permissions). Політика облікового запису/повторних спроб усе ще береться з вибраного облікового запису в активному знімку середовища виконання. ## Рекомендовано: налаштуйте робочий простір гільдії -Коли DM уже працюють, ви можете налаштувати свій сервер Discord як повноцінний робочий простір, де кожен канал отримує окрему сесію агента зі своїм контекстом. Це рекомендовано для приватних серверів, де єте лише ви та ваш бот. +Коли DM уже працюють, ви можете налаштувати свій сервер Discord як повноцінний робочий простір, де кожен канал отримує власну сесію агента з власним контекстом. Це рекомендовано для приватних серверів, де єте лише ви й ваш бот. - Це дозволяє агенту відповідати в будь-якому каналі на вашому сервері, а не лише в DM. + Це дає вашому агенту змогу відповідати в будь-якому каналі на вашому сервері, а не лише в DM. - > "Додай мій Discord Server ID `` до allowlist гільдій" + > "Додай мій Server ID Discord `` до allowlist гільдій" - + ```json5 { @@ -223,14 +223,14 @@ openclaw pairing approve discord - За замовчуванням ваш агент відповідає в каналах гільдії лише за @mention. Для приватного сервера ви, ймовірно, захочете, щоб він відповідав на кожне повідомлення. + Типово ваш агент відповідає в каналах гільдії лише тоді, коли його згадано через @mention. Для приватного сервера, імовірно, ви захочете, щоб він відповідав на кожне повідомлення. - > "Дозволь моєму агенту відповідати на цьому сервері без @mention" + > "Дозволь моєму агенту відповідати на цьому сервері без потреби в @mention" - - Укажіть `requireMention: false` у конфігурації гільдії: + + Установіть `requireMention: false` у конфігурації гільдії: ```json5 { @@ -251,54 +251,54 @@ openclaw pairing approve discord - - За замовчуванням довготривала пам’ять (`MEMORY.md`) завантажується лише в DM-сесіях. У каналах гільдії `MEMORY.md` автоматично не завантажується. + + Типово довготривала пам’ять (`MEMORY.md`) завантажується лише в DM-сесіях. У каналах гільдії `MEMORY.md` не завантажується автоматично. > "Коли я ставлю запитання в каналах Discord, використовуй memory_search або memory_get, якщо тобі потрібен довготривалий контекст із MEMORY.md." - Якщо вам потрібен спільний контекст у кожному каналі, розмістіть стабільні інструкції в `AGENTS.md` або `USER.md` (вони додаються до кожної сесії). Довготривалі нотатки зберігайте в `MEMORY.md` і звертайтеся до них за потреби через інструменти пам’яті. + Якщо вам потрібен спільний контекст у кожному каналі, розмістіть стабільні інструкції в `AGENTS.md` або `USER.md` (вони впроваджуються в кожну сесію). Довготривалі нотатки зберігайте в `MEMORY.md` і звертайтеся до них за потреби за допомогою інструментів пам’яті. -Тепер створіть кілька каналів на своєму сервері Discord і починайте спілкування. Ваш агент бачить назву каналу, і кожен канал отримує власну ізольовану сесію — тож ви можете налаштувати `#coding`, `#home`, `#research` або будь-що інше, що відповідає вашому процесу роботи. +Тепер створіть кілька каналів на своєму сервері Discord і починайте спілкуватися. Ваш агент бачить назву каналу, і кожен канал отримує власну ізольовану сесію — тож ви можете налаштувати `#coding`, `#home`, `#research` або будь-що, що відповідає вашому робочому процесу. ## Модель середовища виконання - Шлюз керує з’єднанням Discord. -- Маршрутизація відповідей детермінована: вхідні відповіді з Discord повертаються в Discord. -- За замовчуванням (`session.dmScope=main`) прямі чати використовують основну сесію агента (`agent:main:main`). +- Маршрутизація відповідей детермінована: вхідні повідомлення Discord повертаються в Discord. +- Типово (`session.dmScope=main`) прямі чати використовують головну сесію агента (`agent:main:main`). - Канали гільдії мають ізольовані ключі сесій (`agent::discord:channel:`). -- Групові DM за замовчуванням ігноруються (`channels.discord.dm.groupEnabled=false`). -- Нативні слеш-команди виконуються в ізольованих командних сесіях (`agent::discord:slash:`), водночас зберігаючи `CommandTargetSessionKey` для маршрутизації до цільової сесії розмови. +- Group DM типово ігноруються (`channels.discord.dm.groupEnabled=false`). +- Нативні слеш-команди виконуються в ізольованих командних сесіях (`agent::discord:slash:`), водночас несучи `CommandTargetSessionKey` до маршрутизованої сесії розмови. ## Канали форумів -Форуми та медіаканали Discord приймають лише дописи в гілках. OpenClaw підтримує два способи їх створення: +Канали форумів і медіаканали Discord приймають лише публікації в потоках. OpenClaw підтримує два способи їх створення: -- Надішліть повідомлення до батьківського форуму (`channel:`), щоб автоматично створити гілку. Заголовок гілки використовує перший непорожній рядок вашого повідомлення. -- Використайте `openclaw message thread create`, щоб створити гілку безпосередньо. Не передавайте `--message-id` для каналів форумів. +- Надішліть повідомлення до батьківського форуму (`channel:`), щоб автоматично створити потік. Заголовок потоку використовує перший непорожній рядок вашого повідомлення. +- Використайте `openclaw message thread create`, щоб створити потік безпосередньо. Не передавайте `--message-id` для каналів форумів. -Приклад: надіслати до батьківського форуму, щоб створити гілку +Приклад: надсилання до батьківського форуму для створення потоку ```bash openclaw message send --channel discord --target channel: \ --message "Topic title\nBody of the post" ``` -Приклад: явно створити гілку форуму +Приклад: явне створення потоку форуму ```bash openclaw message thread create --channel discord --target channel: \ --thread-name "Topic title" --message "Body of the post" ``` -Батьківські форуми не приймають компоненти Discord. Якщо вам потрібні компоненти, надсилайте в саму гілку (`channel:`). +Батьківські форуми не приймають компоненти Discord. Якщо вам потрібні компоненти, надсилайте в сам потік (`channel:`). ## Інтерактивні компоненти @@ -307,20 +307,20 @@ OpenClaw підтримує контейнери компонентів Discord Підтримувані блоки: - `text`, `section`, `separator`, `actions`, `media-gallery`, `file` -- Рядки дій допускають до 5 кнопок або одне меню вибору +- Рядки дій дозволяють до 5 кнопок або одне меню вибору - Типи вибору: `string`, `user`, `role`, `mentionable`, `channel` -За замовчуванням компоненти одноразові. Установіть `components.reusable=true`, щоб дозволити багаторазове використання кнопок, меню вибору та форм, доки не сплине їхній строк дії. +Типово компоненти одноразові. Установіть `components.reusable=true`, щоб дозволити багаторазове використання кнопок, списків вибору та форм до завершення строку їх дії. -Щоб обмежити, хто може натискати кнопку, задайте `allowedUsers` для цієї кнопки (Discord user IDs, теги або `*`). Якщо це налаштовано, користувачі, які не збігаються, отримають ефемерну відмову. +Щоб обмежити, хто може натискати кнопку, установіть `allowedUsers` для цієї кнопки (ID користувачів Discord, теги або `*`). Якщо це налаштовано, користувачі, що не збігаються, отримають ефемерну відмову. -Слеш-команди `/model` і `/models` відкривають інтерактивний вибір моделі з випадними списками провайдера й моделі та кроком Submit. `/models add` також підтримує додавання нового запису провайдера/моделі з чату, а новододані моделі з’являються без перезапуску шлюзу. Відповідь засобу вибору є ефемерною, і використовувати її може лише користувач, який викликав команду. +Слеш-команди `/model` і `/models` відкривають інтерактивний засіб вибору моделі з випадаючими списками провайдера й моделі, а також кроком Submit. Якщо не встановлено `commands.modelsWrite=false`, `/models add` також підтримує додавання нового запису провайдера/моделі з чату, а новододані моделі з’являються без перезапуску шлюзу. Відповідь засобу вибору є ефемерною, і використовувати її може лише користувач, який викликав команду. Вкладення файлів: -- Блоки `file` мають вказувати на посилання вкладення (`attachment://`) +- блоки `file` мають вказувати на посилання вкладення (`attachment://`) - Надайте вкладення через `media`/`path`/`filePath` (один файл); для кількох файлів використовуйте `media-gallery` -- Використовуйте `filename`, щоб перевизначити ім’я завантаження, коли воно має збігатися з посиланням вкладення +- Використовуйте `filename`, щоб перевизначити ім’я завантаження, коли воно має відповідати посиланню вкладення Модальні форми: @@ -344,7 +344,7 @@ OpenClaw підтримує контейнери компонентів Discord type: "actions", buttons: [ { - label: "Схвалити", + label: "Підтвердити", style: "success", allowedUsers: ["123456789012345678"], }, @@ -382,18 +382,18 @@ OpenClaw підтримує контейнери компонентів Discord } ``` -## Керування доступом і маршрутизація +## Контроль доступу та маршрутизація `channels.discord.dmPolicy` керує доступом до DM (застаріле: `channels.discord.dm.policy`): - - `pairing` (за замовчуванням) + - `pairing` (типово) - `allowlist` - - `open` (вимагає, щоб `channels.discord.allowFrom` містив `"*"`; застаріле: `channels.discord.dm.allowFrom`) + - `open` (потребує, щоб `channels.discord.allowFrom` містив `"*"`; застаріле: `channels.discord.dm.allowFrom`) - `disabled` - Якщо політика DM не є open, невідомі користувачі блокуються (або отримують запит на сполучення в режимі `pairing`). + Якщо політика DM не є open, невідомі користувачі блокуються (або отримують запит на зіставлення в режимі `pairing`). Пріоритет для кількох облікових записів: @@ -406,27 +406,27 @@ OpenClaw підтримує контейнери компонентів Discord - `user:` - згадка `<@id>` - Прості числові ID є неоднозначними й відхиляються, якщо явно не вказано тип цілі user/channel. + Прості числові ID неоднозначні й відхиляються, якщо не вказано явний тип цілі користувача/каналу. - + Обробка гільдій керується через `channels.discord.groupPolicy`: - `open` - `allowlist` - `disabled` - Безпечна базова поведінка, коли існує `channels.discord`, — `allowlist`. + Безпечна базова конфігурація, коли існує `channels.discord`, — `allowlist`. Поведінка `allowlist`: - - гільдія має збігатися з `channels.discord.guilds` (переважно `id`, slug також приймається) - - необов’язкові allowlist відправників: `users` (рекомендовано стабільні ID) і `roles` (лише ID ролей); якщо налаштовано будь-яке з них, відправники дозволяються, коли вони збігаються з `users` АБО `roles` - - пряме зіставлення імені/тега за замовчуванням вимкнене; увімкніть `channels.discord.dangerouslyAllowNameMatching: true` лише як аварійний режим сумісності - - імена/теги підтримуються для `users`, але ID безпечніші; `openclaw security audit` попереджає, коли використовуються записи з іменами/тегами - - якщо для гільдії налаштовано `channels`, канали, яких немає у списку, забороняються - - якщо для гільдії немає блоку `channels`, дозволяються всі канали в цій allowlist-гілдії + - гільдія має збігатися з `channels.discord.guilds` (переважно `id`, slug теж приймається) + - необов’язкові allowlist відправників: `users` (рекомендовано стабільні ID) і `roles` (лише ID ролей); якщо налаштовано будь-який із них, відправники дозволяються, коли вони збігаються з `users` АБО `roles` + - пряме зіставлення за ім’ям/тегом типово вимкнене; вмикайте `channels.discord.dangerouslyAllowNameMatching: true` лише як аварійний режим сумісності + - для `users` підтримуються імена/теги, але ID безпечніші; `openclaw security audit` попереджає, коли використовуються записи з іменами/тегами + - якщо для гільдії налаштовано `channels`, канали, яких немає в списку, відхиляються + - якщо гільдія не має блоку `channels`, дозволяються всі канали в цій allowlist-гілдії Приклад: @@ -452,12 +452,12 @@ OpenClaw підтримує контейнери компонентів Discord } ``` - Якщо ви лише задасте `DISCORD_BOT_TOKEN` і не створите блок `channels.discord`, резервна поведінка під час виконання буде `groupPolicy="allowlist"` (із попередженням у журналах), навіть якщо `channels.defaults.groupPolicy` має значення `open`. + Якщо ви лише задали `DISCORD_BOT_TOKEN` і не створили блок `channels.discord`, резервна поведінка під час виконання буде `groupPolicy="allowlist"` (із попередженням у логах), навіть якщо `channels.defaults.groupPolicy` має значення `open`. - - Повідомлення в гільдіях за замовчуванням обмежуються згадками. + + Повідомлення гільдії типово потребують згадки. Визначення згадки включає: @@ -466,19 +466,19 @@ OpenClaw підтримує контейнери компонентів Discord - неявну поведінку reply-to-bot у підтримуваних випадках `requireMention` налаштовується для кожної гільдії/каналу (`channels.discord.guilds...`). - `ignoreOtherMentions` за бажанням відкидає повідомлення, які згадують іншого користувача/роль, але не бота (крім @everyone/@here). + `ignoreOtherMentions` за потреби відкидає повідомлення, які згадують іншого користувача/роль, але не бота (окрім @everyone/@here). - Групові DM: + Group DM: - - за замовчуванням: ігноруються (`dm.groupEnabled=false`) + - типово: ігноруються (`dm.groupEnabled=false`) - необов’язковий allowlist через `dm.groupChannels` (ID каналів або slug) -### Маршрутизація агентів на основі ролей +### Маршрутизація агента на основі ролей -Використовуйте `bindings[].match.roles`, щоб маршрутизувати учасників гільдії Discord до різних агентів за ID ролі. Прив’язки на основі ролей приймають лише ID ролей і перевіряються після прив’язок peer або parent-peer, але перед прив’язками лише для гільдії. Якщо прив’язка також задає інші поля збігу (наприклад, `peer` + `guildId` + `roles`), усі налаштовані поля мають збігатися. +Використовуйте `bindings[].match.roles`, щоб маршрутизувати учасників гільдії Discord до різних агентів за ID ролі. Прив’язки на основі ролей приймають лише ID ролей і оцінюються після прив’язок peer або parent-peer та перед прив’язками лише на рівні гільдії. Якщо прив’язка також задає інші поля зіставлення (наприклад `peer` + `guildId` + `roles`), усі налаштовані поля мають збігатися. ```json5 { @@ -513,13 +513,13 @@ OpenClaw підтримує контейнери компонентів Discord - + У **Bot -> Privileged Gateway Intents** увімкніть: - Message Content Intent - Server Members Intent (рекомендовано) - Намір presence необов’язковий і потрібен лише якщо ви хочете отримувати оновлення статусу. Установлення статусу бота (`setPresence`) не вимагає ввімкнення оновлень статусу для учасників. + Presence intent є необов’язковим і потрібен лише якщо ви хочете отримувати оновлення присутності. Установлення присутності бота (`setPresence`) не потребує ввімкнення оновлень присутності для учасників. @@ -539,7 +539,7 @@ OpenClaw підтримує контейнери компонентів Discord - Attach Files - Add Reactions (необов’язково) - Це базовий набір для звичайних текстових каналів. Якщо ви плануєте публікувати в гілках Discord, зокрема у сценаріях форумів або медіаканалів, де створюється чи продовжується гілка, також увімкніть **Send Messages in Threads**. + Це базовий набір для звичайних текстових каналів. Якщо ви плануєте публікувати в потоках Discord, зокрема у сценаріях форумів або медіаканалів, які створюють або продовжують потік, також увімкніть **Send Messages in Threads**. Уникайте `Administrator`, якщо це не потрібно явно. @@ -551,22 +551,22 @@ OpenClaw підтримує контейнери компонентів Discord - ID каналу - ID користувача - Для надійних аудитів і перевірок віддавайте перевагу числовим ID у конфігурації OpenClaw. + Для надійних аудитів і перевірок надавайте перевагу числовим ID у конфігурації OpenClaw. ## Нативні команди та авторизація команд -- `commands.native` за замовчуванням має значення `"auto"` і ввімкнено для Discord. -- Перевизначення для каналу: `channels.discord.commands.native`. +- `commands.native` типово має значення `"auto"` і ввімкнене для Discord. +- Перевизначення для конкретного каналу: `channels.discord.commands.native`. - `commands.native=false` явно очищає раніше зареєстровані нативні команди Discord. - Авторизація нативних команд використовує ті самі allowlist/політики Discord, що й звичайна обробка повідомлень. -- Команди все одно можуть бути видимими в інтерфейсі Discord для користувачів, які не мають авторизації; виконання все одно примусово застосовує авторизацію OpenClaw і повертає "not authorized". +- Команди все ще можуть бути видимі в інтерфейсі Discord для користувачів, які не мають дозволу; під час виконання все одно застосовується авторизація OpenClaw і повертається "not authorized". Див. [Слеш-команди](/uk/tools/slash-commands), щоб ознайомитися з каталогом команд і поведінкою. -Налаштування слеш-команд за замовчуванням: +Типові налаштування слеш-команд: - `ephemeral: true` @@ -581,33 +581,33 @@ OpenClaw підтримує контейнери компонентів Discord Керується через `channels.discord.replyToMode`: - - `off` (за замовчуванням) + - `off` (типово) - `first` - `all` - `batched` - Примітка: `off` вимикає неявне групування відповідей у треди. Явні теги `[[reply_to_*]]` усе одно враховуються. - `first` завжди додає неявне посилання нативної відповіді до першого вихідного повідомлення Discord для цього ходу. + Примітка: `off` вимикає неявне потокове зв’язування відповідей. Явні теги `[[reply_to_*]]` усе одно враховуються. + `first` завжди додає неявне посилання нативної відповіді до першого вихідного повідомлення Discord у межах ходу. `batched` додає неявне посилання нативної відповіді Discord лише тоді, коли вхідний хід був дебаунсованим пакетом із кількох повідомлень. Це корисно, - коли ви хочете використовувати нативні відповіді переважно для неоднозначних - чатів із частими серіями повідомлень, а не для кожного окремого повідомлення. + коли вам потрібні нативні відповіді переважно для неоднозначних чатів зі сплесками, а не для кожного + окремого ходу з одним повідомленням. - ID повідомлень доступні в контексті/історії, тож агенти можуть націлюватися на конкретні повідомлення. + ID повідомлень потрапляють у контекст/історію, тому агенти можуть націлюватися на конкретні повідомлення. - - OpenClaw може потоково передавати чернетки відповідей, надсилаючи тимчасове повідомлення й редагуючи його в міру надходження тексту. + + OpenClaw може передавати чернетки відповідей потоком, надсилаючи тимчасове повідомлення й редагуючи його в міру надходження тексту. - - `channels.discord.streaming` керує потоковим попереднім переглядом (`off` | `partial` | `block` | `progress`, за замовчуванням: `off`). - - За замовчуванням лишається `off`, тому що редагування попереднього перегляду в Discord може швидко впиратися в обмеження швидкості, особливо коли кілька ботів або шлюзів використовують той самий обліковий запис чи трафік гільдії. - - `progress` приймається для міжканальної узгодженості й у Discord відображається як `partial`. - - `channels.discord.streamMode` — це застарілий псевдонім, який мігрується автоматично. + - `channels.discord.streaming` керує потоковим попереднім переглядом (`off` | `partial` | `block` | `progress`, типово: `off`). + - Типовим значенням залишається `off`, оскільки редагування попереднього перегляду в Discord може швидко впиратися в обмеження швидкості, особливо коли кілька ботів або шлюзів використовують один обліковий запис чи трафік гільдії. + - `progress` приймається для узгодженості між каналами й відображається як `partial` у Discord. + - `channels.discord.streamMode` — застарілий псевдонім, який автоматично мігрується. - `partial` редагує одне повідомлення попереднього перегляду в міру надходження токенів. - - `block` виводить фрагменти розміру чернетки (для налаштування розміру й точок розриву використовуйте `draftChunk`). - - Остаточні відповіді з медіа, помилками та явними відповідями скасовують відкладені редагування попереднього перегляду без виведення тимчасової чернетки перед звичайною доставкою. - - `streaming.preview.toolProgress` керує тим, чи оновлення інструментів/прогресу повторно використовують те саме повідомлення попереднього перегляду чернетки (за замовчуванням: `true`). Установіть `false`, щоб зберегти окремі повідомлення інструментів/прогресу. + - `block` виводить фрагменти розміру чернетки (використовуйте `draftChunk`, щоб налаштувати розмір і точки розриву). + - Підсумкові повідомлення з медіа, помилками та явними відповідями скасовують очікувані редагування попереднього перегляду без скидання тимчасової чернетки перед звичайною доставкою. + - `streaming.preview.toolProgress` керує тим, чи оновлення інструментів/прогресу повторно використовують те саме повідомлення попереднього перегляду чернетки (типово: `true`). Установіть `false`, щоб зберегти окремі повідомлення інструментів/прогресу. Приклад: @@ -621,7 +621,7 @@ OpenClaw підтримує контейнери компонентів Discord } ``` - Типові налаштування фрагментації для режиму `block` (обмежуються значенням `channels.discord.textChunkLimit`): + Типові значення фрагментації для режиму `block` (обмежуються значенням `channels.discord.textChunkLimit`): ```json5 { @@ -638,17 +638,17 @@ OpenClaw підтримує контейнери компонентів Discord } ``` - Потоковий попередній перегляд підтримує лише текст; відповіді з медіа повертаються до звичайної доставки. + Потоковий попередній перегляд працює лише для тексту; відповіді з медіа повертаються до звичайної доставки. - Примітка: потоковий попередній перегляд відокремлений від block streaming. Якщо для Discord явно - ввімкнено block streaming, OpenClaw пропускає потік попереднього перегляду, щоб уникнути подвійного потокового передавання. + Примітка: потоковий попередній перегляд відокремлений від потокової передачі блоками. Коли для Discord явно + ввімкнено потокову передачу блоками, OpenClaw пропускає потік попереднього перегляду, щоб уникнути подвійного потокового передавання. - + Контекст історії гільдії: - - `channels.discord.historyLimit` за замовчуванням `20` + - типове значення `channels.discord.historyLimit` — `20` - резервне значення: `messages.groupChat.historyLimit` - `0` вимикає @@ -657,28 +657,28 @@ OpenClaw підтримує контейнери компонентів Discord - `channels.discord.dmHistoryLimit` - `channels.discord.dms[""].historyLimit` - Поведінка гілок: + Поведінка потоків: - - гілки Discord маршрутизуються як сесії каналів - - метадані батьківської гілки можуть використовуватися для зв’язування з батьківською сесією - - конфігурація гілки успадковує конфігурацію батьківського каналу, якщо немає окремого запису для гілки + - потоки Discord маршрутизуються як сесії каналів + - метадані батьківського потоку можуть використовуватися для прив’язки до батьківської сесії + - конфігурація потоку успадковує конфігурацію батьківського каналу, якщо немає окремого запису для потоку - Теми каналів додаються як **ненадійний** контекст (не як системний запит). - Контекст відповіді та цитованого повідомлення наразі зберігається як отримано. - Allowlist у Discord переважно обмежують, хто може запускати агента, а не є повною межею редагування додаткового контексту. + Теми каналів впроваджуються як **ненадійний** контекст (а не як системний prompt). + Контекст відповідей і цитованих повідомлень наразі залишається таким, як був отриманий. + Allowlist Discord насамперед обмежують, хто може запускати агента, а не є повноцінною межею редагування додаткового контексту. - - У Discord можна прив’язати гілку до цільової сесії, щоб подальші повідомлення в цій гілці й далі маршрутизувалися до тієї самої сесії (включно із сесіями субагентів). + + Discord може прив’язати потік до цільової сесії, щоб подальші повідомлення в цьому потоці й далі маршрутизувалися до тієї самої сесії (зокрема сесій субагентів). Команди: - - `/focus ` — прив’язати поточну/нову гілку до цілі субагента/сесії - - `/unfocus` — видалити поточну прив’язку гілки - - `/agents` — показати активні запуски й стан прив’язок - - `/session idle ` — переглянути/оновити автоматичне зняття фокуса через неактивність для фокусованих прив’язок - - `/session max-age ` — переглянути/оновити жорсткий максимальний вік для фокусованих прив’язок + - `/focus ` прив’язати поточний/новий потік до цілі субагента/сесії + - `/unfocus` прибрати поточну прив’язку потоку + - `/agents` показати активні запуски та стан прив’язки + - `/session idle ` переглянути/оновити автоматичне зняття фокуса за неактивністю для сфокусованих прив’язок + - `/session max-age ` переглянути/оновити жорсткий максимальний вік для сфокусованих прив’язок Конфігурація: @@ -697,7 +697,7 @@ OpenClaw підтримує контейнери компонентів Discord enabled: true, idleHours: 24, maxAgeHours: 0, - spawnSubagentSessions: false, // за бажанням + spawnSubagentSessions: false, // opt-in }, }, }, @@ -706,18 +706,18 @@ OpenClaw підтримує контейнери компонентів Discord Примітки: - - `session.threadBindings.*` задає глобальні значення за замовчуванням. + - `session.threadBindings.*` задає глобальні типові значення. - `channels.discord.threadBindings.*` перевизначає поведінку Discord. - - `spawnSubagentSessions` має бути `true`, щоб автоматично створювати/прив’язувати гілки для `sessions_spawn({ thread: true })`. - - `spawnAcpSessions` має бути `true`, щоб автоматично створювати/прив’язувати гілки для ACP (`/acp spawn ... --thread ...` або `sessions_spawn({ runtime: "acp", thread: true })`). - - Якщо прив’язки гілок вимкнені для облікового запису, `/focus` і пов’язані операції прив’язки гілок недоступні. + - `spawnSubagentSessions` має бути true, щоб автоматично створювати/прив’язувати потоки для `sessions_spawn({ thread: true })`. + - `spawnAcpSessions` має бути true, щоб автоматично створювати/прив’язувати потоки для ACP (`/acp spawn ... --thread ...` або `sessions_spawn({ runtime: "acp", thread: true })`). + - Якщо прив’язки потоків вимкнені для облікового запису, `/focus` і пов’язані операції прив’язки потоків недоступні. - Див. [Sub-agents](/uk/tools/subagents), [ACP Agents](/uk/tools/acp-agents) і [Configuration Reference](/uk/gateway/configuration-reference). + Див. [Субагенти](/uk/tools/subagents), [ACP Agents](/uk/tools/acp-agents) і [Configuration Reference](/uk/gateway/configuration-reference). - Для стабільних ACP-робочих просторів «always-on» налаштуйте типізовані ACP-прив’язки верхнього рівня, націлені на розмови Discord. + Для стабільних «завжди активних» робочих просторів ACP налаштуйте типізовані прив’язки ACP верхнього рівня, націлені на розмови Discord. Шлях конфігурації: @@ -773,15 +773,15 @@ OpenClaw підтримує контейнери компонентів Discord Примітки: - - `/acp spawn codex --bind here` прив’язує поточний канал або гілку Discord на місці та зберігає маршрутизацію майбутніх повідомлень до тієї самої ACP-сесії. - - Це все ще може означати «запустити нову ACP-сесію Codex», але саме по собі не створює нову гілку Discord. Наявний канал лишається поверхнею чату. - - Codex усе ще може працювати у власному `cwd` або робочому просторі backend на диску. Цей робочий простір є станом середовища виконання, а не гілкою Discord. - - Повідомлення в гілках можуть успадковувати ACP-прив’язку батьківського каналу. - - У прив’язаному каналі або гілці `/new` і `/reset` скидають ту саму ACP-сесію на місці. - - Тимчасові прив’язки гілок усе ще працюють і можуть перевизначати розв’язання цілі, доки вони активні. - - `spawnAcpSessions` потрібне лише тоді, коли OpenClaw має створити/прив’язати дочірню гілку через `--thread auto|here`. Воно не потрібне для `/acp spawn ... --bind here` у поточному каналі. + - `/acp spawn codex --bind here` прив’язує поточний канал або потік Discord на місці та зберігає маршрутизацію майбутніх повідомлень до тієї самої сесії ACP. + - Це все ще може означати «запустити нову сесію Codex ACP», але саме по собі не створює новий потік Discord. Наявний канал залишається поверхнею чату. + - Codex усе одно може працювати у власному `cwd` або в робочому просторі backend на диску. Цей робочий простір є станом середовища виконання, а не потоком Discord. + - Повідомлення потоку можуть успадковувати прив’язку ACP батьківського каналу. + - У прив’язаному каналі або потоці `/new` і `/reset` скидають ту саму сесію ACP на місці. + - Тимчасові прив’язки потоків усе ще працюють і можуть перевизначати визначення цілі, поки вони активні. + - `spawnAcpSessions` потрібен лише тоді, коли OpenClaw має створити/прив’язати дочірній потік через `--thread auto|here`. Він не потрібен для `/acp spawn ... --bind here` у поточному каналі. - Див. [ACP Agents](/uk/tools/acp-agents), щоб ознайомитися з подробицями поведінки прив’язок. + Див. [ACP Agents](/uk/tools/acp-agents), щоб ознайомитися з деталями поведінки прив’язок. @@ -789,37 +789,37 @@ OpenClaw підтримує контейнери компонентів Discord Режим сповіщень про реакції для кожної гільдії: - `off` - - `own` (за замовчуванням) + - `own` (типово) - `all` - `allowlist` (використовує `guilds..users`) - Події реакцій перетворюються на системні події та додаються до маршрутизованої Discord-сесії. + Події реакцій перетворюються на системні події та приєднуються до маршрутизованої сесії Discord. - - `ackReaction` надсилає emoji підтвердження, поки OpenClaw обробляє вхідне повідомлення. + + `ackReaction` надсилає емодзі-підтвердження, поки OpenClaw обробляє вхідне повідомлення. - Порядок розв’язання: + Порядок визначення: - `channels.discord.accounts..ackReaction` - `channels.discord.ackReaction` - `messages.ackReaction` - - резервний emoji з ідентичності агента (`agents.list[].identity.emoji`, інакше "👀") + - резервне емодзі ідентичності агента (`agents.list[].identity.emoji`, інакше "👀") Примітки: - - Discord приймає unicode emoji або назви користувацьких emoji. + - Discord приймає emoji Unicode або назви користувацьких emoji. - Використовуйте `""`, щоб вимкнути реакцію для каналу або облікового запису. - - Ініційований каналом запис у конфігурацію ввімкнено за замовчуванням. + + Записи конфігурації, ініційовані з каналу, типово ввімкнені. Це впливає на потоки `/config set|unset` (коли функції команд увімкнені). - Вимкнути: + Вимкнення: ```json5 { @@ -833,8 +833,8 @@ OpenClaw підтримує контейнери компонентів Discord - - Маршрутизуйте WebSocket-трафік шлюзу Discord і REST-запити під час запуску (ID застосунку + розв’язання allowlist) через HTTP(S)-проксі за допомогою `channels.discord.proxy`. + + Маршрутизуйте WebSocket-трафік шлюзу Discord і стартові REST-запити (ID застосунку + визначення allowlist) через HTTP(S)-проксі за допомогою `channels.discord.proxy`. ```json5 { @@ -865,7 +865,7 @@ OpenClaw підтримує контейнери компонентів Discord - Увімкніть розв’язання PluralKit, щоб зіставляти проксійовані повідомлення з ідентичністю учасника системи: + Увімкніть визначення PluralKit, щоб зіставляти проксовані повідомлення з ідентичністю учасника системи: ```json5 { @@ -873,7 +873,7 @@ OpenClaw підтримує контейнери компонентів Discord discord: { pluralkit: { enabled: true, - token: "pk_live_...", // необов’язково; потрібне для приватних систем + token: "pk_live_...", // optional; needed for private systems }, }, }, @@ -884,13 +884,13 @@ OpenClaw підтримує контейнери компонентів Discord - allowlist можуть використовувати `pk:` - відображувані імена учасників зіставляються за іменем/slug лише коли `channels.discord.dangerouslyAllowNameMatching: true` - - пошук використовує ID початкового повідомлення та обмежується часовим вікном - - якщо пошук не вдається, проксійовані повідомлення обробляються як повідомлення бота й відкидаються, якщо тільки `allowBots=true` + - пошук використовує ID оригінального повідомлення та обмежується часовим вікном + - якщо пошук не вдався, проксовані повідомлення розглядаються як повідомлення бота й відкидаються, якщо не задано `allowBots=true` - - Оновлення статусу застосовуються, коли ви задаєте поле status або activity, або коли вмикаєте автоматичний статус. + + Оновлення присутності застосовуються, коли ви задаєте поле статусу або активності, або коли вмикаєте auto presence. Приклад лише зі статусом: @@ -904,7 +904,7 @@ OpenClaw підтримує контейнери компонентів Discord } ``` - Приклад activity (custom status — тип activity за замовчуванням): + Приклад активності (custom status — типовий тип активності): ```json5 { @@ -923,7 +923,7 @@ OpenClaw підтримує контейнери компонентів Discord { channels: { discord: { - activity: "Live coding", + activity: "Прямий ефір кодування", activityType: 1, activityUrl: "https://twitch.tv/openclaw", }, @@ -931,16 +931,16 @@ OpenClaw підтримує контейнери компонентів Discord } ``` - Відповідність типів activity: + Відповідність типів активності: - 0: Playing - - 1: Streaming (потрібен `activityUrl`) + - 1: Streaming (потребує `activityUrl`) - 2: Listening - 3: Watching - - 4: Custom (використовує текст activity як стан статусу; emoji необов’язкове) + - 4: Custom (використовує текст активності як стан статусу; emoji необов’язкове) - 5: Competing - Приклад автоматичного статусу (сигнал працездатності середовища виконання): + Приклад auto presence (сигнал стану середовища виконання): ```json5 { @@ -950,14 +950,14 @@ OpenClaw підтримує контейнери компонентів Discord enabled: true, intervalMs: 30000, minUpdateIntervalMs: 15000, - exhaustedText: "токен вичерпано", + exhaustedText: "токени вичерпано", }, }, }, } ``` - Auto presence зіставляє доступність середовища виконання зі статусом Discord: healthy => online, degraded або unknown => idle, exhausted або unavailable => dnd. Необов’язкові перевизначення тексту: + Auto presence відображає доступність середовища виконання у статус Discord: healthy => online, degraded або unknown => idle, exhausted або unavailable => dnd. Необов’язкові перевизначення тексту: - `autoPresence.healthyText` - `autoPresence.degradedText` @@ -965,79 +965,79 @@ OpenClaw підтримує контейнери компонентів Discord - - Discord підтримує обробку схвалень за допомогою кнопок у DM і за бажанням може публікувати запити на схвалення в каналі походження. + + Discord підтримує обробку погоджень через кнопки в DM і за потреби може також публікувати запити на погодження в каналі, де вони виникли. Шлях конфігурації: - `channels.discord.execApprovals.enabled` - - `channels.discord.execApprovals.approvers` (необов’язково; за можливості використовується резервне значення з `commands.ownerAllowFrom`) - - `channels.discord.execApprovals.target` (`dm` | `channel` | `both`, за замовчуванням: `dm`) + - `channels.discord.execApprovals.approvers` (необов’язково; за можливості резервно використовується `commands.ownerAllowFrom`) + - `channels.discord.execApprovals.target` (`dm` | `channel` | `both`, типово: `dm`) - `agentFilter`, `sessionFilter`, `cleanupAfterResolve` - Discord автоматично вмикає нативні exec-схвалення, коли `enabled` не задано або має значення `"auto"` і можна розв’язати щонайменше одного approver, або з `execApprovals.approvers`, або з `commands.ownerAllowFrom`. Discord не визначає exec-approver із `allowFrom` каналу, застарілого `dm.allowFrom` або `defaultTo` для прямих повідомлень. Явно задайте `enabled: false`, щоб вимкнути Discord як нативний клієнт схвалення. + Discord автоматично вмикає нативні exec-погодження, коли `enabled` не задано або має значення `"auto"` і можна визначити принаймні одного погоджувача — або з `execApprovals.approvers`, або з `commands.ownerAllowFrom`. Discord не виводить exec-погоджувачів із `allowFrom` каналу, застарілого `dm.allowFrom` або `defaultTo` для direct-message. Установіть `enabled: false`, щоб явно вимкнути Discord як нативний клієнт погодження. - Коли `target` має значення `channel` або `both`, запит на схвалення видимий у каналі. Лише розв’язані approver можуть використовувати кнопки; інші користувачі отримують ефемерну відмову. Запити на схвалення містять текст команди, тому вмикайте доставку в канал лише в довірених каналах. Якщо ID каналу неможливо вивести з ключа сесії, OpenClaw використовує резервну доставку через DM. + Коли `target` має значення `channel` або `both`, запит на погодження видно в каналі. Кнопками можуть користуватися лише визначені погоджувачі; інші користувачі отримують ефемерну відмову. Запити на погодження містять текст команди, тому вмикайте доставку в канал лише в довірених каналах. Якщо ID каналу неможливо вивести з ключа сесії, OpenClaw повертається до доставки через DM. - Discord також відображає спільні кнопки схвалення, які використовуються іншими чат-каналами. Нативний адаптер Discord головним чином додає маршрутизацію DM для approver і fanout у канал. - Коли ці кнопки присутні, вони є основним UX для схвалення; OpenClaw + Discord також відображає спільні кнопки погодження, які використовуються іншими чат-каналами. Нативний адаптер Discord переважно додає маршрутизацію DM для погоджувачів і fanout у канал. + Коли ці кнопки присутні, вони є основним UX для погодження; OpenClaw має включати ручну команду `/approve` лише тоді, коли результат інструмента каже, - що схвалення через чат недоступні або єдиним шляхом є ручне схвалення. + що чат-погодження недоступні або ручне погодження — єдиний шлях. - Автентифікація Gateway для цього обробника використовує той самий спільний контракт розв’язання облікових даних, що й інші клієнти Gateway: + Авторизація Gateway для цього обробника використовує той самий спільний контракт визначення облікових даних, що й інші клієнти Gateway: - - локальна автентифікація env-first (`OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD`, потім `gateway.auth.*`) - - у локальному режимі `gateway.remote.*` можна використовувати як резервне значення лише коли `gateway.auth.*` не задано; налаштовані, але нерозв’язані локальні SecretRef завершуються із закриттям доступу - - підтримка remote-mode через `gateway.remote.*`, де це застосовно - - перевизначення URL безпечні щодо перевизначень: перевизначення CLI не використовують неявні облікові дані повторно, а перевизначення env використовують лише env-облікові дані + - локальна авторизація з пріоритетом env (`OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD`, потім `gateway.auth.*`) + - у локальному режимі `gateway.remote.*` може використовуватися як резервний варіант лише коли `gateway.auth.*` не задано; локальні SecretRef, які налаштовані, але не визначаються, завершуються в закритому режимі + - підтримка remote-mode через `gateway.remote.*`, коли це застосовно + - перевизначення URL безпечні щодо перевизначення: перевизначення CLI не повторно використовують неявні облікові дані, а перевизначення env використовують лише облікові дані env - Поведінка розв’язання схвалень: + Поведінка визначення погодження: - - ID з префіксом `plugin:` розв’язуються через `plugin.approval.resolve`. - - Інші ID розв’язуються через `exec.approval.resolve`. - - Discord тут не виконує додатковий резервний перехід exec-to-plugin; префікс - id визначає, який метод шлюзу буде викликано. + - ID з префіксом `plugin:` визначаються через `plugin.approval.resolve`. + - Інші ID визначаються через `exec.approval.resolve`. + - Discord не виконує тут додатковий резервний перехід exec-to-plugin; префікс id + визначає, який метод gateway буде викликано. - Exec-схвалення за замовчуванням спливають через 30 хвилин. Якщо схвалення не спрацьовують через - невідомі ID схвалень, перевірте розв’язання approver, увімкнення функції та - що доставлений тип approval id відповідає очікуваному запиту. + Exec-погодження типово спливають через 30 хвилин. Якщо погодження не проходять через + невідомі ID погодження, перевірте визначення погоджувачів, увімкнення функції та + відповідність типу доставленого ID погодження очікуваному запиту. Пов’язана документація: [Exec approvals](/uk/tools/exec-approvals) -## Інструменти та обмеження дій +## Інструменти та шлюзи дій -Дії повідомлень Discord включають повідомлення, адміністрування каналів, модерацію, статус і дії з метаданими. +Дії повідомлень Discord включають роботу з повідомленнями, адміністрування каналів, модерацію, присутність і дії з метаданими. Основні приклади: - повідомлення: `sendMessage`, `readMessages`, `editMessage`, `deleteMessage`, `threadReply` - реакції: `react`, `reactions`, `emojiList` - модерація: `timeout`, `kick`, `ban` -- статус: `setPresence` +- присутність: `setPresence` Дія `event-create` приймає необов’язковий параметр `image` (URL або шлях до локального файлу), щоб задати обкладинку запланованої події. -Обмеження дій розміщені в `channels.discord.actions.*`. +Шлюзи дій розміщені в `channels.discord.actions.*`. -Поведінка обмежень за замовчуванням: +Типова поведінка шлюзів: -| Група дій | За замовчуванням | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | увімкнено | -| roles | вимкнено | -| moderation | вимкнено | -| presence | вимкнено | +| Група дій | Типово | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------- | +| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | увімкнено | +| roles | вимкнено | +| moderation | вимкнено | +| presence | вимкнено | -## Інтерфейс Components v2 +## Компоненти v2 UI -OpenClaw використовує Discord components v2 для exec-схвалень і позначок між контекстами. Дії повідомлень Discord також можуть приймати `components` для користувацького UI (розширено; вимагає побудови корисного навантаження компонента через інструмент discord), тоді як застарілі `embeds` усе ще доступні, але не рекомендовані. +OpenClaw використовує компоненти Discord v2 для exec-погоджень і маркерів між контекстами. Дії повідомлень Discord також можуть приймати `components` для користувацького UI (розширено; потребує побудови payload компонента через інструмент discord), тоді як застарілі `embeds` усе ще доступні, але не рекомендовані. - `channels.discord.ui.components.accentColor` задає акцентний колір, який використовується контейнерами компонентів Discord (hex). -- Задається для облікового запису через `channels.discord.accounts..ui.components.accentColor`. -- `embeds` ігноруються, коли присутні components v2. +- Задати для окремого облікового запису можна через `channels.discord.accounts..ui.components.accentColor`. +- `embeds` ігноруються, коли присутні компоненти v2. Приклад: @@ -1063,11 +1063,11 @@ OpenClaw може приєднуватися до голосових канал - Увімкніть нативні команди (`commands.native` або `channels.discord.commands.native`). - Налаштуйте `channels.discord.voice`. -- Бот повинен мати дозволи Connect + Speak у цільовому голосовому каналі. +- Боту потрібні дозволи Connect + Speak у цільовому голосовому каналі. -Використовуйте нативну команду лише для Discord `/vc join|leave|status` для керування сесіями. Команда використовує агента за замовчуванням для облікового запису та дотримується тих самих правил allowlist і group policy, що й інші команди Discord. +Використовуйте нативну команду лише для Discord `/vc join|leave|status`, щоб керувати сесіями. Команда використовує типового агента облікового запису та дотримується тих самих правил allowlist і group policy, що й інші команди Discord. -Приклад автоматичного приєднання: +Приклад auto-join: ```json5 { @@ -1096,20 +1096,20 @@ OpenClaw може приєднуватися до голосових канал Примітки: - `voice.tts` перевизначає `messages.tts` лише для відтворення голосу. -- Ходи розшифрування голосу визначають статус власника з Discord `allowFrom` (або `dm.allowFrom`); мовці, які не є власниками, не можуть отримати доступ до інструментів лише для власника (наприклад, `gateway` і `cron`). -- Голос увімкнений за замовчуванням; задайте `channels.discord.voice.enabled=false`, щоб вимкнути його. +- Ходи голосових транскриптів визначають статус власника з Discord `allowFrom` (або `dm.allowFrom`); мовці, які не є власниками, не можуть отримувати доступ до інструментів лише для власника (наприклад `gateway` і `cron`). +- Голос типово ввімкнено; установіть `channels.discord.voice.enabled=false`, щоб вимкнути його. - `voice.daveEncryption` і `voice.decryptionFailureTolerance` передаються в параметри приєднання `@discordjs/voice`. -- Якщо не задано, значення за замовчуванням `@discordjs/voice` — `daveEncryption=true` і `decryptionFailureTolerance=24`. -- OpenClaw також відстежує помилки дешифрування під час отримання та автоматично відновлюється, виходячи й повторно приєднуючись до голосового каналу після повторних збоїв за короткий проміжок часу. -- Якщо журнали отримання постійно показують `DecryptionFailed(UnencryptedWhenPassthroughDisabled)`, це може бути помилка отримання в `@discordjs/voice`, яка відстежується в [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419). +- Якщо не задано, типові значення `@discordjs/voice` — `daveEncryption=true` і `decryptionFailureTolerance=24`. +- OpenClaw також відстежує збої розшифрування під час приймання й автоматично відновлюється, виходячи й повторно приєднуючись до голосового каналу після повторних збоїв у короткому часовому вікні. +- Якщо журнали приймання постійно показують `DecryptionFailed(UnencryptedWhenPassthroughDisabled)`, це може бути пов’язано з помилкою приймання в `@discordjs/voice`, яку відстежують у [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419). ## Голосові повідомлення -Голосові повідомлення Discord показують попередній перегляд хвильової форми та вимагають аудіо OGG/Opus разом із метаданими. OpenClaw генерує хвильову форму автоматично, але для перевірки та конвертації аудіофайлів на хості шлюзу мають бути доступні `ffmpeg` і `ffprobe`. +Голосові повідомлення Discord показують попередній перегляд waveform і потребують аудіо OGG/Opus разом із метаданими. OpenClaw генерує waveform автоматично, але для перевірки й конвертації аудіофайлів на хості Gateway мають бути доступні `ffmpeg` і `ffprobe`. Вимоги й обмеження: -- Надайте **локальний шлях до файлу** (URL відхиляються). +- Укажіть **шлях до локального файлу** (URL відхиляються). - Не додавайте текстовий вміст (Discord не дозволяє текст + голосове повідомлення в одному payload). - Підтримується будь-який аудіоформат; OpenClaw за потреби конвертує його в OGG/Opus. @@ -1125,8 +1125,8 @@ message(action="send", channel="discord", target="channel:123", path="/path/to/a - увімкніть Message Content Intent - - увімкніть Server Members Intent, якщо ви покладаєтеся на розв’язання користувачів/учасників - - після зміни intents перезапустіть шлюз + - увімкніть Server Members Intent, якщо ви покладаєтеся на визначення користувачів/учасників + - перезапустіть шлюз після зміни intents @@ -1134,7 +1134,7 @@ message(action="send", channel="discord", target="channel:123", path="/path/to/a - перевірте `groupPolicy` - перевірте allowlist гільдії в `channels.discord.guilds` - - якщо існує мапа `channels` гільдії, дозволяються лише перелічені канали + - якщо існує мапа `channels` гільдії, дозволяються лише канали зі списку - перевірте поведінку `requireMention` і шаблони згадок Корисні перевірки: @@ -1151,12 +1151,12 @@ openclaw logs --follow Поширені причини: - `groupPolicy="allowlist"` без відповідного allowlist гільдії/каналу - - `requireMention` налаштовано в неправильному місці (має бути в `channels.discord.guilds` або в записі каналу) + - `requireMention` налаштовано не там, де потрібно (має бути в `channels.discord.guilds` або в записі каналу) - відправник заблокований allowlist `users` гільдії/каналу - + Типові журнали: @@ -1169,11 +1169,11 @@ openclaw logs --follow - один обліковий запис: `channels.discord.eventQueue.listenerTimeout` - кілька облікових записів: `channels.discord.accounts..eventQueue.listenerTimeout` - Параметр тайм-ауту виконання worker: + Параметр таймауту виконання worker: - один обліковий запис: `channels.discord.inboundWorker.runTimeoutMs` - кілька облікових записів: `channels.discord.accounts..inboundWorker.runTimeoutMs` - - за замовчуванням: `1800000` (30 хвилин); задайте `0`, щоб вимкнути + - типове значення: `1800000` (30 хвилин); установіть `0`, щоб вимкнути Рекомендована базова конфігурація: @@ -1196,8 +1196,8 @@ openclaw logs --follow } ``` - Використовуйте `eventQueue.listenerTimeout` для повільного налаштування listener і `inboundWorker.runTimeoutMs` - лише якщо вам потрібен окремий запобіжник для поставлених у чергу ходів агента. + Використовуйте `eventQueue.listenerTimeout` для повільного налаштування listener, а `inboundWorker.runTimeoutMs` + лише якщо вам потрібен окремий запобіжник для ходів агента в черзі. @@ -1208,27 +1208,27 @@ openclaw logs --follow - + - DM вимкнено: `channels.discord.dm.enabled=false` - - політика DM вимкнена: `channels.discord.dmPolicy="disabled"` (застаріле: `channels.discord.dm.policy`) - - очікується схвалення сполучення в режимі `pairing` + - політику DM вимкнено: `channels.discord.dmPolicy="disabled"` (застаріле: `channels.discord.dm.policy`) + - у режимі `pairing` очікується підтвердження зіставлення - - За замовчуванням повідомлення, створені ботами, ігноруються. + + Типово повідомлення, створені ботом, ігноруються. - Якщо ви задали `channels.discord.allowBots=true`, використовуйте суворі правила згадок і allowlist, щоб уникнути циклічної поведінки. - Віддавайте перевагу `channels.discord.allowBots="mentions"`, щоб приймати лише повідомлення ботів, які згадують бота. + Якщо ви встановите `channels.discord.allowBots=true`, використовуйте суворі правила згадок і allowlist, щоб уникнути циклічної поведінки. + Надавайте перевагу `channels.discord.allowBots="mentions"`, щоб приймати лише повідомлення ботів, які згадують бота. - + - - підтримуйте актуальність OpenClaw (`openclaw update`), щоб була присутня логіка відновлення отримання голосу Discord - - підтвердьте `channels.discord.voice.daveEncryption=true` (за замовчуванням) - - починайте з `channels.discord.voice.decryptionFailureTolerance=24` (вихідне значення за замовчуванням) і налаштовуйте лише за потреби + - підтримуйте актуальність OpenClaw (`openclaw update`), щоб логіка відновлення приймання голосу Discord була присутня + - підтвердьте `channels.discord.voice.daveEncryption=true` (типово) + - почніть із `channels.discord.voice.decryptionFailureTolerance=24` (типове значення upstream) і змінюйте лише за потреби - стежте за журналами: - `discord voice: DAVE decrypt failures detected` - `discord voice: repeated decrypt failures; attempting rejoin` @@ -1241,37 +1241,37 @@ openclaw logs --follow Основний довідник: -- [Довідник конфігурації - Discord](/uk/gateway/configuration-reference#discord) +- [Configuration reference - Discord](/uk/gateway/configuration-reference#discord) -Важливі поля Discord: +Ключові поля Discord: -- запуск/автентифікація: `enabled`, `token`, `accounts.*`, `allowBots` +- запуск/авторизація: `enabled`, `token`, `accounts.*`, `allowBots` - політика: `groupPolicy`, `dm.*`, `guilds.*`, `guilds.*.channels.*` -- команди: `commands.native`, `commands.useAccessGroups`, `configWrites`, `slashCommand.*` +- команда: `commands.native`, `commands.useAccessGroups`, `configWrites`, `slashCommand.*` - черга подій: `eventQueue.listenerTimeout` (бюджет listener), `eventQueue.maxQueueSize`, `eventQueue.maxConcurrency` - вхідний worker: `inboundWorker.runTimeoutMs` - відповідь/історія: `replyToMode`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit` - доставка: `textChunkLimit`, `chunkMode`, `maxLinesPerMessage` - потокова передача: `streaming` (застарілий псевдонім: `streamMode`), `streaming.preview.toolProgress`, `draftChunk`, `blockStreaming`, `blockStreamingCoalesce` - медіа/повторні спроби: `mediaMaxMb`, `retry` - - `mediaMaxMb` обмежує вихідні завантаження Discord (за замовчуванням: `100MB`) + - `mediaMaxMb` обмежує вихідні завантаження Discord (типово: `100MB`) - дії: `actions.*` -- статус: `activity`, `status`, `activityType`, `activityUrl` +- присутність: `activity`, `status`, `activityType`, `activityUrl` - UI: `ui.components.accentColor` -- функції: `threadBindings`, верхньорівневі `bindings[]` (`type: "acp"`), `pluralkit`, `execApprovals`, `intents`, `agentComponents`, `heartbeat`, `responsePrefix` +- функції: `threadBindings`, верхньорівневий `bindings[]` (`type: "acp"`), `pluralkit`, `execApprovals`, `intents`, `agentComponents`, `heartbeat`, `responsePrefix` -## Безпека й операції +## Безпека та операції -- Розглядайте токени ботів як секрети (у контрольованих середовищах перевага за `DISCORD_BOT_TOKEN`). -- Надавайте мінімально необхідні дозволи Discord. -- Якщо стан розгортання/команд застарів, перезапустіть шлюз і повторно перевірте через `openclaw channels status --probe`. +- Розглядайте токени ботів як секрети (у контрольованих середовищах бажано використовувати `DISCORD_BOT_TOKEN`). +- Надавайте Discord мінімально необхідні дозволи. +- Якщо розгортання/стан команд застаріли, перезапустіть шлюз і повторно перевірте через `openclaw channels status --probe`. ## Пов’язане -- [Сполучення](/uk/channels/pairing) +- [Зіставлення](/uk/channels/pairing) - [Групи](/uk/channels/groups) - [Маршрутизація каналів](/uk/channels/channel-routing) - [Безпека](/uk/gateway/security) -- [Маршрутизація кількох агентів](/uk/concepts/multi-agent) +- [Маршрутизація між кількома агентами](/uk/concepts/multi-agent) - [Усунення проблем](/uk/channels/troubleshooting) - [Слеш-команди](/uk/tools/slash-commands) diff --git a/docs/uk/ci.md b/docs/uk/ci.md index 37820b34d..10238b736 100644 --- a/docs/uk/ci.md +++ b/docs/uk/ci.md @@ -1,89 +1,89 @@ --- read_when: - - Вам потрібно зрозуміти, чому завдання CI було або не було запущено. + - Вам потрібно зрозуміти, чому завдання CI запустилося або не запустилося - Ви налагоджуєте збої перевірок GitHub Actions -summary: Граф завдань CI, шлюзи області дії та локальні еквіваленти команд +summary: Граф завдань CI, межі перевірок і локальні еквіваленти команд title: Конвеєр CI x-i18n: - generated_at: "2026-04-22T19:49:54Z" + generated_at: "2026-04-22T19:55:18Z" model: gpt-5.4 provider: openai - source_hash: 8a3fd8d758be86be3b2845b8507d118b6dbe14d1e4886a7adc88d226d2817772 + source_hash: c8c90ba88b3b08f87407e3b1cd90c13b1a2b2b6cb3c0e23b4f4f367614c97cc2 source_path: ci.md workflow: 15 --- # Конвеєр CI -CI запускається під час кожного push до `main` і для кожного pull request. Він використовує розумне визначення області дії, щоб пропускати дорогі завдання, коли змінено лише не пов’язані частини. +CI запускається при кожному push до `main` і для кожного pull request. Він використовує розумне визначення меж, щоб пропускати дорогі завдання, коли змінювалися лише нерелевантні ділянки. ## Огляд завдань -| Завдання | Призначення | Коли запускається | -| -------------------------------- | -------------------------------------------------------------------------------------------- | ----------------------------------- | -| `preflight` | Визначає зміни лише в документації, змінені області, змінені розширення та збирає маніфест CI | Завжди для push і PR, що не є draft | -| `security-scm-fast` | Виявлення приватних ключів і аудит workflow через `zizmor` | Завжди для push і PR, що не є draft | -| `security-dependency-audit` | Аудит production lockfile без залежностей щодо npm advisories | Завжди для push і PR, що не є draft | -| `security-fast` | Обов’язковий агрегатор для швидких завдань безпеки | Завжди для push і PR, що не є draft | -| `build-artifacts` | Один раз збирає `dist/` і Control UI, завантажує повторно використовувані артефакти для downstream-завдань | Зміни, релевантні для Node | -| `checks-fast-core` | Швидкі Linux-етапи коректності, як-от перевірки bundled/plugin-contract/protocol | Зміни, релевантні для Node | -| `checks-fast-contracts-channels` | Розподілені перевірки контрактів каналів зі стабільним агрегованим результатом перевірки | Зміни, релевантні для Node | -| `checks-node-extensions` | Повні шарди тестів bundled-plugin для всього набору розширень | Зміни, релевантні для Node | -| `checks-node-core-test` | Шарди тестів core Node, без етапів каналів, bundled, контрактів і розширень | Зміни, релевантні для Node | -| `extension-fast` | Цільові тести лише для змінених bundled plugins | Коли виявлено зміни розширень | -| `check` | Розподілений еквівалент основного локального шлюзу: production types, lint, guards, test types і strict smoke | Зміни, релевантні для Node | -| `check-additional` | Захисти архітектури, меж, surface розширень, package-boundary і шарди gateway-watch | Зміни, релевантні для Node | -| `build-smoke` | Smoke-тести зібраного CLI та smoke стартової пам’яті | Зміни, релевантні для Node | -| `checks` | Решта Linux Node-етапів: тести каналів і сумісність лише для push із Node 22 | Зміни, релевантні для Node | -| `check-docs` | Форматування документації, lint і перевірки битих посилань | Коли змінено документацію | -| `skills-python` | Ruff + pytest для Skills на базі Python | Зміни, релевантні для Python Skills | -| `checks-windows` | Windows-специфічні тестові етапи | Зміни, релевантні для Windows | -| `macos-node` | Етап тестів TypeScript на macOS із використанням спільних зібраних артефактів | Зміни, релевантні для macOS | -| `macos-swift` | Swift lint, build і tests для застосунку macOS | Зміни, релевантні для macOS | -| `android` | Матриця збірки та тестів Android | Зміни, релевантні для Android | +| Завдання | Призначення | Коли запускається | +| -------------------------------- | ------------------------------------------------------------------------------------------ | ----------------------------------- | +| `preflight` | Визначає зміни лише в документації, змінені межі, змінені розширення та будує маніфест CI | Завжди для push і PR, що не є draft | +| `security-scm-fast` | Виявлення приватних ключів і аудит workflow через `zizmor` | Завжди для push і PR, що не є draft | +| `security-dependency-audit` | Аудит production lockfile без залежностей щодо advisory з npm | Завжди для push і PR, що не є draft | +| `security-fast` | Обов’язковий агрегат для швидких завдань безпеки | Завжди для push і PR, що не є draft | +| `build-artifacts` | Збирає `dist/` і Control UI один раз, завантажує повторно використовувані артефакти для наступних завдань | Зміни, релевантні Node | +| `checks-fast-core` | Швидкі Linux-етапи коректності, такі як перевірки bundled/plugin-contract/protocol | Зміни, релевантні Node | +| `checks-fast-contracts-channels` | Шардовані перевірки контрактів каналів зі стабільним агрегованим результатом перевірки | Зміни, релевантні Node | +| `checks-node-extensions` | Повні тестові шарди bundled-plugin для всього набору розширень | Зміни, релевантні Node | +| `checks-node-core-test` | Шарди основних тестів Node, за винятком каналів, bundled, контрактних і extension-етапів | Зміни, релевантні Node | +| `extension-fast` | Сфокусовані тести лише для змінених bundled plugins | Коли виявлено зміни розширень | +| `check` | Шардований еквівалент основної локальної перевірки: production types, lint, guards, test types і strict smoke | Зміни, релевантні Node | +| `check-additional` | Архітектурні перевірки, перевірки меж, extension-surface guards, package-boundary і шарди gateway-watch | Зміни, релевантні Node | +| `build-smoke` | Smoke-тести зібраного CLI та smoke-тест використання пам’яті під час запуску | Зміни, релевантні Node | +| `checks` | Решта Linux Node-етапів: тести каналів і сумісність лише для push із Node 22 | Зміни, релевантні Node | +| `check-docs` | Форматування документації, lint і перевірки битих посилань | Документацію змінено | +| `skills-python` | Ruff + pytest для Skills на основі Python | Зміни, релевантні Python Skills | +| `checks-windows` | Специфічні для Windows тестові етапи | Зміни, релевантні Windows | +| `macos-node` | Етап тестів TypeScript на macOS із використанням спільних зібраних артефактів | Зміни, релевантні macOS | +| `macos-swift` | Swift lint, збірка і тести для застосунку macOS | Зміни, релевантні macOS | +| `android` | Матриця збірки й тестів Android | Зміни, релевантні Android | -## Порядок fail-fast +## Порядок швидкого завершення з помилкою -Завдання впорядковані так, щоб дешеві перевірки завершувалися з помилкою раніше, ніж запустяться дорогі: +Завдання впорядковані так, щоб дешеві перевірки завершувалися з помилкою раніше, ніж запускаються дорогі: 1. `preflight` вирішує, які етапи взагалі існують. Логіка `docs-scope` і `changed-scope` — це кроки всередині цього завдання, а не окремі завдання. -2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` і `skills-python` завершуються швидко без очікування важчих завдань з артефактами та платформних матриць. -3. `build-artifacts` виконується паралельно зі швидкими Linux-етапами, щоб downstream-споживачі могли почати роботу, щойно спільна збірка буде готова. -4. Після цього розгалужуються важчі платформні та runtime-етапи: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, `extension-fast`, `checks`, `checks-windows`, `macos-node`, `macos-swift` і `android`. +2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` і `skills-python` швидко завершуються з помилкою, не чекаючи важчих завдань зі збирання артефактів і платформених матриць. +3. `build-artifacts` виконується паралельно зі швидкими Linux-етапами, щоб наступні споживачі могли стартувати, щойно спільна збірка буде готова. +4. Після цього розгалужуються важчі платформені та runtime-етапи: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-extensions`, `checks-node-core-test`, `extension-fast`, `checks`, `checks-windows`, `macos-node`, `macos-swift` і `android`. -Логіка області дії знаходиться в `scripts/ci-changed-scope.mjs` і покривається unit-тестами в `src/scripts/ci-changed-scope.test.ts`. -Зміни у workflow CI перевіряють граф Node CI плюс lint workflow, але самі по собі не примушують запускати нативні збірки Windows, Android або macOS; ці платформні етапи й надалі обмежені змінами у вихідному коді відповідної платформи. -Перевірки Windows Node обмежені Windows-специфічними обгортками для process/path, допоміжними засобами npm/pnpm/UI runner, конфігурацією package manager і поверхнями workflow CI, які запускають цей етап; не пов’язані зміни у вихідному коді, plugins, install-smoke і зміни лише в тестах залишаються на Linux Node-етапах, щоб не резервувати 16-vCPU Windows worker для покриття, яке вже виконується звичайними шардами тестів. -Окремий workflow `install-smoke` повторно використовує той самий скрипт визначення області дії через власне завдання `preflight`. Він обчислює `run_install_smoke` із вужчого сигналу changed-smoke, тому Docker/install smoke запускається лише для змін, релевантних до встановлення, пакування та контейнерів. Його smoke QR package примушує Docker-шар `pnpm install` виконатися повторно, зберігаючи кеш BuildKit pnpm store, тож він усе одно перевіряє встановлення без повторного завантаження залежностей під час кожного запуску. Його gateway-network e2e повторно використовує runtime-образ, зібраний раніше в межах завдання, тому додає реальне WebSocket-покриття між контейнерами без додавання ще однієї Docker-збірки. +Логіка меж знаходиться в `scripts/ci-changed-scope.mjs` і покривається unit-тестами в `src/scripts/ci-changed-scope.test.ts`. +Зміни workflow CI перевіряють граф Node CI разом із linting workflow, але самі по собі не примушують запускати нативні збірки Windows, Android або macOS; ці платформені етапи залишаються прив’язаними до змін у вихідному коді відповідної платформи. +Перевірки Windows Node обмежені специфічними для Windows обгортками process/path, допоміжними засобами npm/pnpm/UI runner, конфігурацією package manager і поверхнями workflow CI, які запускають цей етап; нерелевантні зміни вихідного коду, plugin, install-smoke і лише тестові зміни залишаються на Linux Node-етапах, щоб не резервувати Windows worker із 16 vCPU для покриття, яке вже виконується звичайними тестовими шардами. +Окремий workflow `install-smoke` повторно використовує той самий скрипт меж через власне завдання `preflight`. Він обчислює `run_install_smoke` на основі вужчого сигналу changed-smoke, тому Docker/install smoke запускається лише для змін, релевантних встановленню, пакуванню та контейнерам. Його QR package smoke примушує Docker-шар `pnpm install` виконатися повторно, зберігаючи кеш BuildKit pnpm store, тож він усе ще перевіряє встановлення без повторного завантаження залежностей у кожному запуску. Його gateway-network e2e повторно використовує runtime-образ, зібраний раніше в межах цього завдання, тому додає реальне покриття WebSocket між контейнерами без додавання ще однієї Docker-збірки. -Локальна логіка changed-lane знаходиться в `scripts/changed-lanes.mjs` і виконується через `scripts/check-changed.mjs`. Цей локальний шлюз суворіший щодо архітектурних меж, ніж широка область дії платформ у CI: зміни core production запускають typecheck core prod плюс тести core, зміни лише в тестах core запускають лише typecheck/tests для core test, зміни production у розширеннях запускають typecheck extension prod плюс тести розширень, а зміни лише в тестах розширень запускають лише typecheck/tests для extension test. Зміни в публічному Plugin SDK або plugin-contract розширюють валідацію до розширень, оскільки розширення залежать від цих контрактів core. Підвищення версії лише в release metadata запускають цільові перевірки version/config/root-dependency. Невідомі зміни root/config для безпеки запускають усі етапи. +Локальна логіка changed-lane знаходиться в `scripts/changed-lanes.mjs` і виконується через `scripts/check-changed.mjs`. Ця локальна перевірка суворіша щодо архітектурних меж, ніж широкі платформені межі CI: зміни core production запускають core prod typecheck разом із core tests, зміни лише core test запускають тільки core test typecheck/tests, зміни extension production запускають extension prod typecheck разом із extension tests, а зміни лише extension test запускають тільки extension test typecheck/tests. Зміни публічного Plugin SDK або plugin-contract розширюють перевірку на extension, оскільки розширення залежать від цих контрактів core. Зміни лише в release metadata із підвищенням версії запускають цільові перевірки version/config/root-dependency. Невідомі зміни в root/config безпечно призводять до запуску всіх етапів. Для push матриця `checks` додає етап `compat-node22`, який запускається лише для push. Для pull request цей етап пропускається, і матриця залишається зосередженою на звичайних test/channel-етапах. -Найповільніші сімейства тестів Node розбиті або збалансовані так, щоб кожне завдання залишалося невеликим: контракти каналів розділяють покриття registry і core на вісім зважених шардів кожне, auto-reply працює як три збалансовані workers замість шести крихітних workers, а конфігурації agentic gateway/plugin розподілені по наявних agentic Node-завданнях лише для вихідного коду замість очікування зібраних артефактів. `check-additional` тримає разом compile/canary-роботи package-boundary і відокремлює їх від runtime topology gateway/architecture; шард boundary guard виконує свої невеликі незалежні guards паралельно в межах одного завдання, а регресія gateway watch використовує мінімальний профіль збірки `gatewayWatch` замість повторного збирання повного набору sidecar-артефактів CI. +Найповільніші сімейства тестів Node розбиті або збалансовані так, щоб кожне завдання залишалося невеликим: контракти каналів розділяють покриття registry і core на вісім зважених шардів кожне, auto-reply працює у вигляді трьох збалансованих worker замість шести крихітних, а agentic gateway/plugin configs розподілені по наявних source-only agentic Node-завданнях замість очікування на зібрані артефакти. `check-additional` тримає package-boundary compile/canary роботу разом і відокремлює її від runtime topology gateway/architecture роботи; шард boundary guard запускає свої невеликі незалежні guards паралельно в межах одного завдання, а regression для gateway watch використовує мінімальний профіль збірки `gatewayWatch` замість повторного збирання повного набору sidecar-артефактів CI. -GitHub може позначати витіснені завдання як `cancelled`, коли новіший push потрапляє в той самий PR або ref `main`. Вважайте це шумом CI, якщо тільки найновіший запуск для того самого ref також не завершується з помилкою. Агреговані перевірки шардів використовують `!cancelled() && always()`, тому вони все одно повідомляють про звичайні збої шардів, але не стають у чергу після того, як увесь workflow уже був витіснений. -Ключ конкурентності CI має версію (`CI-v4-*`), щоб zombie-процес на боці GitHub у старій групі черги не міг безстроково блокувати новіші запуски main. +GitHub може позначати замінені новішими завдання як `cancelled`, коли новіший push потрапляє в той самий PR або ref `main`. Сприймайте це як шум CI, якщо тільки найновіший запуск для того самого ref теж не завершується з помилкою. Агреговані перевірки шардів використовують `!cancelled() && always()`, тому вони все одно повідомляють про звичайні збої шардів, але не стають у чергу після того, як увесь workflow уже був замінений новішим. +Ключ concurrency для CI має версію (`CI-v5-*`), щоб zombie-процес на боці GitHub у старій групі черги не міг безстроково блокувати новіші запуски main. ## Runners -| Runner | Завдання | -| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ubuntu-24.04` | `preflight`, швидкі завдання безпеки та агрегатори (`security-scm-fast`, `security-dependency-audit`, `security-fast`), швидкі перевірки protocol/contract/bundled, розподілені перевірки контрактів каналів, шарди `check`, окрім lint, шарди й агрегатори `check-additional`, агреговані верифікатори тестів Node, перевірки документації, Python Skills, workflow-sanity, labeler, auto-response; preflight для install-smoke також використовує GitHub-hosted Ubuntu, щоб матриця Blacksmith могла стати в чергу раніше | -| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, шарди тестів Linux Node, шарди тестів bundled plugins, решта споживачів зібраних артефактів, `android` | -| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`, який залишається достатньо чутливим до CPU, тому 8 vCPU коштували дорожче, ніж заощаджували; Docker-збірки install-smoke, де час очікування в черзі для 32 vCPU коштував дорожче, ніж давав вигоду | -| `blacksmith-16vcpu-windows-2025` | `checks-windows` | -| `blacksmith-6vcpu-macos-latest` | `macos-node` у `openclaw/openclaw`; для fork використовується резервний перехід на `macos-latest` | -| `blacksmith-12vcpu-macos-latest` | `macos-swift` у `openclaw/openclaw`; для fork використовується резервний перехід на `macos-latest` | +| Runner | Завдання | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `ubuntu-24.04` | `preflight`, швидкі завдання безпеки й агрегати (`security-scm-fast`, `security-dependency-audit`, `security-fast`), швидкі перевірки protocol/contract/bundled, шардовані перевірки контрактів каналів, шарди `check`, окрім lint, шарди й агрегати `check-additional`, агреговані верифікатори тестів Node, перевірки документації, Python Skills, workflow-sanity, labeler, auto-response; preflight для install-smoke також використовує GitHub-hosted Ubuntu, щоб матриця Blacksmith могла ставати в чергу раніше | +| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, шарди тестів Linux Node, шарди тестів bundled plugin, решта споживачів зібраних артефактів, `android` | +| `blacksmith-16vcpu-ubuntu-2404` | `check-lint`, який залишається достатньо чутливим до CPU, тому 8 vCPU коштували дорожче, ніж давали вигоди; Docker-збірки install-smoke, де час очікування в черзі для 32 vCPU коштував дорожче, ніж давав вигоди | +| `blacksmith-16vcpu-windows-2025` | `checks-windows` | +| `blacksmith-6vcpu-macos-latest` | `macos-node` у `openclaw/openclaw`; для форків використовується резервний `macos-latest` | +| `blacksmith-12vcpu-macos-latest` | `macos-swift` у `openclaw/openclaw`; для форків використовується резервний `macos-latest` | ## Локальні еквіваленти ```bash pnpm changed:lanes # переглянути локальний класифікатор changed-lane для origin/main...HEAD -pnpm check:changed # розумний локальний шлюз: changed typecheck/lint/tests за boundary-етапом -pnpm check # швидкий локальний шлюз: production tsgo + sharded lint + parallel fast guards +pnpm check:changed # розумна локальна перевірка: changed typecheck/lint/tests за boundary-етапом +pnpm check # швидка локальна перевірка: production tsgo + шардований lint + паралельні швидкі guards pnpm check:test-types -pnpm check:timed # той самий шлюз із таймінгами для кожного етапу +pnpm check:timed # та сама перевірка з таймінгами для кожного етапу pnpm build:strict-smoke pnpm check:architecture pnpm test:gateway:watch-regression diff --git a/docs/uk/concepts/models.md b/docs/uk/concepts/models.md index fb21ed758..b755d2661 100644 --- a/docs/uk/concepts/models.md +++ b/docs/uk/concepts/models.md @@ -3,13 +3,13 @@ read_when: - Додавання або змінення CLI моделей (models list/set/scan/aliases/fallbacks) - Зміна поведінки резервних варіантів моделі або UX вибору - Оновлення перевірок сканування моделей (інструменти/зображення) -summary: 'CLI моделей: список, встановлення, псевдоніми, резервні варіанти, сканування, стан' +summary: 'CLI моделей: список, встановлення, псевдоніми, резервні варіанти, сканування, статус' title: CLI моделей x-i18n: - generated_at: "2026-04-22T17:02:09Z" + generated_at: "2026-04-22T19:55:24Z" model: gpt-5.4 provider: openai - source_hash: 94fe5b6012f12ab469305bcae95b2b7e9482f2d6868fc8a71a8c9ac2bd0e8604 + source_hash: 99174b625d265fe4743f4e0ca7ea3897bb446a485dde0841e101fe136a08558a source_path: concepts/models.md workflow: 15 --- @@ -24,35 +24,34 @@ x-i18n: OpenClaw вибирає моделі в такому порядку: 1. **Основна** модель (`agents.defaults.model.primary` або `agents.defaults.model`). -2. **Резервні варіанти** в `agents.defaults.model.fallbacks` (у вказаному порядку). -3. **Перемикання автентифікації провайдера при збої** відбувається всередині провайдера перед переходом до наступної моделі. +2. **Резервні варіанти** в `agents.defaults.model.fallbacks` (за порядком). +3. **Резервне перемикання автентифікації провайдера** відбувається всередині провайдера перед переходом до наступної моделі. -Пов’язано: +Пов’язане: - `agents.defaults.models` — це allowlist/каталог моделей, які OpenClaw може використовувати (разом із псевдонімами). - `agents.defaults.imageModel` використовується **лише тоді**, коли основна модель не може приймати зображення. -- `agents.defaults.pdfModel` використовується інструментом `pdf`. Якщо його не вказано, інструмент повертається до `agents.defaults.imageModel`, а потім до визначеної моделі сеансу/типової моделі. -- `agents.defaults.imageGenerationModel` використовується спільною можливістю генерації зображень. Якщо його не вказано, `image_generate` усе одно може вивести типовий провайдер на основі автентифікації. Спочатку він пробує поточного типового провайдера, потім решту зареєстрованих провайдерів генерації зображень у порядку provider-id. Якщо ви задаєте конкретний провайдер/модель, також налаштуйте автентифікацію/API key цього провайдера. -- `agents.defaults.musicGenerationModel` використовується спільною можливістю генерації музики. Якщо його не вказано, `music_generate` усе одно може вивести типовий провайдер на основі автентифікації. Спочатку він пробує поточного типового провайдера, потім решту зареєстрованих провайдерів генерації музики в порядку provider-id. Якщо ви задаєте конкретний провайдер/модель, також налаштуйте автентифікацію/API key цього провайдера. -- `agents.defaults.videoGenerationModel` використовується спільною можливістю генерації відео. Якщо його не вказано, `video_generate` усе одно може вивести типовий провайдер на основі автентифікації. Спочатку він пробує поточного типового провайдера, потім решту зареєстрованих провайдерів генерації відео в порядку provider-id. Якщо ви задаєте конкретний провайдер/модель, також налаштуйте автентифікацію/API key цього провайдера. -- Типові значення для окремого агента можуть перевизначати `agents.defaults.model` через `agents.list[].model` разом із прив’язками (див. [/concepts/multi-agent](/uk/concepts/multi-agent)). +- `agents.defaults.pdfModel` використовується інструментом `pdf`. Якщо його не вказано, інструмент повертається до `agents.defaults.imageModel`, а потім до визначеної для сесії/типової моделі. +- `agents.defaults.imageGenerationModel` використовується спільною можливістю генерації зображень. Якщо його не вказано, `image_generate` усе одно може визначити типовий варіант провайдера з автентифікацією. Спочатку він пробує поточного типового провайдера, потім — решту зареєстрованих провайдерів генерації зображень у порядку `provider-id`. Якщо ви задаєте конкретний провайдер/модель, також налаштуйте автентифікацію/API key цього провайдера. +- `agents.defaults.musicGenerationModel` використовується спільною можливістю генерації музики. Якщо його не вказано, `music_generate` усе одно може визначити типовий варіант провайдера з автентифікацією. Спочатку він пробує поточного типового провайдера, потім — решту зареєстрованих провайдерів генерації музики в порядку `provider-id`. Якщо ви задаєте конкретний провайдер/модель, також налаштуйте автентифікацію/API key цього провайдера. +- `agents.defaults.videoGenerationModel` використовується спільною можливістю генерації відео. Якщо його не вказано, `video_generate` усе одно може визначити типовий варіант провайдера з автентифікацією. Спочатку він пробує поточного типового провайдера, потім — решту зареєстрованих провайдерів генерації відео в порядку `provider-id`. Якщо ви задаєте конкретний провайдер/модель, також налаштуйте автентифікацію/API key цього провайдера. +- Типові значення для окремих агентів можуть перевизначати `agents.defaults.model` через `agents.list[].model` разом із прив’язками (див. [/concepts/multi-agent](/uk/concepts/multi-agent)). -## Швидка політика щодо моделей +## Швидка політика моделей - Встановіть основною найсильнішу модель останнього покоління, яка вам доступна. -- Використовуйте резервні варіанти для завдань, чутливих до вартості/затримки, і менш критичного чату. -- Для агентів з увімкненими інструментами або недовіреними вхідними даними уникайте старіших/слабших рівнів моделей. +- Використовуйте резервні варіанти для завдань, чутливих до вартості/затримки, і для менш критичного чату. +- Для агентів з увімкненими інструментами або для недовірених вхідних даних уникайте старіших/слабших рівнів моделей. ## Онбординг (рекомендовано) -Якщо ви не хочете редагувати конфігурацію вручну, запустіть онбординг: +Якщо ви не хочете вручну редагувати конфігурацію, запустіть онбординг: ```bash openclaw onboard ``` -Він може налаштувати модель + автентифікацію для поширених провайдерів, зокрема **OpenAI Code (Codex) -subscription** (OAuth) та **Anthropic** (API key або Claude CLI). +Він може налаштувати модель + автентифікацію для поширених провайдерів, зокрема **OpenAI Code (Codex) subscription** (OAuth) та **Anthropic** (API key або Claude CLI). ## Ключі конфігурації (огляд) @@ -64,24 +63,20 @@ subscription** (OAuth) та **Anthropic** (API key або Claude CLI). - `agents.defaults.models` (allowlist + псевдоніми + параметри провайдера) - `models.providers` (власні провайдери, записані в `models.json`) -Посилання на моделі нормалізуються до нижнього регістру. Псевдоніми провайдерів, наприклад `z.ai/*`, нормалізуються -до `zai/*`. +Посилання на моделі нормалізуються до нижнього регістру. Псевдоніми провайдерів, як-от `z.ai/*`, нормалізуються до `zai/*`. -Приклади конфігурації провайдерів (зокрема OpenCode) наведені в +Приклади конфігурації провайдерів (зокрема OpenCode) наведено в [/providers/opencode](/uk/providers/opencode). -## «Модель не дозволена» (і чому відповіді припиняються) +## «Модель не дозволена» (і чому відповіді зупиняються) -Якщо задано `agents.defaults.models`, воно стає **allowlist** для `/model` і для -перевизначень сеансу. Коли користувач вибирає модель, якої немає в цьому allowlist, -OpenClaw повертає: +Якщо задано `agents.defaults.models`, воно стає **allowlist** для `/model` і для перевизначень сесії. Коли користувач вибирає модель, якої немає в цьому allowlist, OpenClaw повертає: ``` Model "provider/model" is not allowed. Use /model to list available models. ``` -Це відбувається **до** генерації звичайної відповіді, тому може здаватися, -ніби повідомлення «не отримало відповіді». Щоб виправити це, потрібно: +Це відбувається **до** генерації звичайної відповіді, тому може здаватися, що повідомлення «не отримало відповіді». Виправити це можна так: - Додати модель до `agents.defaults.models`, або - Очистити allowlist (видалити `agents.defaults.models`), або @@ -103,7 +98,7 @@ Model "provider/model" is not allowed. Use /model to list available models. ## Перемикання моделей у чаті (`/model`) -Ви можете перемикати моделі для поточного сеансу без перезапуску: +Ви можете перемикати моделі для поточної сесії без перезапуску: ``` /model @@ -115,28 +110,28 @@ Model "provider/model" is not allowed. Use /model to list available models. Примітки: -- `/model` (і `/model list`) — це компактний нумерований засіб вибору (сімейство моделей + доступні провайдери). -- У Discord `/model` і `/models` відкривають інтерактивний засіб вибору зі списками провайдера та моделі, а також кроком Submit. -- `/models add` дає змогу додати запис провайдер/модель із чату без ручного редагування конфігурації. -- `/models add ` — найшвидший шлях; простий `/models add` запускає керований потік із вибором провайдера спочатку, де це підтримується. +- `/model` (і `/model list`) — це компактний нумерований вибір (сімейство моделей + доступні провайдери). +- У Discord `/model` і `/models` відкривають інтерактивний вибір із випадними списками провайдера та моделі, а також кроком Submit. +- `/models add` доступна типово й може бути вимкнена через `commands.modelsWrite=false`. +- Якщо ввімкнено, `/models add ` — це найшвидший шлях; просто `/models add` запускає керований процес із вибором провайдера спочатку, де це підтримується. - Після `/models add` нова модель стає доступною в `/models` і `/model` без перезапуску Gateway. -- `/model <#>` вибирає зі списку цього засобу вибору. -- `/model` одразу зберігає новий вибір для сеансу. +- `/model <#>` вибирає модель із цього списку. +- `/model` одразу зберігає новий вибір для сесії. - Якщо агент неактивний, наступний запуск одразу використовує нову модель. -- Якщо запуск уже активний, OpenClaw позначає перемикання під час роботи як відкладене й перезапускається з новою моделлю лише в чистій точці повторної спроби. -- Якщо активність інструментів або виведення відповіді вже почалися, відкладене перемикання може залишатися в черзі до пізнішої можливості повторної спроби або до наступного ходу користувача. -- `/model status` — це докладне подання (кандидати автентифікації та, якщо налаштовано, `baseUrl` і режим `api` кінцевої точки провайдера). -- Посилання на моделі розбираються шляхом поділу за **першим** `/`. Під час введення `/model ` використовуйте `provider/model`. +- Якщо запуск уже активний, OpenClaw позначає перемикання на льоту як очікуване й перезапускає в нову модель лише в чистій точці повторної спроби. +- Якщо активність інструментів або виведення відповіді вже почалися, очікуване перемикання може залишатися в черзі до пізнішої можливості повторної спроби або до наступного ходу користувача. +- `/model status` — це детальне подання (кандидати автентифікації та, коли налаштовано, `baseUrl` кінцевої точки провайдера + режим `api`). +- Посилання на модель розбираються шляхом поділу за **першим** `/`. Під час введення `/model ` використовуйте `provider/model`. - Якщо сам ID моделі містить `/` (у стилі OpenRouter), ви маєте вказати префікс провайдера (приклад: `/model openrouter/moonshotai/kimi-k2`). - Якщо ви не вказуєте провайдера, OpenClaw визначає введення в такому порядку: 1. збіг псевдоніма - 2. унікальний збіг налаштованого провайдера для цього точного ID моделі без префікса - 3. застаріле повернення до налаштованого типового провайдера + 2. однозначний збіг налаштованого провайдера для цього точного ID моделі без префікса + 3. застарілий резервний перехід до налаштованого типового провайдера Якщо цей провайдер більше не надає налаштовану типову модель, OpenClaw - натомість повертається до першого налаштованого провайдера/моделі, щоб не - показувати застаріле типове значення видаленого провайдера. + натомість переходить до першого налаштованого провайдера/моделі, щоб уникнути + показу застарілого типового значення видаленого провайдера. -Повна поведінка/конфігурація команд: [Слеш-команди](/uk/tools/slash-commands). +Повна поведінка команди/конфігурація: [Косі команди](/uk/tools/slash-commands). Приклади: @@ -146,7 +141,7 @@ Model "provider/model" is not allowed. Use /model to list available models. /models add lmstudio qwen/qwen3.5-9b ``` -## Команди CLI +## CLI команди ```bash openclaw models list @@ -181,31 +176,22 @@ openclaw models image-fallbacks clear - `--plain`: одна модель на рядок - `--json`: машинозчитуваний вивід -`--all` включає зведені статичні рядки каталогу, якими володіють вбудовані провайдери, до -налаштування автентифікації, тому подання лише для виявлення можуть показувати моделі, які недоступні, доки -ви не додасте відповідні облікові дані провайдера. +`--all` включає рядки статичного каталогу вбудованих провайдерів ще до налаштування автентифікації, тож подання лише для виявлення можуть показувати моделі, недоступні, доки ви не додасте відповідні облікові дані провайдера. ### `models status` -Показує визначену основну модель, резервні варіанти, модель зображень і огляд -автентифікації налаштованих провайдерів. Також показує статус завершення дії OAuth для профілів, знайдених -у сховищі автентифікації (типово попереджає за 24 год до завершення). `--plain` виводить лише -визначену основну модель. -Статус OAuth показується завжди (і входить у вивід `--json`). Якщо в налаштованого -провайдера немає облікових даних, `models status` виводить розділ **Відсутня автентифікація**. -JSON включає `auth.oauth` (вікно попередження + профілі) і `auth.providers` +Показує визначені основну модель, резервні варіанти, модель для зображень і огляд автентифікації налаштованих провайдерів. Також показує стан завершення строку дії OAuth для профілів, знайдених у сховищі автентифікації (типово попереджає за 24 год). `--plain` виводить лише визначену основну модель. +Стан OAuth показується завжди (і включається у вивід `--json`). Якщо налаштований провайдер не має облікових даних, `models status` виводить розділ **Відсутня автентифікація**. +JSON містить `auth.oauth` (вікно попередження + профілі) та `auth.providers` (ефективна автентифікація для кожного провайдера, зокрема облікові дані з env). `auth.oauth` -стосується лише стану профілів у сховищі автентифікації; провайдери лише з env там не відображаються. -Використовуйте `--check` для автоматизації (код виходу `1` для відсутніх/прострочених, `2` для тих, що скоро завершаться). -Використовуйте `--probe` для живих перевірок автентифікації; рядки перевірки можуть надходити з профілів автентифікації, облікових даних env -або `models.json`. +стосується лише стану профілів у сховищі автентифікації; провайдери лише з env там не з’являються. +Використовуйте `--check` для автоматизації (код виходу `1` для відсутніх/прострочених, `2` для тих, що скоро спливають). +Використовуйте `--probe` для живих перевірок автентифікації; рядки перевірок можуть надходити з профілів автентифікації, облікових даних env або `models.json`. Якщо явний `auth.order.` пропускає збережений профіль, перевірка повідомляє -`excluded_by_auth_order` замість спроби його використати. Якщо автентифікація є, але не вдається визначити -жодну модель для перевірки для цього провайдера, перевірка повідомляє `status: no_model`. +`excluded_by_auth_order` замість спроби його використати. Якщо автентифікація є, але для цього провайдера неможливо визначити модель, придатну для перевірки, перевірка повідомляє `status: no_model`. -Вибір автентифікації залежить від провайдера/облікового запису. Для хостів Gateway, що працюють постійно, -API key зазвичай є найпередбачуванішим варіантом; також підтримується повторне використання Claude CLI та наявних профілів -OAuth/токенів Anthropic. +Вибір автентифікації залежить від провайдера/облікового запису. Для постійно активних хостів Gateway +API key зазвичай найпередбачуваніші; також підтримується повторне використання Claude CLI та наявних профілів OAuth/token Anthropic. Приклад (Claude CLI): @@ -214,25 +200,25 @@ claude auth login openclaw models status ``` -## Сканування (безкоштовні моделі OpenRouter) +## Сканування (безплатні моделі OpenRouter) -`openclaw models scan` перевіряє **каталог безкоштовних моделей** OpenRouter і може -за потреби перевіряти моделі на підтримку інструментів і зображень. +`openclaw models scan` перевіряє **каталог безплатних моделей** OpenRouter і може +за бажанням виконувати перевірку моделей на підтримку інструментів і зображень. Основні прапорці: - `--no-probe`: пропустити живі перевірки (лише метадані) - `--min-params `: мінімальний розмір параметрів (у мільярдах) -- `--max-age-days `: пропускати старіші моделі +- `--max-age-days `: пропустити старіші моделі - `--provider `: фільтр за префіксом провайдера - `--max-candidates `: розмір списку резервних варіантів -- `--set-default`: встановити `agents.defaults.model.primary` на перший вибраний варіант -- `--set-image`: встановити `agents.defaults.imageModel.primary` на перший вибраний варіант зображень +- `--set-default`: встановити `agents.defaults.model.primary` на перший вибір +- `--set-image`: встановити `agents.defaults.imageModel.primary` на перший вибір зображення -Для перевірок потрібен API key OpenRouter (із профілів автентифікації або +Перевірка потребує API key OpenRouter (з профілів автентифікації або `OPENROUTER_API_KEY`). Без ключа використовуйте `--no-probe`, щоб лише перелічити кандидатів. -Результати сканування ранжуються за такими критеріями: +Результати сканування ранжуються за: 1. Підтримка зображень 2. Затримка інструментів @@ -241,36 +227,36 @@ openclaw models status Вхідні дані -- список OpenRouter `/models` (фільтр `:free`) -- Потрібен API key OpenRouter із профілів автентифікації або `OPENROUTER_API_KEY` (див. [/environment](/uk/help/environment)) +- Список OpenRouter `/models` (фільтр `:free`) +- Потребує API key OpenRouter із профілів автентифікації або `OPENROUTER_API_KEY` (див. [/environment](/uk/help/environment)) - Необов’язкові фільтри: `--max-age-days`, `--min-params`, `--provider`, `--max-candidates` -- Керування перевірками: `--timeout`, `--concurrency` +- Керування перевіркою: `--timeout`, `--concurrency` Під час запуску в TTY ви можете інтерактивно вибирати резервні варіанти. У неінтерактивному режимі передайте `--yes`, щоб прийняти типові значення. ## Реєстр моделей (`models.json`) -Власні провайдери в `models.providers` записуються до `models.json` у -каталозі агента (типово `~/.openclaw/agents//agent/models.json`). Цей файл +Власні провайдери в `models.providers` записуються в `models.json` у каталозі +агента (типово `~/.openclaw/agents//agent/models.json`). Цей файл типово об’єднується, якщо тільки `models.mode` не встановлено в `replace`. -Пріоритет у режимі об’єднання для збіжних ID провайдерів: +Пріоритет у режимі злиття для однакових ID провайдерів: -- Непорожній `baseUrl`, уже наявний у `models.json` агента, має перевагу. -- Непорожній `apiKey` у `models.json` агента має перевагу лише тоді, коли цей провайдер не керується через SecretRef у поточному контексті конфігурації/профілю автентифікації. -- Значення `apiKey` для провайдерів, керованих через SecretRef, оновлюються з маркерів джерела (`ENV_VAR_NAME` для посилань на env, `secretref-managed` для посилань file/exec) замість збереження визначених секретів. -- Значення заголовків для провайдерів, керованих через SecretRef, оновлюються з маркерів джерела (`secretref-env:ENV_VAR_NAME` для посилань на env, `secretref-managed` для посилань file/exec). -- Порожній або відсутній `apiKey`/`baseUrl` агента повертається до конфігурації `models.providers`. +- Непорожній `baseUrl`, уже наявний в `models.json` агента, має пріоритет. +- Непорожній `apiKey` у `models.json` агента має пріоритет лише тоді, коли цей провайдер не керується через SecretRef у поточному контексті конфігурації/профілю автентифікації. +- Значення `apiKey` провайдера, якими керує SecretRef, оновлюються з маркерів джерела (`ENV_VAR_NAME` для env-посилань, `secretref-managed` для посилань file/exec) замість збереження розкритих секретів. +- Значення заголовків провайдера, якими керує SecretRef, оновлюються з маркерів джерела (`secretref-env:ENV_VAR_NAME` для env-посилань, `secretref-managed` для посилань file/exec). +- Порожні або відсутні `apiKey`/`baseUrl` агента переходять до конфігурації `models.providers`. - Інші поля провайдера оновлюються з конфігурації та нормалізованих даних каталогу. -Збереження маркерів є авторитетним щодо джерела: OpenClaw записує маркери з активного знімка конфігурації джерела (до визначення), а не з визначених значень секретів під час виконання. -Це застосовується щоразу, коли OpenClaw повторно генерує `models.json`, зокрема в шляхах, ініційованих командами, таких як `openclaw agent`. +Збереження маркерів є авторитетним щодо джерела: OpenClaw записує маркери з активного знімка конфігурації джерела (до розв’язання), а не з розв’язаних значень секретів часу виконання. +Це застосовується щоразу, коли OpenClaw повторно генерує `models.json`, зокрема в шляхах, ініційованих командами, як-от `openclaw agent`. ## Пов’язане - [Провайдери моделей](/uk/concepts/model-providers) — маршрутизація провайдерів і автентифікація -- [Резервні варіанти моделей](/uk/concepts/model-failover) — ланцюжки резервних варіантів +- [Резервне перемикання моделей](/uk/concepts/model-failover) — ланцюжки резервних варіантів - [Генерація зображень](/uk/tools/image-generation) — конфігурація моделі зображень - [Генерація музики](/uk/tools/music-generation) — конфігурація музичної моделі - [Генерація відео](/uk/tools/video-generation) — конфігурація відеомоделі