diff --git a/docs/uk/plugins/google-meet.md b/docs/uk/plugins/google-meet.md index 053521371..8cba4f32c 100644 --- a/docs/uk/plugins/google-meet.md +++ b/docs/uk/plugins/google-meet.md @@ -1,42 +1,42 @@ --- read_when: - - Ви хочете, щоб агент OpenClaw приєднався до виклику Google Meet - - Ви хочете, щоб агент OpenClaw створив новий дзвінок Google Meet + - Ви хочете, щоб агент OpenClaw приєднався до дзвінка Google Meet + - Ви хочете, щоб агент OpenClaw створив новий дзвінок у Google Meet - Ви налаштовуєте Chrome, вузол Chrome або Twilio як транспорт Google Meet -summary: 'Plugin Google Meet: приєднання до явних URL-адрес Meet через Chrome або Twilio з типовими параметрами голосу в реальному часі' +summary: 'Google Meet Plugin: приєднання до явних URL-адрес Meet через Chrome або Twilio зі стандартними налаштуваннями голосу в реальному часі' title: Plugin Google Meet x-i18n: - generated_at: "2026-05-01T05:59:38Z" + generated_at: "2026-05-01T06:08:51Z" model: gpt-5.5 provider: openai - source_hash: 392628397ba7ae865110ee5589c0e7fc820f108f1611836d3fac8fb0ac994c46 + source_hash: 67661177ca8a72e2e9a67bfee30a90fd02089a81b2ef90ba10f964dee962552b 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-адреси. - `realtime` voice є режимом за замовчуванням. - Realtime voice може звертатися назад до повного агента OpenClaw, коли потрібні глибше - reasoning або tools. -- Агенти вибирають поведінку приєднання за допомогою `mode`: використовуйте `realtime` для live - listen/talk-back або `transcribe`, щоб приєднатися/керувати браузером без + міркування або інструменти. +- Агенти вибирають поведінку приєднання за допомогою `mode`: використовуйте `realtime` для живого + прослуховування/відповіді голосом або `transcribe`, щоб приєднатися/керувати браузером без realtime voice bridge. -- Автентифікація починається як особистий Google OAuth або вже авторизований профіль Chrome. +- Автентифікація починається як особистий Google OAuth або вже виконаний вхід у профілі Chrome. - Автоматичного оголошення згоди немає. - Стандартний аудіобекенд Chrome — `BlackHole 2ch`. -- Chrome може працювати локально або на спареному node host. -- Twilio приймає номер для набору плюс необов’язковий PIN або DTMF sequence. -- CLI-команда — `googlemeet`; `meet` зарезервовано для ширших agent - teleconference workflows. +- Chrome може працювати локально або на спареному вузловому хості. +- Twilio приймає номер для набору плюс необов'язковий PIN або послідовність DTMF. +- Команда CLI — `googlemeet`; `meet` зарезервовано для ширших агентських + телекомунікаційних робочих процесів. ## Швидкий старт -Установіть локальні аудіозалежності й налаштуйте backend realtime voice -provider. OpenAI є типовим; Google Gemini Live також працює з +Установіть локальні аудіозалежності та налаштуйте бекенд-провайдера realtime voice. +OpenAI є типовим; Google Gemini Live також працює з `realtime.provider: "google"`: ```bash @@ -46,7 +46,7 @@ export OPENAI_API_KEY=sk-... export GEMINI_API_KEY=... ``` -`blackhole-2ch` установлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор Homebrew +`blackhole-2ch` встановлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор Homebrew вимагає перезавантаження, перш ніж macOS покаже пристрій: ```bash @@ -60,7 +60,7 @@ system_profiler SPAudioDataType | grep -i BlackHole command -v sox ``` -Увімкніть plugin: +Увімкніть Plugin: ```json5 { @@ -81,33 +81,33 @@ command -v sox openclaw googlemeet setup ``` -Вивід setup призначений бути придатним для читання агентом і чутливим до режиму. Він повідомляє про профіль Chrome, -node pinning, а для realtime Chrome-приєднань — про BlackHole/SoX audio -bridge і delayed realtime intro checks. Для приєднань лише для спостереження перевірте той самий -transport за допомогою `--mode transcribe`; цей режим пропускає передумови realtime audio, -оскільки він не слухає через bridge і не говорить через нього: +Вивід налаштування призначений бути читабельним для агента й обізнаним про режим. Він повідомляє про профіль Chrome, +закріплення вузла, а для realtime-приєднань Chrome — про аудіоміст +BlackHole/SoX і перевірки відкладеного realtime-вступу. Для підключень лише для спостереження перевірте той самий +транспорт за допомогою `--mode transcribe`; цей режим пропускає передумови realtime-аудіо, +бо він не слухає через міст і не говорить через нього: ```bash openclaw googlemeet setup --transport chrome-node --mode transcribe ``` -Коли налаштовано делегування Twilio, setup також повідомляє, чи готові -plugin `voice-call`, облікові дані Twilio і публічне Webhook-розкриття. -Сприймайте будь-яку перевірку `ok: false` як блокер для перевірених transport і mode, +Коли налаштовано делегування Twilio, налаштування також повідомляє, чи готові +Plugin `voice-call`, облікові дані Twilio та публічне Webhook-експонування. +Вважайте будь-яку перевірку `ok: false` блокером для перевіреного транспорту й режиму, перш ніж просити агента приєднатися. Використовуйте `openclaw googlemeet setup --json` для -scripts або машинно-читного виводу. Використовуйте `--transport chrome`, -`--transport chrome-node` або `--transport twilio`, щоб попередньо перевірити конкретний -transport до того, як агент спробує його. +скриптів або машинозчитуваного виводу. Використовуйте `--transport chrome`, +`--transport chrome-node` або `--transport twilio`, щоб попередньо перевірити певний +транспорт до того, як агент спробує його. -Для Twilio завжди явно попередньо перевіряйте transport, коли типовий transport -— Chrome: +Для Twilio завжди явно попередньо перевіряйте транспорт, коли типовий транспорт — +Chrome: ```bash openclaw googlemeet setup --transport twilio ``` -Це виявляє відсутнє підключення `voice-call`, облікові дані Twilio або недоступне -Webhook-розкриття до того, як агент спробує набрати зустріч. +Це виявляє відсутню проводку `voice-call`, облікові дані Twilio або недоступне +Webhook-експонування до того, як агент спробує набрати зустріч. Приєднайтеся до зустрічі: @@ -115,7 +115,7 @@ Webhook-розкриття до того, як агент спробує наб openclaw googlemeet join https://meet.google.com/abc-defg-hij ``` -Або дозвольте агенту приєднатися через tool `google_meet`: +Або дозвольте агенту приєднатися через інструмент `google_meet`: ```json { @@ -141,25 +141,25 @@ openclaw googlemeet create --no-join `googlemeet create` має два шляхи: - Створення через API: використовується, коли налаштовано облікові дані Google Meet OAuth. Це - найдетермінованіший шлях і він не залежить від стану UI браузера. -- Резервний браузерний шлях: використовується, коли облікових даних OAuth немає. OpenClaw використовує - закріплену Chrome node, відкриває `https://meet.google.com/new`, чекає, доки Google - перенаправить на справжню URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях вимагає, - щоб профіль OpenClaw Chrome на node вже був авторизований у Google. - Автоматизація браузера обробляє власний first-run microphone prompt Meet; цей prompt + найдетермінованіший шлях, і він не залежить від стану інтерфейсу браузера. +- Резервний варіант через браузер: використовується, коли облікові дані OAuth відсутні. OpenClaw використовує + закріплений вузол Chrome, відкриває `https://meet.google.com/new`, чекає, доки Google + переспрямує на справжню URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях вимагає, + щоб профіль OpenClaw Chrome на вузлі вже був увійшов у Google. + Автоматизація браузера обробляє власний початковий запит Meet щодо мікрофона; цей запит не вважається помилкою входу в Google. - Потоки приєднання і створення також намагаються повторно використати наявну вкладку Meet перед відкриттям - нової. Зіставлення ігнорує нешкідливі query strings URL, як-от `authuser`, тому + Потоки приєднання та створення також намагаються повторно використати наявну вкладку Meet перед відкриттям + нової. Зіставлення ігнорує нешкідливі рядки запиту URL, такі як `authuser`, тому повторна спроба агента має сфокусувати вже відкриту зустріч замість створення другої вкладки Chrome. -Вивід команди/tool містить поле `source` (`api` або `browser`), щоб агенти -могли пояснити, який шлях було використано. `create` за замовчуванням приєднується до нової зустрічі й -повертає `joined: true` плюс join session. Щоб лише випустити URL-адресу, використовуйте -`create --no-join` у CLI або передайте `"join": false` до tool. +Вивід команди/інструмента містить поле `source` (`api` або `browser`), щоб агенти +могли пояснити, який шлях було використано. `create` за замовчуванням приєднується до нової зустрічі та +повертає `joined: true` плюс сесію приєднання. Щоб лише згенерувати URL-адресу, використовуйте +`create --no-join` у CLI або передайте `"join": false` до інструмента. -Або скажіть агенту: «Створи Google Meet, приєднайся до нього з realtime voice і надішли -мені посилання». Агент має викликати `google_meet` з `action: "create"`, а +Або скажіть агенту: "Створи Google Meet, приєднайся до нього з realtime voice і надішли +мені посилання." Агент має викликати `google_meet` з `action: "create"` і потім поділитися поверненим `meetingUri`. ```json @@ -170,45 +170,45 @@ openclaw googlemeet create --no-join } ``` -Для приєднання лише для спостереження/керування браузером установіть `"mode": "transcribe"`. Це -не запускає duplex realtime model bridge, не потребує BlackHole або SoX -і не говоритиме у відповідь у зустріч. Chrome-приєднання в цьому режимі також уникають -надання OpenClaw дозволу на мікрофон/камеру й обходять шлях Meet **Use -microphone**. Якщо Meet показує інтерстицій вибору аудіо, автоматизація пробує +Для приєднання лише для спостереження/керування браузером встановіть `"mode": "transcribe"`. Це +не запускає дуплексний міст realtime-моделі, не потребує BlackHole або SoX +і не відповідатиме голосом у зустріч. Приєднання Chrome у цьому режимі також уникають +надання OpenClaw дозволу на мікрофон/камеру та уникають шляху Meet **Use +microphone**. Якщо Meet показує проміжний екран вибору аудіо, автоматизація пробує шлях без мікрофона, а інакше повідомляє про ручну дію замість відкриття локального мікрофона. -Під час realtime sessions статус `google_meet` містить стан браузера й audio bridge, -як-от `inCall`, `manualActionRequired`, `providerConnected`, -`realtimeReady`, `audioInputActive`, `audioOutputActive`, останні timestamps вводу/виводу, -byte counters і closed state bridge. Якщо з’являється безпечний prompt сторінки Meet, +Під час realtime-сесій статус `google_meet` містить стан браузера й аудіомоста, +зокрема `inCall`, `manualActionRequired`, `providerConnected`, +`realtimeReady`, `audioInputActive`, `audioOutputActive`, часові позначки останнього вводу/виводу, +лічильники байтів і стан закриття моста. Якщо з'являється безпечний запит сторінки Meet, автоматизація браузера обробляє його, коли може. Вхід, допуск організатором і -prompts дозволів браузера/ОС повідомляються як manual action з reason і -message для агента, щоб він передав їх далі. Managed Chrome sessions випромінюють intro або -test phrase лише після того, як browser health повідомляє `inCall: true`; інакше status повідомляє -`speechReady: false`, а speech attempt блокується замість того, щоб удавати, ніби +запити дозволів браузера/ОС повідомляються як ручна дія з причиною та +повідомленням, яке агент має передати. Керовані сесії Chrome видають вступ або +тестову фразу лише після того, як стан браузера повідомляє `inCall: true`; інакше статус повідомляє +`speechReady: false`, а спроба мовлення блокується замість удавання, що агент говорив у зустріч. -Локальні Chrome-приєднання використовують авторизований браузерний профіль OpenClaw. Realtime mode -потребує `BlackHole 2ch` для шляху мікрофона/динаміка, який використовує OpenClaw. Для -чистого duplex audio використовуйте окремі віртуальні пристрої або граф у стилі Loopback; один -пристрій BlackHole достатній для першого smoke test, але може давати відлуння. +Локальні приєднання Chrome використовують профіль браузера OpenClaw із виконаним входом. Realtime-режим +потребує `BlackHole 2ch` для шляху мікрофон/динамік, який використовує OpenClaw. Для +чистого дуплексного аудіо використовуйте окремі віртуальні пристрої або граф у стилі Loopback; одного +пристрою BlackHole достатньо для першого smoke-тесту, але він може давати відлуння. ### Локальний Gateway + Parallels Chrome -Вам **не** потрібен повний OpenClaw Gateway або model API key усередині macOS VM -лише для того, щоб VM володіла Chrome. Запустіть Gateway і агента локально, потім запустіть -node host у VM. Увімкніть bundled plugin на VM один раз, щоб node -оголошувала Chrome command: +Вам **не** потрібен повний OpenClaw Gateway або ключ API моделі всередині macOS VM +лише для того, щоб VM володіла Chrome. Запустіть Gateway і агента локально, а потім запустіть +вузловий хост у VM. Увімкніть вбудований Plugin у VM один раз, щоб вузол +оголошував команду Chrome: Що де працює: -- Gateway host: OpenClaw Gateway, agent workspace, model/API keys, realtime - provider і конфігурація Google Meet plugin. -- Parallels macOS VM: OpenClaw CLI/node host, Google Chrome, SoX, BlackHole 2ch - і профіль Chrome, авторизований у Google. -- Не потрібно у VM: сервіс Gateway, agent config, OpenAI/GPT key або налаштування model - provider. +- Хост Gateway: OpenClaw Gateway, робочий простір агента, ключі моделі/API, realtime + провайдер і конфігурація Plugin Google Meet. +- Parallels macOS VM: OpenClaw CLI/вузловий хост, Google Chrome, SoX, BlackHole 2ch + і профіль Chrome із виконаним входом у Google. +- Не потрібно у VM: сервіс Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування + провайдера моделі. Установіть залежності VM: @@ -229,27 +229,27 @@ system_profiler SPAudioDataType | grep -i BlackHole command -v sox ``` -Установіть або оновіть OpenClaw у VM, потім увімкніть bundled plugin там: +Установіть або оновіть OpenClaw у VM, потім увімкніть там вбудований Plugin: ```bash openclaw plugins enable google-meet ``` -Запустіть node host у VM: +Запустіть вузловий хост у VM: ```bash openclaw node run --host --port 18789 --display-name parallels-macos ``` -Якщо `` — LAN IP і ви не використовуєте TLS, node відмовляється від -plaintext WebSocket, якщо ви не дали згоду для цієї довіреної приватної мережі: +Якщо `` є LAN IP і ви не використовуєте TLS, вузол відмовляє +plaintext WebSocket, доки ви явно не дозволите це для довіреної приватної мережі: ```bash OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node run --host --port 18789 --display-name parallels-macos ``` -Використовуйте ту саму змінну середовища під час установлення node як LaunchAgent: +Використовуйте ту саму змінну середовища під час установлення вузла як LaunchAgent: ```bash OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ @@ -257,25 +257,25 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node restart ``` -`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` — це process environment, а не -налаштування `openclaw.json`. `openclaw node install` зберігає його в середовищі LaunchAgent, +`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` — це середовище процесу, а не налаштування +`openclaw.json`. `openclaw node install` зберігає його в середовищі LaunchAgent, коли воно присутнє в команді встановлення. -Схваліть node з Gateway host: +Схваліть вузол із хоста Gateway: ```bash openclaw devices list openclaw devices approve ``` -Підтвердьте, що Gateway бачить node і що вона оголошує як `googlemeet.chrome`, -так і browser capability/`browser.proxy`: +Підтвердьте, що Gateway бачить вузол і що він оголошує як `googlemeet.chrome`, +так і можливість браузера/`browser.proxy`: ```bash openclaw nodes status ``` -Спрямуйте Meet через цю node на Gateway host: +Маршрутизуйте Meet через цей вузол на хості Gateway: ```json5 { @@ -305,114 +305,113 @@ openclaw nodes status } ``` -Тепер приєднуйтеся звичайним способом із Gateway host: +Тепер приєднуйтеся звичайно з хоста Gateway: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij ``` -або попросіть агента використати tool `google_meet` з `transport: "chrome-node"`. +або попросіть агента використати інструмент `google_meet` з `transport: "chrome-node"`. -Для smoke test однією командою, який створює або повторно використовує session, промовляє відому -phrase і друкує session health: +Для smoke-тесту однією командою, який створює або повторно використовує сесію, промовляє відому +фразу й друкує стан сесії: ```bash openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij ``` -Під час realtime join автоматизація браузера OpenClaw заповнює ім’я гостя, натискає -Join/Ask to join і приймає first-run вибір Meet "Use microphone", коли цей -prompt з’являється. Під час observe-only join або browser-only створення зустрічі вона -проходить повз той самий prompt без мікрофона, коли такий вибір доступний. -Якщо профіль браузера не авторизований, Meet очікує на допуск організатором, -Chrome потребує дозволу на мікрофон/камеру для realtime join або Meet застряг -на prompt, який автоматизація не змогла розв’язати, результат join/test-speech повідомляє +Під час realtime-приєднання автоматизація браузера OpenClaw заповнює ім'я гостя, натискає +Join/Ask to join і приймає початковий вибір Meet "Use microphone", коли цей +запит з'являється. Під час приєднання лише для спостереження або створення зустрічі лише через браузер вона +проходить повз той самий запит без мікрофона, коли такий вибір доступний. +Якщо профіль браузера не ввійшов у систему, Meet чекає допуску організатором, +Chrome потребує дозволу на мікрофон/камеру для realtime-приєднання або Meet застряг +на запиті, який автоматизація не змогла розв'язати, результат join/test-speech повідомляє `manualActionRequired: true` з `manualActionReason` і -`manualActionMessage`. Агенти мають припинити повторні спроби join, повідомити саме це -message плюс поточні `browserUrl`/`browserTitle` і повторити спробу лише після завершення +`manualActionMessage`. Агенти мають припинити повторні спроби приєднання, повідомити це точне +повідомлення плюс поточні `browserUrl`/`browserTitle` і повторити спробу лише після завершення ручної дії в браузері. -Якщо `chromeNode.node` пропущено, OpenClaw автоматично вибирає лише тоді, коли рівно одна -підключена node оголошує і `googlemeet.chrome`, і browser control. Якщо -підключено кілька придатних nodes, установіть `chromeNode.node` на node id, -display name або remote IP. +Якщо `chromeNode.node` пропущено, OpenClaw автоматично вибирає лише тоді, коли рівно один +підключений вузол оголошує і `googlemeet.chrome`, і керування браузером. Якщо +підключено кілька здатних вузлів, установіть `chromeNode.node` на ідентифікатор вузла, +відображуване ім'я або віддалену IP-адресу. -Поширені перевірки збоїв: +Поширені перевірки помилок: - `Configured Google Meet node ... is not usable: offline`: закріплений вузол відомий Gateway, але недоступний. Агенти мають розглядати цей вузол як діагностичний стан, а не як придатний хост Chrome, і повідомляти про блокер - налаштування замість переходу на інший транспорт, якщо користувач не просив - про це. + налаштування замість переходу на інший транспорт, якщо користувач цього не просив. - `No connected Google Meet-capable node`: запустіть `openclaw node run` у VM, - схваліть сполучення та переконайтеся, що `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` на хості, +- `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 on the node`: встановіть `blackhole-2ch` у VM і перезавантажте VM. -- Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM, або - залиште `chrome.guestName` встановленим для гостьового приєднання. Автоматичне гостьове приєднання використовує +- Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM або + залиште `chrome.guestName` заданим для гостьового приєднання. Гостьове автоматичне приєднання використовує браузерну автоматизацію OpenClaw через проксі браузера вузла; переконайтеся, що конфігурація браузера вузла вказує на потрібний профіль, наприклад `browser.defaultProfile: "user"` або іменований профіль наявного сеансу. -- Дубльовані вкладки Meet: залиште `chrome.reuseExistingTab: true` увімкненим. OpenClaw +- Дублікати вкладок Meet: залиште `chrome.reuseExistingTab: true` увімкненим. OpenClaw активує наявну вкладку для тієї самої URL-адреси Meet перед відкриттям нової, а - створення зустрічі в браузері повторно використовує вкладку `https://meet.google.com/new` - або вкладку запиту Google account, що вже виконується, перед відкриттям іншої. -- Немає аудіо: у Meet спрямовуйте мікрофон/динамік через шлях віртуального аудіопристрою, + браузерне створення зустрічі повторно використовує незавершену вкладку `https://meet.google.com/new` + або вкладку запиту облікового запису Google перед відкриттям іншої. +- Немає аудіо: у Meet спрямуйте мікрофон/динамік через шлях віртуального аудіопристрою, який використовує OpenClaw; використовуйте окремі віртуальні пристрої або маршрутизацію в стилі Loopback - для чистого дуплексного аудіо. + для чистого двостороннього аудіо. ## Примітки щодо встановлення -Типове реального часу для Chrome використовує два зовнішні інструменти: +Стандартний Chrome realtime використовує два зовнішні інструменти: -- `sox`: аудіоутиліта командного рядка. Plugin використовує явні команди пристрою CoreAudio - для типового аудіомоста 24 kHz PCM16. +- `sox`: аудіоутиліта командного рядка. Плагін використовує явні команди пристроїв CoreAudio + для стандартного аудіомоста PCM16 24 кГц. - `blackhole-2ch`: віртуальний аудіодрайвер macOS. Він створює аудіопристрій `BlackHole 2ch`, - через який можуть маршрутизуватися Chrome/Meet. + через який Chrome/Meet можуть виконувати маршрутизацію. -OpenClaw не включає і не поширює жоден із цих пакетів. Документація просить користувачів -установити їх як залежності хоста через Homebrew. SoX ліцензовано як +OpenClaw не комплектує й не розповсюджує жоден із цих пакетів. Документація просить користувачів +встановити їх як залежності хоста через Homebrew. SoX ліцензовано як `LGPL-2.0-only AND GPL-2.0-only`; BlackHole має ліцензію GPL-3.0. Якщо ви створюєте -інсталятор або пристрій, що комплектує BlackHole разом з OpenClaw, перегляньте -умови ліцензування BlackHole upstream або отримайте окрему ліцензію від Existential Audio. +інсталятор або appliance, який комплектує BlackHole разом з OpenClaw, перегляньте +умови upstream-ліцензування BlackHole або отримайте окрему ліцензію від Existential Audio. ## Транспорти ### Chrome Транспорт Chrome відкриває URL-адресу Meet через керування браузером OpenClaw і приєднується -як профіль браузера OpenClaw із виконаним входом. На macOS Plugin перевіряє наявність -`BlackHole 2ch` перед запуском. Якщо налаштовано, він також запускає команду -перевірки справності аудіомоста і команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли +як виконаний вхід профіль браузера OpenClaw. На macOS плагін перевіряє наявність +`BlackHole 2ch` перед запуском. Якщо налаштовано, він також виконує команду перевірки стану +аудіомоста та команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо працюють -на спареному вузлі, наприклад Parallels macOS VM. Для локального Chrome виберіть -профіль через `browser.defaultProfile`; `chrome.browserProfile` передається -хостам `chrome-node`. +на спареному вузлі, такому як Parallels macOS VM. Для локального Chrome виберіть +профіль через `browser.defaultProfile`; `chrome.browserProfile` передається хостам +`chrome-node`. ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node ``` -Спрямовуйте аудіо мікрофона й динаміка Chrome через локальний аудіоміст OpenClaw. +Спрямуйте аудіо мікрофона й динаміка Chrome через локальний аудіоміст OpenClaw. Якщо `BlackHole 2ch` не встановлено, приєднання завершується помилкою налаштування замість тихого приєднання без аудіошляху. ### Twilio -Транспорт Twilio є суворим планом набору, делегованим Plugin голосових викликів. Він +Транспорт Twilio — це строгий план набору, делегований плагіну Voice Call. Він не аналізує сторінки Meet для пошуку телефонних номерів. -Використовуйте це, коли участь через Chrome недоступна або потрібен резервний -телефонний вхід. Google Meet має надавати номер телефонного входу та PIN для -зустрічі; OpenClaw не отримує їх зі сторінки Meet. +Використовуйте це, коли участь через Chrome недоступна або потрібен резервний варіант +телефонного дозвону. Google Meet має надавати телефонний номер дозвону та PIN для +зустрічі; OpenClaw не виявляє їх зі сторінки Meet. -Увімкніть Plugin голосових викликів на хості Gateway, а не на вузлі Chrome: +Увімкніть плагін Voice Call на хості Gateway, а не на вузлі Chrome: ```json5 { @@ -446,8 +445,8 @@ export TWILIO_AUTH_TOKEN=... export TWILIO_FROM_NUMBER=+15550001234 ``` -Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації Plugin -не з’являються в уже запущеному процесі Gateway, доки він не перезавантажиться. +Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації плагіна +не з’являються у вже запущеному процесі Gateway, доки він не перезавантажиться. Потім перевірте: @@ -457,8 +456,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 @@ -468,7 +467,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --pin 123456 ``` -Використовуйте `--dtmf-sequence`, коли зустріч потребує власної послідовності: +Використовуйте `--dtmf-sequence`, коли для зустрічі потрібна власна послідовність: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij \ @@ -479,22 +478,22 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ ## OAuth і попередня перевірка -OAuth є необов’язковим для створення посилання Meet, оскільки `googlemeet create` може -повернутися до автоматизації браузера. Налаштуйте OAuth, коли потрібні офіційне створення через API, -розв’язання просторів або попередні перевірки Meet Media API. +OAuth необов’язковий для створення посилання Meet, оскільки `googlemeet create` може +повертатися до браузерної автоматизації. Налаштуйте OAuth, коли потрібне офіційне створення +через API, розв’язання space або попередні перевірки Meet Media API. Доступ до Google Meet API використовує користувацький OAuth: створіть OAuth-клієнт Google Cloud, -запитайте потрібні області доступу, авторизуйте Google account, а потім збережіть -отриманий refresh token у конфігурації Plugin Google Meet або надайте +запитайте потрібні scopes, авторизуйте обліковий запис Google, а потім збережіть +отриманий refresh token у конфігурації плагіна Google Meet або надайте змінні середовища `OPENCLAW_GOOGLE_MEET_*`. -OAuth не замінює шлях приєднання Chrome. Транспорти Chrome і Chrome-node -усе ще приєднуються через профіль Chrome із виконаним входом, BlackHole/SoX і підключений -вузол, коли ви використовуєте участь через браузер. OAuth призначений лише для офіційного -шляху Google Meet API: створювати простори зустрічей, розв’язувати простори та запускати попередні -перевірки Meet Media API. +OAuth не замінює шлях приєднання через Chrome. Транспорти Chrome і Chrome-node +все одно приєднуються через виконаний вхід профіль Chrome, BlackHole/SoX і підключений +вузол, коли ви використовуєте участь через браузер. OAuth призначений лише для офіційного шляху +Google Meet API: створювати meeting spaces, розв’язувати spaces і виконувати попередні перевірки +Meet Media API. -### Створіть облікові дані Google +### Створення облікових даних Google У Google Cloud Console: @@ -502,15 +501,15 @@ OAuth не замінює шлях приєднання Chrome. Транспор 2. Увімкніть **Google Meet REST API** для цього проєкту. 3. Налаштуйте екран згоди OAuth. - **Internal** найпростіший для організації Google Workspace. - - **External** працює для особистих/тестових налаштувань; поки застосунок перебуває в Testing, - додайте кожен Google account, який авторизуватиме застосунок, як тестового користувача. -4. Додайте області доступу, які запитує OpenClaw: + - **External** працює для персональних/тестових налаштувань; доки застосунок перебуває в Testing, + додайте кожен обліковий запис Google, який авторизуватиме застосунок, як тестового користувача. +4. Додайте scopes, які запитує OpenClaw: - `https://www.googleapis.com/auth/meetings.space.created` - `https://www.googleapis.com/auth/meetings.space.readonly` - `https://www.googleapis.com/auth/meetings.conference.media.readonly` 5. Створіть OAuth client ID. - Тип застосунку: **Web application**. - - Авторизована URI-адреса перенаправлення: + - Авторизований redirect URI: ```text http://localhost:8085/oauth2callback @@ -519,12 +518,12 @@ OAuth не замінює шлях приєднання Chrome. Транспор 6. Скопіюйте client ID і client secret. `meetings.space.created` потрібен Google Meet `spaces.create`. -`meetings.space.readonly` дає OpenClaw змогу розв’язувати URL-адреси/коди Meet у простори. -`meetings.conference.media.readonly` призначений для попередніх перевірок Meet Media API і медіа -робіт; Google може вимагати реєстрацію в Developer Preview для фактичного використання Media API. -Якщо вам потрібні лише приєднання Chrome на основі браузера, повністю пропустіть OAuth. +`meetings.space.readonly` дає OpenClaw змогу розв’язувати URL-адреси/коди Meet у spaces. +`meetings.conference.media.readonly` призначений для попередніх перевірок Meet Media API і медіароботи; +Google може вимагати реєстрації в Developer Preview для фактичного використання Media API. +Якщо вам потрібні лише браузерні приєднання Chrome, повністю пропустіть OAuth. -### Створіть refresh token +### Випуск refresh token Налаштуйте `oauth.clientId` і, за потреби, `oauth.clientSecret`, або передайте їх як змінні середовища, а потім виконайте: @@ -533,8 +532,8 @@ OAuth не замінює шлях приєднання Chrome. Транспор openclaw googlemeet auth login --json ``` -Команда друкує блок конфігурації `oauth` з refresh token. Вона використовує PKCE, -локальний callback на `http://localhost:8085/oauth2callback` і ручний +Команда виводить конфігураційний блок `oauth` з refresh token. Вона використовує PKCE, +callback localhost на `http://localhost:8085/oauth2callback` і ручний потік копіювання/вставлення з `--manual`. Приклади: @@ -553,7 +552,7 @@ OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \ openclaw googlemeet auth login --json --manual ``` -JSON-вивід містить: +Вивід JSON містить: ```json { @@ -568,7 +567,7 @@ JSON-вивід містить: } ``` -Збережіть об’єкт `oauth` у конфігурації Plugin Google Meet: +Збережіть об’єкт `oauth` у конфігурації плагіна Google Meet: ```json5 { @@ -590,38 +589,38 @@ JSON-вивід містить: ``` Надавайте перевагу змінним середовища, коли не хочете мати refresh token у конфігурації. -Якщо присутні і значення конфігурації, і значення середовища, Plugin спочатку бере конфігурацію, -а потім fallback середовища. +Якщо присутні і значення конфігурації, і значення середовища, плагін спершу використовує конфігурацію, +а потім fallback до середовища. -Згода OAuth включає створення просторів Meet, доступ на читання просторів Meet і доступ на читання -медіа конференцій Meet. Якщо ви автентифікувалися до появи підтримки створення зустрічей, -повторно виконайте `openclaw googlemeet auth login --json`, щоб refresh token мав -область доступу `meetings.space.created`. +Згода OAuth включає створення Meet space, доступ на читання Meet space і доступ на читання медіа +конференції Meet. Якщо ви автентифікувалися до появи підтримки створення зустрічей, +повторно виконайте `openclaw googlemeet auth login --json`, щоб refresh token мав scope +`meetings.space.created`. -### Перевірте OAuth за допомогою doctor +### Перевірка OAuth через doctor -Запустіть OAuth doctor, коли потрібна швидка перевірка справності без секретів: +Запустіть OAuth doctor, коли потрібна швидка перевірка стану без секретів: ```bash 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. | -| `meet-spaces-create` | Необов’язкова перевірка `--create-space` створила новий простір Meet. | +| `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. | -Щоб також підтвердити ввімкнення Google Meet API і область доступу `spaces.create`, запустіть +Щоб також довести ввімкнення Google Meet API і scope `spaces.create`, виконайте перевірку створення з побічним ефектом: ```bash @@ -630,25 +629,25 @@ openclaw googlemeet create --no-join --json ``` `--create-space` створює одноразову URL-адресу Meet. Використовуйте це, коли потрібно підтвердити, -що в проєкті Google Cloud увімкнено Meet API і що авторизований -обліковий запис має область доступу `meetings.space.created`. +що проєкт Google Cloud має ввімкнений Meet API і що авторизований +обліковий запис має scope `meetings.space.created`. -Щоб підтвердити доступ на читання до наявного простору зустрічі: +Щоб довести доступ на читання для наявного meeting space: ```bash openclaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --json openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij ``` -`doctor --oauth --meeting` і `resolve-space` підтверджують доступ на читання до наявного -простору, до якого авторизований Google account має доступ. `403` від цих перевірок -зазвичай означає, що Google Meet REST API вимкнено, refresh token із наданою згодою -не має потрібної області доступу, або Google account не може отримати доступ до цього простору Meet. -Помилка refresh-token означає, що потрібно повторно виконати `openclaw googlemeet auth login +`doctor --oauth --meeting` і `resolve-space` доводять доступ на читання до наявного +space, до якого авторизований обліковий запис Google має доступ. `403` від цих перевірок +зазвичай означає, що Google Meet REST API вимкнено, refresh token зі згодою +не має потрібного scope або обліковий запис Google не може отримати доступ до цього Meet +space. Помилка refresh-token означає, що потрібно повторно виконати `openclaw googlemeet auth login --json` і зберегти новий блок `oauth`. -Для fallback браузера облікові дані OAuth не потрібні. У цьому режимі автентифікація Google -походить із профілю Chrome із виконаним входом на вибраному вузлі, а не з +Для браузерного fallback облікові дані OAuth не потрібні. У цьому режимі автентифікація Google +надходить із виконаного входу профілю Chrome на вибраному вузлі, а не з конфігурації OpenClaw. Ці змінні середовища приймаються як fallback: @@ -662,7 +661,7 @@ openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij - `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 @@ -682,9 +681,9 @@ openclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hij openclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-export ``` -З `--meeting` команди `artifacts` і `attendance` типово використовують найновіший запис конференції. Передайте `--all-conference-records`, якщо потрібні всі збережені записи для цієї зустрічі. +З `--meeting`, `artifacts` і `attendance` типово використовують найновіший запис конференції. Передайте `--all-conference-records`, коли потрібні всі збережені записи для цієї зустрічі. -Пошук у календарі може визначити URL зустрічі з Google Calendar перед читанням артефактів Meet: +Пошук у Calendar може розв’язати URL зустрічі з Google Calendar перед читанням артефактів Meet: ```bash openclaw googlemeet latest --today @@ -693,9 +692,9 @@ openclaw googlemeet artifacts --event "Weekly sync" openclaw googlemeet attendance --today --format csv --output attendance.csv ``` -`--today` шукає в сьогоднішньому календарі `primary` подію Calendar із посиланням Google Meet. Використовуйте `--event ` для пошуку відповідного тексту події, а `--calendar ` для неосновного календаря. Пошук у календарі потребує нового входу OAuth, який містить readonly-область подій Calendar. `calendar-events` попередньо показує відповідні події Meet і позначає подію, яку виберуть `latest`, `artifacts`, `attendance` або `export`. +`--today` шукає в сьогоднішньому календарі `primary` подію Calendar із посиланням Google Meet. Використовуйте `--event ` для пошуку відповідного тексту події та `--calendar ` для неосновного календаря. Для пошуку в Calendar потрібен новий вхід OAuth, що включає readonly scope для подій Calendar. `calendar-events` попередньо показує відповідні події Meet і позначає подію, яку виберуть `latest`, `artifacts`, `attendance` або `export`. -Якщо ви вже знаєте id запису конференції, зверніться до нього напряму: +Якщо ви вже знаєте ідентифікатор запису конференції, зверніться до нього напряму: ```bash openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hij @@ -718,11 +717,11 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --dry-run ``` -`artifacts` повертає метадані запису конференції, а також метадані ресурсів учасників, записів, транскрипту, структурованих записів транскрипту та розумних нотаток, коли Google надає їх для зустрічі. Використовуйте `--no-transcript-entries`, щоб пропустити пошук записів для великих зустрічей. `attendance` розгортає учасників у рядки сеансів учасників із часом першої/останньої появи, загальною тривалістю сеансу, прапорцями запізнення/раннього виходу та дубльованими ресурсами учасників, об’єднаними за користувачем із виконаним входом або відображуваним іменем. Передайте `--no-merge-duplicates`, щоб зберегти необроблені ресурси учасників окремо, `--late-after-minutes`, щоб налаштувати визначення запізнення, і `--early-before-minutes`, щоб налаштувати визначення раннього виходу. +`artifacts` повертає метадані запису конференції, а також метадані ресурсів учасників, записів, транскрипту, структурованих записів транскрипту та smart-note, коли Google надає їх для зустрічі. Використовуйте `--no-transcript-entries`, щоб пропустити пошук записів для великих зустрічей. `attendance` розгортає учасників у рядки participant-session з часом першої/останньої появи, загальною тривалістю сесії, прапорцями запізнення/раннього виходу та дубльованими ресурсами учасників, об’єднаними за користувачем, який увійшов у систему, або відображуваним ім’ям. Передайте `--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, коли її було використано, і будь-які попередження про часткове отримання. Передайте `--zip`, щоб також записати переносний архів поруч із папкою. Передайте `--include-doc-bodies`, щоб експортувати текст пов’язаного транскрипту та розумних нотаток Google Docs через Google Drive `files.export`; для цього потрібен новий вхід OAuth, який містить readonly-область Drive Meet. Без `--include-doc-bodies` експорти містять лише метадані Meet і структуровані записи транскрипту. Якщо Google повертає частковий збій артефакту, наприклад помилку списку розумних нотаток, запису транскрипту або тіла документа Drive, summary і manifest зберігають попередження замість того, щоб провалити весь експорт. Використовуйте `--dry-run`, щоб отримати ті самі дані артефактів/відвідуваності та надрукувати JSON manifest без створення папки або ZIP. Це корисно перед записом великого експорту або коли агенту потрібні лише лічильники, вибрані записи та попередження. +`export` записує папку з `summary.md`, `attendance.csv`, `transcript.md`, `artifacts.json`, `attendance.json` і `manifest.json`. `manifest.json` фіксує вибраний вхід, параметри експорту, записи конференції, вихідні файли, кількості, джерело токена, подію Calendar, якщо її було використано, і будь-які попередження про часткове отримання. Передайте `--zip`, щоб також записати переносний архів поруч із папкою. Передайте `--include-doc-bodies`, щоб експортувати текст пов’язаних транскриптів і smart-note Google Docs через Google Drive `files.export`; для цього потрібен новий вхід OAuth, що включає readonly scope Drive Meet. Без `--include-doc-bodies` експорти містять лише метадані Meet і структуровані записи транскрипту. Якщо Google повертає часткову помилку артефакту, наприклад помилку списку smart-note, запису транскрипту або тіла документа Drive, summary і manifest зберігають попередження замість збою всього експорту. Використовуйте `--dry-run`, щоб отримати ті самі дані артефактів/відвідуваності та надрукувати JSON manifest без створення папки або ZIP. Це корисно перед записом великого експорту або коли агенту потрібні лише кількості, вибрані записи та попередження. -Агенти також можуть створити такий самий пакет через інструмент `google_meet`: +Агенти також можуть створити той самий пакет через інструмент `google_meet`: ```json { @@ -736,7 +735,7 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \ Установіть `"dryRun": true`, щоб повернути лише manifest експорту й пропустити запис файлів. -Запустіть захищений live smoke для реальної збереженої зустрічі: +Запустіть захищений live smoke проти реальної збереженої зустрічі: ```bash OPENCLAW_LIVE_TEST=1 \ @@ -744,9 +743,9 @@ OPENCLAW_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \ pnpm test:live -- extensions/google-meet/google-meet.live.test.ts ``` -Live smoke-середовище: +Live smoke середовище: -- `OPENCLAW_LIVE_TEST=1` вмикає захищені live-тести. +- `OPENCLAW_LIVE_TEST=1` вмикає захищені live тести. - `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` вказує на збережений URL Meet, код або `spaces/{id}`. - `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` надає OAuth @@ -758,10 +757,7 @@ Live smoke-середовище: `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` використовують ті самі резервні назви без префікса `OPENCLAW_`. -Базовий live smoke для артефактів/відвідуваності потребує -`https://www.googleapis.com/auth/meetings.space.readonly` і -`https://www.googleapis.com/auth/meetings.conference.media.readonly`. Пошук у календарі потребує `https://www.googleapis.com/auth/calendar.events.readonly`. Експорт тіла документа Drive потребує -`https://www.googleapis.com/auth/drive.meet.readonly`. +Базовий 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/drive.meet.readonly`. Створіть новий простір Meet: @@ -769,7 +765,7 @@ Live smoke-середовище: openclaw googlemeet create ``` -Команда друкує новий `meeting uri`, джерело та сеанс приєднання. З OAuth-обліковими даними вона використовує офіційний Google Meet API. Без OAuth-облікових даних вона використовує профіль браузера закріпленого Chrome node із виконаним входом як резервний варіант. Агенти можуть використовувати інструмент `google_meet` з `action: "create"`, щоб створити й приєднатися за один крок. Для створення лише URL передайте `"join": false`. +Команда друкує новий `meeting uri`, джерело та сесію приєднання. З обліковими даними OAuth вона використовує офіційний Google Meet API. Без облікових даних OAuth вона використовує профіль браузера закріпленого Chrome Node із виконаним входом як резервний варіант. Агенти можуть використовувати інструмент `google_meet` з `action: "create"`, щоб створити й приєднатися за один крок. Для створення лише URL передайте `"join": false`. Приклад JSON-виводу з резервного варіанта браузера: @@ -791,7 +787,7 @@ openclaw googlemeet create } ``` -Якщо резервний варіант браузера натрапляє на вхід Google або блокувальник дозволів Meet до того, як зможе створити URL, метод Gateway повертає невдалу відповідь, а інструмент `google_meet` повертає структуровані подробиці замість простого рядка: +Якщо резервний варіант браузера наштовхується на вхід у Google або блокування дозволів Meet до того, як може створити URL, метод Gateway повертає невдалу відповідь, а інструмент `google_meet` повертає структуровані деталі замість звичайного рядка: ```json { @@ -809,9 +805,9 @@ openclaw googlemeet create } ``` -Коли агент бачить `manualActionRequired: true`, він має повідомити `manualActionMessage` разом із контекстом browser node/tab і припинити відкривати нові вкладки Meet, доки оператор не завершить крок у браузері. +Коли агент бачить `manualActionRequired: true`, він має повідомити `manualActionMessage` разом із контекстом Node/вкладки браузера та припинити відкривати нові вкладки Meet, доки оператор не завершить крок у браузері. -Приклад JSON-виводу зі створення через API: +Приклад JSON-виводу з API create: ```json { @@ -832,13 +828,13 @@ openclaw googlemeet create } ``` -Створення Meet типово приєднує до зустрічі. Транспорт Chrome або Chrome-node все одно потребує профілю Google Chrome із виконаним входом, щоб приєднатися через браузер. Якщо в профілі не виконано вхід, OpenClaw повідомляє `manualActionRequired: true` або помилку резервного варіанта браузера й просить оператора завершити вхід Google перед повторною спробою. +Створення Meet типово виконує приєднання. Транспорт Chrome або Chrome-node все одно потребує профілю Google Chrome із виконаним входом, щоб приєднатися через браузер. Якщо з профілю виконано вихід, OpenClaw повідомляє `manualActionRequired: true` або помилку резервного варіанта браузера й просить оператора завершити вхід у Google перед повторною спробою. -Установлюйте `preview.enrollmentAcknowledged: true` лише після підтвердження, що ваш проєкт Cloud, OAuth principal і учасники зустрічі зареєстровані в Google Workspace Developer Preview Program для Meet media APIs. +Установлюйте `preview.enrollmentAcknowledged: true` лише після підтвердження, що ваш Cloud project, OAuth principal і учасники зустрічі зареєстровані в Google Workspace Developer Preview Program для Meet media APIs. ## Конфігурація -Загальний realtime-шлях Chrome потребує лише ввімкненого плагіна, BlackHole, SoX і ключа backend realtime voice provider. OpenAI використовується типово; установіть `realtime.provider: "google"`, щоб використовувати Google Gemini Live: +Загальний realtime шлях Chrome потребує лише ввімкненого Plugin, BlackHole, SoX і ключа backend realtime voice provider. OpenAI використовується типово; установіть `realtime.provider: "google"`, щоб використовувати Google Gemini Live: ```bash brew install blackhole-2ch sox @@ -847,7 +843,7 @@ export OPENAI_API_KEY=sk-... export GEMINI_API_KEY=... ``` -Установіть конфігурацію плагіна в `plugins.entries.google-meet.config`: +Установіть конфігурацію Plugin у `plugins.entries.google-meet.config`: ```json5 { @@ -866,26 +862,21 @@ export GEMINI_API_KEY=... - `defaultTransport: "chrome"` - `defaultMode: "realtime"` -- `chromeNode.node`: необов’язкові node id/назва/IP для `chrome-node` +- `chromeNode.node`: необов’язковий ідентифікатор/назва/IP Node для `chrome-node` - `chrome.audioBackend: "blackhole-2ch"` -- `chrome.guestName: "OpenClaw Agent"`: ім’я, що використовується на екрані гостя Meet без виконаного входу -- `chrome.autoJoin: true`: best-effort заповнення імені гостя та натискання Join Now через автоматизацію браузера OpenClaw на `chrome-node` -- `chrome.reuseExistingTab: true`: активувати наявну вкладку Meet замість відкриття дублікатів -- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet повідомить про стан in-call, перш ніж буде запущено realtime-вступ -- `chrome.audioFormat: "pcm16-24khz"`: аудіоформат command-pair. Використовуйте - `"g711-ulaw-8khz"` лише для застарілих/кастомних command pairs, які все ще видають - телефонне аудіо. -- `chrome.audioInputCommand`: команда SoX, що читає з CoreAudio `BlackHole 2ch` - і записує аудіо у `chrome.audioFormat` -- `chrome.audioOutputCommand`: команда SoX, що читає аудіо у `chrome.audioFormat` - і записує в CoreAudio `BlackHole 2ch` +- `chrome.guestName: "OpenClaw Agent"`: ім’я, що використовується на гостьовому екрані Meet без виконаного входу +- `chrome.autoJoin: true`: best-effort заповнення імені гостя та натискання Join Now через браузерну автоматизацію OpenClaw на `chrome-node` +- `chrome.reuseExistingTab: true`: активувати наявну вкладку Meet замість відкривання дублікатів +- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet повідомить, що вона in-call, перш ніж запускати realtime intro +- `chrome.audioFormat: "pcm16-24khz"`: аудіоформат command-pair. Використовуйте `"g711-ulaw-8khz"` лише для legacy/custom command pairs, які досі видають телефонне аудіо. +- `chrome.audioInputCommand`: команда SoX, що читає з CoreAudio `BlackHole 2ch` і записує аудіо у `chrome.audioFormat` +- `chrome.audioOutputCommand`: команда SoX, що читає аудіо у `chrome.audioFormat` і записує в CoreAudio `BlackHole 2ch` - `realtime.provider: "openai"` - `realtime.toolPolicy: "safe-read-only"` - `realtime.instructions`: короткі усні відповіді з `openclaw_agent_consult` для глибших відповідей -- `realtime.introMessage`: коротка усна перевірка готовності, коли realtime-міст - підключається; установіть значення `""`, щоб приєднатися мовчки -- `realtime.agentId`: необов’язковий OpenClaw agent id для +- `realtime.introMessage`: коротка усна перевірка готовності, коли realtime bridge підключається; установіть `""`, щоб приєднатися мовчки +- `realtime.agentId`: необов’язковий ідентифікатор агента OpenClaw для `openclaw_agent_consult`; типово `main` Необов’язкові перевизначення: @@ -935,7 +926,12 @@ export GEMINI_API_KEY=... } ``` -`voiceCall.enabled` типово має значення `true`; з транспортом Twilio він делегує фактичний PSTN-дзвінок і DTMF плагіну Voice Call. Якщо `voice-call` не ввімкнено, Google Meet все ще може перевірити й записати план набору, але не може здійснити Twilio-дзвінок. +`voiceCall.enabled` за замовчуванням має значення `true`; з транспортом Twilio він делегує +фактичний виклик PSTN, DTMF і вступне привітання Plugin Voice Call. Voice Call +відтворює послідовність DTMF перед відкриттям медіапотоку реального часу, а потім використовує +збережений вступний текст як початкове привітання реального часу. Якщо `voice-call` не +увімкнено, Google Meet усе ще може перевірити та записати план набору, але не може +здійснити виклик Twilio. ## Інструмент @@ -951,33 +947,33 @@ export GEMINI_API_KEY=... ``` Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. Використовуйте -`transport: "chrome-node"`, коли Chrome працює на спареному вузлі, наприклад у Parallels -VM. В обох випадках realtime-модель і `openclaw_agent_consult` працюють на хості -Gateway, тому облікові дані моделі залишаються там. +`transport: "chrome-node"`, коли Chrome працює на спареному Node, наприклад у Parallels +VM. В обох випадках модель реального часу й `openclaw_agent_consult` працюють на +хості Gateway, тому облікові дані моделі залишаються там. Використовуйте `action: "status"`, щоб перелічити активні сеанси або перевірити ID сеансу. Використовуйте -`action: "speak"` із `sessionId` і `message`, щоб realtime-агент -заговорив негайно. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сеанс, +`action: "speak"` із `sessionId` і `message`, щоб агент реального часу +негайно заговорив. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сеанс, запустити відому фразу й повернути стан `inCall`, коли хост Chrome може -повідомити його. `test_speech` завжди примусово встановлює `mode: "realtime"` і завершується помилкою, якщо його просять +його повідомити. `test_speech` завжди примусово встановлює `mode: "realtime"` і завершується помилкою, якщо його просять працювати в `mode: "transcribe"`, тому що сеанси лише для спостереження навмисно не можуть -відтворювати мовлення. Результат `speechOutputVerified` базується на збільшенні байтів realtime-аудіовиходу -під час цього тестового виклику, тому повторно використаний сеанс зі старішим аудіо +відтворювати мовлення. Його результат `speechOutputVerified` ґрунтується на збільшенні байтів +аудіовиходу реального часу під час цього тестового виклику, тому повторно використаний сеанс зі старішим аудіо не зараховується як нова успішна перевірка мовлення. Використовуйте `action: "leave"`, щоб позначити -сеанс завершеним. +сеанс як завершений. -`status` включає стан Chrome, коли він доступний: +`status` містить стан Chrome, коли він доступний: - `inCall`: Chrome, схоже, перебуває всередині виклику Meet -- `micMuted`: найкраща можлива оцінка стану мікрофона Meet +- `micMuted`: найкраще можливе визначення стану мікрофона Meet - `manualActionRequired` / `manualActionReason` / `manualActionMessage`: профілю браузера потрібен ручний вхід, допуск хостом Meet, дозволи або відновлення керування браузером, перш ніж мовлення зможе працювати - `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: чи кероване мовлення Chrome зараз дозволене. `speechReady: false` означає, що OpenClaw - не надіслав вступну/тестову фразу в аудіоміст. -- `providerConnected` / `realtimeReady`: стан realtime-голосового моста -- `lastInputAt` / `lastOutputAt`: останнє аудіо, отримане з моста або надіслане до нього + не надіслав вступну або тестову фразу в аудіоміст. +- `providerConnected` / `realtimeReady`: стан голосового мосту реального часу +- `lastInputAt` / `lastOutputAt`: останнє аудіо, побачене з мосту або надіслане до нього ```json { @@ -987,41 +983,41 @@ Gateway, тому облікові дані моделі залишаються } ``` -## Консультація realtime-агента +## Консультація агента реального часу -Realtime-режим Chrome оптимізований для живого голосового циклу. Realtime-провайдер голосу -чує аудіо зустрічі й говорить через налаштований аудіоміст. -Коли realtime-моделі потрібні глибші міркування, актуальна інформація або звичайні +Режим реального часу Chrome оптимізований для живого голосового циклу. Голосовий +провайдер реального часу чує аудіо зустрічі й говорить через налаштований аудіоміст. +Коли моделі реального часу потрібні глибші міркування, поточна інформація або звичайні інструменти OpenClaw, вона може викликати `openclaw_agent_consult`. Інструмент консультації запускає звичайного агента OpenClaw у фоновому режимі з контекстом -недавньої транскрипції зустрічі й повертає стислу усну відповідь до realtime -голосового сеансу. Потім голосова модель може озвучити цю відповідь у зустрічі. -Він використовує той самий спільний realtime-інструмент консультації, що й Voice Call. +нещодавньої стенограми зустрічі та повертає стислу усну відповідь до голосового сеансу +реального часу. Потім голосова модель може озвучити цю відповідь у зустрічі. +Він використовує той самий спільний інструмент консультації реального часу, що й Voice Call. За замовчуванням консультації виконуються для агента `main`. Встановіть `realtime.agentId`, коли -Meet-лінія має консультуватися зі спеціальним робочим простором агента OpenClaw, типовими моделями, -політикою інструментів, пам’яттю та історією сеансів. +канал Meet має звертатися до виділеного робочого простору агента OpenClaw, стандартів моделі, +політики інструментів, пам’яті та історії сеансів. `realtime.toolPolicy` керує запуском консультації: -- `safe-read-only`: надає інструмент консультації й обмежує звичайного агента +- `safe-read-only`: відкрити інструмент консультації й обмежити звичайного агента `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. -- `owner`: надає інструмент консультації й дозволяє звичайному агенту використовувати нормальну +- `owner`: відкрити інструмент консультації й дозволити звичайному агенту використовувати звичайну політику інструментів агента. -- `none`: не надає інструмент консультації realtime-голосовій моделі. +- `none`: не відкривати інструмент консультації голосовій моделі реального часу. Ключ сеансу консультації обмежений окремим сеансом Meet, тому наступні виклики консультації можуть повторно використовувати попередній контекст консультації під час тієї самої зустрічі. -Щоб примусово запустити усну перевірку готовності після того, як Chrome повністю приєднався до виклику: +Щоб примусово виконати усну перевірку готовності після того, як Chrome повністю приєднався до виклику: ```bash openclaw googlemeet speak meet_... "Say exactly: I'm here and listening." ``` -Для повної перевірки приєднання та мовлення: +Для повної перевірки приєднання й мовлення: ```bash openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ @@ -1031,7 +1027,7 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ ## Контрольний список live-тесту -Використовуйте цю послідовність, перш ніж передавати зустріч автономному агенту: +Використовуйте цю послідовність перед передаванням зустрічі автономному агенту: ```bash openclaw googlemeet setup @@ -1044,11 +1040,11 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ Очікуваний стан Chrome-node: - `googlemeet setup` повністю зелений. -- `googlemeet setup` включає `chrome-node-connected`, коли Chrome-node є - типовим транспортом або вузол закріплено. -- `nodes status` показує, що вибраний вузол підключений. -- Вибраний вузол оголошує і `googlemeet.chrome`, і `browser.proxy`. -- Вкладка Meet приєднується до виклику, а `test-speech` повертає стан Chrome із +- `googlemeet setup` містить `chrome-node-connected`, коли Chrome-node є + транспортом за замовчуванням або Node закріплено. +- `nodes status` показує, що вибраний Node підключено. +- Вибраний Node оголошує і `googlemeet.chrome`, і `browser.proxy`. +- Вкладка Meet приєднується до виклику, а `test-speech` повертає стан Chrome з `inCall: true`. Для віддаленого хоста Chrome, наприклад Parallels macOS VM, це найкоротша @@ -1063,11 +1059,11 @@ openclaw nodes invoke \ --params '{"action":"setup"}' ``` -Це підтверджує, що Plugin Gateway завантажено, вузол VM підключений із +Це доводить, що Plugin Gateway завантажено, Node VM підключений із поточним токеном, а аудіоміст Meet доступний до того, як агент відкриє справжню вкладку зустрічі. -Для перевірки Twilio використовуйте зустріч, яка надає дані телефонного дозвону: +Для перевірки Twilio використовуйте зустріч, яка надає деталі телефонного набору: ```bash openclaw googlemeet setup @@ -1079,7 +1075,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ Очікуваний стан Twilio: -- `googlemeet setup` включає зелені перевірки `twilio-voice-call-plugin`, +- `googlemeet setup` містить зелені перевірки `twilio-voice-call-plugin`, `twilio-voice-call-credentials` і `twilio-voice-call-webhook`. - `voicecall` доступний у CLI після перезавантаження Gateway. - Повернений сеанс має `transport: "twilio"` і `twilio.voiceCallId`. @@ -1099,9 +1095,9 @@ openclaw googlemeet setup Якщо ви щойно відредагували `plugins.entries.google-meet`, перезапустіть або перезавантажте Gateway. Запущений агент бачить лише інструменти Plugin, зареєстровані поточним процесом Gateway. -### Немає підключеного вузла з підтримкою Google Meet +### Немає підключеного Node, здатного працювати з Google Meet -На хості вузла виконайте: +На хості Node виконайте: ```bash openclaw plugins enable google-meet @@ -1110,7 +1106,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node run --host --port 18789 --display-name parallels-macos ``` -На хості Gateway схваліть вузол і перевірте команди: +На хості Gateway схваліть Node і перевірте команди: ```bash openclaw devices list @@ -1118,8 +1114,8 @@ openclaw devices approve openclaw nodes status ``` -Вузол має бути підключений і перелічувати `googlemeet.chrome` плюс `browser.proxy`. -Конфігурація Gateway має дозволяти ці команди вузла: +Node має бути підключений і перелічувати `googlemeet.chrome` разом із `browser.proxy`. +Конфігурація Gateway має дозволяти ці команди Node: ```json5 { @@ -1132,8 +1128,8 @@ openclaw nodes status ``` Якщо `googlemeet setup` не проходить `chrome-node-connected` або журнал Gateway повідомляє -`gateway token mismatch`, перевстановіть або перезапустіть вузол із поточним токеном Gateway. -Для LAN Gateway це зазвичай означає: +`gateway token mismatch`, перевстановіть або перезапустіть Node із поточним токеном Gateway. +Для Gateway у локальній мережі це зазвичай означає: ```bash OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ @@ -1144,7 +1140,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ --force ``` -Потім перезавантажте службу вузла й повторно виконайте: +Потім перезавантажте службу Node і повторно виконайте: ```bash openclaw googlemeet setup @@ -1154,102 +1150,102 @@ openclaw nodes status --connected ### Браузер відкривається, але агент не може приєднатися Запустіть `googlemeet test-speech` і перевірте повернений стан Chrome. Якщо він -повідомляє `manualActionRequired: true`, покажіть `manualActionMessage` оператору -і припиніть повторні спроби, доки дія в браузері не буде завершена. +повідомляє `manualActionRequired: true`, покажіть оператору `manualActionMessage` +і припиніть повторні спроби, доки дію в браузері не буде завершено. Поширені ручні дії: - Увійти в профіль Chrome. -- Допустити гостя з акаунта хоста Meet. -- Надати Chrome дозволи на мікрофон/камеру, коли з’явиться нативний запит дозволу +- Допустити гостя з облікового запису хоста Meet. +- Надати Chrome дозволи на мікрофон/камеру, коли з’являється нативний запит дозволу Chrome. -- Закрити або відновити завислий діалог дозволів Meet. +- Закрити або виправити завислий діалог дозволів Meet. -Не повідомляйте «не виконано вхід» лише тому, що Meet показує «Do you want people to -hear you in the meeting?» Це проміжний екран вибору аудіо Meet; OpenClaw +Не повідомляйте "not signed in" лише тому, що Meet показує "Do you want people to +hear you in the meeting?" Це проміжний екран вибору аудіо Meet; OpenClaw натискає **Use microphone** через автоматизацію браузера, коли це доступно, і продовжує -чекати на реальний стан зустрічі. Для резервного режиму браузера лише для створення OpenClaw +очікувати справжній стан зустрічі. Для резервного варіанта браузера лише для створення OpenClaw може натиснути **Continue without microphone**, тому що створення URL не потребує -realtime-аудіошляху. +аудіошляху реального часу. -### Створення зустрічі завершується помилкою +### Не вдається створити зустріч `googlemeet create` спочатку використовує endpoint Google Meet API `spaces.create`, -коли налаштовано облікові дані OAuth. Без облікових даних OAuth він переходить -до закріпленого браузера вузла Chrome. Підтвердьте: +коли налаштовано облікові дані OAuth. Без облікових даних OAuth він переходить на +закріплений браузер Chrome Node. Підтвердьте: -- Для створення через API: налаштовано `oauth.clientId` і `oauth.refreshToken`, - або наявні відповідні змінні середовища `OPENCLAW_GOOGLE_MEET_*`. -- Для створення через API: refresh token було створено після додавання підтримки створення. +- Для створення через API: `oauth.clientId` і `oauth.refreshToken` налаштовано, + або присутні відповідні змінні середовища `OPENCLAW_GOOGLE_MEET_*`. +- Для створення через API: токен оновлення було створено після додавання підтримки створення. Старішим токенам може бракувати scope `meetings.space.created`; повторно виконайте `openclaw googlemeet auth login --json` і оновіть конфігурацію Plugin. -- Для резервного режиму браузера: `defaultTransport: "chrome-node"` і - `chromeNode.node` вказують на підключений вузол із `browser.proxy` і +- Для резервного варіанта браузера: `defaultTransport: "chrome-node"` і + `chromeNode.node` вказують на підключений Node з `browser.proxy` і `googlemeet.chrome`. -- Для резервного режиму браузера: профіль OpenClaw Chrome на цьому вузлі має виконаний вхід - у Google і може відкрити `https://meet.google.com/new`. -- Для резервного режиму браузера: повторні спроби повторно використовують наявний `https://meet.google.com/new` - або вкладку запиту акаунта Google, перш ніж відкривати нову вкладку. Якщо в агента спливає час очікування, - повторіть виклик інструменту замість ручного відкриття іншої вкладки Meet. -- Для резервного режиму браузера: якщо інструмент повертає `manualActionRequired: true`, використовуйте +- Для резервного варіанта браузера: профіль OpenClaw Chrome на цьому Node виконано вхід + у Google і він може відкрити `https://meet.google.com/new`. +- Для резервного варіанта браузера: повторні спроби повторно використовують наявну вкладку `https://meet.google.com/new` + або вкладку запиту облікового запису Google перед відкриттям нової вкладки. Якщо в агента стається timeout, + повторіть виклик інструмента, а не відкривайте вручну ще одну вкладку 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`. + `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`. ### Агент приєднується, але не говорить -Перевірте realtime-шлях: +Перевірте шлях реального часу: ```bash openclaw googlemeet setup openclaw googlemeet doctor ``` -Використовуйте `mode: "realtime"` для прослуховування/відповіді голосом. `mode: "transcribe"` навмисно -не запускає дуплексний realtime-голосовий міст. `googlemeet test-speech` -завжди перевіряє realtime-шлях і повідомляє, чи були помічені байти виходу моста -для цього виклику. Якщо `speechOutputVerified` має значення false, а -`speechOutputTimedOut` має значення true, realtime-провайдер міг прийняти -висловлювання, але OpenClaw не побачив, щоб нові вихідні байти дійшли до аудіомоста +Використовуйте `mode: "realtime"` для прослуховування й відповіді голосом. `mode: "transcribe"` навмисно +не запускає дуплексний голосовий міст реального часу. `googlemeet test-speech` +завжди перевіряє шлях реального часу й повідомляє, чи були байти виводу мосту +спостережені для цього виклику. Якщо `speechOutputVerified` має значення false, а +`speechOutputTimedOut` має значення true, провайдер реального часу міг прийняти +висловлювання, але OpenClaw не побачив, як нові байти виводу дійшли до аудіомосту Chrome. Також перевірте: -- Ключ realtime-провайдера доступний на хості Gateway, наприклад +- Ключ провайдера реального часу доступний на хості Gateway, наприклад `OPENAI_API_KEY` або `GEMINI_API_KEY`. - `BlackHole 2ch` видимий на хості Chrome. - `sox` існує на хості Chrome. -- Мікрофон і динамік Meet маршрутизуються через віртуальний аудіошлях, який використовує +- Мікрофон і динамік Meet спрямовані через віртуальний аудіошлях, який використовує OpenClaw. -`googlemeet doctor [session-id]` друкує сеанс, вузол, стан перебування у виклику, -причину ручної дії, підключення realtime-провайдера, `realtimeReady`, активність -аудіовходу/виходу, останні часові мітки аудіо, лічильники байтів і URL браузера. +`googlemeet doctor [session-id]` виводить сеанс, Node, стан у виклику, +причину ручної дії, підключення провайдера реального часу, `realtimeReady`, активність +аудіовходу/виходу, останні аудіомітки часу, лічильники байтів і URL браузера. Використовуйте `googlemeet status [session-id] --json`, коли потрібен сирий JSON. Використовуйте -`googlemeet doctor --oauth`, коли потрібно перевірити Google Meet OAuth refresh -без розкриття токенів; додайте `--meeting` або `--create-space`, коли вам також потрібне -підтвердження Google Meet API. +`googlemeet doctor --oauth`, коли потрібно перевірити оновлення OAuth Google Meet +без розкриття токенів; додайте `--meeting` або `--create-space`, коли також потрібен +доказ Google Meet API. -Якщо в агента сплив час очікування й ви бачите вже відкриту вкладку Meet, перевірте цю вкладку -без відкриття нової: +Якщо в агента стався timeout і ви бачите вже відкриту вкладку Meet, перевірте цю вкладку +без відкриття ще однієї: ```bash openclaw googlemeet recover-tab openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij ``` -Еквівалентна дія інструменту — `recover_current_tab`. Вона фокусує та перевіряє +Еквівалентна дія інструмента — `recover_current_tab`. Вона фокусує та перевіряє наявну вкладку Meet для вибраного транспорту. З `chrome` вона використовує локальне керування браузером через Gateway; з `chrome-node` вона використовує налаштований вузол Chrome. Вона не відкриває нову вкладку й не створює новий сеанс; вона повідомляє -поточний блокер, наприклад вхід, допуск, дозволи або стан вибору аудіо. +про поточний блокер, як-от вхід, допуск, дозволи або стан вибору аудіо. Команда CLI звертається до налаштованого Gateway, тому Gateway має бути запущений; -`chrome-node` також вимагає підключеного вузла Chrome. +`chrome-node` також потребує підключеного вузла Chrome. ### Перевірки налаштування Twilio завершуються помилкою @@ -1257,8 +1253,8 @@ openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij Додайте його до `plugins.allow`, увімкніть `plugins.entries.voice-call` і перезавантажте Gateway. -`twilio-voice-call-credentials` завершується помилкою, коли в бекенді Twilio бракує SID -облікового запису, токена автентифікації або номера абонента, що викликає. Задайте їх на хості Gateway: +`twilio-voice-call-credentials` завершується помилкою, коли у бекенді Twilio бракує SID +облікового запису, токена автентифікації або номера абонента-відправника. Задайте їх на хості Gateway: ```bash export TWILIO_ACCOUNT_SID=AC... @@ -1266,12 +1262,12 @@ 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-адреси непридатні для зворотних викликів оператора. Не використовуйте +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`. @@ -1294,7 +1290,7 @@ Loopback і приватні URL-адреси непридатні для зво } ``` -Для локальної розробки використовуйте тунель або експонування Tailscale замість приватної +Для локальної розробки використовуйте тунель або Tailscale-доступ замість приватної URL-адреси хоста: ```json5 @@ -1321,7 +1317,7 @@ openclaw voicecall setup openclaw voicecall smoke ``` -`voicecall smoke` за замовчуванням лише перевіряє готовність. Щоб виконати пробний запуск для певного номера: +`voicecall smoke` за замовчуванням лише перевіряє готовність. Щоб виконати dry-run для конкретного номера: ```bash openclaw voicecall smoke --to "+15555550123" @@ -1334,10 +1330,10 @@ openclaw voicecall smoke --to "+15555550123" 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 \ @@ -1349,53 +1345,54 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ Використовуйте початкові `w` або коми в `--dtmf-sequence`, якщо провайдеру потрібна пауза перед введенням PIN. -Якщо телефонний виклик створено, але список учасників Meet ніколи не показує -учасника телефонного підключення: +Якщо телефонний дзвінок створено, але список учасників Meet так і не показує учасника +з телефонного підключення: -- Виконайте `openclaw voicecall status --call-id ` і переконайтеся, що виклик усе ще +- Виконайте `openclaw voicecall status --call-id ` і переконайтеся, що дзвінок досі активний. -- Виконайте `openclaw voicecall tail` і перевірте, що Webhook Twilio надходять до +- Виконайте `openclaw voicecall tail` і перевірте, що webhook-и Twilio надходять до Gateway. -- Повторно виконайте `openclaw googlemeet setup --transport twilio`; зелена перевірка налаштування - потрібна, але вона не доводить, що послідовність PIN для зустрічі правильна. -- Переконайтеся, що номер телефонного підключення належить до того самого запрошення Meet і регіону, що й +- Повторно виконайте `openclaw googlemeet setup --transport twilio`; успішна перевірка налаштування + обов'язкова, але вона не доводить, що послідовність PIN для зустрічі правильна. +- Переконайтеся, що номер для набору належить до того самого запрошення Meet і регіону, що й PIN. - Збільште початкові паузи в `--dtmf-sequence`, якщо Meet відповідає повільно, наприклад `wwww123456#`. -- Якщо учасник приєднується, але ви пропускаєте першу промовлену фразу, збільште - `plugins.entries.google-meet.config.voiceCall.postDtmfSpeechDelayMs`, щоб вступ прозвучав - після того, як Meet завершить допуск телефонного учасника. +- Якщо учасник приєднується, але ви не чуєте привітання, перевірте + `openclaw voicecall tail` на наявність старту потоку Twilio, після якого realtime + провайдер стає готовим. Привітання тепер генерується з початкового + повідомлення `voicecall.start` після підключення потоку. -Якщо Webhook не надходять, спершу налагодьте Voice Call plugin: провайдер має -дістатися `plugins.entries.voice-call.config.publicUrl` або налаштованого тунелю. -Див. [Усунення несправностей голосових викликів](/uk/plugins/voice-call#troubleshooting). +Якщо webhook-и не надходять, спершу налагодьте Plugin Voice Call: провайдер має +досягати `plugins.entries.voice-call.config.publicUrl` або налаштованого тунелю. +Див. [Усунення несправностей голосових дзвінків](/uk/plugins/voice-call#troubleshooting). ## Примітки -Офіційний медіа API Google Meet орієнтований на отримання, тому для мовлення у виклик Meet -усе ще потрібен шлях учасника. Цей plugin робить цю межу видимою: +Офіційний медіа-API Google Meet орієнтований на отримання, тому для мовлення в дзвінку Meet +усе одно потрібен шлях учасника. Цей plugin робить цю межу явною: Chrome обробляє участь через браузер і локальну маршрутизацію аудіо; Twilio обробляє -участь через телефонне підключення. +участь через телефонний набір. -Режим реального часу Chrome потребує `BlackHole 2ch` плюс одне з такого: +Realtime-режим Chrome потребує `BlackHole 2ch` і одного з такого: -- `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw володіє - мостом моделі реального часу й передає аудіо у `chrome.audioFormat` між цими - командами та вибраним провайдером голосу реального часу. Стандартний шлях Chrome — це - PCM16 24 кГц; G.711 mu-law 8 кГц лишається доступним для застарілих пар команд. -- `chrome.audioBridgeCommand`: зовнішня команда мосту володіє всім локальним +- `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw керує + мостом realtime-моделі та передає аудіо в `chrome.audioFormat` між цими + командами й вибраним realtime-провайдером голосу. Стандартний шлях Chrome — + 24 kHz PCM16; 8 kHz G.711 mu-law лишається доступним для застарілих пар команд. +- `chrome.audioBridgeCommand`: зовнішня команда моста керує всім локальним аудіошляхом і має завершитися після запуску або перевірки свого демона. -Для чистого дуплексного аудіо маршрутизуйте вихід Meet і мікрофон Meet через окремі +Для чистого дуплексного аудіо спрямовуйте вихід Meet і мікрофон Meet через окремі віртуальні пристрої або граф віртуальних пристроїв у стилі Loopback. Один спільний -пристрій BlackHole може відлунювати інших учасників назад у виклик. +пристрій BlackHole може повертати аудіо інших учасників назад у дзвінок. -`googlemeet speak` запускає активний аудіоміст реального часу для сесії Chrome. -`googlemeet leave` зупиняє цей міст. Для сесій Twilio, делегованих через Voice Call plugin, -`leave` також завершує базовий голосовий виклик. +`googlemeet speak` запускає активний realtime-аудіоміст для сеансу Chrome. +`googlemeet leave` зупиняє цей міст. Для сеансів Twilio, делегованих через Plugin Voice Call, +`leave` також завершує базовий голосовий дзвінок. -## Пов’язане +## Пов'язане -- [Voice call plugin](/uk/plugins/voice-call) +- [Plugin голосових дзвінків](/uk/plugins/voice-call) - [Режим розмови](/uk/nodes/talk) - [Створення plugins](/uk/plugins/building-plugins) diff --git a/docs/uk/plugins/voice-call.md b/docs/uk/plugins/voice-call.md index 86ae9ac64..22ccdaf76 100644 --- a/docs/uk/plugins/voice-call.md +++ b/docs/uk/plugins/voice-call.md @@ -1,21 +1,21 @@ --- read_when: - - Ви хочете здійснити вихідний голосовий дзвінок із OpenClaw - - Ви налаштовуєте або розробляєте Plugin voice-call - - Вам потрібен голосовий зв’язок у реальному часі або потокова транскрипція в телефонії + - Ви хочете здійснити вихідний голосовий дзвінок з OpenClaw + - Ви налаштовуєте або розробляєте Plugin голосових викликів + - Вам потрібен голос у реальному часі або потокова транскрипція в телефонії sidebarTitle: Voice call -summary: Здійснюйте вихідні та приймайте вхідні голосові дзвінки через Twilio, Telnyx або Plivo, з опційним голосовим зв’язком у реальному часі та потоковою транскрипцією -title: Plugin голосового виклику +summary: Здійснюйте вихідні та приймайте вхідні голосові виклики через Twilio, Telnyx або Plivo з необов’язковим голосовим зв’язком у реальному часі та потоковою транскрипцією +title: Plugin голосових викликів x-i18n: - generated_at: "2026-05-01T05:59:37Z" + generated_at: "2026-05-01T06:08:46Z" model: gpt-5.5 provider: openai - source_hash: ce208e4c23e6ac6f844dce23a7e6a565b4deb1f32b8018aae7f56ea196d5245c + source_hash: 756e0fe4ec11d21175adabd976b8afbbc4a13caef322bbed2348a4bb928ca268 source_path: plugins/voice-call.md workflow: 16 --- -Голосові виклики для OpenClaw через Plugin. Підтримує вихідні сповіщення, +Voice calls для OpenClaw через Plugin. Підтримує вихідні сповіщення, багатоетапні розмови, повнодуплексний голос у реальному часі, потокову транскрипцію та вхідні виклики з політиками списку дозволених. @@ -24,22 +24,22 @@ x-i18n: speech), `mock` (розробка/без мережі). -Voice Call Plugin працює **всередині процесу Gateway**. Якщо ви використовуєте -віддалений Gateway, установіть і налаштуйте Plugin на машині, де запущено +Plugin Voice Call працює **всередині процесу Gateway**. Якщо ви використовуєте +віддалений Gateway, установіть і налаштуйте Plugin на машині, де працює Gateway, а потім перезапустіть Gateway, щоб завантажити його. ## Швидкий старт - + - + ```bash openclaw plugins install @openclaw/voice-call ``` - + ```bash PLUGIN_SRC=./path/to/local/voice-call-plugin openclaw plugins install "$PLUGIN_SRC" @@ -48,39 +48,38 @@ Gateway, а потім перезапустіть Gateway, щоб заванта - Якщо npm повідомляє, що пакет, яким володіє OpenClaw, застарілий, ця версія пакета - походить зі старішої зовнішньої лінійки пакетів; використовуйте поточну - пакетовану збірку OpenClaw або шлях до локальної папки, доки не буде - опубліковано новіший npm-пакет. + Якщо npm повідомляє, що пакет, який належить OpenClaw, застарілий, ця версія пакета + походить зі старішої зовнішньої лінійки пакетів; використовуйте поточну упаковану збірку OpenClaw + або шлях до локальної папки, доки не буде опубліковано новіший пакет npm. Після цього перезапустіть Gateway, щоб Plugin завантажився. - - Задайте конфігурацію в `plugins.entries.voice-call.config` (повну структуру див. + + Установіть конфігурацію в `plugins.entries.voice-call.config` (повну структуру див. у розділі [Конфігурація](#configuration) нижче). Мінімально потрібні: `provider`, облікові дані провайдера, `fromNumber` і публічно - доступна URL-адреса Webhook. + доступна URL-адреса webhook. - + ```bash openclaw voicecall setup ``` - Типовий вивід зручно читати в журналах чату й терміналах. Він перевіряє - ввімкнення Plugin, облікові дані провайдера, доступність Webhook і те, що + Типовий вивід зручно читати в журналах чату та терміналах. Він перевіряє + увімкнення Plugin, облікові дані провайдера, доступність webhook і те, що активний лише один аудіорежим (`streaming` або `realtime`). Використовуйте `--json` для скриптів. - + ```bash openclaw voicecall smoke openclaw voicecall smoke --to "+15555550123" ``` - Обидві команди за замовчуванням виконуються як пробні запуски. Додайте `--yes`, - щоб фактично виконати короткий вихідний виклик-сповіщення: + Обидві команди за замовчуванням є сухими запусками. Додайте `--yes`, щоб фактично здійснити короткий + вихідний виклик зі сповіщенням: ```bash openclaw voicecall smoke --to "+15555550123" --yes @@ -90,21 +89,21 @@ Gateway, а потім перезапустіть Gateway, щоб заванта -Для Twilio, Telnyx і Plivo налаштування має визначатися як **публічна URL-адреса Webhook**. +Для Twilio, Telnyx і Plivo налаштування має визначати **публічну URL-адресу webhook**. Якщо `publicUrl`, URL тунелю, URL Tailscale або резервний варіант serve -визначається як local loopback або простір приватної мережі, налаштування завершується -помилкою замість запуску провайдера, який не може отримувати Webhook від операторів. +визначається як loopback або приватний мережевий простір, налаштування завершується помилкою замість +запуску провайдера, який не може отримувати webhook від оператора. ## Конфігурація Якщо `enabled: true`, але для вибраного провайдера бракує облікових даних, -під час запуску Gateway записує попередження про неповне налаштування з відсутніми -ключами та пропускає запуск середовища виконання. Команди, RPC-виклики та інструменти -агента все одно повертають точну відсутню конфігурацію провайдера під час використання. +під час запуску Gateway записує попередження про неповне налаштування з відсутніми ключами та +пропускає запуск середовища виконання. Команди, виклики RPC та інструменти агента все одно +повертають точну відсутню конфігурацію провайдера під час використання. -Облікові дані голосових викликів підтримують SecretRefs. `plugins.entries.voice-call.config.twilio.authToken` і `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.tts.providers.*.apiKey` визначаються через стандартну поверхню SecretRef; див. [поверхню облікових даних SecretRef](/uk/reference/secretref-credential-surface). ```json5 @@ -165,29 +164,29 @@ Gateway, а потім перезапустіть Gateway, щоб заванта ``` - - - Twilio, Telnyx і Plivo всі потребують **публічно доступної** URL-адреси Webhook. - - `mock` — локальний провайдер для розробки (без мережевих викликів). - - Telnyx потребує `telnyx.publicKey` (або `TELNYX_PUBLIC_KEY`), якщо `skipSignatureVerification` не має значення true. + + - 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` є local loopback (локальний агент ngrok). Лише для локальної розробки. - - URL-адреси безплатного рівня ngrok можуть змінюватися або додавати проміжну поведінку; якщо `publicUrl` зміщується, підписи Twilio не проходять перевірку. Для продакшену віддавайте перевагу стабільному домену або тунелю Tailscale. + - На безкоштовному рівні ngrok установіть `publicUrl` на точну URL-адресу ngrok; перевірка підпису завжди примусова. + - `tunnel.allowNgrokFreeTierLoopbackBypass: true` дозволяє webhook Twilio з недійсними підписами **лише** коли `tunnel.provider="ngrok"` і `serve.bind` є loopback (локальний агент ngrok). Лише для локальної розробки. + - URL-адреси безкоштовного рівня ngrok можуть змінюватися або додавати проміжну сторінку; якщо `publicUrl` зміститься, підписи Twilio не пройдуть перевірку. Для продакшну: віддавайте перевагу стабільному домену або Tailscale funnel. - + - `streaming.preStartTimeoutMs` закриває сокети, які ніколи не надсилають дійсний кадр `start`. - `streaming.maxPendingConnections` обмежує загальну кількість неавтентифікованих сокетів до старту. - `streaming.maxPendingConnectionsPerIp` обмежує кількість неавтентифікованих сокетів до старту для кожної IP-адреси джерела. - `streaming.maxConnections` обмежує загальну кількість відкритих сокетів медіапотоку (очікуваних + активних). - + Старіші конфігурації, що використовують `provider: "log"`, `twilio.from` або застарілі ключі OpenAI `streaming.*`, переписуються командою `openclaw doctor --fix`. - Резервний шлях середовища виконання поки що все ще приймає старі ключі voice-call, але - шлях переписування — це `openclaw doctor --fix`, а шар сумісності - тимчасовий. + Резервний варіант середовища виконання поки що приймає старі ключі voice-call, але + шлях переписування — це `openclaw doctor --fix`, а сумісний shim є + тимчасовим. Автоматично мігровані ключі streaming: @@ -203,8 +202,8 @@ Gateway, а потім перезапустіть Gateway, щоб заванта ## Голосові розмови в реальному часі `realtime` вибирає повнодуплексного голосового провайдера реального часу для живого аудіо -виклику. Це окремо від `streaming`, який лише пересилає аудіо до -провайдерів транскрипції в реальному часі. +виклику. Він окремий від `streaming`, який лише пересилає аудіо до +провайдерів транскрипції реального часу. `realtime.enabled` не можна поєднувати з `streaming.enabled`. Виберіть один @@ -214,12 +213,12 @@ Gateway, а потім перезапустіть Gateway, щоб заванта Поточна поведінка середовища виконання: - `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.provider` указує на незареєстрованого провайдера або взагалі не зареєстровано жодного голосового провайдера реального часу, Voice Call записує попередження й пропускає медіа реального часу замість того, щоб завершувати роботу всього Plugin помилкою. -- Ключі сеансу консультації повторно використовують наявний голосовий сеанс, коли він доступний, а потім повертаються до номера телефону абонента/одержувача, щоб подальші консультаційні виклики зберігали контекст під час виклику. +- `realtime.provider` є необов’язковим. Якщо його не задано, Voice Call використовує першого зареєстрованого голосового провайдера реального часу. +- Вбудовані голосові провайдери реального часу: Google Gemini Live (`google`) і OpenAI (`openai`), зареєстровані їхніми Plugin провайдера. +- Сира конфігурація, що належить провайдеру, розміщується в `realtime.providers.`. +- Voice Call за замовчуванням надає спільний інструмент реального часу `openclaw_agent_consult`. Модель реального часу може викликати його, коли абонент просить глибшого міркування, актуальної інформації або звичайних інструментів OpenClaw. +- Якщо `realtime.provider` вказує на незареєстрованого провайдера або жоден голосовий провайдер реального часу взагалі не зареєстрований, Voice Call записує попередження й пропускає медіа реального часу замість того, щоб завершувати весь Plugin помилкою. +- Ключі сесії консультації повторно використовують наявну голосову сесію, коли вона доступна, а потім повертаються до номера телефону абонента/одержувача, щоб подальші консультаційні виклики зберігали контекст під час виклику. ### Політика інструментів @@ -227,9 +226,9 @@ Gateway, а потім перезапустіть Gateway, щоб заванта | Політика | Поведінка | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| `safe-read-only` | Відкрити інструмент консультації та обмежити звичайного агента до `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. | -| `owner` | Відкрити інструмент консультації та дозволити звичайному агенту використовувати нормальну політику інструментів агента. | -| `none` | Не відкривати інструмент консультації. Користувацькі `realtime.tools` все одно передаються провайдеру реального часу. | +| `safe-read-only` | Надає інструмент консультації та обмежує звичайного агента до `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. | +| `owner` | Надає інструмент консультації та дозволяє звичайному агенту використовувати звичайну політику інструментів агента. | +| `none` | Не надає інструмент консультації. Користувацькі `realtime.tools` все одно передаються провайдеру реального часу. | ### Приклади провайдерів реального часу @@ -292,21 +291,21 @@ Gateway, а потім перезапустіть Gateway, щоб заванта -Див. [провайдера Google](/uk/providers/google) і -[провайдера OpenAI](/uk/providers/openai), щоб переглянути параметри голосу -реального часу, специфічні для провайдера. +Див. [провайдер Google](/uk/providers/google) і +[провайдер OpenAI](/uk/providers/openai) для параметрів голосу реального часу, +специфічних для провайдера. ## Потокова транскрипція -`streaming` вибирає провайдера транскрипції в реальному часі для живого аудіо виклику. +`streaming` вибирає провайдера транскрипції реального часу для живого аудіо виклику. Поточна поведінка середовища виконання: -- `streaming.provider` необов’язковий. Якщо його не задано, Voice Call використовує першого зареєстрованого провайдера транскрипції в реальному часі. -- Вбудовані провайдери транскрипції в реальному часі: Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) і xAI (`xai`), зареєстровані їхніми провайдерськими Plugin. -- Необроблена конфігурація, якою володіє провайдер, розміщується в `streaming.providers.`. -- Після того як Twilio надсилає прийняте повідомлення `start` потоку, Voice Call негайно реєструє потік, ставить вхідні медіа в чергу через провайдера транскрипції, поки провайдер підключається, і запускає початкове привітання лише після готовності транскрипції в реальному часі. -- Якщо `streaming.provider` указує на незареєстрованого провайдера або жоден не зареєстрований, Voice Call записує попередження й пропускає потокове передавання медіа замість того, щоб завершувати роботу всього Plugin помилкою. +- `streaming.provider` є необов’язковим. Якщо його не задано, Voice Call використовує першого зареєстрованого провайдера транскрипції реального часу. +- Вбудовані провайдери транскрипції реального часу: Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) і xAI (`xai`), зареєстровані їхніми Plugin провайдера. +- Сира конфігурація, що належить провайдеру, розміщується в `streaming.providers.`. +- Після того як Twilio надсилає прийняте повідомлення `start` потоку, Voice Call негайно реєструє потік, ставить вхідні медіа в чергу через провайдера транскрипції, поки провайдер підключається, і починає початкове привітання лише після готовності транскрипції реального часу. +- Якщо `streaming.provider` вказує на незареєстрованого провайдера або жоден не зареєстрований, Voice Call записує попередження й пропускає потокове медіа замість того, щоб завершувати весь Plugin помилкою. ### Приклади провайдерів streaming @@ -344,7 +343,7 @@ Gateway, а потім перезапустіть Gateway, щоб заванта - Типові значення: ключ API `streaming.providers.xai.apiKey` або `XAI_API_KEY`; + За замовчуванням: ключ API `streaming.providers.xai.apiKey` або `XAI_API_KEY`; кінцева точка `wss://api.x.ai/v1/stt`; кодування `mulaw`; частота дискретизації `8000`; `endpointingMs: 800`; `interimResults: true`. @@ -376,11 +375,11 @@ Gateway, а потім перезапустіть Gateway, щоб заванта -## TTS для викликів +## TTS для дзвінків Voice Call використовує основну конфігурацію `messages.tts` для потокового -мовлення у викликах. Її можна перевизначити в конфігурації Plugin з -**такою самою формою** — вона глибоко обʼєднується з `messages.tts`. +мовлення під час дзвінків. Ви можете перевизначити її в конфігурації Plugin з +**тією самою структурою** — вона глибоко об’єднується з `messages.tts`. ```json5 { @@ -397,22 +396,22 @@ Voice Call використовує основну конфігурацію `mes ``` -**Microsoft speech ігнорується для голосових викликів.** Телефонне аудіо потребує PCM; +**Мовлення Microsoft ігнорується для голосових дзвінків.** Телефонному аудіо потрібен PCM; поточний транспорт Microsoft не надає телефонний PCM-вивід. Примітки щодо поведінки: -- Застарілі ключі `tts.` у конфігурації Plugin (`openai`, `elevenlabs`, `microsoft`, `edge`) виправляються за допомогою `openclaw doctor --fix`; закомічена конфігурація має використовувати `tts.providers.`. -- Основний 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`) для налагодження. -- Коли Twilio barge-in або демонтаж потоку очищає чергу TTS, що очікує, запити відтворення в черзі завершуються, а не залишають абонентів у підвішеному стані в очікуванні завершення відтворення. +- Коли втручання Twilio або демонтаж потоку очищує чергу очікування TTS, запити на відтворення в черзі завершуються, а не залишають абонентів, які очікують завершення відтворення, у підвішеному стані. ### Приклади TTS - + ```json5 { messages: { @@ -426,7 +425,7 @@ Voice Call використовує основну конфігурацію `mes } ``` - + ```json5 { plugins: { @@ -450,7 +449,7 @@ Voice Call використовує основну конфігурацію `mes } ``` - + ```json5 { plugins: { @@ -487,63 +486,58 @@ Voice Call використовує основну конфігурацію `mes ``` -`inboundPolicy: "allowlist"` — це перевірка caller ID з низьким рівнем гарантії. Plugin -нормалізує надане провайдером значення `From` і порівнює його з -`allowFrom`. Перевірка Webhook автентифікує доставку провайдера та -цілісність payload, але вона **не** доводить володіння номером абонента -PSTN/VoIP. Сприймайте `allowFrom` як фільтрацію caller ID, а не як надійну -ідентичність абонента. +`inboundPolicy: "allowlist"` — це перевірка ідентифікатора абонента з низьким рівнем надійності. Plugin нормалізує надане провайдером значення `From` і порівнює його з `allowFrom`. Перевірка Webhook автентифікує доставку провайдером і цілісність корисного навантаження, але **не** доводить право власності на номер абонента PSTN/VoIP. Розглядайте `allowFrom` як фільтрацію ідентифікатора абонента, а не як надійну ідентичність абонента. -Автовідповіді використовують агентну систему. Налаштовуйте за допомогою `responseModel`, +Автовідповіді використовують систему агентів. Налаштовуйте за допомогою `responseModel`, `responseSystemPrompt` і `responseTimeoutMs`. -### Контракт мовленнєвого виводу +### Контракт озвученого виводу -Для автовідповідей Voice Call додає суворий контракт мовленнєвого виводу до -системного prompt: +Для автовідповідей Voice Call додає до системного запиту суворий контракт +озвученого виводу: ```text {"spoken":"..."} ``` -Voice Call захисно витягує текст мовлення: +Voice Call обережно витягує текст для мовлення: -- Ігнорує payload, позначені як вміст reasoning/error. -- Розбирає прямий JSON, JSON у fenced-блоці або inline-ключі `"spoken"`. -- Повертається до plain text і видаляє ймовірні вступні абзаци планування/метаданих. +- Ігнорує корисні навантаження, позначені як вміст міркувань/помилок. +- Розбирає прямий JSON, JSON у блоці коду або вбудовані ключі `"spoken"`. +- Повертається до звичайного тексту й видаляє ймовірні вступні абзаци з плануванням/метаданими. -Це утримує мовленнєве відтворення сфокусованим на тексті для абонента й запобігає +Це утримує озвучене відтворення зосередженим на тексті для абонента та запобігає потраплянню тексту планування в аудіо. ### Поведінка запуску розмови -Для вихідних викликів `conversation` обробка першого повідомлення привʼязана до поточного -стану відтворення: +Для вихідних викликів `conversation` обробка першого повідомлення прив'язана до стану +живого відтворення: -- Очищення черги barge-in і автовідповідь пригнічуються лише тоді, коли початкове привітання активно озвучується. -- Якщо початкове відтворення зазнає невдачі, виклик повертається до `listening`, а початкове повідомлення лишається в черзі для повторної спроби. -- Початкове відтворення для потокового Twilio починається під час підключення потоку без додаткової затримки. -- Barge-in перериває активне відтворення й очищає записи Twilio TTS у черзі, які ще не відтворюються. Очищені записи завершуються як пропущені, тож логіка подальшої відповіді може продовжити роботу без очікування аудіо, яке ніколи не відтвориться. -- Розмови realtime voice використовують власний початковий хід realtime-потоку. Voice Call **не** надсилає legacy-оновлення TwiML `` для цього початкового повідомлення, тож вихідні сеанси `` залишаються підключеними. +- Очищення черги під час перебивання та автовідповідь пригнічуються лише тоді, коли початкове привітання активно озвучується. +- Якщо початкове відтворення не вдається, виклик повертається до стану `listening`, а початкове повідомлення залишається в черзі для повторної спроби. +- Початкове відтворення для потокової передачі Twilio починається під час підключення потоку без додаткової затримки. +- Перебивання перериває активне відтворення й очищає поставлені в чергу, але ще не відтворювані записи Twilio TTS. Очищені записи завершуються як пропущені, тому логіка подальшої відповіді може продовжити роботу, не чекаючи аудіо, яке ніколи не буде відтворене. +- Голосові розмови в реальному часі використовують власний початковий хід потоку реального часу. Voice Call **не** надсилає застаріле оновлення TwiML `` для цього початкового повідомлення, тому вихідні сеанси `` залишаються підключеними. ### Пільговий період відключення потоку Twilio Коли медіапотік Twilio відключається, Voice Call чекає **2000 мс** перед автоматичним завершенням виклику: -- Якщо потік повторно підключається протягом цього вікна, автоматичне завершення скасовується. -- Якщо після пільгового періоду жоден потік не зареєструється повторно, виклик завершується, щоб запобігти завислим активним викликам. +- Якщо потік повторно підключається протягом цього вікна, автозавершення скасовується. +- Якщо після пільгового періоду жоден потік не реєструється повторно, виклик завершується, щоб запобігти завислим активним викликам. -## Reaper застарілих викликів +## Прибирач застарілих викликів Використовуйте `staleCallReaperSeconds`, щоб завершувати виклики, які ніколи не отримують термінальний -Webhook (наприклад, виклики в режимі сповіщення, які ніколи не завершуються). Типове значення -— `0` (вимкнено). +webhook (наприклад, виклики в режимі сповіщення, які ніколи не завершуються). Типове значення +становить `0` (вимкнено). Рекомендовані діапазони: -- **Production:** `120`–`300` секунд для потоків у стилі сповіщень. +- **Продакшн:** `120`–`300` секунд для потоків у стилі сповіщень. - Тримайте це значення **вищим за `maxDurationSeconds`**, щоб звичайні виклики могли завершитися. Добра початкова точка — `maxDurationSeconds + 30–60` секунд. ```json5 @@ -564,25 +558,25 @@ Webhook (наприклад, виклики в режимі сповіщення ## Безпека Webhook Коли проксі або тунель розташований перед Gateway, plugin -відновлює публічний URL для перевірки підпису. Ці параметри +відтворює публічний URL для перевірки підпису. Ці параметри керують тим, яким пересланим заголовкам можна довіряти: - Список дозволених хостів із заголовків пересилання. + Список дозволених хостів із заголовків переспрямування. - Довіряти пересланим заголовкам без списку дозволених. + Довіряти пересланим заголовкам без списку дозволених хостів. Довіряти пересланим заголовкам лише тоді, коли віддалена IP-адреса запиту збігається зі списком. -Додаткові засоби захисту: +Додаткові захисти: -- Захист від **повторного відтворення Webhook** увімкнено для Twilio і Plivo. Повторно відтворені дійсні запити Webhook підтверджуються, але пропускаються для побічних ефектів. -- Ходи розмови Twilio містять токен для кожного ходу в зворотних викликах ``, тому застарілі або повторно відтворені мовленнєві зворотні виклики не можуть задовольнити новіший очікуваний хід транскрипта. +- **Захист від повторного відтворення** Webhook увімкнено для Twilio і Plivo. Повторно відтворені дійсні запити Webhook підтверджуються, але пропускаються для побічних ефектів. +- Ходи розмови Twilio містять токен для кожного ходу в callback-викликах ``, тому застарілі або повторно відтворені callback-виклики мовлення не можуть задовольнити новіший очікуваний хід транскрипта. - Неавтентифіковані запити Webhook відхиляються до читання тіла, якщо відсутні обов’язкові заголовки підпису провайдера. -- Webhook voice-call використовує спільний профіль тіла до автентифікації (64 КБ / 5 секунд) плюс обмеження одночасних запитів для кожної IP-адреси перед перевіркою підпису. +- Webhook voice-call використовує спільний профіль тіла до автентифікації (64 КБ / 5 секунд) плюс ліміт одночасних запитів на IP перед перевіркою підпису. Приклад зі стабільним публічним хостом: @@ -618,10 +612,10 @@ openclaw voicecall latency # summarize turn latency from lo openclaw voicecall expose --mode funnel ``` -Коли Gateway вже запущено, операційні команди `voicecall` делегують -runtime voice-call, яким володіє Gateway, щоб CLI не прив’язував другий -сервер Webhook. Якщо Gateway недоступний, команди переходять до -автономного runtime CLI. +Коли Gateway уже запущено, операційні команди `voicecall` делегують +до runtime voice-call, що належить Gateway, тому CLI не прив’язує другий +сервер Webhook. Якщо Gateway недоступний, команди повертаються до +самостійного runtime CLI. `latency` читає `calls.jsonl` зі стандартного шляху сховища voice-call. Використовуйте `--file `, щоб указати інший журнал, і `--last `, щоб обмежити @@ -641,11 +635,11 @@ runtime voice-call, яким володіє Gateway, щоб CLI не прив’ | `end_call` | `callId` | | `get_status` | `callId` | -Цей repo постачається з відповідним документом Skills у `skills/voice-call/SKILL.md`. +Цей репозиторій постачає відповідний документ skill за адресою `skills/voice-call/SKILL.md`. -## RPC Gateway +## Gateway RPC -| Метод | Аргументи | +| Метод | Аргументи | | -------------------- | ------------------------- | | `voicecall.initiate` | `to?`, `message`, `mode?` | | `voicecall.continue` | `callId`, `message` | @@ -656,7 +650,7 @@ runtime voice-call, яким володіє Gateway, щоб CLI не прив’ ## Усунення несправностей -### Налаштування не може відкрити Webhook назовні +### Налаштування не проходить перевірку доступності Webhook Запускайте налаштування з того самого середовища, у якому працює Gateway: @@ -666,12 +660,12 @@ openclaw voicecall setup --json ``` Для `twilio`, `telnyx` і `plivo` `webhook-exposure` має бути зеленим. Налаштований -`publicUrl` усе одно не працює, якщо він указує на локальний або приватний мережевий -простір, оскільки оператор не може виконати зворотний виклик на ці адреси. Не використовуйте +`publicUrl` усе одно не проходить перевірку, коли вказує на локальний або приватний мережевий +простір, тому що оператор не може виконати 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`. -Використовуйте один публічний шлях доступу: +Використовуйте один шлях публічного доступу: ```json5 { @@ -691,16 +685,16 @@ openclaw voicecall setup --json } ``` -Після зміни конфігурації перезапустіть або перезавантажте Gateway, а потім виконайте: +Після зміни конфігурації перезапустіть або перезавантажте Gateway, а потім запустіть: ```bash openclaw voicecall setup openclaw voicecall smoke ``` -`voicecall smoke` — це пробний запуск, якщо не передати `--yes`. +`voicecall smoke` є пробним запуском, якщо не передати `--yes`. -### Облікові дані провайдера не працюють +### Облікові дані провайдера не проходять перевірку Перевірте вибраного провайдера та обов’язкові поля облікових даних: @@ -710,17 +704,19 @@ openclaw voicecall smoke `fromNumber`. - Plivo: `plivo.authId`, `plivo.authToken` і `fromNumber`. -Облікові дані мають існувати на хості Gateway. Редагування локального профілю оболонки не впливає на вже запущений Gateway, доки він не перезапуститься або не перезавантажить своє середовище. +Облікові дані мають існувати на хості Gateway. Редагування локального профілю оболонки +не впливає на вже запущений Gateway, доки він не перезапуститься або не перезавантажить своє +середовище. -### Виклики запускаються, але Webhook постачальника не надходять +### Виклики запускаються, але Webhook-и постачальника не надходять -Переконайтеся, що консоль постачальника вказує на точну публічну URL-адресу Webhook: +Підтвердьте, що консоль постачальника вказує на точну публічну URL-адресу Webhook: ```text https://voice.example.com/voice/webhook ``` -Потім перевірте стан під час виконання: +Потім перевірте стан виконання: ```bash openclaw voicecall status --call-id @@ -732,23 +728,30 @@ openclaw voicecall tail - `publicUrl` вказує на інший шлях, ніж `serve.path`. - URL тунелю змінилася після запуску Gateway. - Проксі переспрямовує запит, але видаляє або переписує заголовки host/proto. -- Фаєрвол або DNS спрямовує публічне ім’я хоста не на Gateway. +- Брандмауер або DNS спрямовує публічне ім’я хоста не до Gateway. - Gateway було перезапущено без увімкненого Plugin Voice Call. -Коли перед Gateway стоїть зворотний проксі або тунель, установіть `webhookSecurity.allowedHosts` на публічне ім’я хоста або використайте `webhookSecurity.trustedProxyIPs` для відомої адреси проксі. Використовуйте `webhookSecurity.trustForwardingHeaders` лише тоді, коли межа проксі перебуває під вашим контролем. +Коли перед Gateway стоїть зворотний проксі або тунель, установіть +`webhookSecurity.allowedHosts` на публічне ім’я хоста або використовуйте +`webhookSecurity.trustedProxyIPs` для відомої адреси проксі. Використовуйте +`webhookSecurity.trustForwardingHeaders` лише тоді, коли межа проксі перебуває під +вашим контролем. -### Помилка перевірки підпису +### Перевірка підпису не вдається -Підписи постачальника перевіряються відносно публічної URL-адреси, яку OpenClaw відтворює з вхідного запиту. Якщо перевірка підписів не проходить: +Підписи постачальника перевіряються за публічною URL-адресою, яку OpenClaw відтворює +з вхідного запиту. Якщо підписи не проходять перевірку: -- Переконайтеся, що URL Webhook постачальника точно збігається з `publicUrl`, включно зі схемою, хостом і шляхом. -- Для URL ngrok безкоштовного рівня оновлюйте `publicUrl`, коли змінюється ім’я хоста тунелю. -- Переконайтеся, що проксі зберігає оригінальні заголовки host і proto, або налаштуйте `webhookSecurity.allowedHosts`. +- Підтвердьте, що URL Webhook постачальника точно відповідає `publicUrl`, зокрема + схемі, хосту та шляху. +- Для URL безкоштовного рівня ngrok оновлюйте `publicUrl`, коли ім’я хоста тунелю змінюється. +- Переконайтеся, що проксі зберігає початкові заголовки host і proto, або налаштуйте + `webhookSecurity.allowedHosts`. - Не вмикайте `skipSignatureVerification` поза локальним тестуванням. -### Не вдається приєднатися до Google Meet через Twilio +### Не вдається приєднання Google Meet через Twilio -Google Meet використовує цей Plugin для приєднань через набір Twilio. Спершу перевірте Voice Call: +Google Meet використовує цей Plugin для приєднань через набір номера Twilio. Спочатку перевірте Voice Call: ```bash openclaw voicecall setup @@ -761,20 +764,27 @@ openclaw voicecall smoke --to "+15555550123" openclaw googlemeet setup --transport twilio ``` -Якщо Voice Call працює коректно, але учасник Meet так і не приєднується, перевірте номер для дозвону Meet, PIN і `--dtmf-sequence`. Телефонний виклик може бути справним, тоді як зустріч відхиляє або ігнорує неправильну послідовність DTMF. +Якщо Voice Call працює справно, але учасник Meet так і не приєднується, перевірте номер +для набору Meet, PIN і `--dtmf-sequence`. Телефонний виклик може бути справним, тоді як +зустріч відхиляє або ігнорує неправильну DTMF-послідовність. -Google Meet непомітно запускає Voice Call, надсилає DTMF, а потім просить Voice Call озвучити вступ після `voiceCall.postDtmfSpeechDelayMs`. Збільште цю затримку в конфігурації Plugin Google Meet, якщо перший рядок озвучується до того, як Meet допускає телефонного учасника. +Google Meet передає DTMF-послідовність Meet і вступний текст до `voicecall.start`. +Для викликів Twilio Voice Call спочатку віддає DTMF TwiML, переспрямовує назад до +Webhook, а потім відкриває медіапотік у реальному часі, щоб збережений вступ було згенеровано +після того, як телефонний учасник приєднався до зустрічі. -### У realtime-виклику немає мовлення +### У виклику в реальному часі немає мовлення -Переконайтеся, що ввімкнено лише один аудіорежим. `realtime.enabled` і `streaming.enabled` не можуть одночасно мати значення true. +Підтвердьте, що ввімкнено лише один аудіорежим. `realtime.enabled` і +`streaming.enabled` не можуть одночасно мати значення true. -Для realtime-викликів Twilio також перевірте: +Для викликів Twilio у реальному часі також перевірте: -- Plugin realtime-постачальника завантажено й зареєстровано. -- `realtime.provider` не задано або містить назву зареєстрованого постачальника. +- Plugin постачальника реального часу завантажено й зареєстровано. +- `realtime.provider` не задано або він називає зареєстрованого постачальника. - API-ключ постачальника доступний процесу Gateway. -- `openclaw voicecall tail` показує, що медіапотік прийнято, а realtime-постачальник готовий до початкового привітання. +- `openclaw voicecall tail` показує, що медіапотік прийнято, а постачальник реального часу + готовий до початкового привітання. ## Пов’язане