From 12353ea3570d01555061bdae6ff8bde6e047d997 Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Mon, 4 May 2026 04:50:55 +0000 Subject: [PATCH] chore(i18n): refresh uk translations --- docs/uk/plugins/google-meet.md | 1067 ++++++++++++++++---------------- docs/uk/plugins/voice-call.md | 371 ++++++----- docs/uk/providers/google.md | 232 +++---- 3 files changed, 838 insertions(+), 832 deletions(-) diff --git a/docs/uk/plugins/google-meet.md b/docs/uk/plugins/google-meet.md index d5900bccf..e74d79ce6 100644 --- a/docs/uk/plugins/google-meet.md +++ b/docs/uk/plugins/google-meet.md @@ -3,41 +3,41 @@ read_when: - Ви хочете, щоб агент OpenClaw приєднався до дзвінка Google Meet - Ви хочете, щоб агент OpenClaw створив новий дзвінок Google Meet - Ви налаштовуєте Chrome, вузол Chrome або Twilio як транспорт для Google Meet -summary: 'Google Meet Plugin: приєднання за явними URL-адресами Meet через Chrome або Twilio зі стандартними налаштуваннями відповіді агента' +summary: 'Plugin Google Meet: приєднання до явних URL-адрес Meet через Chrome або Twilio зі стандартними налаштуваннями відповіді агента' title: Plugin Google Meet x-i18n: - generated_at: "2026-05-04T03:12:39Z" + generated_at: "2026-05-04T04:47:25Z" model: gpt-5.5 provider: openai - source_hash: a7c35884f9fff49561e884050e1d94099621b1a4acd8a035e82ca8cb0f5a06ff + source_hash: 9caeb2d4540b833c75cd0f3b5f61a99f0a6bb16ca71a96011d25e4ea103a4601 source_path: plugins/google-meet.md workflow: 16 --- -Підтримка учасника Google Meet для OpenClaw — Plugin навмисно є явним за дизайном: +Підтримка учасника Google Meet для OpenClaw — Plugin навмисно явний за дизайном: - Він приєднується лише до явної URL-адреси `https://meet.google.com/...`. -- Він може створити новий простір Meet через Google Meet API, а потім приєднатися до - поверненої URL-адреси. -- `agent` — стандартний режим відповіді голосом: транскрипція в реальному часі слухає, +- Він може створити новий простір Meet через Google Meet API, а потім приєднатися за + поверненою URL-адресою. +- `agent` — типовий режим відповіді голосом: транскрибування в реальному часі слухає, налаштований агент OpenClaw відповідає, а звичайний OpenClaw TTS говорить у Meet. -- `bidi` залишається доступним як резервний режим прямої голосової моделі реального часу. -- Агенти вибирають поведінку приєднання за допомогою `mode`: використовуйте `agent` для живого - прослуховування/відповіді голосом, `bidi` для прямого резервного голосового режиму реального часу або `transcribe` - для приєднання/керування браузером без мосту відповіді голосом. -- Автентифікація починається як особистий Google OAuth або вже виконаний вхід у профіль Chrome. +- `bidi` залишається доступним як резервний режим прямої голосової моделі в реальному часі. +- Агенти вибирають поведінку приєднання через `mode`: використовуйте `agent` для живого + прослуховування/відповіді голосом, `bidi` для прямого резервного голосового режиму в реальному часі або `transcribe` + для приєднання/керування браузером без моста відповіді голосом. +- Автентифікація починається як особистий Google OAuth або вже авторизований профіль Chrome. - Автоматичного оголошення згоди немає. -- Стандартний аудіобекенд Chrome — `BlackHole 2ch`. +- Типовий аудіобекенд Chrome — `BlackHole 2ch`. - Chrome може працювати локально або на спареному вузловому хості. -- Twilio приймає номер для дозвону плюс необов’язковий PIN або DTMF-послідовність; він - не може набирати URL-адресу Meet напряму. -- Команда CLI — `googlemeet`; `meet` зарезервовано для ширших агентних +- Twilio приймає номер для дзвінка плюс необов’язковий PIN або послідовність DTMF; він + не може напряму набрати URL Meet. +- Команда CLI — `googlemeet`; `meet` зарезервовано для ширших агентських телеконференційних робочих процесів. ## Швидкий старт -Установіть локальні аудіозалежності й налаштуйте провайдера транскрипції в реальному часі -плюс звичайний OpenClaw TTS. OpenAI є стандартним провайдером транскрипції; +Установіть локальні аудіозалежності та налаштуйте постачальника транскрибування в реальному часі +плюс звичайний OpenClaw TTS. OpenAI є типовим постачальником транскрибування; Google Gemini Live також працює як окремий резервний голосовий режим `bidi` з `realtime.voiceProvider: "google"`: @@ -83,9 +83,9 @@ command -v sox openclaw googlemeet setup ``` -Вивід налаштування призначений бути читабельним для агента й обізнаним про режим. Він повідомляє про профіль Chrome, -закріплення вузла, а для приєднань Chrome у реальному часі — міст аудіо -BlackHole/SoX і відкладені перевірки вступу в реальному часі. Для приєднань лише для спостереження перевірте той самий +Вивід налаштування призначений бути читабельним для агента та залежним від режиму. Він повідомляє профіль Chrome, +закріплення вузла та, для приєднань Chrome у реальному часі, аудіоміст BlackHole/SoX +і відкладені перевірки вступу в реальному часі. Для приєднань лише для спостереження перевіряйте той самий транспорт із `--mode transcribe`; цей режим пропускає аудіопередумови реального часу, оскільки він не слухає через міст і не говорить через нього: @@ -94,22 +94,22 @@ openclaw googlemeet setup --transport chrome-node --mode transcribe ``` Коли налаштовано делегування Twilio, налаштування також повідомляє, чи готові -Plugin `voice-call`, облікові дані Twilio і публічне відкриття Webhook. -Сприймайте будь-яку перевірку `ok: false` як блокер для перевіреного транспорту й режиму, -перш ніж просити агента приєднатися. Використовуйте `openclaw googlemeet setup --json` для +Plugin `voice-call`, облікові дані Twilio та публічна доступність Webhook. +Сприймайте будь-яку перевірку `ok: false` як блокер для перевіреного транспорту й режиму +перед тим, як просити агента приєднатися. Використовуйте `openclaw googlemeet setup --json` для скриптів або машинозчитуваного виводу. Використовуйте `--transport chrome`, `--transport chrome-node` або `--transport twilio`, щоб попередньо перевірити конкретний транспорт до того, як агент спробує його використати. -Для Twilio завжди явно попередньо перевіряйте транспорт, коли стандартним транспортом -є Chrome: +Для Twilio завжди явно попередньо перевіряйте транспорт, коли типовий транспорт +— Chrome: ```bash openclaw googlemeet setup --transport twilio ``` -Це виявляє відсутню проводку `voice-call`, облікові дані Twilio або недосяжне -відкриття Webhook до того, як агент спробує набрати зустріч. +Це виявляє відсутнє підключення `voice-call`, облікові дані Twilio або недосяжну +публічну доступність Webhook до того, як агент спробує набрати зустріч. Приєднайтеся до зустрічі: @@ -128,11 +128,11 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij } ``` -Орієнтований на агента інструмент `google_meet` залишається доступним на хостах не macOS для -артефактів, календаря, налаштування, транскрибування, Twilio і потоків `chrome-node`. Локальні -дії відповіді голосом у Chrome там заблоковані, оскільки вбудований аудіошлях Chrome +Агентський інструмент `google_meet` залишається доступним на хостах не macOS для +потоків артефактів, календаря, налаштування, транскрибування, Twilio та `chrome-node`. Локальні +дії відповіді голосом Chrome там заблоковані, оскільки вбудований аудіошлях Chrome наразі залежить від macOS `BlackHole 2ch`. На Linux використовуйте `mode: "transcribe"`, -дозвон Twilio або macOS-хост `chrome-node` для участі Chrome з відповіддю голосом. +дзвінок Twilio або macOS-хост `chrome-node` для участі Chrome з відповіддю голосом. Створіть нову зустріч і приєднайтеся до неї: @@ -141,24 +141,23 @@ openclaw googlemeet create --transport chrome-node --mode agent ``` Для кімнат, створених через API, використовуйте Google Meet `SpaceConfig.accessType`, коли хочете, -щоб політика входу без запиту для кімнати була явною, а не успадкованою зі стандартних налаштувань -облікового запису Google: +щоб політика кімнати без запиту на допуск була явною, а не успадкованою від типових значень облікового запису Google: ```bash openclaw googlemeet create --access-type OPEN --transport chrome-node --mode agent ``` -`OPEN` дозволяє будь-кому з URL-адресою Meet приєднатися без запиту. `TRUSTED` дозволяє -довіреним користувачам організації хоста, запрошеним зовнішнім користувачам і користувачам -дозвону приєднуватися без запиту. `RESTRICTED` обмежує вхід без запиту лише запрошеними. -Ці налаштування застосовуються лише до офіційного шляху створення Google Meet API, тому -облікові дані OAuth мають бути налаштовані. +`OPEN` дозволяє будь-кому з URL Meet приєднатися без запиту на допуск. `TRUSTED` дозволяє +довіреним користувачам організації хоста, запрошеним зовнішнім користувачам і користувачам, +що дзвонять телефоном, приєднуватися без запиту на допуск. `RESTRICTED` обмежує вхід без запиту на допуск +запрошеними. Ці налаштування застосовуються лише до офіційного шляху створення Google Meet API, +тож облікові дані OAuth мають бути налаштовані. -Якщо ви автентифікували Google Meet до того, як ця опція стала доступною, повторно запустіть -`openclaw googlemeet auth login --json` після додавання scope +Якщо ви автентифікували Google Meet до появи цієї опції, повторно виконайте +`openclaw googlemeet auth login --json` після додавання області `meetings.space.settings` до екрана згоди Google OAuth. -Створіть лише URL-адресу без приєднання: +Створіть лише URL без приєднання: ```bash openclaw googlemeet create --no-join @@ -167,21 +166,21 @@ openclaw googlemeet create --no-join `googlemeet create` має два шляхи: - Створення через API: використовується, коли налаштовано облікові дані Google Meet OAuth. Це - найдетермінованіший шлях, який не залежить від стану UI браузера. -- Резервний браузерний шлях: використовується, коли облікові дані OAuth відсутні. OpenClaw використовує + найдетермінованіший шлях, який не залежить від стану інтерфейсу браузера. +- Резервний браузерний шлях: використовується, коли облікових даних OAuth немає. OpenClaw використовує закріплений вузол Chrome, відкриває `https://meet.google.com/new`, чекає, доки Google - переспрямує на справжню URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях потребує, - щоб профіль OpenClaw Chrome на вузлі вже мав виконаний вхід у Google. - Браузерна автоматизація обробляє власний початковий запит Meet на мікрофон; цей запит - не вважається помилкою входу Google. - Потоки приєднання та створення також намагаються повторно використати наявну вкладку Meet, перш ніж відкривати - нову. Зіставлення ігнорує нешкідливі рядки запиту URL, як-от `authuser`, тому + перенаправить на справжню URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях потребує, + щоб профіль Chrome OpenClaw на вузлі вже був авторизований у Google. + Браузерна автоматизація обробляє власний початковий запит Meet щодо мікрофона; цей запит + не вважається помилкою входу в Google. + Потоки приєднання та створення також намагаються повторно використати наявну вкладку Meet перед відкриттям + нової. Зіставлення ігнорує нешкідливі рядки запиту URL, як-от `authuser`, тож повторна спроба агента має сфокусувати вже відкриту зустріч замість створення другої вкладки Chrome. Вивід команди/інструмента містить поле `source` (`api` або `browser`), щоб агенти -могли пояснити, який шлях було використано. `create` стандартно приєднується до нової зустрічі й -повертає `joined: true` плюс сесію приєднання. Щоб лише створити URL-адресу, використовуйте +могли пояснити, який шлях було використано. `create` типово приєднується до нової зустрічі та +повертає `joined: true` плюс сесію приєднання. Щоб лише створити URL, використовуйте `create --no-join` у CLI або передайте `"join": false` інструменту. Або скажіть агенту: "Створи Google Meet, приєднайся до нього в режимі відповіді голосом агента @@ -196,54 +195,54 @@ openclaw googlemeet create --no-join } ``` -Для приєднання лише для спостереження/керування браузером установіть `"mode": "transcribe"`. Це не -запускає дуплексний голосовий міст реального часу, не потребує BlackHole або SoX +Для приєднання лише для спостереження/керування браузером задайте `"mode": "transcribe"`. Це +не запускає двонапрямний голосовий міст у реальному часі, не потребує BlackHole або SoX і не відповідатиме голосом у зустріч. Приєднання Chrome у цьому режимі також уникають -надання OpenClaw дозволу на мікрофон/камеру й уникають шляху Meet **Use +надання OpenClaw дозволу на мікрофон/камеру та уникають шляху Meet **Use microphone**. Якщо Meet показує проміжний екран вибору аудіо, автоматизація пробує шлях без мікрофона, а інакше повідомляє про ручну дію замість відкриття -локального мікрофона. У режимі транскрибування керовані транспорти Chrome також установлюють -best-effort спостерігач субтитрів Meet. `googlemeet status --json` і +локального мікрофона. У режимі транскрибування керовані транспорти Chrome також встановлюють +найкращий можливий спостерігач субтитрів Meet. `googlemeet status --json` і `googlemeet doctor` показують `captioning`, `captionsEnabledAttempted`, `transcriptLines`, `lastCaptionAt`, `lastCaptionSpeaker`, `lastCaptionText` -і короткий хвіст `recentTranscript`, щоб оператори могли визначити, чи браузер -приєднався до виклику і чи субтитри Meet створюють текст. +і короткий хвіст `recentTranscript`, щоб оператори могли зрозуміти, чи браузер +приєднався до дзвінка і чи субтитри Meet створюють текст. Використовуйте `openclaw googlemeet test-listen --transport chrome-node`, коли -вам потрібна перевірка так/ні: він приєднується в режимі транскрибування, чекає на свіжий рух субтитрів або -транскрипту й повертає `listenVerified`, `listenTimedOut`, поля ручної -дії та останній стан субтитрів. +потрібна перевірка так/ні: він приєднується в режимі транскрибування, чекає на нові субтитри або +рух транскрипту й повертає `listenVerified`, `listenTimedOut`, поля ручних +дій і найновіший стан субтитрів. -Під час сесій реального часу статус `google_meet` містить стан браузера й аудіомоста, +Під час сесій у реальному часі статус `google_meet` містить стан браузера й аудіомоста, зокрема `inCall`, `manualActionRequired`, `providerConnected`, -`realtimeReady`, `audioInputActive`, `audioOutputActive`, останні часові позначки -вводу/виводу, лічильники байтів і закритий стан мосту. Якщо з’являється безпечний запит сторінки Meet, -браузерна автоматизація обробляє його, коли може. Запити входу, допуску хостом і -дозволів браузера/OS повідомляються як ручна дія з причиною та -повідомленням, яке агент має передати. Керовані сесії Chrome видають вступну або -тестову фразу лише після того, як стан браузера повідомить `inCall: true`; інакше статус повідомляє +`realtimeReady`, `audioInputActive`, `audioOutputActive`, часові мітки останнього вводу/виводу, +лічильники байтів і стан закриття моста. Якщо з’являється безпечний запит сторінки Meet, +браузерна автоматизація обробляє його, коли може. Вхід, допуск хостом і +запити дозволів браузера/ОС повідомляються як ручна дія з причиною та +повідомленням, яке агент має передати. Керовані сесії Chrome надсилають вступ або +тестову фразу лише після того, як стан браузера повідомляє `inCall: true`; інакше статус повідомляє `speechReady: false`, а спроба мовлення блокується замість удавання, що -агент говорив у зустріч. +агент сказав щось у зустріч. -Локальні приєднання Chrome проходять через профіль браузера OpenClaw із виконаним входом. Режим реального часу -потребує `BlackHole 2ch` для шляху мікрофона/динаміка, який використовує OpenClaw. Для -чистого дуплексного аудіо використовуйте окремі віртуальні пристрої або граф на кшталт Loopback; одного -пристрою BlackHole достатньо для першого smoke test, але він може давати відлуння. +Локальні приєднання Chrome проходять через авторизований браузерний профіль OpenClaw. Режим реального часу +потребує `BlackHole 2ch` для шляху мікрофон/динамік, який використовує OpenClaw. Для +чистого двонапрямного аудіо використовуйте окремі віртуальні пристрої або граф у стилі Loopback; одного +пристрою BlackHole достатньо для першого smoke-тесту, але він може давати відлуння. ### Локальний Gateway + Parallels Chrome Вам **не** потрібен повний OpenClaw Gateway або ключ API моделі всередині macOS VM лише для того, щоб VM володіла Chrome. Запустіть Gateway і агента локально, а потім запустіть -вузловий хост у VM. Один раз увімкніть вбудований Plugin на VM, щоб вузол +вузловий хост у VM. Увімкніть вбудований Plugin на VM один раз, щоб вузол оголошував команду Chrome: Що де працює: -- Хост Gateway: OpenClaw Gateway, робочий простір агента, ключі моделі/API, провайдер - реального часу й конфігурація Plugin Google Meet. +- Хост Gateway: OpenClaw Gateway, робочий простір агента, ключі моделі/API, постачальник реального часу + і конфігурація Plugin Google Meet. - Parallels macOS VM: OpenClaw CLI/вузловий хост, Google Chrome, SoX, BlackHole 2ch - і профіль Chrome із виконаним входом у Google. -- Не потрібно у VM: служба Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування - провайдера моделі. + і профіль Chrome, авторизований у Google. +- Не потрібно у VM: служба Gateway, конфігурація агента, ключ OpenAI/GPT або + налаштування постачальника моделі. Установіть залежності VM: @@ -276,7 +275,7 @@ openclaw plugins enable google-meet openclaw node run --host --port 18789 --display-name parallels-macos ``` -Якщо `` — LAN IP і ви не використовуєте TLS, вузол відмовляється від +Якщо `` — LAN IP і ви не використовуєте TLS, вузол відмовиться від відкритого WebSocket, якщо ви явно не погодитеся на це для цієї довіреної приватної мережі: ```bash @@ -310,7 +309,7 @@ openclaw devices approve openclaw nodes status ``` -Спрямуйте Meet через цей вузол на хості Gateway: +Маршрутизуйте Meet через цей вузол на хості Gateway: ```json5 { @@ -340,7 +339,7 @@ openclaw nodes status } ``` -Тепер приєднайтеся звичайно з хоста Gateway: +Тепер приєднуйтеся звичайно з хоста Gateway: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij @@ -348,83 +347,83 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij або попросіть агента використати інструмент `google_meet` з `transport: "chrome-node"`. -Для однокомандного smoke test, який створює або повторно використовує сесію, вимовляє відому +Для smoke-тесту однією командою, який створює або повторно використовує сесію, промовляє відому фразу й друкує стан сесії: ```bash openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij ``` -Під час приєднання в реальному часі автоматизація браузера OpenClaw заповнює ім’я гостя, натискає -Join/Ask to join і приймає вибір першого запуску Meet "Use microphone", коли ця -підказка з’являється. Під час приєднання лише для спостереження або створення зустрічі лише в браузері вона -проходить ту саму підказку без мікрофона, коли такий вибір доступний. -Якщо профіль браузера не ввійшов в обліковий запис, Meet очікує допуску від організатора, -Chrome потребує дозволу на мікрофон/камеру для приєднання в реальному часі, або Meet застряг -на підказці, яку автоматизація не змогла вирішити, результат join/test-speech повідомляє +Під час підключення в реальному часі автоматизація браузера OpenClaw заповнює ім'я гостя, натискає +Join/Ask to join і приймає перший вибір Meet "Use microphone", коли з'являється +цей запит. Під час підключення лише для спостереження або створення зустрічі лише через браузер вона +проходить повз той самий запит без мікрофона, коли такий вибір доступний. +Якщо профіль браузера не має входу в обліковий запис, Meet очікує допуску від організатора, +Chrome потребує дозволу на мікрофон/камеру для підключення в реальному часі або Meet застряг +на запиті, який автоматизація не змогла розв'язати, результат join/test-speech повідомляє `manualActionRequired: true` з `manualActionReason` і -`manualActionMessage`. Агенти мають припинити повторні спроби приєднання, повідомити саме це -повідомлення плюс поточні `browserUrl`/`browserTitle` і повторювати спробу лише після завершення -ручної дії в браузері. +`manualActionMessage`. Агенти мають припинити повторні спроби підключення, повідомити саме це +повідомлення плюс поточні `browserUrl`/`browserTitle` і повторювати спробу лише після +завершення ручної дії в браузері. Якщо `chromeNode.node` пропущено, OpenClaw автоматично вибирає лише тоді, коли рівно один підключений вузол оголошує і `googlemeet.chrome`, і керування браузером. Якщо підключено кілька придатних вузлів, задайте `chromeNode.node` як ідентифікатор вузла, -відображуване ім’я або віддалену IP-адресу. +відображуване ім'я або віддалену IP-адресу. -Поширені перевірки збоїв: +Типові перевірки збоїв: - `Configured Google Meet node ... is not usable: offline`: закріплений вузол - відомий Gateway, але недоступний. Агенти мають розглядати цей вузол як - діагностичний стан, а не як придатний Chrome-хост, і повідомляти про блокер налаштування - замість переходу на інший транспорт, якщо користувач не попросив про це. + відомий Gateway, але недоступний. Агенти мають трактувати цей вузол як + діагностичний стан, а не як придатний хост Chrome, і повідомляти про блокер + налаштування замість резервного переходу на інший транспорт, якщо користувач цього не просив. - `No connected Google Meet-capable node`: запустіть `openclaw node run` у VM, - схваліть pairing і переконайтеся, що `openclaw plugins enable google-meet` і + схваліть сполучення й переконайтеся, що `openclaw plugins enable google-meet` і `openclaw plugins enable browser` були виконані у VM. Також підтвердьте, що хост Gateway дозволяє обидві команди вузла через `gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`. -- `BlackHole 2ch audio device not found`: встановіть `blackhole-2ch` на хості, - який перевіряється, і перезавантажте його перед використанням локального аудіо Chrome. -- `BlackHole 2ch audio device not found on the node`: встановіть `blackhole-2ch` +- `BlackHole 2ch audio device not found`: установіть `blackhole-2ch` на хості, + який перевіряється, і перезавантажтеся перед використанням локального аудіо Chrome. +- `BlackHole 2ch audio device not found on the node`: установіть `blackhole-2ch` у VM і перезавантажте VM. - Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM або - залиште `chrome.guestName` заданим для гостьового приєднання. Гостьове автоприєднання використовує + залиште `chrome.guestName` заданим для гостьового підключення. Автоматичне підключення гостя використовує автоматизацію браузера OpenClaw через браузерний проксі вузла; переконайтеся, що конфігурація браузера вузла вказує на потрібний профіль, наприклад - `browser.defaultProfile: "user"` або іменований профіль існуючого сеансу. + `browser.defaultProfile: "user"` або іменований профіль наявного сеансу. - Дублікати вкладок Meet: залиште `chrome.reuseExistingTab: true` увімкненим. OpenClaw - активує наявну вкладку для того самого URL Meet перед відкриттям нової, а - створення зустрічі в браузері повторно використовує поточну вкладку `https://meet.google.com/new` - або вкладку підказки облікового запису Google перед відкриттям ще однієї. -- Немає аудіо: у Meet спрямуйте аудіо мікрофона/динаміка через шлях віртуального аудіопристрою, - який використовує OpenClaw; використовуйте окремі віртуальні пристрої або маршрутизацію на кшталт Loopback + активує наявну вкладку для тієї самої URL-адреси Meet перед відкриттям нової, а + створення зустрічі в браузері повторно використовує вкладку `https://meet.google.com/new` + у процесі або вкладку запиту облікового запису Google перед відкриттям іншої. +- Немає аудіо: у Meet спрямуйте мікрофон/динамік через шлях віртуального аудіопристрою, + який використовує OpenClaw; використовуйте окремі віртуальні пристрої або маршрутизацію у стилі Loopback для чистого двостороннього аудіо. ## Нотатки щодо встановлення -Типове зворотне мовлення Chrome використовує два зовнішні інструменти: +Стандартне налаштування зворотного відтворення Chrome використовує два зовнішні інструменти: -- `sox`: утиліта аудіо командного рядка. Плагін використовує явні команди пристрою CoreAudio - для типового аудіомоста 24 kHz PCM16. +- `sox`: утиліта командного рядка для аудіо. Plugin використовує явні команди пристроїв CoreAudio + для стандартного 24 кГц PCM16 аудіомоста. - `blackhole-2ch`: віртуальний аудіодрайвер macOS. Він створює аудіопристрій `BlackHole 2ch`, через який Chrome/Meet можуть маршрутизувати аудіо. -OpenClaw не комплектує і не розповсюджує жоден із цих пакетів. Документація просить користувачів +OpenClaw не пакує й не розповсюджує жоден із цих пакетів. Документація просить користувачів установити їх як залежності хоста через Homebrew. SoX ліцензовано як `LGPL-2.0-only AND GPL-2.0-only`; BlackHole має ліцензію GPL-3.0. Якщо ви створюєте -інсталятор або appliance, який комплектує BlackHole з OpenClaw, перегляньте умови -ліцензування upstream BlackHole або отримайте окрему ліцензію від Existential Audio. +інсталятор або appliance, який пакує BlackHole разом з OpenClaw, перегляньте умови +ліцензування BlackHole upstream або отримайте окрему ліцензію від Existential Audio. ## Транспорти ### Chrome -Транспорт Chrome відкриває URL Meet через керування браузером OpenClaw і приєднується -як профіль браузера OpenClaw, що ввійшов в обліковий запис. На macOS плагін перевіряє наявність -`BlackHole 2ch` перед запуском. Якщо налаштовано, він також запускає команду перевірки стану -аудіомоста і команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли +Транспорт Chrome відкриває URL-адресу Meet через керування браузером OpenClaw і приєднується +як профіль браузера OpenClaw із виконаним входом. На macOS Plugin перевіряє наявність +`BlackHole 2ch` перед запуском. Якщо налаштовано, він також виконує команду +перевірки стану аудіомоста й команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо працюють -на спареному вузлі, наприклад Parallels macOS VM. Для локального Chrome виберіть +на сполученому вузлі, наприклад Parallels macOS VM. Для локального Chrome виберіть профіль через `browser.defaultProfile`; `chrome.browserProfile` передається хостам `chrome-node`. @@ -434,24 +433,24 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome ``` Спрямуйте аудіо мікрофона й динаміка Chrome через локальний аудіоміст OpenClaw. -Якщо `BlackHole 2ch` не встановлено, приєднання завершується помилкою налаштування +Якщо `BlackHole 2ch` не встановлено, підключення завершується помилкою налаштування замість тихого приєднання без аудіошляху. ### Twilio -Транспорт Twilio — це строгий план набору, делегований плагіну Voice Call. Він +Транспорт Twilio — це строгий план набору, делегований Voice Call plugin. Він не аналізує сторінки Meet для пошуку телефонних номерів. Використовуйте це, коли участь через Chrome недоступна або потрібен резервний варіант -телефонного дозвону. Google Meet має надати телефонний номер дозвону й PIN для +телефонного набору. Google Meet має надавати телефонний номер для набору й PIN для зустрічі; OpenClaw не виявляє їх зі сторінки Meet. -Увімкніть плагін Voice Call на хості Gateway, а не на вузлі Chrome: +Увімкніть Voice Call plugin на хості Gateway, а не на вузлі Chrome: ```json5 { plugins: { - allow: ["google-meet", "voice-call"], + allow: ["google-meet", "voice-call", "google"], entries: { "google-meet": { enabled: true, @@ -464,8 +463,24 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome enabled: true, config: { provider: "twilio", + inboundPolicy: "allowlist", + realtime: { + enabled: true, + provider: "google", + instructions: "Join this Google Meet as an OpenClaw agent. Be brief.", + toolPolicy: "safe-read-only", + providers: { + google: { + silenceDurationMs: 500, + startSensitivity: "high", + }, + }, + }, }, }, + google: { + enabled: true, + }, }, }, } @@ -478,10 +493,14 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome export TWILIO_ACCOUNT_SID=AC... export TWILIO_AUTH_TOKEN=... export TWILIO_FROM_NUMBER=+15550001234 +export GEMINI_API_KEY=... ``` -Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації плагіна -не з’являються в уже запущеному процесі Gateway, доки він не перезавантажиться. +Натомість використовуйте `realtime.provider: "openai"` з OpenAI provider plugin і +`OPENAI_API_KEY`, якщо це ваш провайдер голосу в реальному часі. + +Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації plugin +не з'являються у вже запущеному процесі Gateway, доки він не перезавантажиться. Потім перевірте: @@ -491,8 +510,8 @@ openclaw plugins list | grep -E 'google-meet|voice-call' openclaw googlemeet setup ``` -Коли делегування Twilio підключено, `googlemeet setup` містить успішні перевірки -`twilio-voice-call-plugin`, `twilio-voice-call-credentials` і +Коли делегування Twilio під'єднано, `googlemeet setup` містить успішні +перевірки `twilio-voice-call-plugin`, `twilio-voice-call-credentials` і `twilio-voice-call-webhook`. ```bash @@ -511,22 +530,22 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --dtmf-sequence ww123456# ``` -## OAuth і preflight +## OAuth і попередня перевірка -OAuth необов’язковий для створення посилання Meet, тому що `googlemeet create` може -відкотитися до автоматизації браузера. Налаштуйте OAuth, коли потрібне створення через офіційний API, -розв’язання space або preflight-перевірки Meet Media API. +OAuth необов'язковий для створення посилання Meet, тому що `googlemeet create` може +використати резервну автоматизацію браузера. Налаштовуйте OAuth, коли потрібне офіційне створення через API, +розв'язання простору або попередні перевірки Meet Media API. Доступ до Google Meet API використовує користувацький OAuth: створіть OAuth-клієнт Google Cloud, -запросіть потрібні scopes, авторизуйте обліковий запис Google, а потім збережіть -отриманий refresh token у конфігурації плагіна Google Meet або надайте змінні середовища -`OPENCLAW_GOOGLE_MEET_*`. +запросіть потрібні області доступу, авторизуйте обліковий запис Google, а потім збережіть +отриманий refresh token у конфігурації Google Meet plugin або надайте +змінні середовища `OPENCLAW_GOOGLE_MEET_*`. -OAuth не замінює шлях приєднання Chrome. Транспорти Chrome і Chrome-node -і далі приєднуються через профіль Chrome, що ввійшов в обліковий запис, BlackHole/SoX і підключений -вузол, коли ви використовуєте участь через браузер. OAuth призначений лише для офіційного -шляху Google Meet API: створення meeting spaces, розв’язання spaces і запуску preflight-перевірок -Meet Media API. +OAuth не замінює шлях підключення через Chrome. Транспорти Chrome і Chrome-node +далі приєднуються через профіль Chrome із виконаним входом, BlackHole/SoX і підключений +вузол, коли ви використовуєте участь через браузер. OAuth призначений лише для офіційного шляху +Google Meet API: створення просторів зустрічей, розв'язання просторів і виконання попередніх +перевірок Meet Media API. ### Створення облікових даних Google @@ -535,10 +554,10 @@ Meet Media API. 1. Створіть або виберіть проєкт Google Cloud. 2. Увімкніть **Google Meet REST API** для цього проєкту. 3. Налаштуйте екран згоди OAuth. - - **Internal** — найпростіше для організації Google Workspace. - - **External** працює для персональних/тестових налаштувань; поки застосунок у Testing, + - **Internal** найпростіший для організації Google Workspace. + - **External** працює для особистих/тестових налаштувань; доки застосунок перебуває в Testing, додайте кожен обліковий запис Google, який авторизуватиме застосунок, як тестового користувача. -4. Додайте scopes, які запитує OpenClaw: +4. Додайте області доступу, які запитує OpenClaw: - `https://www.googleapis.com/auth/meetings.space.created` - `https://www.googleapis.com/auth/meetings.space.readonly` - `https://www.googleapis.com/auth/meetings.space.settings` @@ -554,24 +573,24 @@ Meet Media API. 6. Скопіюйте client ID і client secret. `meetings.space.created` потрібен Google Meet `spaces.create`. -`meetings.space.readonly` дає OpenClaw змогу розв’язувати URL/коди Meet у spaces. -`meetings.space.settings` дає OpenClaw змогу передавати налаштування `SpaceConfig`, наприклад +`meetings.space.readonly` дає OpenClaw змогу розв'язувати URL-адреси/коди Meet у простори. +`meetings.space.settings` дає OpenClaw змогу передавати налаштування `SpaceConfig`, як-от `accessType`, під час створення кімнати через API. -`meetings.conference.media.readonly` призначений для preflight Meet Media API і роботи з медіа; -Google може вимагати участі в Developer Preview для фактичного використання Media API. -Якщо вам потрібні лише приєднання Chrome на основі браузера, повністю пропустіть OAuth. +`meetings.conference.media.readonly` призначено для попередньої перевірки Meet Media API і роботи з медіа; +Google може вимагати реєстрацію в Developer Preview для фактичного використання Media API. +Якщо вам потрібні лише підключення Chrome на основі браузера, повністю пропустіть OAuth. -### Створення refresh token +### Випуск refresh token -Налаштуйте `oauth.clientId` і необов’язково `oauth.clientSecret` або передайте їх як -змінні середовища, а потім запустіть: +Налаштуйте `oauth.clientId` і, за потреби, `oauth.clientSecret`, або передайте їх як +змінні середовища, а потім виконайте: ```bash openclaw googlemeet auth login --json ``` -Команда друкує блок конфігурації `oauth` з refresh token. Вона використовує PKCE, -localhost callback на `http://localhost:8085/oauth2callback` і ручний +Команда друкує конфігураційний блок `oauth` із refresh token. Вона використовує PKCE, +локальний callback на `http://localhost:8085/oauth2callback` і ручний потік копіювання/вставлення з `--manual`. Приклади: @@ -590,7 +609,7 @@ OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \ openclaw googlemeet auth login --json --manual ``` -JSON-вивід містить: +Вивід JSON містить: ```json { @@ -605,7 +624,7 @@ JSON-вивід містить: } ``` -Збережіть об’єкт `oauth` у конфігурації плагіна Google Meet: +Збережіть об'єкт `oauth` у конфігурації Google Meet plugin: ```json5 { @@ -626,14 +645,14 @@ JSON-вивід містить: } ``` -Віддавайте перевагу змінним середовища, коли не хочете зберігати refresh token у конфігурації. -Якщо наявні і значення конфігурації, і значення середовища, плагін спершу бере конфігурацію, -а потім fallback із середовища. +Надавайте перевагу змінним середовища, коли не хочете мати refresh token у конфігурації. +Якщо присутні і значення конфігурації, і значення середовища, Plugin спершу використовує конфігурацію, +а потім резервно звертається до середовища. -Згода OAuth включає створення Meet space, доступ на читання Meet space і доступ на читання -медіа конференції Meet. Якщо ви автентифікувалися до появи підтримки створення зустрічей, -повторно запустіть `openclaw googlemeet auth login --json`, щоб refresh token мав scope -`meetings.space.created`. +Згода OAuth включає створення простору Meet, доступ до читання простору Meet і доступ +до читання медіа конференції Meet. Якщо ви автентифікувалися до появи підтримки +створення зустрічей, повторно виконайте `openclaw googlemeet auth login --json`, щоб refresh +token мав область доступу `meetings.space.created`. ### Перевірка OAuth через doctor @@ -644,21 +663,21 @@ openclaw googlemeet doctor --oauth --json ``` Це не завантажує runtime Chrome і не потребує підключеного вузла Chrome. Воно -перевіряє, що конфігурація OAuth існує і що refresh token може створити access -token. JSON-звіт містить лише поля статусу, такі як `ok`, `configured`, -`tokenSource`, `expiresAt` і повідомлення перевірок; він не друкує access +перевіряє, що конфігурація OAuth існує і що refresh token може випустити access +token. Звіт JSON містить лише поля стану, як-от `ok`, `configured`, +`tokenSource`, `expiresAt`, і повідомлення перевірок; він не друкує access token, refresh token або client secret. -Поширені результати: +Типові результати: | Перевірка | Значення | | -------------------- | --------------------------------------------------------------------------------------- | -| `oauth-config` | Наявний `oauth.clientId` плюс `oauth.refreshToken` або кешований access token. | -| `oauth-token` | Кешований access token і досі дійсний або refresh token створив новий access token. | -| `meet-spaces-get` | Необов’язкова перевірка `--meeting` розв’язала наявний Meet space. | -| `meet-spaces-create` | Необов’язкова перевірка `--create-space` створила новий Meet space. | +| `oauth-config` | Наявні `oauth.clientId` плюс `oauth.refreshToken` або кешований токен доступу. | +| `oauth-token` | Кешований токен доступу досі чинний, або токен оновлення створив новий токен доступу. | +| `meet-spaces-get` | Необов’язкова перевірка `--meeting` знайшла наявний простір Meet. | +| `meet-spaces-create` | Необов’язкова перевірка `--create-space` створила новий простір Meet. | -Щоб також довести ввімкнення Google Meet API і scope `spaces.create`, запустіть +Щоб також підтвердити ввімкнення Google Meet API і scope `spaces.create`, виконайте перевірку створення з побічним ефектом: ```bash @@ -666,7 +685,7 @@ openclaw googlemeet doctor --oauth --create-space --json openclaw googlemeet create --no-join --json ``` -`--create-space` створює тимчасовий URL Meet. Використовуйте його, коли потрібно підтвердити, +`--create-space` створює одноразову URL-адресу Meet. Використовуйте це, коли потрібно підтвердити, що в проєкті Google Cloud увімкнено Meet API і що авторизований обліковий запис має scope `meetings.space.created`. @@ -678,17 +697,17 @@ openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij ``` `doctor --oauth --meeting` і `resolve-space` підтверджують доступ на читання до наявного -простору, до якого має доступ авторизований обліковий запис Google. `403` від цих перевірок -зазвичай означає, що REST API Google Meet вимкнено, погодженому refresh token -бракує потрібного scope або обліковий запис Google не має доступу до цього простору -Meet. Помилка refresh-token означає, що потрібно повторно виконати `openclaw googlemeet auth login +простору, до якого авторизований обліковий запис Google має доступ. `403` від цих перевірок +зазвичай означає, що Google Meet REST API вимкнено, погодженому токену оновлення +бракує потрібного scope або обліковий запис Google не має доступу до цього простору Meet. +Помилка токена оновлення означає, що потрібно повторно виконати `openclaw googlemeet auth login --json` і зберегти новий блок `oauth`. -Для резервного браузерного режиму облікові дані OAuth не потрібні. У цьому режимі автентифікація Google -надходить із профілю Chrome, у який виконано вхід на вибраному вузлі, а не з +Для резервного режиму браузера облікові дані OAuth не потрібні. У цьому режимі автентифікація Google +береться з профілю Chrome з виконаним входом на вибраному Node, а не з конфігурації OpenClaw. -Ці змінні середовища приймаються як резервні: +Ці змінні середовища приймаються як резервні значення: - `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` - `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` або `GOOGLE_MEET_CLIENT_SECRET` @@ -699,19 +718,19 @@ Meet. Помилка refresh-token означає, що потрібно пов - `OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING` або `GOOGLE_MEET_DEFAULT_MEETING` - `OPENCLAW_GOOGLE_MEET_PREVIEW_ACK` або `GOOGLE_MEET_PREVIEW_ACK` -Розв’яжіть URL Meet, код або `spaces/{id}` через `spaces.get`: +Розв’яжіть URL-адресу Meet, код або `spaces/{id}` через `spaces.get`: ```bash openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij ``` -Запустіть попередню перевірку перед роботою з медіа: +Виконайте попередню перевірку перед роботою з медіа: ```bash openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij ``` -Виведіть артефакти зустрічі та відвідуваність після того, як Meet створить записи конференції: +Перелічіть артефакти зустрічі та відвідуваність після того, як Meet створить записи конференції: ```bash openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hij @@ -720,10 +739,10 @@ openclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --outp ``` З `--meeting`, `artifacts` і `attendance` за замовчуванням використовують найновіший запис конференції. -Передайте `--all-conference-records`, коли потрібні всі збережені записи +Передайте `--all-conference-records`, якщо потрібні всі збережені записи для цієї зустрічі. -Пошук у календарі може визначити URL зустрічі з Google Calendar перед читанням +Пошук у календарі може знайти URL-адресу зустрічі з Google Calendar перед читанням артефактів Meet: ```bash @@ -733,14 +752,14 @@ openclaw googlemeet artifacts --event "Weekly sync" openclaw googlemeet attendance --today --format csv --output attendance.csv ``` -`--today` шукає в сьогоднішньому календарі `primary` подію Calendar із посиланням -Google Meet. Використовуйте `--event `, щоб шукати відповідний текст події, і +`--today` шукає в сьогоднішньому календарі `primary` подію Calendar з +посиланням Google Meet. Використовуйте `--event ` для пошуку відповідного тексту події та `--calendar ` для неосновного календаря. Пошук у календарі потребує нового -входу OAuth, який включає readonly scope для подій Calendar. +входу OAuth, який включає scope лише для читання подій Calendar. `calendar-events` попередньо показує відповідні події Meet і позначає подію, яку -виберуть `latest`, `artifacts`, `attendance` або `export`. +вибере `latest`, `artifacts`, `attendance` або `export`. -Якщо ви вже знаєте id запису конференції, зверніться до нього напряму: +Якщо ви вже знаєте ідентифікатор запису конференції, зверніться до нього напряму: ```bash openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hij @@ -757,9 +776,9 @@ openclaw googlemeet end-active-conference https://meet.google.com/abc-defg-hij Це викликає Google Meet `spaces.endActiveConference` і потребує OAuth зі scope `meetings.space.created` для простору, яким авторизований обліковий запис може керувати. -OpenClaw приймає URL Meet, код зустрічі або вхідні дані `spaces/{id}` і розв’язує їх -до ресурсу простору API перед завершенням активної конференції. -Це окремо від `googlemeet leave`: `leave` зупиняє локальну/сесійну +OpenClaw приймає URL-адресу Meet, код зустрічі або вхідні дані `spaces/{id}` і перетворює їх +на ресурс простору API перед завершенням активної конференції. +Це окремо від `googlemeet leave`: `leave` зупиняє локальну/сеансову участь OpenClaw, тоді як `end-active-conference` просить Google Meet завершити активну конференцію для простору. @@ -778,34 +797,34 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --dry-run ``` -`artifacts` повертає метадані запису конференції плюс метадані ресурсів учасників, записів, +`artifacts` повертає метадані запису конференції, а також метадані ресурсів учасників, записів, транскриптів, структурованих записів транскрипту та розумних нотаток, коли Google надає їх для зустрічі. Використовуйте `--no-transcript-entries`, щоб пропустити пошук записів для великих зустрічей. `attendance` розгортає учасників у -рядки сесій учасників із часом першої/останньої появи, загальною тривалістю сесії, -позначками запізнення/раннього виходу та дубльованими ресурсами учасників, об’єднаними за користувачем, -який увійшов у систему, або відображуваним іменем. Передайте `--no-merge-duplicates`, щоб залишити необроблені ресурси -учасників окремо, `--late-after-minutes`, щоб налаштувати виявлення запізнення, і -`--early-before-minutes`, щоб налаштувати виявлення раннього виходу. +рядки сеансів учасників із часом першої/останньої появи, загальною тривалістю сеансу, +позначками запізнення/раннього виходу та об’єднанням дубльованих ресурсів учасників за користувачем +із виконаним входом або відображуваним іменем. Передайте `--no-merge-duplicates`, щоб залишити сирі ресурси учасників +окремими, `--late-after-minutes` для налаштування виявлення запізнення та +`--early-before-minutes` для налаштування виявлення раннього виходу. `export` записує папку, що містить `summary.md`, `attendance.csv`, `transcript.md`, `artifacts.json`, `attendance.json` і `manifest.json`. -`manifest.json` фіксує вибрані вхідні дані, параметри експорту, записи конференції, -вихідні файли, лічильники, джерело токена, подію Calendar, якщо її було використано, і будь-які +`manifest.json` фіксує вибрані вхідні дані, параметри експорту, записи конференцій, +вихідні файли, кількості, джерело токена, подію Calendar, якщо вона використовувалася, і будь-які попередження про часткове отримання. Передайте `--zip`, щоб також записати переносний архів поруч -із папкою. Передайте `--include-doc-bodies`, щоб експортувати пов’язаний текст транскриптів і -розумних нотаток Google Docs через Google Drive `files.export`; для цього потрібен -новий вхід OAuth, який включає Drive Meet readonly scope. Без +із папкою. Передайте `--include-doc-bodies`, щоб експортувати пов’язаний транскрипт і +текст розумних нотаток Google Docs через Google Drive `files.export`; для цього потрібен +новий вхід OAuth, який включає scope лише для читання Drive Meet. Без `--include-doc-bodies` експорт містить лише метадані Meet і структуровані записи транскрипту. Якщо Google повертає часткову помилку артефакту, наприклад помилку списку розумних нотаток, -запису транскрипту або тіла документа Drive, зведення й +запису транскрипту або тіла документа Drive, підсумок і маніфест зберігають попередження замість того, щоб провалити весь експорт. Використовуйте `--dry-run`, щоб отримати ті самі дані артефактів/відвідуваності та надрукувати JSON маніфесту без створення папки або ZIP. Це корисно перед записом -великого експорту або коли агенту потрібні лише лічильники, вибрані записи та +великого експорту або коли агенту потрібні лише кількості, вибрані записи та попередження. -Агенти також можуть створити той самий bundle через інструмент `google_meet`: +Агенти також можуть створити такий самий пакет через інструмент `google_meet`: ```json { @@ -819,7 +838,7 @@ JSON маніфесту без створення папки або ZIP. Це к Установіть `"dryRun": true`, щоб повернути лише маніфест експорту й пропустити запис файлів. -Агенти також можуть створити кімнату на основі API з явною політикою доступу: +Агенти також можуть створити кімнату на базі API з явною політикою доступу: ```json { @@ -851,7 +870,7 @@ JSON маніфесту без створення папки або ZIP. Це к } ``` -Запустіть захищений live smoke проти реальної збереженої зустрічі: +Запустіть захищений live smoke для реальної збереженої зустрічі: ```bash OPENCLAW_LIVE_TEST=1 \ @@ -859,33 +878,32 @@ OPENCLAW_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \ pnpm test:live -- extensions/google-meet/google-meet.live.test.ts ``` -Запустіть live browser probe з пріоритетом прослуховування проти зустрічі, де хтось буде -говорити з доступними субтитрами Meet: +Запустіть live-браузерну перевірку з пріоритетом прослуховування для зустрічі, де хтось +говоритиме з доступними субтитрами Meet: ```bash openclaw googlemeet setup --transport chrome-node --mode transcribe openclaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport chrome-node --timeout-ms 30000 ``` -Live smoke environment: +Середовище live smoke: -- `OPENCLAW_LIVE_TEST=1` вмикає захищені live tests. -- `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` вказує на збережений URL Meet, код або +- `OPENCLAW_LIVE_TEST=1` вмикає захищені live-тести. +- `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` вказує на збережену URL-адресу Meet, код або `spaces/{id}`. -- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` надає OAuth - client id. +- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` надає ідентифікатор клієнта OAuth. - `OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN` або `GOOGLE_MEET_REFRESH_TOKEN` надає - refresh token. + токен оновлення. - Необов’язково: `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET`, `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN` і `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` використовують ті самі резервні назви без префікса `OPENCLAW_`. -Базовому live smoke для артефактів/відвідуваності потрібні +Базовий live smoke для артефактів/відвідуваності потребує `https://www.googleapis.com/auth/meetings.space.readonly` і -`https://www.googleapis.com/auth/meetings.conference.media.readonly`. Пошуку в Calendar -потрібен `https://www.googleapis.com/auth/calendar.events.readonly`. Експорту -тіла документа Drive потрібен +`https://www.googleapis.com/auth/meetings.conference.media.readonly`. Пошук у Calendar +потребує `https://www.googleapis.com/auth/calendar.events.readonly`. Експорт +тіла документа Drive потребує `https://www.googleapis.com/auth/drive.meet.readonly`. Створіть новий простір Meet: @@ -894,13 +912,13 @@ Live smoke environment: openclaw googlemeet create ``` -Команда друкує новий `meeting uri`, джерело та сесію приєднання. З обліковими даними OAuth +Команда друкує новий `meeting uri`, джерело та сеанс приєднання. З обліковими даними OAuth вона використовує офіційний Google Meet API. Без облікових даних OAuth вона -використовує профіль браузера Chrome закріпленого вузла, у який виконано вхід, як резервний варіант. Агенти можуть +використовує профіль браузера з виконаним входом закріпленого Chrome Node як резервний варіант. Агенти можуть використовувати інструмент `google_meet` з `action: "create"`, щоб створити й приєднатися за один -крок. Для створення лише URL передайте `"join": false`. +крок. Для створення лише URL-адреси передайте `"join": false`. -Приклад JSON-виводу з резервного браузерного режиму: +Приклад JSON-виводу з резервного режиму браузера: ```json { @@ -920,9 +938,9 @@ openclaw googlemeet create } ``` -Якщо резервний браузерний режим наштовхується на вхід Google або блокування дозволів Meet, перш ніж -зможе створити URL, метод Gateway повертає невдалу відповідь, а інструмент -`google_meet` повертає структуровані деталі замість простого рядка: +Якщо резервний режим браузера натрапляє на вхід у Google або блокування дозволу Meet до того, як +зможе створити URL-адресу, метод Gateway повертає невдалу відповідь, а +інструмент `google_meet` повертає структуровані деталі замість простого рядка: ```json { @@ -941,10 +959,10 @@ openclaw googlemeet create ``` Коли агент бачить `manualActionRequired: true`, він має повідомити -`manualActionMessage` разом із контекстом вузла/вкладки браузера й припинити відкривати нові -вкладки Meet, доки оператор не завершить браузерний крок. +`manualActionMessage` разом із контекстом Node/вкладки браузера та припинити відкривати нові +вкладки Meet, доки оператор не виконає крок у браузері. -Приклад JSON-виводу створення через API: +Приклад JSON-виводу зі створення через API: ```json { @@ -966,9 +984,9 @@ openclaw googlemeet create ``` Створення Meet за замовчуванням приєднує до зустрічі. Транспорт Chrome або Chrome-node все ще -потребує профілю Google Chrome, у який виконано вхід, щоб приєднатися через браузер. Якщо -з профілю виконано вихід, OpenClaw повідомляє `manualActionRequired: true` або -помилку резервного браузерного режиму й просить оператора завершити вхід Google перед +потребує профілю Google Chrome із виконаним входом, щоб приєднатися через браузер. Якщо +профіль вийшов із системи, OpenClaw повідомляє `manualActionRequired: true` або +помилку резервного браузерного варіанта й просить оператора завершити вхід у Google перед повторною спробою. Установлюйте `preview.enrollmentAcknowledged: true` лише після підтвердження, що ваш Cloud @@ -977,11 +995,11 @@ Workspace Developer Preview Program для Meet media APIs. ## Конфігурація -Звичайний шлях агента Chrome потребує лише увімкненого plugin, BlackHole, SoX, ключа -провайдера транскрипції в реальному часі та налаштованого провайдера TTS OpenClaw. -OpenAI є стандартним провайдером транскрипції; установіть `realtime.voiceProvider` на +Спільному шляху агента Chrome потрібні лише ввімкнений Plugin, BlackHole, SoX, ключ +провайдера транскрипції в реальному часі та налаштований провайдер TTS OpenClaw. +OpenAI є провайдером транскрипції за замовчуванням; установіть `realtime.voiceProvider` на `"google"` і `realtime.model`, щоб використовувати Google Gemini Live для режиму `bidi` -без зміни стандартного провайдера транскрипції режиму агента: +без зміни провайдера транскрипції за замовчуванням для agent-mode: ```bash brew install blackhole-2ch sox @@ -990,7 +1008,7 @@ export OPENAI_API_KEY=sk-... export GEMINI_API_KEY=... ``` -Задайте конфігурацію plugin у `plugins.entries.google-meet.config`: +Установіть конфігурацію Plugin у `plugins.entries.google-meet.config`: ```json5 { @@ -1005,65 +1023,64 @@ export GEMINI_API_KEY=... } ``` -Стандартні значення: +Значення за замовчуванням: - `defaultTransport: "chrome"` - `defaultMode: "agent"` (`"realtime"` приймається лише як застарілий - сумісний псевдонім для `"agent"`; нові виклики інструментів мають указувати `"agent"`) -- `chromeNode.node`: необов’язковий ідентифікатор/назва/IP вузла для `chrome-node` + псевдонім сумісності для `"agent"`; нові виклики інструментів мають указувати `"agent"`) +- `chromeNode.node`: необов’язковий id/name/IP Node для `chrome-node` - `chrome.audioBackend: "blackhole-2ch"` -- `chrome.guestName: "OpenClaw Agent"`: ім’я, яке використовується на гостьовому - екрані Meet без входу в обліковий запис -- `chrome.autoJoin: true`: заповнення імені гостя та натискання Join Now у режимі +- `chrome.guestName: "OpenClaw Agent"`: ім’я, що використовується на екрані гостя Meet + без виконаного входу +- `chrome.autoJoin: true`: заповнення імені гостя та натискання Join Now за принципом найкращого зусилля через браузерну автоматизацію OpenClaw на `chrome-node` - `chrome.reuseExistingTab: true`: активувати наявну вкладку Meet замість відкриття дублікатів -- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet повідомить, що - вона у виклику, перед запуском вступного голосового зворотного зв’язку +- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet повідомить, що вона в дзвінку, + перш ніж спрацює вступний talk-back - `chrome.audioFormat: "pcm16-24khz"`: аудіоформат пари команд. Використовуйте - `"g711-ulaw-8khz"` лише для застарілих/користувацьких пар команд, які все ще - видають телефонне аудіо. -- `chrome.audioBufferBytes: 4096`: буфер обробки SoX для згенерованих аудіокоманд - пари команд Chrome. Це половина стандартного буфера SoX у 8192 байти, що - зменшує стандартну затримку каналу, залишаючи можливість збільшити її на - завантажених хостах. Значення нижче мінімуму SoX обмежуються 17 байтами. + `"g711-ulaw-8khz"` лише для застарілих/кастомних пар команд, які все ще видають + телефонне аудіо. +- `chrome.audioBufferBytes: 4096`: буфер обробки SoX для згенерованих команд аудіо + пари команд Chrome. Це половина стандартного 8192-байтового буфера SoX, + що зменшує стандартну затримку каналу, залишаючи можливість збільшити його на завантажених хостах. + Значення нижче мінімуму SoX обмежуються до 17 байтів. - `chrome.audioInputCommand`: команда SoX, що читає з CoreAudio `BlackHole 2ch` і записує аудіо у `chrome.audioFormat` - `chrome.audioOutputCommand`: команда SoX, що читає аудіо у `chrome.audioFormat` і записує в CoreAudio `BlackHole 2ch` -- `chrome.bargeInInputCommand`: необов’язкова команда локального мікрофона, яка - записує знаковий 16-бітний little-endian моно PCM для виявлення людського - втручання, доки активне відтворення асистента. Наразі це застосовується до - розміщеного в Gateway моста пари команд `chrome`. -- `chrome.bargeInRmsThreshold: 650`: рівень RMS, який рахується як людське +- `chrome.bargeInInputCommand`: необов’язкова команда локального мікрофона, яка записує + підписаний 16-бітний little-endian mono PCM для виявлення втручання людини, доки + відтворення асистента активне. Наразі це застосовується до розміщеного на Gateway + мосту пари команд `chrome`. +- `chrome.bargeInRmsThreshold: 650`: рівень RMS, що рахується як людське переривання на `chrome.bargeInInputCommand` -- `chrome.bargeInPeakThreshold: 2500`: піковий рівень, який рахується як людське +- `chrome.bargeInPeakThreshold: 2500`: піковий рівень, що рахується як людське переривання на `chrome.bargeInInputCommand` - `chrome.bargeInCooldownMs: 900`: мінімальна затримка між повторними очищеннями - людських переривань -- `mode: "agent"`: стандартний режим голосового зворотного зв’язку. Мовлення - учасників транскрибується налаштованим провайдером транскрипції в реальному - часі, надсилається налаштованому агенту OpenClaw у сеансі підагента для - конкретної зустрічі та озвучується через звичайне середовище виконання TTS OpenClaw. -- `mode: "bidi"`: резервний прямий двонапрямний режим моделі реального часу. - Провайдер голосу реального часу відповідає на мовлення учасників напряму та - може викликати `openclaw_agent_consult` для глибших відповідей або відповідей - з підтримкою інструментів. -- `mode: "transcribe"`: режим лише спостереження без моста голосового зворотного зв’язку. -- `realtime.provider: "openai"`: сумісний резервний варіант, який використовується, - коли наведені нижче поля провайдера в межах області не задані. -- `realtime.transcriptionProvider: "openai"`: ідентифікатор провайдера, який режим - `agent` використовує для транскрипції в реальному часі. -- `realtime.voiceProvider`: ідентифікатор провайдера, який режим `bidi` використовує - для прямого голосу в реальному часі. Установіть його на `"google"`, щоб - використовувати Gemini Live, залишаючи транскрипцію режиму агента на OpenAI. + людського переривання +- `mode: "agent"`: стандартний режим talk-back. Мовлення учасників транскрибується + налаштованим провайдером транскрипції в реальному часі, надсилається налаштованому + агенту OpenClaw у сесії під-агента для окремої зустрічі та озвучується через + звичайне середовище виконання TTS OpenClaw. +- `mode: "bidi"`: резервний прямий двонапрямний режим моделі реального часу. Провайдер + голосу в реальному часі відповідає безпосередньо на мовлення учасників і може викликати + `openclaw_agent_consult` для глибших/підкріплених інструментами відповідей. +- `mode: "transcribe"`: режим лише спостереження без моста talk-back. +- `realtime.provider: "openai"`: резерв сумісності, який використовується, коли наведені нижче + поля провайдера з областю дії не задані. +- `realtime.transcriptionProvider: "openai"`: id провайдера, який режим `agent` використовує + для транскрипції в реальному часі. +- `realtime.voiceProvider`: id провайдера, який режим `bidi` використовує для прямого голосу + в реальному часі. Установіть це на `"google"`, щоб використовувати Gemini Live, залишаючи + транскрипцію agent-mode на OpenAI. - `realtime.toolPolicy: "safe-read-only"` -- `realtime.instructions`: короткі усні відповіді з +- `realtime.instructions`: короткі усні відповіді, з `openclaw_agent_consult` для глибших відповідей -- `realtime.introMessage`: коротка усна перевірка готовності під час підключення - моста реального часу; задайте `""`, щоб приєднуватися без звуку -- `realtime.agentId`: необов’язковий ідентифікатор агента OpenClaw для - `openclaw_agent_consult`; стандартно `main` +- `realtime.introMessage`: коротка усна перевірка готовності, коли міст реального часу + підключається; установіть її на `""`, щоб приєднуватися мовчки +- `realtime.agentId`: необов’язковий id агента OpenClaw для + `openclaw_agent_consult`; за замовчуванням `main` Необов’язкові перевизначення: @@ -1133,12 +1150,12 @@ export GEMINI_API_KEY=... } ``` -`voiceCall.enabled` стандартно дорівнює `true`; з транспортом Twilio він делегує -фактичний PSTN-виклик, DTMF і вступне привітання plugin Voice Call. Voice Call -відтворює послідовність DTMF перед відкриттям медіапотоку реального часу, а потім -використовує збережений вступний текст як початкове привітання в реальному часі. -Якщо `voice-call` не увімкнено, Google Meet усе ще може перевірити та записати -план набору, але не може здійснити виклик Twilio. +`voiceCall.enabled` за замовчуванням має значення `true`; з транспортом Twilio він делегує +фактичний PSTN-дзвінок, DTMF і вступне привітання Plugin Voice Call. Voice Call +відтворює послідовність DTMF перед відкриттям медіапотоку реального часу, а потім використовує +збережений вступний текст як початкове привітання в реальному часі. Якщо `voice-call` не +ввімкнено, Google Meet усе ще може перевіряти й записувати план набору, але не може +здійснити дзвінок Twilio. ## Інструмент @@ -1153,45 +1170,43 @@ export GEMINI_API_KEY=... } ``` -Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. -Використовуйте `transport: "chrome-node"`, коли Chrome працює на спареному вузлі, -наприклад VM Parallels. В обох випадках провайдери моделей і `openclaw_agent_consult` -працюють на хості Gateway, тож облікові дані моделей залишаються там. Зі -стандартним `mode: "agent"` провайдер транскрипції в реальному часі обробляє -прослуховування, налаштований агент OpenClaw створює відповідь, а звичайний -TTS OpenClaw озвучує її в Meet. Використовуйте `mode: "bidi"`, коли хочете, щоб -голосова модель реального часу відповідала напряму. Сирий `mode: "realtime"` -досі приймається як застарілий сумісний псевдонім для `mode: "agent"`, але -більше не рекламується у схемі інструмента агента. +Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. Використовуйте +`transport: "chrome-node"`, коли Chrome працює на спареному Node, наприклад VM Parallels. +В обох випадках провайдери моделей і `openclaw_agent_consult` виконуються на хості +Gateway, тому облікові дані моделей залишаються там. З типовим `mode: "agent"` +провайдер транскрипції в реальному часі відповідає за прослуховування, налаштований агент OpenClaw +створює відповідь, а звичайний TTS OpenClaw промовляє її в Meet. Використовуйте +`mode: "bidi"`, коли хочете, щоб голосова модель реального часу відповідала безпосередньо. +Сире `mode: "realtime"` і надалі приймається як застарілий псевдонім сумісності для +`mode: "agent"`, але більше не рекламується у схемі інструментів агента. -Використовуйте `action: "status"`, щоб перелічити активні сеанси або перевірити -ідентифікатор сеансу. Використовуйте `action: "speak"` із `sessionId` і `message`, -щоб агент реального часу негайно заговорив. Використовуйте `action: "test_speech"`, -щоб створити або повторно використати сеанс, запустити відому фразу та повернути -стан `inCall`, коли хост Chrome може його повідомити. `test_speech` завжди -примусово встановлює `mode: "agent"` і завершується помилкою, якщо його просять -працювати в `mode: "transcribe"`, оскільки сеанси лише спостереження навмисно не -можуть видавати мовлення. Його результат `speechOutputVerified` базується на -збільшенні байтів аудіовиходу в реальному часі під час цього тестового виклику, -тому повторно використаний сеанс зі старішим аудіо не рахується як свіжа успішна -перевірка мовлення. Використовуйте `action: "leave"`, щоб позначити сеанс як завершений. +Використовуйте `action: "status"`, щоб перелічити активні сесії або перевірити ID сесії. Використовуйте +`action: "speak"` з `sessionId` і `message`, щоб агент реального часу +заговорив негайно. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сесію, +запустити відому фразу й повернути стан `inCall`, коли хост Chrome може +про це повідомити. `test_speech` завжди примусово встановлює `mode: "agent"` і завершується помилкою, якщо його просять +працювати в `mode: "transcribe"`, оскільки сесії лише спостереження навмисно не можуть +видавати мовлення. Його результат `speechOutputVerified` базується на збільшенні байтів аудіовиходу +в реальному часі під час цього тестового виклику, тому повторно використана сесія зі старішим аудіо +не рахується як нова успішна перевірка мовлення. Використовуйте `action: "leave"`, щоб позначити +сесію завершеною. -`status` включає стан Chrome, коли він доступний: +`status` містить стан Chrome, коли він доступний: -- `inCall`: Chrome, схоже, перебуває у виклику Meet -- `micMuted`: стан мікрофона Meet у режимі найкращого зусилля +- `inCall`: Chrome, схоже, перебуває всередині дзвінка Meet +- `micMuted`: стан мікрофона Meet за принципом найкращого зусилля - `manualActionRequired` / `manualActionReason` / `manualActionMessage`: профілю - браузера потрібні ручний вхід, допуск хостом Meet, дозволи або виправлення - керування браузером, перш ніж мовлення зможе працювати -- `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: чи дозволене - кероване мовлення Chrome зараз. `speechReady: false` означає, що OpenClaw не + браузера потрібні ручний вхід, допуск хостом Meet, дозволи або + ремонт керування браузером, перш ніж мовлення зможе працювати +- `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: чи + кероване мовлення Chrome дозволене зараз. `speechReady: false` означає, що OpenClaw не надіслав вступну/тестову фразу в аудіоміст. - `providerConnected` / `realtimeReady`: стан голосового моста реального часу -- `lastInputAt` / `lastOutputAt`: останнє аудіо, побачене мостом або надіслане до нього -- `audioOutputRouted` / `audioOutputDeviceLabel`: чи медіавихід вкладки Meet було - активно спрямовано на пристрій BlackHole, який використовує міст -- `lastSuppressedInputAt` / `suppressedInputBytes`: вхід local loopback, - проігнорований, доки активне відтворення асистента +- `lastInputAt` / `lastOutputAt`: останнє аудіо, побачене з моста або надіслане до нього +- `audioOutputRouted` / `audioOutputDeviceLabel`: чи було медіавиведення вкладки Meet + активно скеровано на пристрій BlackHole, який використовує міст +- `lastSuppressedInputAt` / `suppressedInputBytes`: вхід local loopback, проігнорований, доки + відтворення асистента активне ```json { @@ -1203,64 +1218,58 @@ TTS OpenClaw озвучує її в Meet. Використовуйте `mode: "b ## Режими Agent і Bidi -Режим Chrome `agent` оптимізований для поведінки "мій агент перебуває на зустрічі". -Провайдер транскрипції в реальному часі чує аудіо зустрічі, фінальні транскрипти -учасників маршрутизуються через налаштованого агента OpenClaw, а відповідь -озвучується через звичайне середовище виконання TTS OpenClaw. Установіть -`mode: "bidi"`, коли хочете, щоб голосова модель реального часу відповідала напряму. -Сусідні фінальні фрагменти транскрипту об’єднуються перед консультацією, щоб один -усний хід не створював кілька застарілих часткових відповідей. Вхід реального -часу також пригнічується, доки аудіо асистента в черзі ще відтворюється, а -недавні схожі на асистента відлуння транскрипту ігноруються перед консультацією -агента, щоб local loopback BlackHole не змушував агента відповідати на власне мовлення. +Режим Chrome `agent` оптимізований для поведінки «мій агент перебуває на зустрічі». Провайдер +транскрипції в реальному часі чує аудіо зустрічі, фінальні транскрипти учасників +спрямовуються через налаштованого агента OpenClaw, а відповідь промовляється через +звичайне середовище виконання TTS OpenClaw. Установіть `mode: "bidi"`, коли хочете, +щоб голосова модель реального часу відповідала безпосередньо. +Близькі фінальні фрагменти транскрипту об’єднуються перед consult, щоб один усний +хід не створював кілька застарілих часткових відповідей. Вхід реального часу також +пригнічується, доки поставлене в чергу аудіо асистента все ще відтворюється, +а нещодавні схожі на асистента відлуння транскрипту ігноруються перед agent consult, +щоб local loopback BlackHole не змушував агента відповідати на власне мовлення. -| Режим | Хто визначає відповідь | Шлях виведення мовлення | Коли використовувати | -| ------- | ------------------------------- | --------------------------------------- | ----------------------------------------------------- | -| `agent` | Налаштований агент OpenClaw | Звичайне середовище виконання TTS OpenClaw | Ви хочете поведінку "мій агент перебуває на зустрічі" | -| `bidi` | Голосова модель реального часу | Аудіовідповідь провайдера голосу реального часу | Ви хочете голосовий цикл розмови з найнижчою затримкою | +| Режим | Хто вирішує відповідь | Шлях виведення мовлення | Коли використовувати | +| ------- | ----------------------------- | -------------------------------------- | ----------------------------------------------------- | +| `agent` | Налаштований агент OpenClaw | Звичайне середовище виконання TTS OpenClaw | Потрібна поведінка «мій агент перебуває на зустрічі» | +| `bidi` | Голосова модель реального часу | Аудіовідповідь провайдера голосу реального часу | Потрібен розмовний голосовий цикл із найменшою затримкою | -У режимі `bidi`, коли моделі реального часу потрібні глибше міркування, актуальна -інформація або звичайні інструменти OpenClaw, вона може викликати -`openclaw_agent_consult`. +У режимі `bidi`, коли моделі реального часу потрібні глибше міркування, поточна +інформація або звичайні інструменти OpenClaw, вона може викликати `openclaw_agent_consult`. -Інструмент консультації запускає звичайного агента OpenClaw за лаштунками з -контекстом останніх транскриптів зустрічі та повертає стислу усну відповідь. У -режимі `agent` OpenClaw надсилає цю відповідь напряму в середовище виконання TTS; -у режимі `bidi` голосова модель реального часу може озвучити результат -консультації назад у зустріч. Він використовує той самий спільний механізм -консультацій, що й Voice Call. +Інструмент consult запускає звичайного агента OpenClaw за лаштунками з контекстом +нещодавнього транскрипту зустрічі й повертає стислу усну відповідь. У режимі `agent` +OpenClaw надсилає цю відповідь безпосередньо до середовища виконання TTS; у режимі `bidi` +голосова модель реального часу може промовити результат consult назад у зустріч. Він використовує +той самий спільний механізм consult, що й Voice Call. -Стандартно консультації виконуються для агента `main`. Установіть -`realtime.agentId`, коли канал Meet має консультувати спеціальний робочий простір -агента OpenClaw, стандартні параметри моделі, політику інструментів, пам’ять та -історію сеансу. +За замовчуванням consult виконуються для агента `main`. Установіть `realtime.agentId`, коли +лінія Meet має консультуватися з окремим робочим простором агента OpenClaw, стандартними моделями, +політикою інструментів, пам’яттю та історією сесії. -Консультації режиму агента використовують ключ сеансу -`agent::subagent:google-meet:` для конкретної зустрічі, щоб додаткові -запитання зберігали контекст зустрічі, успадковуючи звичайну політику агента від -налаштованого агента. +Consult у режимі agent-mode використовують ключ сесії `agent::subagent:google-meet:` +для окремої зустрічі, щоб подальші запитання зберігали контекст зустрічі, успадковуючи звичайну +політику агента від налаштованого агента. -`realtime.toolPolicy` керує запуском консультації: +`realtime.toolPolicy` керує запуском consult: -- `safe-read-only`: показати інструмент консультації та обмежити звичайного агента - до `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і +- `safe-read-only`: відкрити інструмент consult і обмежити звичайного агента до + `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. -- `owner`: показати інструмент консультації та дозволити звичайному агенту - використовувати звичайну політику інструментів агента. -- `none`: не показувати інструмент консультації голосовій моделі реального часу. +- `owner`: відкрити інструмент consult і дозволити звичайному агенту використовувати звичайну + політику інструментів агента. +- `none`: не відкривати інструмент consult для голосової моделі реального часу. -Ключ сеансу консультації обмежений кожним сеансом Meet, тому подальші виклики -консультації можуть повторно використовувати попередній контекст консультації -під час тієї самої зустрічі. +Ключ сесії consult має область дії в межах сесії Meet, тому наступні виклики consult +можуть повторно використовувати попередній контекст consult під час тієї самої зустрічі. -Щоб примусово виконати усну перевірку готовності після того, як Chrome повністю -приєднався до виклику: +Щоб примусово виконати усну перевірку готовності після повного приєднання Chrome до дзвінка: ```bash openclaw googlemeet speak meet_... "Say exactly: I'm here and listening." ``` -Для повної димової перевірки приєднання й мовлення: +Для повної smoke-перевірки приєднання й мовлення: ```bash openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ @@ -1270,7 +1279,7 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ ## Контрольний список live-тесту -Використовуйте цю послідовність перед переданням зустрічі автономному агенту: +Використовуйте цю послідовність, перш ніж передавати зустріч автономному агенту: ```bash openclaw googlemeet setup @@ -1282,12 +1291,12 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ Очікуваний стан Chrome-node: -- `googlemeet setup` увесь зелений. +- `googlemeet setup` повністю зелений. - `googlemeet setup` містить `chrome-node-connected`, коли Chrome-node є - стандартним транспортом або node закріплено. -- `nodes status` показує, що вибраний node підключено. -- Вибраний node оголошує і `googlemeet.chrome`, і `browser.proxy`. -- Вкладка Meet приєднується до дзвінка, а `test-speech` повертає стан Chrome з + типовим транспортом або вузол закріплено. +- `nodes status` показує, що вибраний вузол підключено. +- Вибраний вузол оголошує і `googlemeet.chrome`, і `browser.proxy`. +- Вкладка Meet приєднується до виклику, а `test-speech` повертає стан Chrome з `inCall: true`. Для віддаленого хоста Chrome, наприклад Parallels macOS VM, це найкоротша @@ -1302,12 +1311,12 @@ openclaw nodes invoke \ --params '{"action":"setup"}' ``` -Це підтверджує, що Plugin Gateway завантажено, node VM підключено з поточним +Це підтверджує, що Plugin Gateway завантажено, вузол VM підключено з поточним токеном, а аудіоміст Meet доступний до того, як агент відкриє вкладку реальної зустрічі. Для smoke-перевірки Twilio використовуйте зустріч, яка надає дані телефонного -підключення: +дозвону: ```bash openclaw googlemeet setup @@ -1323,11 +1332,11 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ `twilio-voice-call-credentials` і `twilio-voice-call-webhook`. - `voicecall` доступний у CLI після перезавантаження Gateway. - Повернений сеанс має `transport: "twilio"` і `twilio.voiceCallId`. -- `openclaw logs --follow` показує, що DTMF TwiML було віддано перед realtime TwiML, а потім - realtime-міст із початковим привітанням у черзі. -- `googlemeet leave ` завершує делегований голосовий дзвінок. +- `openclaw logs --follow` показує, що DTMF TwiML віддано перед realtime TwiML, + а потім realtime-міст із поставленим у чергу початковим привітанням. +- `googlemeet leave ` завершує делегований голосовий виклик. -## Усунення неполадок +## Усунення несправностей ### Агент не бачить інструмент Google Meet @@ -1338,19 +1347,20 @@ openclaw plugins list | grep google-meet openclaw googlemeet setup ``` -Якщо ви щойно редагували `plugins.entries.google-meet`, перезапустіть або перезавантажте Gateway. -Запущений агент бачить лише інструменти Plugin, зареєстровані поточним процесом -Gateway. +Якщо ви щойно редагували `plugins.entries.google-meet`, перезапустіть або +перезавантажте Gateway. Запущений агент бачить лише інструменти Plugin, +зареєстровані поточним процесом Gateway. -На хостах Gateway не з macOS інструмент `google_meet`, видимий агенту, залишається видимим, -але локальні дії відповіді голосом Chrome блокуються до потрапляння в аудіоміст. -Локальний Chrome-аудіо talk-back наразі залежить від macOS `BlackHole 2ch`, тому -агенти Linux мають використовувати `mode: "transcribe"`, телефонне підключення Twilio або хост macOS -`chrome-node` замість стандартного локального шляху агента Chrome. +На хостах Gateway не macOS інструмент `google_meet`, видимий агенту, залишається +доступним, але локальні дії Chrome talk-back блокуються до потрапляння в +аудіоміст. Локальний звук Chrome talk-back наразі залежить від macOS +`BlackHole 2ch`, тому агенти Linux мають використовувати `mode: "transcribe"`, +дозвін Twilio або хост macOS `chrome-node` замість типового шляху локального +агента Chrome. -### Немає підключеного node із підтримкою Google Meet +### Немає підключеного вузла з підтримкою Google Meet -На хості node виконайте: +На хості вузла виконайте: ```bash openclaw plugins enable google-meet @@ -1359,7 +1369,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node run --host --port 18789 --display-name parallels-macos ``` -На хості Gateway схваліть node і перевірте команди: +На хості Gateway схваліть вузол і перевірте команди: ```bash openclaw devices list @@ -1367,8 +1377,8 @@ openclaw devices approve openclaw nodes status ``` -Node має бути підключений і перелічувати `googlemeet.chrome` разом із `browser.proxy`. -Конфігурація Gateway має дозволяти ці команди node: +Вузол має бути підключений і вказувати `googlemeet.chrome` разом із +`browser.proxy`. Конфігурація Gateway має дозволяти ці команди вузла: ```json5 { @@ -1380,9 +1390,9 @@ Node має бути підключений і перелічувати `googlem } ``` -Якщо `googlemeet setup` не проходить `chrome-node-connected` або журнал Gateway повідомляє -`gateway token mismatch`, перевстановіть або перезапустіть node з поточним токеном Gateway. -Для LAN Gateway це зазвичай означає: +Якщо `googlemeet setup` не проходить `chrome-node-connected` або журнал Gateway +повідомляє `gateway token mismatch`, перевстановіть або перезапустіть вузол із +поточним токеном Gateway. Для LAN Gateway це зазвичай означає: ```bash OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ @@ -1393,7 +1403,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ --force ``` -Потім перезавантажте службу node і повторно виконайте: +Потім перезавантажте службу вузла й повторно виконайте: ```bash openclaw googlemeet setup @@ -1402,53 +1412,58 @@ openclaw nodes status --connected ### Браузер відкривається, але агент не може приєднатися -Виконайте `googlemeet test-listen` для підключень лише для спостереження або `googlemeet test-speech` -для realtime-підключень, а потім перегляньте повернений стан Chrome. Якщо будь-яка проба -повідомляє `manualActionRequired: true`, покажіть `manualActionMessage` оператору -і припиніть повтори, доки дія в браузері не буде завершена. +Запустіть `googlemeet test-listen` для приєднань лише для спостереження або +`googlemeet test-speech` для realtime-приєднань, а потім перевірте повернений +стан Chrome. Якщо будь-яка з перевірок повідомляє `manualActionRequired: true`, +покажіть `manualActionMessage` оператору й припиніть повторні спроби, доки дію в +браузері не буде завершено. Поширені ручні дії: - Увійти в профіль Chrome. - Допустити гостя з облікового запису хоста Meet. -- Надати Chrome дозволи на мікрофон/камеру, коли з’явиться нативний запит дозволу Chrome. -- Закрити або виправити завислий діалог дозволів Meet. +- Надати Chrome дозволи на мікрофон/камеру, коли з’явиться нативний запит + дозволу Chrome. +- Закрити або відновити завислий діалог дозволів Meet. -Не повідомляйте "not signed in" лише через те, що Meet показує "Do you want people to +Не повідомляйте "not signed in" лише тому, що Meet показує "Do you want people to hear you in the meeting?" Це проміжний екран вибору аудіо Meet; OpenClaw -натискає **Use microphone** через автоматизацію браузера, коли це доступно, і продовжує -чекати реального стану зустрічі. Для browser fallback лише для створення OpenClaw -може натиснути **Continue without microphone**, бо створення URL не потребує -realtime-аудіошляху. +натискає **Use microphone** через автоматизацію браузера, коли це доступно, і +продовжує чекати на реальний стан зустрічі. Для резервного створення лише через +браузер OpenClaw може натиснути **Continue without microphone**, оскільки для +створення URL не потрібен realtime-аудіошлях. -### Створення зустрічі не вдається +### Не вдається створити зустріч -`googlemeet create` спочатку використовує endpoint Google Meet API `spaces.create`, -коли налаштовано облікові дані OAuth. Без облікових даних OAuth він переходить -до pinned Chrome node browser. Підтвердьте: +`googlemeet create` спочатку використовує endpoint Google Meet API +`spaces.create`, коли облікові дані OAuth налаштовано. Без облікових даних OAuth +він переходить до резервного браузера закріпленого вузла Chrome. Підтвердьте: - Для створення через API: `oauth.clientId` і `oauth.refreshToken` налаштовано, або присутні відповідні змінні середовища `OPENCLAW_GOOGLE_MEET_*`. -- Для створення через API: refresh token було створено після додавання підтримки створення. - У старіших токенах може бракувати scope `meetings.space.created`; повторно виконайте - `openclaw googlemeet auth login --json` і оновіть конфігурацію Plugin. -- Для browser fallback: `defaultTransport: "chrome-node"` і - `chromeNode.node` вказують на підключений node з `browser.proxy` і +- Для створення через API: refresh token було видано після додавання підтримки + створення. Старішим токенам може бракувати scope `meetings.space.created`; + повторно виконайте `openclaw googlemeet auth login --json` і оновіть + конфігурацію Plugin. +- Для резервного браузера: `defaultTransport: "chrome-node"` і + `chromeNode.node` вказують на підключений вузол із `browser.proxy` і `googlemeet.chrome`. -- Для browser fallback: профіль OpenClaw Chrome на цьому node увійшов +- Для резервного браузера: профіль Chrome OpenClaw на цьому вузлі виконано вхід у Google і може відкрити `https://meet.google.com/new`. -- Для browser fallback: повтори використовують наявну вкладку `https://meet.google.com/new` - або вкладку запиту облікового запису Google перед відкриттям нової вкладки. Якщо агент вичерпує час очікування, - повторіть виклик інструмента замість ручного відкриття іншої вкладки Meet. -- Для browser fallback: якщо інструмент повертає `manualActionRequired: true`, використовуйте - повернені `browser.nodeId`, `browser.targetId`, `browserUrl` і - `manualActionMessage`, щоб скерувати оператора. Не повторюйте в циклі, доки ця - дія не буде завершена. -- Для browser fallback: якщо Meet показує "Do you want people to hear you in the - meeting?", залиште вкладку відкритою. OpenClaw має натиснути **Use microphone** або, для - create-only fallback, **Continue without microphone** через автоматизацію браузера - і продовжити чекати згенерований URL Meet. Якщо він не може, помилка має згадувати - `meet-audio-choice-required`, а не `google-login-required`. +- Для резервного браузера: повторні спроби повторно використовують наявну + вкладку `https://meet.google.com/new` або вкладку запиту облікового запису + Google перед відкриттям нової вкладки. Якщо агенту вичерпано час очікування, + повторіть виклик інструмента замість ручного відкриття ще однієї вкладки Meet. +- Для резервного браузера: якщо інструмент повертає `manualActionRequired: true`, + використовуйте повернені `browser.nodeId`, `browser.targetId`, `browserUrl` і + `manualActionMessage`, щоб скерувати оператора. Не повторюйте спроби в циклі, + доки цю дію не буде завершено. +- Для резервного браузера: якщо Meet показує "Do you want people to hear you in the + meeting?", залиште вкладку відкритою. OpenClaw має натиснути **Use microphone** + або, для резервного створення лише через браузер, **Continue without microphone** + через автоматизацію браузера й продовжити чекати на згенерований URL Meet. + Якщо це неможливо, помилка має згадувати `meet-audio-choice-required`, а не + `google-login-required`. ### Агент приєднується, але не говорить @@ -1459,41 +1474,42 @@ openclaw googlemeet setup openclaw googlemeet doctor ``` -Використовуйте `mode: "agent"` для нормального шляху STT -> агент OpenClaw -> TTS talk-back, -або `mode: "bidi"` для прямого резервного realtime-голосу. `mode: "transcribe"` -навмисно не запускає міст talk-back. Для налагодження лише зі спостереженням -виконайте `openclaw googlemeet status --json ` після того, як учасники заговорять, -і перевірте `captioning`, `transcriptLines` і `lastCaptionText`. Якщо `inCall` дорівнює -true, але `transcriptLines` залишається `0`, субтитри Meet можуть бути вимкнені, ніхто -не говорив після встановлення спостерігача, UI Meet змінився або живі -субтитри недоступні для мови/облікового запису зустрічі. +Використовуйте `mode: "agent"` для звичайного шляху STT -> агент OpenClaw -> +TTS talk-back або `mode: "bidi"` для прямого резервного realtime-голосу. +`mode: "transcribe"` навмисно не запускає міст talk-back. Для налагодження лише +спостереження запустіть `openclaw googlemeet status --json ` після +того, як учасники говоритимуть, і перевірте `captioning`, `transcriptLines` і +`lastCaptionText`. Якщо `inCall` дорівнює true, але `transcriptLines` залишається +`0`, субтитри Meet можуть бути вимкнені, ніхто не говорив після встановлення +спостерігача, інтерфейс Meet змінився або live-субтитри недоступні для мови чи +облікового запису зустрічі. -`googlemeet test-speech` завжди перевіряє realtime-шлях і повідомляє, чи -було зафіксовано вихідні байти мосту для цього виклику. Якщо `speechOutputVerified` дорівнює false, а +`googlemeet test-speech` завжди перевіряє realtime-шлях і повідомляє, чи були +спостережені байти виходу моста для цього виклику. Якщо `speechOutputVerified` дорівнює false, а `speechOutputTimedOut` дорівнює true, realtime-провайдер міг прийняти -фразу, але OpenClaw не побачив, щоб нові вихідні байти дійшли до аудіомоста -Chrome. +висловлювання, але OpenClaw не побачив, щоб нові вихідні байти дійшли до +аудіомоста Chrome. Також перевірте: -- На хості Gateway доступний ключ realtime-провайдера, наприклад +- Ключ realtime-провайдера доступний на хості Gateway, наприклад `OPENAI_API_KEY` або `GEMINI_API_KEY`. -- `BlackHole 2ch` видно на хості Chrome. +- `BlackHole 2ch` видимий на хості Chrome. - `sox` існує на хості Chrome. -- Мікрофон і динамік Meet спрямовано через віртуальний аудіошлях, який використовує - OpenClaw. `doctor` має показати `meet output routed: yes` для локальних Chrome - realtime-підключень. +- Мікрофон і динамік Meet маршрутизовано через віртуальний аудіошлях, який + використовує OpenClaw. `doctor` має показати `meet output routed: yes` для + локальних realtime-приєднань Chrome. -`googlemeet doctor [session-id]` виводить сеанс, node, стан перебування в дзвінку, -причину ручної дії, з’єднання realtime-провайдера, `realtimeReady`, активність -аудіовходу/аудіовиходу, останні аудіо timestamps, лічильники байтів і URL браузера. -Використовуйте `googlemeet status [session-id] --json`, коли потрібен сирий JSON. Використовуйте -`googlemeet doctor --oauth`, коли потрібно перевірити refresh Google Meet OAuth -без розкриття токенів; додайте `--meeting` або `--create-space`, коли також потрібне -підтвердження Google Meet API. +`googlemeet doctor [session-id]` виводить сеанс, вузол, стан у виклику, причину +ручної дії, підключення realtime-провайдера, `realtimeReady`, активність +аудіовходу/виходу, останні аудіомітки часу, лічильники байтів і URL браузера. +Використовуйте `googlemeet status [session-id] --json`, коли потрібен сирий +JSON. Використовуйте `googlemeet doctor --oauth`, коли потрібно перевірити +оновлення Google Meet OAuth без розкриття токенів; додайте `--meeting` або +`--create-space`, коли також потрібне підтвердження Google Meet API. -Якщо час очікування агента вичерпався і ви бачите вже відкриту вкладку Meet, перегляньте цю вкладку -без відкриття ще однієї: +Якщо агенту вичерпано час очікування і ви бачите вже відкриту вкладку Meet, +перевірте цю вкладку, не відкриваючи іншу: ```bash openclaw googlemeet recover-tab @@ -1501,21 +1517,21 @@ openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij ``` Еквівалентна дія інструмента — `recover_current_tab`. Вона фокусує та перевіряє -наявну вкладку Meet для вибраного транспорту. З `chrome` вона використовує локальне -керування браузером через Gateway; з `chrome-node` вона використовує налаштований -Chrome node. Вона не відкриває нову вкладку і не створює новий сеанс; вона повідомляє -поточний блокер, наприклад стан входу, допуску, дозволів або вибору аудіо. -Команда CLI звертається до налаштованого Gateway, тому Gateway має бути запущений; -`chrome-node` також потребує підключеного Chrome node. +наявну вкладку Meet для вибраного транспорту. З `chrome` вона використовує +локальне керування браузером через Gateway; з `chrome-node` вона використовує +налаштований вузол Chrome. Вона не відкриває нову вкладку й не створює новий +сеанс; вона повідомляє поточний блокер, наприклад вхід, допуск, дозволи або стан +вибору аудіо. Команда CLI звертається до налаштованого Gateway, тому Gateway має +працювати; `chrome-node` також вимагає, щоб вузол Chrome було підключено. ### Перевірки налаштування Twilio не проходять -`twilio-voice-call-plugin` не проходить, коли `voice-call` не дозволено або не ввімкнено. -Додайте його до `plugins.allow`, увімкніть `plugins.entries.voice-call` і перезавантажте -Gateway. +`twilio-voice-call-plugin` не проходить, коли `voice-call` не дозволено або не +увімкнено. Додайте його до `plugins.allow`, увімкніть +`plugins.entries.voice-call` і перезавантажте Gateway. `twilio-voice-call-credentials` не проходить, коли бекенду Twilio бракує account -SID, auth token або caller number. Задайте їх на хості Gateway: +SID, auth token або номера абонента. Задайте їх на хості Gateway: ```bash export TWILIO_ACCOUNT_SID=AC... @@ -1523,13 +1539,14 @@ export TWILIO_AUTH_TOKEN=... export TWILIO_FROM_NUMBER=+15550001234 ``` -`twilio-voice-call-webhook` не проходить, коли `voice-call` не має публічної Webhook -експозиції або коли `publicUrl` вказує на loopback чи простір приватної мережі. -Задайте `plugins.entries.voice-call.config.publicUrl` як публічний URL провайдера або -налаштуйте тунель/Tailscale експозицію `voice-call`. +`twilio-voice-call-webhook` не проходить, коли `voice-call` не має публічної +Webhook-експозиції або коли `publicUrl` вказує на loopback чи приватний +мережевий простір. Установіть `plugins.entries.voice-call.config.publicUrl` на +публічний URL провайдера або налаштуйте тунель/експозицію Tailscale для +`voice-call`. -Loopback і приватні URL не є дійсними для callback-ів оператора. Не використовуйте -`localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`, +Loopback і приватні URL недійсні для callback-ів операторів зв’язку. Не +використовуйте `localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`, `192.168.x`, `169.254.x`, `fc00::/7` або `fd00::/8` як `publicUrl`. Для стабільного публічного URL: @@ -1551,8 +1568,8 @@ Loopback і приватні URL не є дійсними для callback-ів } ``` -Для локальної розробки використовуйте тунель або Tailscale експозицію замість URL приватного -хоста: +Для локальної розробки використовуйте тунель або експозицію Tailscale замість +приватного URL хоста: ```json5 { @@ -1578,23 +1595,24 @@ openclaw voicecall setup openclaw voicecall smoke ``` -`voicecall smoke` за замовчуванням перевіряє лише готовність. Щоб dry-run конкретний номер: +`voicecall smoke` за замовчуванням лише перевіряє готовність. Щоб виконати dry-run +для конкретного номера: ```bash openclaw voicecall smoke --to "+15555550123" ``` -Додавайте `--yes` лише тоді, коли навмисно хочете здійснити живий outbound notify -дзвінок: +Додавайте `--yes` лише тоді, коли навмисно хочете здійснити live вихідний +сповіщувальний виклик: ```bash openclaw voicecall smoke --to "+15555550123" --yes ``` -### Дзвінок Twilio починається, але ніколи не входить у зустріч +### Виклик Twilio починається, але ніколи не входить у зустріч -Підтвердьте, що подія Meet надає дані телефонного підключення. Передайте точний номер -підключення і PIN або спеціальну DTMF-послідовність: +Підтвердьте, що подія Meet надає дані телефонного дозвону. Передайте точний +номер дозвону та PIN або власну DTMF-послідовність: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij \ @@ -1604,81 +1622,80 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ ``` Використовуйте початкові `w` або коми в `--dtmf-sequence`, якщо провайдеру потрібна пауза -перед введенням PIN. +перед введенням PIN-коду. -Якщо телефонний дзвінок створено, але roster Meet ніколи не показує учасника -dial-in: +Якщо телефонний виклик створено, але в списку учасників Meet так і не зʼявляється +учасник, що приєднався через телефонний набір: -- Запустіть `openclaw googlemeet doctor `, щоб підтвердити делегований - ідентифікатор виклику Twilio, чи було DTMF поставлено в чергу та чи було - запитано вступне привітання. -- Запустіть `openclaw voicecall status --call-id ` і підтвердьте, що виклик - усе ще активний. -- Запустіть `openclaw voicecall tail` і перевірте, що Webhook-и Twilio надходять - до Gateway. +- Запустіть `openclaw googlemeet doctor `, щоб підтвердити делегований Twilio + ID виклику, чи DTMF було поставлено в чергу, і чи було запитано вступне привітання. +- Запустіть `openclaw voicecall status --call-id ` і підтвердьте, що виклик усе ще + активний. +- Запустіть `openclaw voicecall tail` і перевірте, що Webhook-и Twilio надходять до + Gateway. - Запустіть `openclaw logs --follow` і знайдіть послідовність Twilio Meet: Google - Meet делегує приєднання, Voice Call запускає телефонну гілку, Google Meet - очікує `voiceCall.dtmfDelayMs`, надсилає DTMF за допомогою `voicecall.dtmf`, - очікує `voiceCall.postDtmfSpeechDelayMs`, а потім запитує вступне мовлення за - допомогою `voicecall.speak`. -- Повторно запустіть `openclaw googlemeet setup --transport twilio`; потрібна - зелена перевірка налаштування, але вона не доводить, що послідовність PIN - зустрічі правильна. -- Підтвердьте, що номер для дозвону належить до того самого запрошення Meet і - регіону, що й PIN. -- Збільште `voiceCall.dtmfDelayMs`, якщо Meet відповідає повільно або транскрипт - виклику все ще показує підказку з проханням ввести PIN після надсилання DTMF. + Meet делегує приєднання, Voice Call запускає телефонну гілку, Google Meet очікує + `voiceCall.dtmfDelayMs`, надсилає DTMF через `voicecall.dtmf`, очікує + `voiceCall.postDtmfSpeechDelayMs`, а потім запитує вступне мовлення через + `voicecall.speak`. +- Повторно запустіть `openclaw googlemeet setup --transport twilio`; успішна перевірка + налаштування потрібна, але вона не доводить, що послідовність PIN-коду зустрічі + правильна. +- Підтвердьте, що номер для телефонного підключення належить до того самого запрошення + Meet і регіону, що й PIN-код. +- Збільште `voiceCall.dtmfDelayMs`, якщо Meet відповідає повільно або транскрипт виклику + все ще показує запит на введення PIN-коду після надсилання DTMF. - Якщо учасник приєднується, але ви не чуєте привітання, перевірте `openclaw logs --follow` на наявність post-DTMF запиту `voicecall.speak` і - або відтворення TTS через медіапотік, або резервний варіант Twilio ``. - Якщо транскрипт виклику все ще містить "enter the meeting PIN", телефонна гілка - ще не приєдналася до кімнати Meet, тож учасники зустрічі не почують мовлення. + або відтворення TTS через медіапотік, або резервний варіант Twilio ``. Якщо + транскрипт виклику все ще містить "enter the meeting PIN", телефонна гілка ще не + приєдналася до кімнати Meet, тому учасники зустрічі не почують мовлення. Якщо Webhook-и не надходять, спершу налагодьте Plugin Voice Call: провайдер має досягати `plugins.entries.voice-call.config.publicUrl` або налаштованого тунелю. -Див. [Усунення несправностей голосового виклику](/uk/plugins/voice-call#troubleshooting). +Див. [усунення проблем із голосовими викликами](/uk/plugins/voice-call#troubleshooting). ## Нотатки -Офіційний медіа-API Google Meet орієнтований на отримання, тому для мовлення у -виклик Meet все ще потрібен шлях учасника. Цей Plugin робить цю межу видимою: -Chrome обробляє участь у браузері та локальну маршрутизацію аудіо; Twilio -обробляє участь через телефонний дозвін. +Офіційний медіа-API Google Meet орієнтований на приймання, тому для мовлення в +виклику Meet усе ще потрібен шлях учасника. Цей Plugin робить цю межу видимою: +Chrome обробляє участь через браузер і маршрутизацію локального аудіо; Twilio +обробляє участь через телефонне підключення. Режими зворотного мовлення Chrome потребують `BlackHole 2ch` плюс одне з такого: - `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw володіє - мостом і передає аудіо у `chrome.audioFormat` між цими командами та вибраним - провайдером. Режим агента використовує транскрипцію в реальному часі плюс - звичайний TTS; режим bidi використовує провайдера голосу в реальному часі. - Типовий шлях Chrome — 24 кГц PCM16 з `chrome.audioBufferBytes: 4096`; 8 кГц + мостом і передає аудіо у форматі `chrome.audioFormat` між цими командами та + вибраним провайдером. Режим агента використовує транскрипцію в реальному часі + плюс звичайний TTS; режим bidi використовує голосового провайдера реального часу. + Стандартний шлях Chrome — 24 кГц PCM16 з `chrome.audioBufferBytes: 4096`; 8 кГц G.711 mu-law залишається доступним для застарілих пар команд. - `chrome.audioBridgeCommand`: зовнішня команда мосту володіє всім локальним аудіошляхом і має завершитися після запуску або перевірки свого демона. Це - дійсно лише для `bidi`, оскільки режим `agent` потребує прямого доступу до - пари команд для TTS. + чинно лише для `bidi`, оскільки режим `agent` потребує прямого доступу до пари + команд для TTS. Для чистого дуплексного аудіо маршрутизуйте вихід Meet і мікрофон Meet через -окремі віртуальні пристрої або граф віртуальних пристроїв у стилі Loopback. Один -спільний пристрій BlackHole може відлунювати інших учасників назад у виклик. +окремі віртуальні пристрої або граф віртуальних пристроїв у стилі Loopback. +Один спільний пристрій BlackHole може відлунювати інших учасників назад у виклик. -З командно-парним мостом Chrome `chrome.bargeInInputCommand` може прослуховувати +З мостом Chrome на основі пари команд `chrome.bargeInInputCommand` може слухати окремий локальний мікрофон і очищати відтворення асистента, коли людина починає -говорити. Це утримує людське мовлення попереду виводу асистента, навіть коли -спільний вхід BlackHole loopback тимчасово приглушено під час відтворення +говорити. Це зберігає мовлення людини попереду виводу асистента навіть тоді, коли +спільний вхід loopback BlackHole тимчасово приглушено під час відтворення асистента. Як і `chrome.audioInputCommand` та `chrome.audioOutputCommand`, це -налаштована оператором локальна команда. Використовуйте явний довірений шлях +налаштована оператором локальна команда. Використовуйте явний довірений шлях до команди або список аргументів і не спрямовуйте її на скрипти з недовірених розташувань. -`googlemeet speak` запускає активний аудіоміст зворотного мовлення для сесії -Chrome. `googlemeet leave` зупиняє цей міст. Для сесій Twilio, делегованих через -Plugin Voice Call, `leave` також завершує базовий голосовий виклик. Використовуйте -`googlemeet end-active-conference`, коли також потрібно закрити активну конференцію -Google Meet для простору, керованого API. +`googlemeet speak` запускає активний аудіоміст зворотного мовлення для сеансу +Chrome. `googlemeet leave` зупиняє цей міст. Для сеансів Twilio, делегованих +через Plugin Voice Call, `leave` також завершує базовий голосовий виклик. +Використовуйте `googlemeet end-active-conference`, коли також потрібно закрити +активну конференцію Google Meet для простору, керованого API. -## Пов’язане +## Повʼязане -- [Plugin голосового виклику](/uk/plugins/voice-call) +- [Plugin голосових викликів](/uk/plugins/voice-call) - [Режим розмови](/uk/nodes/talk) -- [Створення Plugins](/uk/plugins/building-plugins) +- [Створення plugins](/uk/plugins/building-plugins) diff --git a/docs/uk/plugins/voice-call.md b/docs/uk/plugins/voice-call.md index 1362f4ba3..b053b3432 100644 --- a/docs/uk/plugins/voice-call.md +++ b/docs/uk/plugins/voice-call.md @@ -1,32 +1,32 @@ --- read_when: - - Ви хочете здійснити вихідний голосовий виклик з OpenClaw - - Ви налаштовуєте або розробляєте Plugin голосових викликів - - Вам потрібен голосовий зв’язок у реальному часі або потокове транскрибування для телефонії + - Ви хочете здійснити вихідний голосовий дзвінок з OpenClaw + - Ви налаштовуєте або розробляєте Plugin для голосових викликів + - Вам потрібен голосовий зв’язок у реальному часі або потокова транскрипція для телефонії sidebarTitle: Voice call -summary: Здійснюйте вихідні та приймайте вхідні голосові дзвінки через Twilio, Telnyx або Plivo, з необов’язковою підтримкою голосового зв’язку в реальному часі та потокової транскрипції +summary: Здійснюйте вихідні та приймайте вхідні голосові дзвінки через Twilio, Telnyx або Plivo, за потреби з голосовим зв’язком у реальному часі та потоковою транскрипцією title: Plugin для голосових викликів x-i18n: - generated_at: "2026-05-02T21:59:45Z" + generated_at: "2026-05-04T04:47:20Z" model: gpt-5.5 provider: openai - source_hash: 18a9a0d7095ec92036b516cc26c69219a0a2fd9bb8e0cb2e7509123bb4f3f65a + source_hash: 8ec2c22dcc9073572963744685a432328787bcedb14025e0326c20d9d842f857 source_path: plugins/voice-call.md workflow: 16 --- -Голосові дзвінки для OpenClaw через plugin. Підтримує вихідні сповіщення, -багатоетапні розмови, повнодуплексний голос у реальному часі, потокову -транскрипцію та вхідні дзвінки з політиками списку дозволених. +Голосові виклики для OpenClaw через plugin. Підтримує вихідні сповіщення, +багатокрокові розмови, повнодуплексний голос у реальному часі, потокову +транскрипцію та вхідні виклики з політиками списку дозволених. **Поточні провайдери:** `twilio` (Programmable Voice + Media Streams), `telnyx` (Call Control v2), `plivo` (Voice API + XML transfer + GetInput speech), `mock` (розробка/без мережі). -Plugin голосових дзвінків працює **всередині процесу Gateway**. Якщо ви використовуєте +Voice Call plugin працює **всередині процесу Gateway**. Якщо ви використовуєте віддалений Gateway, установіть і налаштуйте plugin на машині, де працює -Gateway, а потім перезапустіть Gateway, щоб завантажити його. +Gateway, а потім перезапустіть Gateway, щоб його завантажити. ## Швидкий старт @@ -48,25 +48,25 @@ Gateway, а потім перезапустіть Gateway, щоб заванта - Використовуйте пакет без версії, щоб слідувати поточному офіційному тегу релізу. Закріплюйте - точну версію лише тоді, коли потрібна відтворювана інсталяція. + Використовуйте пакет без версії, щоб відстежувати поточний офіційний тег релізу. Закріплюйте + точну версію лише тоді, коли потрібне відтворюване встановлення. Після цього перезапустіть Gateway, щоб plugin завантажився. - Задайте конфігурацію в `plugins.entries.voice-call.config` (див. - [Конфігурація](#configuration) нижче для повної структури). Мінімально потрібні: + Задайте конфігурацію в `plugins.entries.voice-call.config` (повну структуру див. + у розділі [Конфігурація](#configuration) нижче). Мінімально потрібні: `provider`, облікові дані провайдера, `fromNumber` і публічно - доступна URL-адреса webhook. + доступний URL webhook. ```bash openclaw voicecall setup ``` - Типовий вивід зручно читати в журналах чату й терміналах. Він перевіряє - увімкнення plugin, облікові дані провайдера, доступність webhook і те, що + Стандартний вивід зручно читати в чат-журналах і терміналах. Він перевіряє + ввімкнення plugin, облікові дані провайдера, доступність webhook і те, що активний лише один аудіорежим (`streaming` або `realtime`). Використовуйте `--json` для скриптів. @@ -77,8 +77,8 @@ Gateway, а потім перезапустіть Gateway, щоб заванта openclaw voicecall smoke --to "+15555550123" ``` - Обидві команди за замовчуванням виконуються без реальних дій. Додайте `--yes`, щоб справді здійснити короткий - вихідний дзвінок-сповіщення: + Обидві команди за замовчуванням виконуються як dry run. Додайте `--yes`, щоб фактично здійснити короткий + вихідний виклик-сповіщення: ```bash openclaw voicecall smoke --to "+15555550123" --yes @@ -88,21 +88,21 @@ Gateway, а потім перезапустіть Gateway, щоб заванта -Для Twilio, Telnyx і Plivo налаштування має визначатися як **публічна URL-адреса webhook**. +Для Twilio, Telnyx і Plivo налаштування має визначати **публічний URL webhook**. Якщо `publicUrl`, URL тунелю, URL Tailscale або резервний варіант serve -визначається як loopback чи простір приватної мережі, налаштування завершується помилкою замість -запуску провайдера, який не зможе отримувати webhook від оператора. +визначається як loopback чи приватний мережевий простір, налаштування завершується помилкою замість +запуску провайдера, який не зможе отримувати carrier webhooks. ## Конфігурація Якщо `enabled: true`, але для вибраного провайдера бракує облікових даних, під час запуску Gateway записує попередження про неповне налаштування з відсутніми ключами та -пропускає запуск runtime. Команди, RPC-виклики та інструменти агента все одно +пропускає запуск runtime. Команди, RPC-виклики й інструменти агента все одно повертають точну відсутню конфігурацію провайдера під час використання. -Облікові дані voice-call підтримують SecretRefs. `plugins.entries.voice-call.config.twilio.authToken`, `plugins.entries.voice-call.config.realtime.providers.*.apiKey`, `plugins.entries.voice-call.config.streaming.providers.*.apiKey` і `plugins.entries.voice-call.config.tts.providers.*.apiKey` розв’язуються через стандартну поверхню SecretRef; див. [поверхню облікових даних SecretRef](/uk/reference/secretref-credential-surface). +Облікові дані Voice-call приймають SecretRefs. `plugins.entries.voice-call.config.twilio.authToken`, `plugins.entries.voice-call.config.realtime.providers.*.apiKey`, `plugins.entries.voice-call.config.streaming.providers.*.apiKey` і `plugins.entries.voice-call.config.tts.providers.*.apiKey` визначаються через стандартну поверхню SecretRef; див. [поверхню облікових даних SecretRef](/uk/reference/secretref-credential-surface). ```json5 @@ -175,28 +175,28 @@ Gateway, а потім перезапустіть Gateway, щоб заванта ``` - - - Twilio, Telnyx і Plivo всі потребують **публічно доступної** URL-адреси webhook. - - `mock` — локальний провайдер для розробки (без мережевих викликів). + + - Twilio, Telnyx і Plivo потребують **публічно доступного** URL webhook. + - `mock` — це локальний провайдер для розробки (без мережевих викликів). - Telnyx потребує `telnyx.publicKey` (або `TELNYX_PUBLIC_KEY`), якщо `skipSignatureVerification` не дорівнює true. - `skipSignatureVerification` призначено лише для локального тестування. - - На безплатному рівні ngrok задайте `publicUrl` як точну URL-адресу ngrok; перевірка підпису завжди застосовується. - - `tunnel.allowNgrokFreeTierLoopbackBypass: true` дозволяє webhook Twilio з недійсними підписами **лише** коли `tunnel.provider="ngrok"` і `serve.bind` є loopback (локальний агент ngrok). Лише для локальної розробки. - - URL-адреси безплатного рівня ngrok можуть змінюватися або додавати проміжну сторінку; якщо `publicUrl` зміщується, підписи Twilio не проходять перевірку. Для production віддавайте перевагу стабільному домену або funnel Tailscale. + - На безкоштовному тарифі ngrok задайте `publicUrl` як точний URL ngrok; перевірка підпису завжди примусова. + - `tunnel.allowNgrokFreeTierLoopbackBypass: true` дозволяє Twilio webhooks з недійсними підписами **лише** коли `tunnel.provider="ngrok"` і `serve.bind` є loopback (локальний агент ngrok). Лише для локальної розробки. + - URL безкоштовного тарифу Ngrok можуть змінюватися або додавати проміжну поведінку; якщо `publicUrl` зміщується, підписи Twilio не проходять перевірку. Для продакшну надавайте перевагу стабільному домену або Tailscale funnel. - - `streaming.preStartTimeoutMs` закриває сокети, які ніколи не надсилають дійсний кадр `start`. - - `streaming.maxPendingConnections` обмежує загальну кількість неавтентифікованих сокетів до старту. - - `streaming.maxPendingConnectionsPerIp` обмежує кількість неавтентифікованих сокетів до старту для кожної вихідної IP-адреси. - - `streaming.maxConnections` обмежує загальну кількість відкритих сокетів медіапотоку (очікувані + активні). + - `streaming.preStartTimeoutMs` закриває сокети, які так і не надсилають дійсний кадр `start`. + - `streaming.maxPendingConnections` обмежує загальну кількість неавтентифікованих pre-start сокетів. + - `streaming.maxPendingConnectionsPerIp` обмежує неавтентифіковані pre-start сокети для кожної вихідної IP-адреси. + - `streaming.maxConnections` обмежує загальну кількість відкритих сокетів media stream (pending + active). - Старіші конфігурації, що використовують `provider: "log"`, `twilio.from` або застарілі - ключі OpenAI у `streaming.*`, переписуються командою `openclaw doctor --fix`. - Резервний runtime поки що все ще приймає старі ключі voice-call, але - шлях переписування — `openclaw doctor --fix`, а shim сумісності є + Старіші конфігурації з `provider: "log"`, `twilio.from` або застарілими + ключами OpenAI `streaming.*` переписуються командою `openclaw doctor --fix`. + Runtime fallback поки що приймає старі ключі voice-call, але + шлях переписування — `openclaw doctor --fix`, а compat shim є тимчасовим. Автоматично мігровані ключі streaming: @@ -212,51 +212,54 @@ Gateway, а потім перезапустіть Gateway, щоб заванта ## Область сесії -За замовчуванням Voice Call використовує `sessionScope: "per-phone"`, щоб повторні дзвінки від -того самого абонента зберігали пам’ять розмови. Установіть `sessionScope: "per-call"`, коли -кожен дзвінок оператора має починатися зі свіжим контекстом, наприклад для рецепції, -бронювання, IVR або потоків мосту Google Meet, де той самий номер телефону може +За замовчуванням Voice Call використовує `sessionScope: "per-phone"`, тому повторні виклики від +того самого абонента зберігають пам’ять розмови. Задайте `sessionScope: "per-call"`, коли +кожен carrier call має починатися зі свіжого контексту, наприклад для рецепції, +бронювання, IVR або потоків моста Google Meet, де один і той самий номер телефону може представляти різні зустрічі. ## Голосові розмови в реальному часі -`realtime` вибирає провайдера повнодуплексного голосу в реальному часі для live-аудіо -дзвінка. Це окремо від `streaming`, який лише передає аудіо +`realtime` вибирає повнодуплексного голосового провайдера в реальному часі для живого аудіо +виклику. Це окремо від `streaming`, який лише передає аудіо провайдерам транскрипції в реальному часі. `realtime.enabled` не можна поєднувати з `streaming.enabled`. Виберіть один -аудіорежим для кожного дзвінка. +аудіорежим для кожного виклику. Поточна поведінка runtime: - `realtime.enabled` підтримується для Twilio Media Streams. -- `realtime.provider` є необов’язковим. Якщо не задано, Voice Call використовує першого зареєстрованого провайдера голосу в реальному часі. -- Вбудовані провайдери голосу в реальному часі: Google Gemini Live (`google`) і OpenAI (`openai`), зареєстровані їхніми plugin провайдерів. -- Сира конфігурація, що належить провайдеру, міститься в `realtime.providers.`. -- Voice Call за замовчуванням надає спільний інструмент `openclaw_agent_consult` у реальному часі. Модель реального часу може викликати його, коли абонент просить глибшого міркування, актуальної інформації або звичайних інструментів OpenClaw. -- `realtime.fastContext.enabled` за замовчуванням вимкнено. Коли ввімкнено, Voice Call спочатку шукає проіндексовану пам’ять/контекст сесії для consult-запитання та повертає ці фрагменти моделі реального часу в межах `realtime.fastContext.timeoutMs`, перш ніж відкотитися до повного consult-агента лише якщо `realtime.fastContext.fallbackToConsult` дорівнює true. -- Якщо `realtime.provider` вказує на незареєстрованого провайдера або жодного провайдера голосу в реальному часі не зареєстровано, Voice Call записує попередження та пропускає realtime-медіа замість збою всього plugin. -- Ключі consult-сесії повторно використовують збережену сесію дзвінка, коли вона доступна, а потім відкочуються до налаштованого `sessionScope` (`per-phone` за замовчуванням або `per-call` для ізольованих дзвінків). +- `realtime.provider` необов’язковий. Якщо не задано, Voice Call використовує першого зареєстрованого голосового провайдера в реальному часі. +- Вбудовані голосові провайдери в реальному часі: Google Gemini Live (`google`) і OpenAI (`openai`), зареєстровані їхніми provider plugins. +- Сирий конфіг, яким володіє провайдер, розміщується в `realtime.providers.`. +- Voice Call за замовчуванням відкриває спільний realtime-інструмент `openclaw_agent_consult`. Realtime-модель може викликати його, коли абонент просить глибше міркування, актуальну інформацію або звичайні інструменти OpenClaw. +- `realtime.fastContext.enabled` за замовчуванням вимкнено. Коли ввімкнено, Voice Call спочатку шукає індексовану пам’ять/контекст сесії для consult-запитання та повертає ці фрагменти realtime-моделі протягом `realtime.fastContext.timeoutMs`, перш ніж переходити до повного consult-агента, лише якщо `realtime.fastContext.fallbackToConsult` дорівнює true. +- Якщо `realtime.provider` вказує на незареєстрованого провайдера або жодного голосового провайдера в реальному часі не зареєстровано, Voice Call записує попередження та пропускає realtime media замість того, щоб зупиняти весь plugin з помилкою. +- Ключі consult-сесії повторно використовують збережену сесію виклику, коли вона доступна, а потім повертаються до налаштованого `sessionScope` (`per-phone` за замовчуванням або `per-call` для ізольованих викликів). ### Політика інструментів -`realtime.toolPolicy` керує запуском consult: +`realtime.toolPolicy` керує consult-запуском: | Політика | Поведінка | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| `safe-read-only` | Надає інструмент consult і обмежує звичайного агента до `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. | -| `owner` | Надає інструмент consult і дозволяє звичайному агенту використовувати стандартну політику інструментів агента. | -| `none` | Не надає інструмент consult. Користувацькі `realtime.tools` усе одно передаються провайдеру реального часу. | +| `safe-read-only` | Відкрити consult-інструмент і обмежити звичайного агента до `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. | +| `owner` | Відкрити consult-інструмент і дозволити звичайному агенту використовувати стандартну політику інструментів агента. | +| `none` | Не відкривати consult-інструмент. Користувацькі `realtime.tools` все одно передаються realtime-провайдеру. | -### Приклади провайдерів реального часу +### Приклади realtime-провайдерів Типові значення: API-ключ із `realtime.providers.google.apiKey`, `GEMINI_API_KEY` або `GOOGLE_GENERATIVE_AI_API_KEY`; модель `gemini-2.5-flash-native-audio-preview-12-2025`; голос `Kore`. + `sessionResumption` і `contextWindowCompression` за замовчуванням увімкнені для довших, + відновлюваних викликів. Використовуйте `silenceDurationMs`, `startSensitivity` і + `endSensitivity`, щоб налаштувати швидше передавання черги мовлення для телефонного аудіо. ```json5 { @@ -277,6 +280,8 @@ Gateway, а потім перезапустіть Gateway, щоб заванта apiKey: "${GEMINI_API_KEY}", model: "gemini-2.5-flash-native-audio-preview-12-2025", voice: "Kore", + silenceDurationMs: 500, + startSensitivity: "high", }, }, }, @@ -311,21 +316,21 @@ Gateway, а потім перезапустіть Gateway, щоб заванта -Див. [провайдера Google](/uk/providers/google) і -[провайдера OpenAI](/uk/providers/openai) для параметрів голосу в реальному часі, +Див. [провайдер Google](/uk/providers/google) та +[провайдер OpenAI](/uk/providers/openai) щодо параметрів голосу в реальному часі, специфічних для провайдера. ## Потокова транскрипція -`streaming` вибирає провайдера транскрипції в реальному часі для live-аудіо дзвінка. +`streaming` вибирає провайдера транскрипції в реальному часі для аудіо живого дзвінка. Поточна поведінка runtime: -- `streaming.provider` необов’язковий. Якщо його не задано, Voice Call використовує першого зареєстрованого провайдера транскрипції в реальному часі. -- Вбудовані провайдери транскрипції в реальному часі: Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) і xAI (`xai`), зареєстровані їхніми плагінами провайдерів. -- Сирова конфігурація, що належить провайдеру, розміщується в `streaming.providers.`. -- Після того як Twilio надсилає прийняте повідомлення потоку `start`, Voice Call негайно реєструє потік, ставить вхідні медіадані в чергу через провайдера транскрипції, поки провайдер підключається, і запускає початкове привітання лише після готовності транскрипції в реальному часі. -- Якщо `streaming.provider` вказує на незареєстрованого провайдера або жодного не зареєстровано, Voice Call записує попередження в журнал і пропускає потокове передавання медіа замість того, щоб завершити роботу всього плагіна з помилкою. +- `streaming.provider` необов’язковий. Якщо не задано, Voice Call використовує першого зареєстрованого провайдера транскрипції в реальному часі. +- Вбудовані провайдери транскрипції в реальному часі: Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) та xAI (`xai`), зареєстровані їхніми provider plugins. +- Сирий конфіг, що належить провайдеру, розміщується в `streaming.providers.`. +- Після того як Twilio надішле прийняте повідомлення `start` потоку, Voice Call негайно реєструє потік, ставить вхідні медіа в чергу через провайдера транскрипції, поки провайдер підключається, і запускає початкове привітання лише після готовності транскрипції в реальному часі. +- Якщо `streaming.provider` вказує на незареєстрованого провайдера або жодного не зареєстровано, Voice Call записує попередження в журнал і пропускає потокове передавання медіа замість того, щоб завершити весь plugin з помилкою. ### Приклади провайдерів потокового передавання @@ -364,7 +369,7 @@ Gateway, а потім перезапустіть Gateway, щоб заванта Типові значення: API-ключ `streaming.providers.xai.apiKey` або `XAI_API_KEY`; - кінцева точка `wss://api.x.ai/v1/stt`; кодування `mulaw`; частота дискретизації `8000`; + endpoint `wss://api.x.ai/v1/stt`; кодування `mulaw`; частота дискретизації `8000`; `endpointingMs: 800`; `interimResults: true`. ```json5 @@ -395,10 +400,10 @@ Gateway, а потім перезапустіть Gateway, щоб заванта -## TTS для викликів +## TTS для дзвінків Voice Call використовує основну конфігурацію `messages.tts` для потокового -мовлення під час викликів. Її можна перевизначити в конфігурації плагіна з +мовлення під час дзвінків. Її можна перевизначити в конфігу plugin з **такою самою формою** — вона глибоко об’єднується з `messages.tts`. ```json5 @@ -416,22 +421,22 @@ Voice Call використовує основну конфігурацію `mes ``` -**Microsoft speech ігнорується для голосових викликів.** Телефонне аудіо потребує PCM; -поточний транспорт Microsoft не надає телефонний PCM-вивід. +**Microsoft speech ігнорується для голосових дзвінків.** Телефонному аудіо потрібен PCM; +поточний транспорт Microsoft не надає вихід PCM для телефонії. Примітки щодо поведінки: -- Застарілі ключі `tts.` у конфігурації плагіна (`openai`, `elevenlabs`, `microsoft`, `edge`) виправляються командою `openclaw doctor --fix`; зафіксована конфігурація має використовувати `tts.providers.`. -- Core TTS використовується, коли потокове передавання медіа Twilio увімкнене; інакше виклики повертаються до власних голосів провайдера. +- Застарілі ключі `tts.` у конфігу plugin (`openai`, `elevenlabs`, `microsoft`, `edge`) виправляються командою `openclaw doctor --fix`; зафіксований конфіг має використовувати `tts.providers.`. +- Core TTS використовується, коли ввімкнено потокове передавання медіа Twilio; інакше дзвінки повертаються до нативних голосів провайдера. - Якщо медіапотік Twilio вже активний, Voice Call не повертається до TwiML ``. Якщо телефонний TTS недоступний у такому стані, запит відтворення завершується помилкою замість змішування двох шляхів відтворення. - Коли телефонний TTS повертається до вторинного провайдера, Voice Call записує попередження з ланцюжком провайдерів (`from`, `to`, `attempts`) для налагодження. -- Коли barge-in Twilio або демонтаж потоку очищає чергу TTS, відкладені запити на відтворення завершуються, а не залишають абонентів очікувати завершення відтворення. +- Коли barge-in Twilio або розбір потоку очищує чергу TTS в очікуванні, запити відтворення в черзі завершуються, а не залишають абонентів чекати завершення відтворення. ### Приклади TTS - + ```json5 { messages: { @@ -445,7 +450,7 @@ Voice Call використовує основну конфігурацію `mes } ``` - + ```json5 { plugins: { @@ -469,7 +474,7 @@ Voice Call використовує основну конфігурацію `mes } ``` - + ```json5 { plugins: { @@ -493,9 +498,9 @@ Voice Call використовує основну конфігурацію `mes -## Вхідні виклики +## Вхідні дзвінки -Вхідна політика за замовчуванням має значення `disabled`. Щоб увімкнути вхідні виклики, задайте: +Для вхідної політики типове значення — `disabled`. Щоб увімкнути вхідні дзвінки, задайте: ```json5 { @@ -506,33 +511,21 @@ Voice Call використовує основну конфігурацію `mes ``` -`inboundPolicy: "allowlist"` — це перевірка caller-ID із низьким рівнем гарантії. Плагін -нормалізує надане провайдером значення `From` і порівнює його з -`allowFrom`. Перевірка Webhook автентифікує доставку провайдером і -цілісність payload, але вона **не** доводить право власності на номер -абонента PSTN/VoIP. Сприймайте `allowFrom` як фільтрацію caller-ID, а не як надійну -ідентичність абонента. +`inboundPolicy: "allowlist"` — це перевірка caller-ID з низьким рівнем надійності. Plugin нормалізує надане провайдером значення `From` і порівнює його з `allowFrom`. Перевірка Webhook автентифікує доставку провайдером і цілісність payload, але **не** доводить право власності на номер абонента PSTN/VoIP. Розглядайте `allowFrom` як фільтрацію caller-ID, а не як надійну ідентичність абонента. -Автовідповіді використовують систему агентів. Налаштовуйте їх за допомогою `responseModel`, +Автовідповіді використовують систему agent. Налаштовуйте за допомогою `responseModel`, `responseSystemPrompt` і `responseTimeoutMs`. ### Маршрутизація за номером -Використовуйте `numbers`, коли один плагін Voice Call приймає виклики для кількох телефонних -номерів і кожен номер має поводитися як окрема лінія. Наприклад, один -номер може використовувати невимушеного персонального асистента, а інший — бізнес-персону, -іншого агента відповіді та інший голос TTS. +Використовуйте `numbers`, коли один Voice Call plugin приймає дзвінки для кількох телефонних номерів і кожен номер має поводитися як окрема лінія. Наприклад, один номер може використовувати неформального персонального асистента, а інший — бізнес-персону, іншого agent для відповіді та інший голос TTS. -Маршрути вибираються з наданого провайдером набраного номера `To`. Ключі мають бути -номерами E.164. Коли надходить виклик, Voice Call один раз визначає відповідний маршрут, -зберігає зіставлений маршрут у записі виклику та повторно використовує цю ефективну конфігурацію -для привітання, класичного шляху автовідповіді, шляху консультації в реальному часі та -відтворення TTS. Якщо жоден маршрут не збігається, використовується глобальна конфігурація Voice Call. -Вихідні виклики не використовують `numbers`; передавайте вихідну ціль, повідомлення та -сеанс явно під час ініціювання виклику. +Маршрути вибираються з наданого провайдером набраного номера `To`. Ключі мають бути номерами E.164. Коли надходить дзвінок, Voice Call один раз визначає відповідний маршрут, зберігає знайдений маршрут у записі дзвінка та повторно використовує цей ефективний конфіг для привітання, класичного шляху автовідповіді, шляху консультації в реальному часі та відтворення TTS. Якщо жоден маршрут не збігається, використовується глобальний конфіг Voice Call. +Вихідні дзвінки не використовують `numbers`; передавайте вихідну ціль, повідомлення та +сесію явно під час ініціювання дзвінка. -Перевизначення маршрутів наразі підтримують: +Перевизначення маршруту наразі підтримують: - `inboundGreeting` - `tts` @@ -541,8 +534,7 @@ Voice Call використовує основну конфігурацію `mes - `responseSystemPrompt` - `responseTimeoutMs` -Значення маршруту `tts` глибоко об’єднується поверх глобальної конфігурації Voice Call `tts`, тож -зазвичай можна перевизначити лише голос провайдера: +Значення маршруту `tts` глибоко об’єднується поверх глобального конфігу Voice Call `tts`, тож зазвичай можна перевизначити лише голос провайдера: ```json5 { @@ -568,9 +560,9 @@ Voice Call використовує основну конфігурацію `mes } ``` -### Контракт мовного виводу +### Контракт мовленнєвого виводу -Для автовідповідей Voice Call додає до системного prompt суворий контракт мовного виводу: +Для автовідповідей Voice Call додає до системного prompt суворий контракт мовленнєвого виводу: ```text {"spoken":"..."} @@ -578,42 +570,39 @@ Voice Call використовує основну конфігурацію `mes Voice Call захисно витягує текст мовлення: -- Ігнорує payloads, позначені як вміст reasoning/error. -- Розбирає прямий JSON, fenced JSON або вбудовані ключі `"spoken"`. -- Повертається до звичайного тексту й видаляє ймовірні вступні абзаци планування/метаданих. +- Ігнорує payload, позначені як вміст reasoning/error. +- Розбирає прямий JSON, JSON у fenced-блоці або inline-ключі `"spoken"`. +- Повертається до звичайного тексту та видаляє ймовірні вступні абзаци планування/метаданих. -Це зосереджує мовне відтворення на тексті для абонента й запобігає -потраплянню тексту планування в аудіо. +Це утримує мовленнєве відтворення сфокусованим на тексті для абонента й запобігає +витоку тексту планування в аудіо. ### Поведінка запуску розмови -Для вихідних викликів `conversation` обробка першого повідомлення прив’язана до поточного -стану відтворення: +Для вихідних дзвінків `conversation` обробка першого повідомлення прив’язана до стану живого відтворення: -- Очищення черги barge-in і автовідповідь пригнічуються лише тоді, коли початкове привітання активно промовляється. -- Якщо початкове відтворення завершується помилкою, виклик повертається до `listening`, а початкове повідомлення залишається в черзі для повторної спроби. +- Очищення черги barge-in та автовідповідь пригнічуються лише тоді, коли початкове привітання активно промовляється. +- Якщо початкове відтворення завершується помилкою, дзвінок повертається до `listening`, а початкове повідомлення лишається в черзі для повторної спроби. - Початкове відтворення для потокового передавання Twilio запускається під час підключення потоку без додаткової затримки. -- Barge-in перериває активне відтворення й очищає записи Twilio TTS, які вже стоять у черзі, але ще не відтворюються. Очищені записи завершуються як пропущені, тож логіка подальшої відповіді може продовжити роботу без очікування аудіо, яке ніколи не буде відтворено. -- Голосові розмови в реальному часі використовують власний початковий хід потоку в реальному часі. Voice Call **не** надсилає застаріле оновлення TwiML `` для цього початкового повідомлення, тож вихідні сеанси `` залишаються приєднаними. +- Barge-in перериває активне відтворення й очищує записи Twilio TTS, які стоять у черзі, але ще не відтворюються. Очищені записи завершуються як пропущені, тож логіка подальшої відповіді може продовжуватися без очікування аудіо, яке ніколи не відтвориться. +- Голосові розмови в реальному часі використовують власний початковий turn потоку в реальному часі. Voice Call **не** надсилає legacy-оновлення TwiML `` для цього початкового повідомлення, тому вихідні сесії `` лишаються підключеними. -### Grace-період відключення потоку Twilio +### Пільговий період відключення потоку Twilio -Коли медіапотік Twilio відключається, Voice Call чекає **2000 мс** перед -автоматичним завершенням виклику: +Коли медіапотік Twilio відключається, Voice Call чекає **2000 ms** перед +автоматичним завершенням дзвінка: -- Якщо потік повторно підключається протягом цього вікна, автоматичне завершення скасовується. -- Якщо після grace-періоду жоден потік не реєструється повторно, виклик завершується, щоб уникнути завислих активних викликів. +- Якщо потік повторно підключається протягом цього вікна, автозавершення скасовується. +- Якщо після пільгового періоду жоден потік не реєструється повторно, дзвінок завершується, щоб запобігти завислим активним дзвінкам. -## Reaper застарілих викликів +## Прибирач застарілих дзвінків -Використовуйте `staleCallReaperSeconds`, щоб завершувати виклики, які ніколи не отримують термінальний -webhook (наприклад, виклики в режимі notify, які ніколи не завершуються). Типове значення -— `0` (вимкнено). +Використовуйте `staleCallReaperSeconds`, щоб завершувати дзвінки, які ніколи не отримують термінальний webhook (наприклад, дзвінки в notify-режимі, які ніколи не завершуються). Типове значення — `0` (вимкнено). Рекомендовані діапазони: -- **Production:** `120`–`300` секунд для потоків у стилі notify. -- Тримайте це значення **вищим за `maxDurationSeconds`**, щоб звичайні виклики могли завершитися. Хороша початкова точка — `maxDurationSeconds + 30–60` секунд. +- **Production:** `120`–`300` секунд для потоків notify-типу. +- Тримайте це значення **вищим за `maxDurationSeconds`**, щоб звичайні дзвінки могли завершитися. Хороша початкова точка — `maxDurationSeconds + 30–60` секунд. ```json5 { @@ -632,28 +621,26 @@ webhook (наприклад, виклики в режимі notify, які ні ## Безпека Webhook -Коли proxy або tunnel розміщено перед Gateway, плагін -реконструює публічну URL-адресу для перевірки підпису. Ці параметри -керують тим, яким forwarded-заголовкам довіряти: +Коли proxy або tunnel розміщено перед Gateway, plugin реконструює публічний URL для перевірки підпису. Ці параметри керують тим, яким forwarded-заголовкам довіряти: - Allowlist хостів із forwarding-заголовків. + Список дозволених host з forwarding-заголовків. Довіряти forwarded-заголовкам без allowlist. - Довіряти forwarded-заголовкам лише тоді, коли віддалена IP-адреса запиту збігається зі списком. + Довіряти forwarded-заголовкам лише тоді, коли віддалений IP запиту збігається зі списком. -Додаткові захисти: +Додаткові засоби захисту: -- **Захист від replay** Webhook увімкнено для Twilio і Plivo. Повторно відтворені чинні webhook-запити підтверджуються, але пропускаються для побічних ефектів. -- Ходи розмови Twilio містять токен для кожного ходу в callback-викликах ``, тому застарілі/повторно відтворені speech callback-виклики не можуть задовольнити новіший очікуваний хід транскрипта. -- Неавтентифіковані webhook-запити відхиляються до читання тіла, якщо обов’язкові заголовки підпису провайдера відсутні. -- Webhook voice-call використовує спільний pre-auth body profile (64 КБ / 5 секунд) плюс обмеження кількості одночасних запитів для кожної IP-адреси перед перевіркою підпису. +- **Захист від повторного відтворення** Webhook увімкнено для Twilio та Plivo. Повторно відтворені дійсні webhook-запити підтверджуються, але пропускаються для побічних ефектів. +- Conversation turns Twilio містять токен для кожного turn у callbacks ``, тож застарілі/повторно відтворені мовленнєві callbacks не можуть задовольнити новіший очікуваний transcript turn. +- Неавтентифіковані webhook-запити відхиляються до читання body, якщо відсутні потрібні signature-заголовки провайдера. +- Webhook voice-call використовує спільний pre-auth body profile (64 KB / 5 seconds) плюс per-IP in-flight cap перед перевіркою підпису. -Приклад зі стабільним публічним хостом: +Приклад зі стабільним публічним host: ```json5 { @@ -687,15 +674,15 @@ openclaw voicecall latency # summarize turn latency from lo openclaw voicecall expose --mode funnel ``` -Коли Gateway уже запущено, операційні команди `voicecall` делегуються -runtime voice-call, що належить Gateway, щоб CLI не прив’язував другий -webhook-сервер. Якщо Gateway недоступний, команди повертаються до +Коли Gateway вже запущено, операційні команди `voicecall` делегують +runtime голосового виклику, яким володіє Gateway, щоб CLI не прив’язував другий +сервер webhook. Якщо жоден Gateway недоступний, команди повертаються до автономного runtime CLI. -`latency` читає `calls.jsonl` зі стандартного шляху сховища голосових викликів. +`latency` читає `calls.jsonl` зі стандартного шляху зберігання голосових викликів. Використовуйте `--file `, щоб указати інший журнал, і `--last `, щоб обмежити аналіз останніми N записами (за замовчуванням 200). Вивід містить p50/p90/p99 -для затримки ходу та часу очікування прослуховування. +для затримки ходу й часу очікування прослуховування. ## Інструмент агента @@ -710,11 +697,11 @@ webhook-сервер. Якщо Gateway недоступний, команди п | `end_call` | `callId` | | `get_status` | `callId` | -Цей репозиторій постачається з відповідним документом skill у `skills/voice-call/SKILL.md`. +Цей репозиторій постачає відповідний документ skill за адресою `skills/voice-call/SKILL.md`. -## Gateway RPC +## RPC Gateway -| Метод | Аргументи | +| Метод | Аргументи | | -------------------- | ------------------------------------------ | | `voicecall.initiate` | `to?`, `message`, `mode?`, `dtmfSequence?` | | `voicecall.continue` | `callId`, `message` | @@ -723,15 +710,15 @@ webhook-сервер. Якщо Gateway недоступний, команди п | `voicecall.end` | `callId` | | `voicecall.status` | `callId` | -`dtmfSequence` дійсний лише з `mode: "conversation"`. Виклики в режимі сповіщення +`dtmfSequence` дійсний лише з `mode: "conversation"`. Виклики в notify-mode мають використовувати `voicecall.dtmf` після створення виклику, якщо їм потрібні цифри після з’єднання. ## Усунення несправностей -### Налаштування не проходить перевірку експонування Webhook +### Налаштуванню не вдається оприлюднити Webhook -Запустіть налаштування з того самого середовища, у якому працює Gateway: +Запускайте налаштування з того самого середовища, у якому працює Gateway: ```bash openclaw voicecall setup @@ -739,18 +726,18 @@ openclaw voicecall setup --json ``` Для `twilio`, `telnyx` і `plivo` `webhook-exposure` має бути зеленим. Налаштований -`publicUrl` усе одно зазнає невдачі, якщо вказує на локальний або приватний -мережевий простір, бо оператор не може виконати зворотний виклик на ці адреси. Не використовуйте +`publicUrl` усе одно завершується помилкою, коли він указує на локальний або приватний +мережевий простір, оскільки оператор не може викликати ці адреси у зворотному напрямку. Не використовуйте `localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`, `192.168.x`, `169.254.x`, `fc00::/7` або `fd00::/8` як `publicUrl`. -Вихідні виклики Twilio в режимі сповіщення надсилають початковий `` TwiML безпосередньо в -запиті create-call, тому перше озвучене повідомлення не залежить від того, чи Twilio -отримає Webhook TwiML. Публічний Webhook усе ще потрібен для статусних зворотних викликів, -розмовних викликів, DTMF перед з’єднанням, потоків реального часу та керування викликом +Вихідні виклики Twilio у notify-mode надсилають свій початковий `` TwiML безпосередньо в +запит create-call, тому перше озвучене повідомлення не залежить від того, чи Twilio +отримає webhook TwiML. Публічний Webhook усе ще потрібен для callback-ів стану, +розмовних викликів, DTMF до з’єднання, потоків реального часу й керування викликом після з’єднання. -Використовуйте один шлях публічного експонування: +Використовуйте один шлях публічного доступу: ```json5 { @@ -770,18 +757,18 @@ openclaw voicecall setup --json } ``` -Після зміни конфігурації перезапустіть або перезавантажте Gateway, потім виконайте: +Після зміни конфігурації перезапустіть або перезавантажте Gateway, а потім виконайте: ```bash openclaw voicecall setup openclaw voicecall smoke ``` -`voicecall smoke` є пробним запуском, якщо не передати `--yes`. +`voicecall smoke` є пробним запуском, якщо ви не передасте `--yes`. -### Облікові дані провайдера не працюють +### Облікові дані провайдера не проходять перевірку -Перевірте вибраного провайдера та потрібні поля облікових даних: +Перевірте вибраного провайдера й обов’язкові поля облікових даних: - Twilio: `twilio.accountSid`, `twilio.authToken` і `fromNumber`, або `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN` і `TWILIO_FROM_NUMBER`. @@ -789,19 +776,19 @@ openclaw voicecall smoke `fromNumber`. - Plivo: `plivo.authId`, `plivo.authToken` і `fromNumber`. -Облікові дані мають існувати на хості Gateway. Редагування локального профілю оболонки -не впливає на вже запущений Gateway, доки він не перезапуститься або не перезавантажить своє -середовище. +Облікові дані мають існувати на хості Gateway. Редагування локального shell-профілю +не впливає на вже запущений Gateway, доки він не перезапуститься або не перезавантажить +своє середовище. -### Виклики запускаються, але Webhook провайдера не надходять +### Виклики починаються, але Webhook-и провайдера не надходять -Переконайтеся, що консоль провайдера вказує на точну публічну URL-адресу Webhook: +Підтвердьте, що консоль провайдера вказує на точну публічну URL-адресу Webhook: ```text https://voice.example.com/voice/webhook ``` -Потім перевірте стан виконання: +Потім перевірте стан runtime: ```bash openclaw voicecall status --call-id @@ -811,33 +798,33 @@ openclaw logs --follow Поширені причини: -- `publicUrl` вказує на інший шлях, ніж `serve.path`. +- `publicUrl` указує на інший шлях, ніж `serve.path`. - URL тунелю змінився після запуску Gateway. - Проксі пересилає запит, але видаляє або переписує заголовки host/proto. -- Брандмауер або DNS спрямовує публічне ім’я хоста кудись не на Gateway. +- Firewall або DNS спрямовує публічне ім’я хоста кудись інде, а не до Gateway. - Gateway було перезапущено без увімкненого Plugin Voice Call. -Коли перед Gateway стоїть зворотний проксі або тунель, задайте -`webhookSecurity.allowedHosts` як публічне ім’я хоста або використайте +Коли перед Gateway стоїть reverse proxy або тунель, установіть +`webhookSecurity.allowedHosts` на публічне ім’я хоста або використовуйте `webhookSecurity.trustedProxyIPs` для відомої адреси проксі. Використовуйте `webhookSecurity.trustForwardingHeaders` лише тоді, коли межа проксі перебуває під вашим контролем. -### Перевірка підпису не вдається +### Перевірка підпису не проходить -Підписи провайдера перевіряються відносно публічної URL-адреси, яку OpenClaw відтворює +Підписи провайдера перевіряються відносно публічної URL-адреси, яку OpenClaw відновлює з вхідного запиту. Якщо підписи не проходять перевірку: -- Переконайтеся, що URL Webhook провайдера точно відповідає `publicUrl`, включно зі +- Підтвердьте, що URL Webhook провайдера точно збігається з `publicUrl`, включно зі схемою, хостом і шляхом. -- Для URL безплатного рівня ngrok оновлюйте `publicUrl`, коли змінюється ім’я хоста тунелю. -- Переконайтеся, що проксі зберігає оригінальні заголовки host і proto, або налаштуйте +- Для URL безкоштовного рівня ngrok оновлюйте `publicUrl`, коли ім’я хоста тунелю змінюється. +- Переконайтеся, що проксі зберігає початкові заголовки host і proto, або налаштуйте `webhookSecurity.allowedHosts`. - Не вмикайте `skipSignatureVerification` поза локальним тестуванням. -### Приєднання Google Meet через Twilio не вдаються +### Приєднання Google Meet Twilio не вдаються -Google Meet використовує цей Plugin для приєднань через набір номера Twilio. Спершу перевірте Voice Call: +Google Meet використовує цей Plugin для приєднань Twilio через dial-in. Спочатку перевірте Voice Call: ```bash openclaw voicecall setup @@ -850,43 +837,43 @@ openclaw voicecall smoke --to "+15555550123" openclaw googlemeet setup --transport twilio ``` -Якщо Voice Call зелений, але учасник Meet так і не приєднується, перевірте номер набору -Meet, PIN і `--dtmf-sequence`. Телефонний виклик може бути справним, тоді як +Якщо Voice Call зелений, але учасник Meet так і не приєднується, перевірте номер +dial-in Meet, PIN і `--dtmf-sequence`. Телефонний виклик може бути справним, тоді як зустріч відхиляє або ігнорує неправильну послідовність DTMF. Google Meet передає послідовність DTMF Meet і вступний текст до `voicecall.start`. -Для викликів Twilio Voice Call спочатку віддає DTMF TwiML, перенаправляє назад до -Webhook, а потім відкриває медіапотік реального часу, щоб збережений вступ був згенерований +Для викликів Twilio Voice Call спершу обслуговує DTMF TwiML, перенаправляє назад до +Webhook, а потім відкриває медіапотік реального часу, щоб збережений вступ генерувався після того, як телефонний учасник приєднався до зустрічі. -Використовуйте `openclaw logs --follow` для живого трасування фази. Успішне приєднання +Використовуйте `openclaw logs --follow` для трасування живої фази. Справне приєднання Twilio Meet записує журнали в такому порядку: - Google Meet делегує приєднання Twilio до Voice Call. -- Voice Call зберігає DTMF TwiML перед з’єднанням. -- Початковий TwiML Twilio споживається та віддається перед обробкою реального часу. -- Voice Call віддає TwiML реального часу для виклику Twilio. +- Voice Call зберігає DTMF TwiML до з’єднання. +- Початковий TwiML Twilio споживається й обслуговується перед обробкою реального часу. +- Voice Call обслуговує TwiML реального часу для виклику Twilio. - Міст реального часу запускається з початковим привітанням у черзі. `openclaw voicecall tail` усе ще показує збережені записи викликів; це корисно для -стану виклику та транскриптів, але не кожен перехід Webhook/реального часу з’являється -там. +стану виклику й транскриптів, але не кожен Webhook-перехід або перехід реального часу +з’являється там. -### У виклику реального часу немає мовлення +### Виклик реального часу не має мовлення -Переконайтеся, що увімкнено лише один аудіорежим. `realtime.enabled` і -`streaming.enabled` не можуть одночасно бути true. +Підтвердьте, що ввімкнено лише один аудіорежим. `realtime.enabled` і +`streaming.enabled` не можуть одночасно бути `true`. -Для викликів Twilio реального часу також перевірте: +Для викликів Twilio у реальному часі також перевірте: -- Plugin провайдера реального часу завантажений і зареєстрований. -- `realtime.provider` не заданий або називає зареєстрованого провайдера. +- Plugin провайдера реального часу завантажено й зареєстровано. +- `realtime.provider` не встановлено або називає зареєстрованого провайдера. - API-ключ провайдера доступний процесу Gateway. -- `openclaw logs --follow` показує, що TwiML реального часу віддано, міст реального часу +- `openclaw logs --follow` показує, що TwiML реального часу обслуговано, міст реального часу запущено, а початкове привітання поставлено в чергу. ## Пов’язане - [Режим розмови](/uk/nodes/talk) -- [Перетворення тексту на мовлення](/uk/tools/tts) +- [Text-to-speech](/uk/tools/tts) - [Голосове пробудження](/uk/nodes/voicewake) diff --git a/docs/uk/providers/google.md b/docs/uk/providers/google.md index ff9f6e370..84dbd4b1c 100644 --- a/docs/uk/providers/google.md +++ b/docs/uk/providers/google.md @@ -1,38 +1,38 @@ --- read_when: - Ви хочете використовувати моделі Google Gemini з OpenClaw - - Потрібен API-ключ або потік автентифікації OAuth -summary: Налаштування Google Gemini (ключ API + OAuth, генерація зображень, розуміння медіаконтенту, TTS, вебпошук) + - Вам потрібен ключ API або потік автентифікації OAuth +summary: Налаштування Google Gemini (ключ API + OAuth, генерування зображень, розуміння медіа, TTS, вебпошук) title: Google (Gemini) x-i18n: - generated_at: "2026-05-02T04:47:18Z" + generated_at: "2026-05-04T04:47:11Z" model: gpt-5.5 provider: openai - source_hash: 14605b88f0d1d7e01796d429113a73b2b52a48fde6443565dcb3db47653be5e7 + source_hash: 3e45627f5d5cd57e858c7590a90435b7fc0e9381509f3312a16fc9e9a4cbd908 source_path: providers/google.md workflow: 16 --- -Plugin Google надає доступ до моделей Gemini через Google AI Studio, а також +The Google Plugin надає доступ до моделей Gemini через Google AI Studio, а також генерацію зображень, розуміння медіа (зображення/аудіо/відео), перетворення тексту на мовлення та вебпошук через Gemini Grounding. -- Постачальник: `google` +- Провайдер: `google` - Автентифікація: `GEMINI_API_KEY` або `GOOGLE_API_KEY` - API: Google Gemini API -- Опція середовища виконання: `agents.defaults.agentRuntime.id: "google-gemini-cli"` - повторно використовує OAuth Gemini CLI, зберігаючи посилання на моделі канонічними як `google/*`. +- Параметр середовища виконання: `agents.defaults.agentRuntime.id: "google-gemini-cli"` + повторно використовує OAuth Gemini CLI, зберігаючи канонічні посилання на моделі як `google/*`. ## Початок роботи Виберіть бажаний метод автентифікації та виконайте кроки налаштування. - + **Найкраще для:** стандартного доступу до Gemini API через Google AI Studio. - + ```bash openclaw onboard --auth-choice gemini-api-key ``` @@ -46,7 +46,7 @@ Gemini Grounding. --gemini-api-key "$GEMINI_API_KEY" ``` - + ```json5 { agents: { @@ -57,7 +57,7 @@ Gemini Grounding. } ``` - + ```bash openclaw models list --provider google ``` @@ -65,21 +65,21 @@ Gemini Grounding. - Змінні середовища `GEMINI_API_KEY` і `GOOGLE_API_KEY` підтримуються обидві. Використовуйте ту, яку вже налаштовано. + Змінні середовища `GEMINI_API_KEY` і `GOOGLE_API_KEY` обидві підтримуються. Використовуйте ту, яку вже налаштовано. - **Найкраще для:** повторного використання наявного входу Gemini CLI через PKCE OAuth замість окремого ключа API. + **Найкраще для:** повторного використання наявного входу Gemini CLI через PKCE OAuth замість окремого API-ключа. - Постачальник `google-gemini-cli` є неофіційною інтеграцією. Деякі користувачі - повідомляють про обмеження облікових записів під час використання OAuth таким способом. Використовуйте на власний ризик. + Провайдер `google-gemini-cli` є неофіційною інтеграцією. Деякі користувачі + повідомляють про обмеження облікових записів під час використання OAuth у такий спосіб. Використовуйте на власний ризик. - + Локальна команда `gemini` має бути доступною в `PATH`. ```bash @@ -90,26 +90,26 @@ Gemini Grounding. npm install -g @google/gemini-cli ``` - OpenClaw підтримує як інсталяції Homebrew, так і глобальні інсталяції npm, зокрема - поширені компонування Windows/npm. + OpenClaw підтримує як встановлення через Homebrew, так і глобальні встановлення npm, зокрема + поширені макети Windows/npm. - + ```bash openclaw models auth login --provider google-gemini-cli --set-default ``` - + ```bash openclaw models list --provider google ``` - - Модель за замовчуванням: `google/gemini-3.1-pro-preview` + - Стандартна модель: `google/gemini-3.1-pro-preview` - Середовище виконання: `google-gemini-cli` - Псевдонім: `gemini-cli` - Ідентифікатор моделі Gemini 3.1 Pro у Gemini API — `gemini-3.1-pro-preview`. OpenClaw приймає коротший `google/gemini-3.1-pro` як зручний псевдонім і нормалізує його перед викликами постачальника. + Ідентифікатор моделі Gemini API для Gemini 3.1 Pro — `gemini-3.1-pro-preview`. OpenClaw приймає коротший `google/gemini-3.1-pro` як зручний псевдонім і нормалізує його перед викликами провайдера. **Змінні середовища:** @@ -119,13 +119,13 @@ Gemini Grounding. (Або варіанти `GEMINI_CLI_*`.) - Якщо запити OAuth Gemini CLI після входу завершуються помилкою, задайте `GOOGLE_CLOUD_PROJECT` або + Якщо запити OAuth Gemini CLI не виконуються після входу, задайте `GOOGLE_CLOUD_PROJECT` або `GOOGLE_CLOUD_PROJECT_ID` на хості Gateway і повторіть спробу. Якщо вхід завершується помилкою до запуску потоку браузера, переконайтеся, що локальна команда `gemini` - установлена й доступна в `PATH`. + встановлена й доступна в `PATH`. Посилання на моделі `google-gemini-cli/*` є застарілими псевдонімами сумісності. Нові @@ -137,24 +137,24 @@ Gemini Grounding. ## Можливості -| Можливість | Підтримується | -| ---------------------- | ---------------------------- | -| Завершення чату | Так | -| Генерація зображень | Так | -| Генерація музики | Так | -| Перетворення тексту на мовлення | Так | +| Можливість | Підтримка | +| --------------------- | ----------------------------- | +| Чат-доповнення | Так | +| Генерація зображень | Так | +| Генерація музики | Так | +| Перетворення тексту на мовлення | Так | | Голос у реальному часі | Так (Google Live API) | -| Розуміння зображень | Так | -| Транскрипція аудіо | Так | -| Розуміння відео | Так | -| Вебпошук (Grounding) | Так | -| Мислення/міркування | Так (Gemini 2.5+ / Gemini 3+) | -| Моделі Gemma 4 | Так | +| Розуміння зображень | Так | +| Транскрибування аудіо | Так | +| Розуміння відео | Так | +| Вебпошук (Grounding) | Так | +| Мислення/міркування | Так (Gemini 2.5+ / Gemini 3+) | +| Моделі Gemma 4 | Так | ## Вебпошук -Вбудований постачальник вебпошуку `gemini` використовує Gemini Google Search grounding. -Налаштуйте спеціальний ключ пошуку в `plugins.entries.google.config.webSearch` +Вбудований провайдер вебпошуку `gemini` використовує grounding Google Search у Gemini. +Налаштуйте окремий ключ пошуку в `plugins.entries.google.config.webSearch` або дозвольте повторно використовувати `models.providers.google.apiKey` після `GEMINI_API_KEY`: ```json5 @@ -175,32 +175,32 @@ Gemini Grounding. } ``` -Пріоритет облікових даних такий: спеціальний `webSearch.apiKey`, потім `GEMINI_API_KEY`, -потім `models.providers.google.apiKey`. `webSearch.baseUrl` необов’язковий і +Пріоритет облікових даних: окремий `webSearch.apiKey`, потім `GEMINI_API_KEY`, +потім `models.providers.google.apiKey`. `webSearch.baseUrl` є необов’язковим і існує для операторських проксі або сумісних кінцевих точок Gemini API; якщо його пропущено, вебпошук Gemini повторно використовує `models.providers.google.baseUrl`. Див. -[пошук Gemini](/uk/tools/gemini-search), щоб дізнатися про поведінку інструмента, специфічну для постачальника. +[Пошук Gemini](/uk/tools/gemini-search) щодо поведінки інструмента, специфічної для провайдера. -Моделі Gemini 3 використовують `thinkingLevel`, а не `thinkingBudget`. OpenClaw зіставляє -керування міркуваннями для Gemini 3, Gemini 3.1 і псевдонімів `gemini-*-latest` із -`thinkingLevel`, щоб запуски за замовчуванням або з низькою затримкою не надсилали вимкнені +Моделі Gemini 3 використовують `thinkingLevel` замість `thinkingBudget`. OpenClaw зіставляє +керування міркуванням для Gemini 3, Gemini 3.1 і псевдонімів `gemini-*-latest` з +`thinkingLevel`, щоб стандартні запуски або запуски з низькою затримкою не надсилали вимкнені значення `thinkingBudget`. `/think adaptive` зберігає семантику динамічного мислення Google замість вибору -фіксованого рівня OpenClaw. Gemini 3 і Gemini 3.1 пропускають фіксований `thinkingLevel`, щоб +фіксованого рівня OpenClaw. Gemini 3 і Gemini 3.1 не задають фіксований `thinkingLevel`, щоб Google міг вибрати рівень; Gemini 2.5 надсилає динамічний sentinel Google `thinkingBudget: -1`. -Моделі Gemma 4 (наприклад `gemma-4-26b-a4b-it`) підтримують режим мислення. OpenClaw -переписує `thinkingBudget` у підтримуваний Google `thinkingLevel` для Gemma 4. -Установлення мислення в `off` зберігає вимкнене мислення замість зіставлення з +Моделі Gemma 4 (наприклад, `gemma-4-26b-a4b-it`) підтримують режим мислення. OpenClaw +переписує `thinkingBudget` на підтримуваний Google `thinkingLevel` для Gemma 4. +Якщо встановити мислення в `off`, мислення залишається вимкненим замість зіставлення з `MINIMAL`. ## Генерація зображень -Вбудований постачальник генерації зображень `google` за замовчуванням використовує +Вбудований провайдер генерації зображень `google` за замовчуванням використовує `google/gemini-3.1-flash-image-preview`. - Також підтримує `google/gemini-3-pro-image-preview` @@ -208,7 +208,7 @@ Google міг вибрати рівень; Gemini 2.5 надсилає дина - Режим редагування: увімкнено, до 5 вхідних зображень - Керування геометрією: `size`, `aspectRatio` і `resolution` -Щоб використовувати Google як постачальника зображень за замовчуванням: +Щоб використовувати Google як стандартного провайдера зображень: ```json5 { @@ -223,7 +223,7 @@ Google міг вибрати рівень; Gemini 2.5 надсилає дина ``` -Див. [Генерація зображень](/uk/tools/image-generation), щоб дізнатися про спільні параметри інструмента, вибір постачальника та поведінку failover. +Див. [Генерація зображень](/uk/tools/image-generation) щодо спільних параметрів інструмента, вибору провайдера та поведінки failover. ## Генерація відео @@ -231,12 +231,12 @@ Google міг вибрати рівень; Gemini 2.5 надсилає дина Вбудований Plugin `google` також реєструє генерацію відео через спільний інструмент `video_generate`. -- Модель відео за замовчуванням: `google/veo-3.1-fast-generate-preview` -- Режими: текст-у-відео, зображення-у-відео та потоки посилання на одне відео +- Стандартна відеомодель: `google/veo-3.1-fast-generate-preview` +- Режими: текст-у-відео, зображення-у-відео та потоки з посиланням на одне відео - Підтримує `aspectRatio`, `resolution` і `audio` - Поточне обмеження тривалості: **від 4 до 8 секунд** -Щоб використовувати Google як постачальника відео за замовчуванням: +Щоб використовувати Google як стандартного провайдера відео: ```json5 { @@ -251,7 +251,7 @@ Google міг вибрати рівень; Gemini 2.5 надсилає дина ``` -Див. [Генерація відео](/uk/tools/video-generation), щоб дізнатися про спільні параметри інструмента, вибір постачальника та поведінку failover. +Див. [Генерація відео](/uk/tools/video-generation) щодо спільних параметрів інструмента, вибору провайдера та поведінки failover. ## Генерація музики @@ -259,14 +259,14 @@ Google міг вибрати рівень; Gemini 2.5 надсилає дина Вбудований Plugin `google` також реєструє генерацію музики через спільний інструмент `music_generate`. -- Модель музики за замовчуванням: `google/lyria-3-clip-preview` +- Стандартна музична модель: `google/lyria-3-clip-preview` - Також підтримує `google/lyria-3-pro-preview` -- Керування підказкою: `lyrics` і `instrumental` -- Формат виводу: `mp3` за замовчуванням, а також `wav` у `google/lyria-3-pro-preview` +- Керування prompt: `lyrics` і `instrumental` +- Формат виводу: `mp3` за замовчуванням, а також `wav` на `google/lyria-3-pro-preview` - Вхідні посилання: до 10 зображень -- Запуски з підтримкою сеансів від’єднуються через спільний потік завдання/статусу, зокрема `action: "status"` +- Запуски на основі сесії від’єднуються через спільний потік завдань/статусу, зокрема `action: "status"` -Щоб використовувати Google як постачальника музики за замовчуванням: +Щоб використовувати Google як стандартного провайдера музики: ```json5 { @@ -281,20 +281,20 @@ Google міг вибрати рівень; Gemini 2.5 надсилає дина ``` -Див. [Генерація музики](/uk/tools/music-generation), щоб дізнатися про спільні параметри інструмента, вибір постачальника та поведінку failover. +Див. [Генерація музики](/uk/tools/music-generation) щодо спільних параметрів інструмента, вибору провайдера та поведінки failover. ## Перетворення тексту на мовлення -Вбудований постачальник мовлення `google` використовує шлях TTS Gemini API з +Вбудований мовленнєвий провайдер `google` використовує шлях TTS Gemini API з `gemini-3.1-flash-tts-preview`. -- Голос за замовчуванням: `Kore` +- Стандартний голос: `Kore` - Автентифікація: `messages.tts.providers.google.apiKey`, `models.providers.google.apiKey`, `GEMINI_API_KEY` або `GOOGLE_API_KEY` - Вивід: WAV для звичайних вкладень TTS, Opus для цілей голосових нотаток, PCM для Talk/телефонії -- Вивід голосової нотатки: Google PCM обгортається як WAV і транскодується в Opus 48 кГц за допомогою `ffmpeg` +- Вивід голосових нотаток: Google PCM обгортається як WAV і транскодується у 48 кГц Opus за допомогою `ffmpeg` -Щоб використовувати Google як постачальника TTS за замовчуванням: +Щоб використовувати Google як стандартного провайдера TTS: ```json5 { @@ -314,13 +314,13 @@ Google міг вибрати рівень; Gemini 2.5 надсилає дина } ``` -TTS Gemini API використовує підказки природною мовою для керування стилем. Установіть -`audioProfile`, щоб додати багаторазову стильову підказку перед озвучуваним текстом. Установіть -`speakerName`, коли текст підказки посилається на названого мовця. +TTS Gemini API використовує prompt природною мовою для керування стилем. Задайте +`audioProfile`, щоб додати багаторазовий prompt стилю перед озвучуваним текстом. Задайте +`speakerName`, коли текст prompt посилається на іменованого мовця. TTS Gemini API також приймає виразні аудіотеги у квадратних дужках у тексті, -наприклад `[whispers]` або `[laughs]`. Щоб теги не з’являлися у видимій відповіді чату, -але надсилалися в TTS, помістіть їх у блок `[[tts:text]]...[[/tts:text]]`: +наприклад `[whispers]` або `[laughs]`. Щоб не показувати теги у видимій відповіді чату, +але надсилати їх у TTS, помістіть їх у блок `[[tts:text]]...[[/tts:text]]`: ```text Here is the clean reply text. @@ -329,29 +329,31 @@ Here is the clean reply text. ``` -Ключ API Google Cloud Console, обмежений Gemini API, чинний для цього -постачальника. Це не окремий шлях Cloud Text-to-Speech API. +API-ключ Google Cloud Console, обмежений Gemini API, є дійсним для цього +провайдера. Це не окремий шлях Cloud Text-to-Speech API. ## Голос у реальному часі -Вбудований Plugin `google` реєструє постачальника голосу в реальному часі на основі -Gemini Live API для серверних аудіомостів, як-от Voice Call і Google Meet. +Вбудований Plugin `google` реєструє провайдера голосу в реальному часі на основі +Gemini Live API для бекендних аудіомостів, таких як Voice Call і Google Meet. -| Параметр | Шлях конфігурації | Типове значення | -| --------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| Модель | `plugins.entries.voice-call.config.realtime.providers.google.model` | `gemini-2.5-flash-native-audio-preview-12-2025` | -| Голос | `...google.voice` | `Kore` | -| Температура | `...google.temperature` | (не задано) | -| Чутливість початку VAD | `...google.startSensitivity` | (не задано) | -| Чутливість завершення VAD | `...google.endSensitivity` | (не задано) | -| Тривалість тиші | `...google.silenceDurationMs` | (не задано) | -| Обробка активності | `...google.activityHandling` | Типове значення Google, `start-of-activity-interrupts` | -| Охоплення ходу | `...google.turnCoverage` | Типове значення Google, `only-activity` | -| Вимкнути автоматичний VAD | `...google.automaticActivityDetectionDisabled` | `false` | -| Ключ API | `...google.apiKey` | Резервно використовує `models.providers.google.apiKey`, `GEMINI_API_KEY` або `GOOGLE_API_KEY` | +| Налаштування | Шлях конфігурації | За замовчуванням | +| ---------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| Модель | `plugins.entries.voice-call.config.realtime.providers.google.model` | `gemini-2.5-flash-native-audio-preview-12-2025` | +| Голос | `...google.voice` | `Kore` | +| Температура | `...google.temperature` | (не задано) | +| Чутливість початку VAD | `...google.startSensitivity` | (не задано) | +| Чутливість завершення VAD | `...google.endSensitivity` | (не задано) | +| Тривалість тиші | `...google.silenceDurationMs` | (не задано) | +| Обробка активності | `...google.activityHandling` | типове значення Google, `start-of-activity-interrupts` | +| Охоплення ходу | `...google.turnCoverage` | типове значення Google, `only-activity` | +| Вимкнути автоматичний VAD | `...google.automaticActivityDetectionDisabled` | `false` | +| Відновлення сесії | `...google.sessionResumption` | `true` | +| Стиснення контексту | `...google.contextWindowCompression` | `true` | +| Ключ API | `...google.apiKey` | Повертається до `models.providers.google.apiKey`, `GEMINI_API_KEY` або `GOOGLE_API_KEY` | -Приклад конфігурації Voice Call у реальному часі: +Приклад конфігурації Voice Call у режимі realtime: ```json5 { @@ -380,37 +382,37 @@ Gemini Live API для серверних аудіомостів, як-от Voic ``` -Google Live API використовує двонапрямний аудіопотік і виклики функцій через WebSocket. -OpenClaw адаптує аудіо мосту телефонії/Meet до потоку PCM Live API Gemini та -зберігає виклики інструментів у спільному контракті голосу в реальному часі. Залиште `temperature` -незаданим, якщо вам не потрібні зміни семплінгу; OpenClaw пропускає недодатні значення, +Google Live API використовує двонапрямне аудіо й виклики функцій через WebSocket. +OpenClaw адаптує аудіо телекомунікаційного/Meet bridge до PCM-потоку Gemini Live API і +залишає виклики інструментів у спільному контракті realtime voice. Залишайте `temperature` +незаданою, якщо вам не потрібні зміни семплінгу; OpenClaw пропускає недодатні значення, оскільки Google Live може повертати транскрипти без аудіо для `temperature: 0`. Транскрипцію Gemini API увімкнено без `languageCodes`; поточний Google SDK відхиляє підказки кодів мов на цьому шляху API. -Control UI Talk підтримує браузерні сеанси Google Live з обмеженими одноразовими -токенами. Backend-only постачальники голосу в реальному часі також можуть працювати через загальний -транспорт ретрансляції Gateway, який зберігає облікові дані постачальника на Gateway. +Control UI Talk підтримує браузерні сесії Google Live з обмеженими одноразовими +токенами. Провайдери realtime voice лише для бекенду також можуть працювати через загальний +транспорт ретрансляції Gateway, який зберігає облікові дані провайдера на Gateway. -Для live-перевірки супровідником запустіть +Для live-перевірки мейнтейнером виконайте `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts`. -Гілка Google випускає токен Live API тієї самої обмеженої форми, яку використовує Control -UI Talk, відкриває браузерну кінцеву точку WebSocket, надсилає початкове корисне навантаження налаштування -та очікує `setupComplete`. +Гілка Google створює ту саму форму обмеженого токена Live API, яку використовує Control +UI Talk, відкриває браузерний кінцевий пункт WebSocket, надсилає початкове корисне навантаження налаштування +і чекає на `setupComplete`. ## Розширена конфігурація - + Для прямих запусків Gemini API (`api: "google-generative-ai"`) OpenClaw передає налаштований дескриптор `cachedContent` до запитів Gemini. - Налаштовуйте параметри для окремої моделі або глобально за допомогою - `cachedContent` чи застарілого `cached_content` - - Якщо наявні обидва, перевагу має `cachedContent` + `cachedContent` або застарілого `cached_content` + - Якщо присутні обидва, перемагає `cachedContent` - Приклад значення: `cachedContents/prebuilt-context` - Використання cache-hit Gemini нормалізується в OpenClaw `cacheRead` з upstream `cachedContentTokenCount` @@ -433,19 +435,19 @@ UI Talk, відкриває браузерну кінцеву точку WebSock - - Під час використання OAuth-постачальника `google-gemini-cli` OpenClaw нормалізує + + Під час використання OAuth-провайдера `google-gemini-cli` OpenClaw нормалізує JSON-вивід CLI так: - Текст відповіді береться з поля CLI JSON `response`. - - Використання резервно береться зі `stats`, коли CLI залишає `usage` порожнім. + - Дані про використання повертаються до `stats`, коли CLI залишає `usage` порожнім. - `stats.cached` нормалізується в OpenClaw `cacheRead`. - - Якщо `stats.input` відсутнє, OpenClaw виводить вхідні токени з + - Якщо `stats.input` відсутній, OpenClaw виводить вхідні токени з `stats.input_tokens - stats.cached`. - + Якщо Gateway працює як демон (launchd/systemd), переконайтеся, що `GEMINI_API_KEY` доступний цьому процесу (наприклад, у `~/.openclaw/.env` або через `env.shellEnv`). @@ -455,16 +457,16 @@ UI Talk, відкриває браузерну кінцеву точку WebSock ## Пов’язане - - Вибір постачальників, посилань на моделі та поведінки відмовостійкого перемикання. + + Вибір провайдерів, посилань на моделі та поведінки failover. - - Спільні параметри інструмента зображень і вибір постачальника. + + Спільні параметри інструмента зображень і вибір провайдера. - - Спільні параметри інструмента відео та вибір постачальника. + + Спільні параметри інструмента відео і вибір провайдера. - - Спільні параметри інструмента музики та вибір постачальника. + + Спільні параметри інструмента музики і вибір провайдера.