From 034f52b42738959dae8bf8652e345079d9b23615 Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Fri, 1 May 2026 05:56:14 +0000 Subject: [PATCH] chore(i18n): refresh uk translations --- docs/uk/gateway/logging.md | 108 ++--- docs/uk/logging.md | 168 +++---- docs/uk/plugins/google-meet.md | 806 +++++++++++++++++++-------------- docs/uk/plugins/voice-call.md | 372 ++++++++++----- 4 files changed, 859 insertions(+), 595 deletions(-) diff --git a/docs/uk/gateway/logging.md b/docs/uk/gateway/logging.md index d02ea85b3..6a2d27040 100644 --- a/docs/uk/gateway/logging.md +++ b/docs/uk/gateway/logging.md @@ -1,101 +1,101 @@ --- read_when: - - Зміна виводу або форматів журналювання - - Налагодження виводу CLI або gateway -summary: Поверхні логування, файлові журнали, стилі журналів WS і форматування консолі + - Зміна виводу або форматів логування + - Налагодження виводу CLI або Gateway +summary: Інтерфейси журналювання, файлові журнали, стилі журналів WS і форматування консолі title: Журналювання Gateway x-i18n: - generated_at: "2026-04-27T23:13:06Z" - model: gpt-5.4 + generated_at: "2026-05-01T05:53:12Z" + model: gpt-5.5 provider: openai - source_hash: 9ce9c78201d2e26760282b08eacb17826b1eac84e80b99d3a9d5cbff4078b5b3 + source_hash: f843812a41c25f9ca1884543ad3a5663c8e0bc327027cbd2b58ea6557c466aa9 source_path: gateway/logging.md - workflow: 15 + workflow: 16 --- # Журналювання -Огляд для користувачів (CLI + Control UI + конфігурація) див. у [/logging](/uk/logging). +Огляд для користувачів (CLI + інтерфейс керування + конфігурація) див. у [/logging](/uk/logging). -OpenClaw має дві «поверхні» журналювання: +OpenClaw має дві “поверхні” журналів: -- **Вивід у консоль** (те, що ви бачите в терміналі / Debug UI). -- **Файлові журнали** (рядки JSON), які записує реєстратор Gateway. +- **Вивід у консоль** (те, що ви бачите в терміналі / інтерфейсі налагодження). +- **Файлові журнали** (рядки JSON), які записує логер Gateway. -## Файловий реєстратор +## Файловий логер -- Типовий файл журналу з ротацією розміщується в `/tmp/openclaw/` (один файл на день): `openclaw-YYYY-MM-DD.log` - - Дата використовує локальний часовий пояс хоста gateway. -- Активні файли журналів ротуються на `logging.maxFileBytes` (типово: 100 MB), із збереженням - до п’яти нумерованих архівів і продовженням запису в новий активний файл. -- Шлях до файла журналу й рівень можна налаштувати через `~/.openclaw/openclaw.json`: +- Типовий ротаційний файл журналу розташований у `/tmp/openclaw/` (один файл на день): `openclaw-YYYY-MM-DD.log` + - Дата використовує локальний часовий пояс хоста Gateway. +- Активні файли журналу ротуються при `logging.maxFileBytes` (типово: 100 МБ), зберігаючи + до п’яти нумерованих архівів і продовжуючи запис у новий активний файл. +- Шлях до файла журналу та рівень можна налаштувати через `~/.openclaw/openclaw.json`: - `logging.file` - `logging.level` Формат файла — один об’єкт JSON на рядок. -Вкладка Logs у Control UI відстежує цей файл через gateway (`logs.tail`). +Вкладка журналів інтерфейсу керування стежить за цим файлом через Gateway (`logs.tail`). CLI може робити те саме: ```bash openclaw logs --follow ``` -**Докладний режим і рівні журналювання** +**Докладність проти рівнів журналювання** -- **Файлові журнали** керуються виключно через `logging.level`. -- `--verbose` впливає лише на **деталізацію консолі** (і стиль журналів WS); він **не** - підвищує рівень файлових журналів. -- Щоб зберігати деталі лише для докладного режиму у файлових журналах, установіть `logging.level` на `debug` або +- **Файлові журнали** керуються виключно `logging.level`. +- `--verbose` впливає лише на **докладність консолі** (і стиль журналів WS); він **не** + підвищує рівень файлового журналювання. +- Щоб записувати у файлові журнали деталі, доступні лише в докладному режимі, установіть `logging.level` у `debug` або `trace`. -## Захоплення консолі +## Перехоплення консолі CLI перехоплює `console.log/info/warn/error/debug/trace` і записує їх у файлові журнали, -водночас продовжуючи виводити їх у stdout/stderr. +водночас продовжуючи друкувати у stdout/stderr. -Ви можете окремо налаштувати деталізацію консолі через: +Докладність консолі можна налаштувати незалежно через: - `logging.consoleLevel` (типово `info`) - `logging.consoleStyle` (`pretty` | `compact` | `json`) -## Редагування чутливих даних +## Редагування секретів -OpenClaw може маскувати чутливі токени до того, як вивід журналу або транскрипту залишить -процес. Ця політика редагування для журналювання застосовується до консолі, файлових журналів, OTLP -записів журналів і текстових приймачів транскриптів сеансів, тому відповідні значення секретів -маскуються до того, як рядки JSONL або повідомлення записуються на диск. +OpenClaw може маскувати чутливі токени до того, як вивід журналу або транскрипта залишить +процес. Ця політика редагування журналів застосовується до консолі, файлового журналу, записів журналу OTLP +і текстових приймачів транскриптів сесій, тому відповідні секретні значення +маскуються до запису рядків JSONL або повідомлень на диск. - `logging.redactSensitive`: `off` | `tools` (типово: `tools`) -- `logging.redactPatterns`: масив рядків regex (перевизначає типові значення) - - Використовуйте необроблені рядки regex (автоматично `gi`) або `/pattern/flags`, якщо вам потрібні власні прапорці. +- `logging.redactPatterns`: масив рядків регулярних виразів (перевизначає типові значення) + - Використовуйте необроблені рядки регулярних виразів (автоматично `gi`) або `/pattern/flags`, якщо потрібні власні прапорці. - Збіги маскуються зі збереженням перших 6 + останніх 4 символів (довжина >= 18), інакше `***`. - - Типові значення охоплюють поширені присвоєння ключів, прапорці CLI, поля JSON, заголовки bearer, блоки PEM і популярні префікси токенів. + - Типові значення покривають поширені присвоєння ключів, прапорці CLI, поля JSON, bearer-заголовки, блоки PEM, популярні префікси токенів і назви полів платіжних облікових даних, як-от номер картки, CVC/CVV, спільний платіжний токен і платіжні облікові дані. -Деякі межі безпеки завжди виконують редагування незалежно від `logging.redactSensitive`. -Сюди входять події виклику інструментів у Control UI, вивід інструмента `sessions_history`, -експорти діагностичної підтримки, спостереження за помилками провайдера, відображення команди схвалення exec -і журнали протоколу Gateway WebSocket. Ці поверхні все одно можуть використовувати +Деякі межі безпеки завжди редагують секрети незалежно від `logging.redactSensitive`. +Сюди входять події викликів інструментів інтерфейсу керування, вивід інструмента `sessions_history`, +експорти підтримки діагностики, спостереження помилок провайдерів, показ команди схвалення exec +і журнали протоколу Gateway WebSocket. Ці поверхні все ще можуть використовувати `logging.redactPatterns` як додаткові шаблони, але `redactSensitive: "off"` не змушує їх виводити необроблені секрети. ## Журнали Gateway WebSocket -Gateway виводить журнали протоколу WebSocket у двох режимах: +Gateway друкує журнали протоколу WebSocket у двох режимах: -- **Звичайний режим (без `--verbose`)**: виводяться лише «цікаві» результати RPC: +- **Звичайний режим (без `--verbose`)**: друкуються лише “цікаві” результати RPC: - помилки (`ok=false`) - повільні виклики (типовий поріг: `>= 50ms`) - помилки розбору -- **Докладний режим (`--verbose`)**: виводить увесь трафік запитів/відповідей WS. +- **Докладний режим (`--verbose`)**: друкує весь трафік запитів/відповідей WS. ### Стиль журналів WS -`openclaw gateway` підтримує окреме перемикання стилю для gateway: +`openclaw gateway` підтримує перемикач стилю для кожного Gateway: -- `--ws-log auto` (типово): звичайний режим оптимізований; у докладному режимі використовується компактний вивід -- `--ws-log compact`: компактний вивід (парний запит/відповідь) у докладному режимі -- `--ws-log full`: повний вивід для кожного кадру в докладному режимі +- `--ws-log auto` (типово): звичайний режим оптимізований; докладний режим використовує компактний вивід +- `--ws-log compact`: компактний вивід (парні запит/відповідь) у докладному режимі +- `--ws-log full`: повний вивід для кожного фрейму в докладному режимі - `--compact`: псевдонім для `--ws-log compact` Приклади: @@ -113,22 +113,22 @@ openclaw gateway --verbose --ws-log full ## Форматування консолі (журналювання підсистем) -Форматер консолі **враховує TTY** і виводить узгоджені рядки з префіксами. -Реєстратори підсистем зберігають вивід згрупованим і зручним для перегляду. +Форматер консолі **враховує TTY** і друкує узгоджені рядки з префіксами. +Логери підсистем групують вивід і роблять його зручним для перегляду. Поведінка: - **Префікси підсистем** у кожному рядку (наприклад, `[gateway]`, `[canvas]`, `[tailscale]`) -- **Кольори підсистем** (сталі для кожної підсистеми) плюс кольори рівнів +- **Кольори підсистем** (стабільні для кожної підсистеми) плюс забарвлення рівнів - **Колір, коли вивід є TTY або середовище схоже на розширений термінал** (`TERM`/`COLORTERM`/`TERM_PROGRAM`), з урахуванням `NO_COLOR` -- **Скорочені префікси підсистем**: відкидає початкові `gateway/` + `channels/`, зберігає останні 2 сегменти (наприклад, `whatsapp/outbound`) -- **Підреєстратори за підсистемами** (автоматичний префікс + структуроване поле `{ subsystem }`) -- **`logRaw()`** для QR/UX-виводу (без префікса, без форматування) +- **Скорочені префікси підсистем**: відкидає початкові `gateway/` + `channels/`, залишає останні 2 сегменти (наприклад, `whatsapp/outbound`) +- **Підлогери за підсистемами** (автоматичний префікс + структуроване поле `{ subsystem }`) +- **`logRaw()`** для виводу QR/UX (без префікса, без форматування) - **Стилі консолі** (наприклад, `pretty | compact | json`) -- **Рівень журналу консолі** окремо від рівня файлового журналу (файл зберігає повну деталізацію, коли `logging.level` установлено в `debug`/`trace`) -- **Тіла повідомлень WhatsApp** журналюються на рівні `debug` (використовуйте `--verbose`, щоб їх бачити) +- **Рівень журналювання консолі** окремий від рівня файлового журналювання (файл зберігає повну деталізацію, коли `logging.level` установлено в `debug`/`trace`) +- **Тіла повідомлень WhatsApp** журналюються на рівні `debug` (використовуйте `--verbose`, щоб їх побачити) -Це зберігає наявні файлові журнали стабільними, водночас роблячи інтерактивний вивід зручним для перегляду. +Це зберігає стабільність наявних файлових журналів і водночас робить інтерактивний вивід зручним для перегляду. ## Пов’язане diff --git a/docs/uk/logging.md b/docs/uk/logging.md index 7ec9d94f7..127990322 100644 --- a/docs/uk/logging.md +++ b/docs/uk/logging.md @@ -2,14 +2,14 @@ read_when: - Вам потрібен зручний для початківців огляд журналювання OpenClaw - Ви хочете налаштувати рівні журналювання, формати або маскування - - Ви усуваєте неполадки й вам потрібно швидко знайти журнали -summary: Файлові журнали, вивід консолі, стеження за журналами через CLI та вкладка журналів в інтерфейсі керування + - Ви усуваєте несправність і вам потрібно швидко знайти журнали +summary: Файлові журнали, вивід консолі, відстеження CLI та вкладка «Журнали» інтерфейсу керування title: Журналювання x-i18n: - generated_at: "2026-04-29T07:14:12Z" + generated_at: "2026-05-01T05:53:19Z" model: gpt-5.5 provider: openai - source_hash: 916fb03219d571f0302560a4cb6755940575c92fff0b4eab024b9dad53f841ce + source_hash: d41ce5b1ae30fe1ca65577abe387fc266bd281686acb10098f82b8e78dfaa357 source_path: logging.md workflow: 16 --- @@ -17,9 +17,9 @@ x-i18n: OpenClaw має дві основні поверхні журналювання: - **Файлові журнали** (рядки JSON), які записує Gateway. -- **Вивід консолі**, що показується в терміналах і Gateway Debug UI. +- **Консольний вивід**, що відображається в терміналах і Gateway Debug UI. -Вкладка **Logs** у Control UI відстежує файловий журнал Gateway. На цій сторінці пояснено, де +Вкладка **Logs** у Control UI відстежує файловий журнал gateway. Ця сторінка пояснює, де зберігаються журнали, як їх читати та як налаштовувати рівні й формати журналювання. ## Де зберігаються журнали @@ -28,11 +28,11 @@ OpenClaw має дві основні поверхні журналювання: `/tmp/openclaw/openclaw-YYYY-MM-DD.log` -Дата використовує локальний часовий пояс хоста Gateway. +Дата використовує локальний часовий пояс хоста gateway. -Кожен файл ротуються, коли досягає `logging.maxFileBytes` (за замовчуванням: 100 MB). +Кожен файл ротується, коли досягає `logging.maxFileBytes` (за замовчуванням: 100 MB). OpenClaw зберігає до п’яти нумерованих архівів поруч з активним файлом, наприклад -`openclaw-YYYY-MM-DD.1.log`, і продовжує писати в новий активний журнал замість +`openclaw-YYYY-MM-DD.1.log`, і продовжує писати до нового активного журналу замість пригнічення діагностики. Це можна перевизначити в `~/.openclaw/openclaw.json`: @@ -47,9 +47,9 @@ OpenClaw зберігає до п’яти нумерованих архівів ## Як читати журнали -### CLI: живе відстеження (рекомендовано) +### CLI: відстеження наживо (рекомендовано) -Використовуйте CLI, щоб відстежувати файл журналу Gateway через RPC: +Використовуйте CLI, щоб відстежувати файл журналу gateway через RPC: ```bash openclaw logs --follow @@ -57,19 +57,19 @@ openclaw logs --follow Корисні поточні параметри: -- `--local-time`: відображати часові позначки у вашому локальному часовому поясі -- `--url ` / `--token ` / `--timeout `: стандартні прапорці RPC Gateway +- `--local-time`: відображати часові мітки у вашому локальному часовому поясі +- `--url ` / `--token ` / `--timeout `: стандартні прапорці Gateway RPC - `--expect-final`: прапорець очікування фінальної відповіді RPC на базі агента (приймається тут через спільний клієнтський шар) Режими виводу: -- **TTY-сеанси**: красиві, кольорові, структуровані рядки журналу. -- **Не-TTY-сеанси**: простий текст. -- `--json`: JSON із розділенням за рядками (одна подія журналу на рядок). -- `--plain`: примусово використовувати простий текст у TTY-сеансах. -- `--no-color`: вимкнути кольори ANSI. +- **TTY-сеанси**: гарні, кольорові, структуровані рядки журналу. +- **Не-TTY-сеанси**: звичайний текст. +- `--json`: JSON з розділенням за рядками (одна подія журналу на рядок). +- `--plain`: примусово використовувати звичайний текст у TTY-сеансах. +- `--no-color`: вимкнути ANSI-кольори. -Коли ви передаєте явний `--url`, CLI автоматично не застосовує конфігураційні або +Коли ви передаєте явний `--url`, CLI не застосовує автоматично конфігураційні або середовищні облікові дані; додайте `--token` самостійно, якщо цільовий Gateway вимагає автентифікації. @@ -77,15 +77,15 @@ openclaw logs --follow - `meta`: метадані потоку (файл, курсор, розмір) - `log`: розібраний запис журналу -- `notice`: підказки про обрізання / ротацію +- `notice`: підказки щодо обрізання / ротації - `raw`: нерозібраний рядок журналу Якщо неявний Gateway через local loopback запитує сполучення, закривається під час підключення -або час очікування минає до відповіді `logs.tail`, `openclaw logs` автоматично -переходить до налаштованого файлового журналу Gateway. Явні цілі `--url` не використовують -цей резервний варіант. +або вичерпує час очікування до відповіді `logs.tail`, `openclaw logs` автоматично +повертається до налаштованого файлового журналу Gateway. Явні цілі `--url` не використовують +цей резервний шлях. -Якщо Gateway недоступний, CLI виводить коротку підказку виконати: +Якщо Gateway недоступний, CLI друкує коротку підказку виконати: ```bash openclaw doctor @@ -109,31 +109,31 @@ openclaw channels logs --channel whatsapp ### Файлові журнали (JSONL) Кожен рядок у файлі журналу є об’єктом JSON. CLI і Control UI розбирають ці -записи, щоб відображати структурований вивід (час, рівень, підсистему, повідомлення). +записи, щоб відображати структурований вивід (час, рівень, підсистема, повідомлення). -Записи JSONL файлового журналу також містять придатні для машинної фільтрації поля верхнього рівня, коли +Записи JSONL файлового журналу також містять машинно-фільтровані поля верхнього рівня, коли вони доступні: -- `hostname`: ім’я хоста Gateway. -- `message`: сплющений текст повідомлення журналу для повнотекстового пошуку. -- `agent_id`: id активного агента, коли виклик журналу містить контекст агента. -- `session_id`: id/ключ активного сеансу, коли виклик журналу містить контекст сеансу. -- `channel`: активний канал, коли виклик журналу містить контекст каналу. +- `hostname`: ім’я хоста gateway. +- `message`: сплощений текст повідомлення журналу для повнотекстового пошуку. +- `agent_id`: ідентифікатор активного агента, коли виклик журналювання має контекст агента. +- `session_id`: ідентифікатор/ключ активного сеансу, коли виклик журналювання має контекст сеансу. +- `channel`: активний канал, коли виклик журналювання має контекст каналу. OpenClaw зберігає початкові структуровані аргументи журналу поруч із цими полями, щоб наявні парсери, які читають нумеровані ключі аргументів tslog, продовжували працювати. -### Вивід консолі +### Консольний вивід -Консольні журнали **враховують TTY** і форматуються для читабельності: +Консольні журнали **враховують TTY** і форматуються для зручності читання: - Префікси підсистем (наприклад, `gateway/channels/whatsapp`) - Кольорування рівнів (info/warn/error) - Необов’язковий компактний режим або режим JSON -Форматування консолі керується `logging.consoleStyle`. +Консольне форматування керується `logging.consoleStyle`. -### Журнали WebSocket Gateway +### Журнали Gateway WebSocket `openclaw gateway` також має журналювання протоколу WebSocket для RPC-трафіку: @@ -172,90 +172,94 @@ openclaw gateway --verbose --ws-log full - `logging.level`: рівень **файлових журналів** (JSONL). - `logging.consoleLevel`: рівень докладності **консолі**. -Можна перевизначити обидва через змінну середовища **`OPENCLAW_LOG_LEVEL`** (наприклад, `OPENCLAW_LOG_LEVEL=debug`). Змінна середовища має пріоритет над конфігураційним файлом, тож можна підвищити докладність для одного запуску без редагування `openclaw.json`. Також можна передати глобальний параметр CLI **`--log-level `** (наприклад, `openclaw --log-level debug gateway run`), який перевизначає змінну середовища для цієї команди. +Обидва можна перевизначити через змінну середовища **`OPENCLAW_LOG_LEVEL`** (наприклад, `OPENCLAW_LOG_LEVEL=debug`). Змінна середовища має пріоритет над файлом конфігурації, тож можна підвищити докладність для одного запуску без редагування `openclaw.json`. Також можна передати глобальний параметр CLI **`--log-level `** (наприклад, `openclaw --log-level debug gateway run`), який перевизначає змінну середовища для цієї команди. -`--verbose` впливає лише на вивід консолі та докладність журналу WS; він не змінює +`--verbose` впливає лише на консольний вивід і докладність журналів WS; він не змінює рівні файлового журналювання. ### Кореляція трасування -Файлові журнали мають формат JSONL. Коли виклик журналу містить дійсний контекст діагностичного трасування, +Файлові журнали мають формат JSONL. Коли виклик журналювання має дійсний контекст діагностичного трасування, OpenClaw записує поля трасування як ключі JSON верхнього рівня (`traceId`, `spanId`, -`parentSpanId`, `traceFlags`), щоб зовнішні обробники журналів могли пов’язати рядок -зі span OTEL і поширенням `traceparent` провайдера. +`parentSpanId`, `traceFlags`), щоб зовнішні обробники журналів могли співвідносити рядок +зі спанами OTEL і поширенням `traceparent` провайдера. -HTTP-запити Gateway і кадри WebSocket Gateway встановлюють внутрішню область трасування -запиту. Журнали та діагностичні події, створені всередині цієї асинхронної області, успадковують -трасування запиту, коли не передають явний контекст трасування. Трасування запуску агента та -виклику моделі стають дочірніми від активного трасування запиту, тому локальні журнали, -діагностичні знімки, span OTEL і довірені заголовки `traceparent` провайдера можна -об’єднати за `traceId` без журналювання сирого вмісту запиту або моделі. +HTTP-запити Gateway і кадри Gateway WebSocket встановлюють внутрішню область трасування +запиту. Журнали й діагностичні події, емітовані в цій асинхронній області, успадковують +трасування запиту, коли вони не передають явний контекст трасування. Трасування запуску агента й +викликів моделі стають дочірніми до активного трасування запиту, тому локальні журнали, +діагностичні знімки, спани OTEL і довірені заголовки `traceparent` провайдера можна +об’єднувати за `traceId` без журналювання сирого вмісту запиту або моделі. ### Розмір і час виклику моделі Діагностика викликів моделі записує обмежені вимірювання запиту/відповіді без -захоплення сирого вмісту prompt або відповіді: +захоплення сирого вмісту промпта або відповіді: -- `requestPayloadBytes`: розмір у байтах UTF-8 фінального payload запиту моделі +- `requestPayloadBytes`: розмір у байтах UTF-8 фінального корисного навантаження запиту до моделі - `responseStreamBytes`: розмір у байтах UTF-8 потокових подій відповіді моделі - `timeToFirstByteMs`: час, що минув до першої потокової події відповіді - `durationMs`: загальна тривалість виклику моделі -Ці поля доступні діагностичним знімкам, хукам Plugin для викликів моделі та -span/метрикам викликів моделі OTEL, коли експорт діагностики ввімкнено. +Ці поля доступні для діагностичних знімків, хуків Plugin для викликів моделі та +спанів/метрик викликів моделі OTEL, коли експорт діагностики ввімкнено. ### Стилі консолі `logging.consoleStyle`: -- `pretty`: зручний для людини, кольоровий, із часовими позначками. +- `pretty`: зручний для людини, кольоровий, з часовими мітками. - `compact`: щільніший вивід (найкраще для довгих сеансів). - `json`: JSON на рядок (для обробників журналів). -### Редагування секретів +### Редакція -OpenClaw може редагувати чутливі токени до того, як вони потраплять у вивід консолі, файлові журнали, -записи журналів OTLP, збережений текст транскрипту сеансу або payload подій інструментів -Control UI (аргументи запуску інструменту, часткові/фінальні payload результатів, похідний -вивід exec і підсумки patch): +OpenClaw може редагувати чутливі токени до того, як вони потраплять у консольний вивід, файлові журнали, +записи журналу OTLP, збережений текст стенограми сеансу або корисні навантаження подій інструментів +Control UI (аргументи запуску інструмента, часткові/фінальні корисні навантаження результату, похідний +вивід exec і зведення патчів): - `logging.redactSensitive`: `off` | `tools` (за замовчуванням: `tools`) -- `logging.redactPatterns`: список regex-рядків для перевизначення стандартного набору. Користувацькі шаблони застосовуються поверх вбудованих стандартних шаблонів для payload інструментів Control UI, тому додавання шаблону ніколи не послаблює редагування значень, які вже виявляються стандартними шаблонами. +- `logging.redactPatterns`: список рядків regex для перевизначення стандартного набору. Власні шаблони застосовуються поверх вбудованих стандартних значень для корисних навантажень інструментів Control UI, тож додавання шаблону ніколи не послаблює редакцію значень, які вже знаходять стандартні правила. -Файлові журнали та транскрипти сеансів залишаються JSONL, але відповідні секретні значення -маскуються до запису рядка або повідомлення на диск. Редагування виконується за принципом найкращого зусилля: -воно застосовується до текстового вмісту повідомлень і рядків журналів, а не до кожного -ідентифікатора або поля бінарного payload. +Файлові журнали й стенограми сеансів залишаються JSONL, але відповідні секретні значення +маскуються до запису рядка або повідомлення на диск. Редакція виконується за принципом найкращих зусиль: +вона застосовується до текстового вмісту повідомлень і рядків журналу, а не до кожного +ідентифікатора чи поля бінарного корисного навантаження. -`logging.redactSensitive: "off"` вимикає лише цю загальну політику журналів/транскриптів. -OpenClaw усе одно редагує payload меж безпеки, які можуть показуватися UI -клієнтам, пакетам підтримки, спостерігачам діагностики, запитам схвалення або -інструментам агента. Приклади включають події виклику інструментів Control UI, вивід `sessions_history`, -експорти діагностики для підтримки, спостереження помилок провайдера, показ команди для схвалення exec -і журнали протоколу WebSocket Gateway. Користувацькі `logging.redactPatterns` -можуть і далі додавати шаблони, специфічні для проєкту, на цих поверхнях. +Вбудовані стандартні правила охоплюють поширені облікові дані API й імена полів платіжних облікових даних, +такі як номер картки, CVC/CVV, спільний платіжний токен і платіжні облікові дані, +коли вони з’являються як поля JSON, параметри URL, прапорці CLI або присвоєння. -## Діагностика та OpenTelemetry +`logging.redactSensitive: "off"` вимикає лише цю загальну політику журналів/стенограм. +OpenClaw усе одно редагує корисні навантаження меж безпеки, які можуть показуватися UI +клієнтам, пакетам підтримки, спостерігачам діагностики, запитам схвалення або інструментам +агента. Приклади: події викликів інструментів Control UI, вивід `sessions_history`, +експорти підтримки діагностики, спостереження помилок провайдера, відображення команди +схвалення exec і журнали протоколу Gateway WebSocket. Власні `logging.redactPatterns` +усе ще можуть додавати проєктно-специфічні шаблони на цих поверхнях. -Діагностика — це структуровані, машинозчитувані події для запусків моделі та -телеметрії потоку повідомлень (webhook-и, постановка в чергу, стан сеансу). Вони **не** -замінюють журнали — вони живлять метрики, трасування та експортери. Події створюються -в процесі незалежно від того, експортуєте ви їх чи ні. +## Діагностика й OpenTelemetry + +Діагностика — це структуровані, машинно-читані події для запусків моделі й +телеметрії потоку повідомлень (webhooks, постановка в чергу, стан сеансу). Вони **не** +замінюють журнали — вони живлять метрики, трасування й експортери. Події емітуються +всередині процесу незалежно від того, експортуєте ви їх чи ні. Дві суміжні поверхні: - **Експорт OpenTelemetry** — надсилання метрик, трасувань і журналів через OTLP/HTTP до - будь-якого сумісного з OpenTelemetry колектора або бекенду (Grafana, Datadog, + будь-якого колектора або бекенду, сумісного з OpenTelemetry (Grafana, Datadog, Honeycomb, New Relic, Tempo тощо). Повна конфігурація, каталог сигналів, - назви метрик/span, змінні середовища та модель приватності розміщені на окремій сторінці: + назви метрик/спанів, змінні середовища й модель приватності розміщені на окремій сторінці: [Експорт OpenTelemetry](/uk/gateway/opentelemetry). -- **Прапорці діагностики** — цільові прапорці debug-журналів, які спрямовують додаткові журнали до +- **Прапорці діагностики** — цільові прапорці журналів налагодження, які спрямовують додаткові журнали до `logging.file` без підвищення `logging.level`. Прапорці нечутливі до регістру - і підтримують символи узагальнення (`telegram.*`, `*`). Налаштовуйте в `diagnostics.flags` + й підтримують символи підстановки (`telegram.*`, `*`). Налаштовуйте в `diagnostics.flags` або через перевизначення змінної середовища `OPENCLAW_DIAGNOSTICS=...`. Повний посібник: [Прапорці діагностики](/uk/diagnostics/flags). -Щоб увімкнути діагностичні події для plugin-ів або користувацьких приймачів без експорту OTLP: +Щоб увімкнути діагностичні події для plugins або власних приймачів без експорту OTLP: ```json5 { @@ -274,7 +278,7 @@ OpenClaw усе одно редагує payload меж безпеки, які м ## Пов’язане -- [Експорт OpenTelemetry](/uk/gateway/opentelemetry) — експорт OTLP/HTTP, каталог метрик/span, модель приватності -- [Прапорці діагностики](/uk/diagnostics/flags) — цільові прапорці debug-журналів -- [Внутрішні механізми журналювання Gateway](/uk/gateway/logging) — стилі журналу WS, префікси підсистем і захоплення консолі -- [Довідник конфігурації](/uk/gateway/configuration-reference#diagnostics) — повна довідка полів `diagnostics.*` +- [Експорт OpenTelemetry](/uk/gateway/opentelemetry) — експорт OTLP/HTTP, каталог метрик/спанів, модель приватності +- [Прапорці діагностики](/uk/diagnostics/flags) — цільові прапорці журналів налагодження +- [Внутрішні механізми журналювання Gateway](/uk/gateway/logging) — стилі журналів WS, префікси підсистем і захоплення консолі +- [Довідник конфігурації](/uk/gateway/configuration-reference#diagnostics) — повний довідник полів `diagnostics.*` diff --git a/docs/uk/plugins/google-meet.md b/docs/uk/plugins/google-meet.md index cc061b540..1baa805a7 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 - - Ви налаштовуєте Chrome, вузол Chrome або Twilio як транспорт Google Meet -summary: 'Google Meet Plugin: приєднання до явних URL Meet через Chrome або Twilio зі типовими налаштуваннями голосу в реальному часі' + - Ви хочете, щоб агент OpenClaw приєднався до дзвінка Google Meet + - Ви хочете, щоб агент OpenClaw створив новий дзвінок Google Meet + - Ви налаштовуєте Chrome, вузол Chrome або Twilio як транспорт для Google Meet +summary: 'Plugin Google Meet: приєднання за явно вказаними URL-адресами Meet через Chrome або Twilio з типовими налаштуваннями голосу в реальному часі' title: Plugin Google Meet x-i18n: - generated_at: "2026-05-01T05:44:37Z" + generated_at: "2026-05-01T05:53:20Z" model: gpt-5.5 provider: openai - source_hash: ad42eb664c3dcffe261c2bd7f5d8a3cd87a31e5a1b030d1a6f68c0259ffa53c6 + source_hash: 6b7f5505dcc0ee20a5331f1e41206c8a4fd4090f317799d3f8af0018a067772f 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, коли потрібні глибші +- Він приєднується лише до явної URL-адреси `https://meet.google.com/...`. +- Він може створити новий простір Meet через Google Meet API, а потім приєднатися за + поверненою URL-адресою. +- `realtime` голос є режимом за замовчуванням. +- Realtime голос може звертатися назад до повного агента OpenClaw, коли потрібні глибші міркування або інструменти. - Агенти вибирають поведінку приєднання за допомогою `mode`: використовуйте `realtime` для живого - прослуховування/відповіді голосом або `transcribe`, щоб приєднатися/керувати браузером без - realtime voice bridge. -- Автентифікація починається як персональний Google OAuth або вже виконаний вхід у профіль Chrome. -- Автоматичного оголошення згоди немає. -- Аудіобекенд Chrome за замовчуванням — `BlackHole 2ch`. + прослуховування/зворотного мовлення або `transcribe`, щоб приєднатися/керувати браузером без + realtime голосового мосту. +- Автентифікація починається як особистий Google OAuth або вже авторизований профіль Chrome. +- Автоматичного оголошення про згоду немає. +- Типовий аудіобекенд Chrome — `BlackHole 2ch`. - Chrome може працювати локально або на спареному вузловому хості. -- Twilio приймає номер для дзвінка плюс необов’язковий PIN або послідовність DTMF. +- Twilio приймає номер для дозвону плюс необов’язковий PIN або DTMF-послідовність. - Команда CLI — `googlemeet`; `meet` зарезервовано для ширших агентських робочих процесів телеконференцій. ## Швидкий старт -Установіть локальні аудіозалежності та налаштуйте бекенд-провайдера realtime voice. -OpenAI використовується за замовчуванням; Google Gemini Live також працює з +Установіть локальні аудіозалежності та налаштуйте бекенд-провайдер realtime голосу. +OpenAI є типовим; Google Gemini Live також працює з `realtime.provider: "google"`: ```bash @@ -46,14 +46,14 @@ export OPENAI_API_KEY=sk-... export GEMINI_API_KEY=... ``` -`blackhole-2ch` установлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор Homebrew -потребує перезавантаження, перш ніж macOS покаже пристрій: +`blackhole-2ch` установлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор +Homebrew потребує перезавантаження, перш ніж macOS покаже пристрій: ```bash sudo reboot ``` -Після перезавантаження перевірте обидва компоненти: +Після перезавантаження перевірте обидві частини: ```bash system_profiler SPAudioDataType | grep -i BlackHole @@ -81,24 +81,34 @@ command -v sox openclaw googlemeet setup ``` -Вивід налаштування призначений для читання агентом і враховує режим. Він повідомляє про профіль Chrome, -прив’язку вузла та, для realtime-приєднань через Chrome, аудіоміст BlackHole/SoX -і відкладені перевірки realtime-вступу. Для приєднань лише для спостереження перевірте той самий -транспорт із `--mode transcribe`; цей режим пропускає передумови realtime audio, -бо не слухає через міст і не говорить через нього: +Вивід налаштування призначений бути придатним для читання агентом і враховувати режим. Він повідомляє про профіль Chrome +, прив’язування вузла та, для realtime приєднань Chrome, аудіоміст +BlackHole/SoX і перевірки затриманого realtime вступу. Для приєднань лише для спостереження перевірте той самий +транспорт за допомогою `--mode transcribe`; цей режим пропускає передумови realtime аудіо, +оскільки він не слухає через міст і не говорить через нього: ```bash openclaw googlemeet setup --transport chrome-node --mode transcribe ``` -Коли налаштовано делегування Twilio, налаштування також повідомляє, чи готові -Plugin `voice-call`, облікові дані Twilio і публічний Webhook. -Будь-яку перевірку `ok: false` вважайте блокером для перевірених транспорту й режиму, +Коли делегування Twilio налаштовано, налаштування також повідомляє, чи готові +Plugin `voice-call`, облікові дані Twilio та публічне Webhook-розкриття. +Сприймайте будь-яку перевірку `ok: false` як блокер для перевіреного транспорту й режиму, перш ніж просити агента приєднатися. Використовуйте `openclaw googlemeet setup --json` для -скриптів або машинозчитуваного виводу. Використовуйте `--transport chrome`, +скриптів або машиночитного виводу. Використовуйте `--transport chrome`, `--transport chrome-node` або `--transport twilio`, щоб попередньо перевірити конкретний транспорт, перш ніж агент спробує його. +Для Twilio завжди явно попередньо перевіряйте транспорт, коли типовий транспорт +— Chrome: + +```bash +openclaw googlemeet setup --transport twilio +``` + +Це виявляє відсутнє підключення `voice-call`, облікові дані Twilio або недосяжне +Webhook-розкриття до того, як агент спробує зателефонувати на зустріч. + Приєднайтеся до зустрічі: ```bash @@ -132,24 +142,24 @@ openclaw googlemeet create --no-join - Створення через API: використовується, коли налаштовано облікові дані Google Meet OAuth. Це найдетермінованіший шлях, який не залежить від стану інтерфейсу браузера. -- Резервний шлях через браузер: використовується, коли облікові дані OAuth відсутні. OpenClaw використовує - закріплений вузол Chrome, відкриває `https://meet.google.com/new`, чекає, доки Google - перенаправить на реальну URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях вимагає, - щоб профіль OpenClaw Chrome на вузлі вже був увійшов у Google. - Автоматизація браузера обробляє власний перший запит Meet на доступ до мікрофона; цей запит +- Резервний браузерний шлях: використовується, коли облікових даних OAuth немає. OpenClaw використовує + закріплений вузол Chrome, відкриває `https://meet.google.com/new`, чекає, поки Google + переспрямує на справжню URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях потребує, + щоб профіль OpenClaw Chrome на вузлі вже був авторизований у Google. + Автоматизація браузера обробляє власний запит Meet першого запуску щодо мікрофона; цей запит не вважається помилкою входу в Google. - Потоки приєднання й створення також намагаються повторно використати наявну вкладку Meet перед відкриттям - нової. Зіставлення ігнорує нешкідливі рядки запиту URL, як-от `authuser`, тож повторна спроба - агента має сфокусувати вже відкриту зустріч, а не створювати другу - вкладку Chrome. + Потоки приєднання й створення також намагаються повторно використати наявну вкладку Meet, перш ніж відкривати + нову. Зіставлення ігнорує нешкідливі рядки запиту URL, такі як `authuser`, тож повторна спроба + агента має сфокусувати вже відкриту зустріч замість створення другої + вкладки Chrome. Вивід команди/інструмента містить поле `source` (`api` або `browser`), щоб агенти -могли пояснити, який шлях було використано. `create` за замовчуванням приєднується до нової зустрічі та -повертає `joined: true` плюс сеанс приєднання. Щоб лише створити URL-адресу, використовуйте +могли пояснити, який шлях було використано. `create` за замовчуванням приєднується до нової зустрічі й +повертає `joined: true` плюс сесію приєднання. Щоб лише згенерувати URL-адресу, використовуйте `create --no-join` у CLI або передайте `"join": false` інструменту. -Або скажіть агенту: "Створи Google Meet, приєднайся до нього з realtime voice і надішли -мені посилання." Агент має викликати `google_meet` з `action: "create"`, а +Або скажіть агенту: «Створи Google Meet, приєднайся до нього з realtime голосом і надішли +мені посилання». Агент має викликати `google_meet` з `action: "create"`, а потім поділитися поверненим `meetingUri`. ```json @@ -161,44 +171,44 @@ openclaw googlemeet create --no-join ``` Для приєднання лише для спостереження/керування браузером установіть `"mode": "transcribe"`. Це -не запускає дуплексний міст realtime-моделі, не потребує BlackHole або SoX -і не відповідатиме голосом у зустрічі. Приєднання Chrome у цьому режимі також уникають -надання OpenClaw дозволів на мікрофон/камеру та обходять шлях Meet **Use -microphone**. Якщо Meet показує проміжний екран вибору аудіо, автоматизація намагається -вибрати шлях без мікрофона, а інакше повідомляє про потрібну ручну дію замість відкриття +не запускає дуплексний realtime модельний міст, не потребує BlackHole або SoX +і не говоритиме назад у зустріч. Приєднання Chrome у цьому режимі також уникають +надання OpenClaw дозволу на мікрофон/камеру та уникають шляху Meet **Використовувати +мікрофон**. Якщо Meet показує проміжний екран вибору аудіо, автоматизація пробує +шлях без мікрофона, а інакше повідомляє про ручну дію замість відкриття локального мікрофона. -Під час realtime-сеансів статус `google_meet` містить стан браузера й аудіомоста, -зокрема `inCall`, `manualActionRequired`, `providerConnected`, +Під час realtime сесій статус `google_meet` містить стан браузера та аудіомоста, +як-от `inCall`, `manualActionRequired`, `providerConnected`, `realtimeReady`, `audioInputActive`, `audioOutputActive`, останні часові мітки -вводу/виводу, лічильники байтів і стан закриття моста. Якщо з’являється безпечний запит сторінки Meet, -автоматизація браузера обробляє його, коли може. Вхід, допуск хостом і +вводу/виводу, лічильники байтів і стан закриття мосту. Якщо з’являється безпечний запит сторінки Meet +, автоматизація браузера обробляє його, коли може. Вхід, допуск хостом і запити дозволів браузера/ОС повідомляються як ручна дія з причиною та -повідомленням, яке агент має передати. Керовані сеанси Chrome видають вступ або +повідомленням, яке агент має передати. Керовані сесії Chrome відтворюють вступ або тестову фразу лише після того, як стан браузера повідомляє `inCall: true`; інакше статус повідомляє `speechReady: false`, а спроба мовлення блокується замість удавання, що агент говорив у зустріч. -Локальні приєднання Chrome виконуються через профіль браузера OpenClaw із виконаним входом. Realtime-режим +Локальні приєднання Chrome використовують авторизований профіль браузера OpenClaw. Realtime режим потребує `BlackHole 2ch` для шляху мікрофона/динаміка, який використовує OpenClaw. Для -чистого дуплексного аудіо використовуйте окремі віртуальні пристрої або граф у стилі Loopback; -одного пристрою BlackHole достатньо для першого smoke-тесту, але він може створювати відлуння. +чистого дуплексного аудіо використовуйте окремі віртуальні пристрої або граф у стилі Loopback; одного +пристрою BlackHole достатньо для першого smoke test, але він може створювати відлуння. ### Локальний Gateway + Parallels Chrome Вам **не** потрібен повний OpenClaw Gateway або ключ API моделі всередині macOS VM лише для того, щоб VM володіла Chrome. Запустіть Gateway і агента локально, а потім запустіть -вузловий хост у VM. Один раз увімкніть bundled Plugin на VM, щоб вузол +вузловий хост у VM. Увімкніть вбудований Plugin на VM один раз, щоб вузол оголошував команду Chrome: Що де працює: -- Хост Gateway: OpenClaw Gateway, робочий простір агента, ключі моделі/API, realtime - provider і конфігурація Google Meet Plugin. +- Хост Gateway: OpenClaw Gateway, робоча область агента, ключі моделі/API, realtime + провайдер і конфігурація Plugin Google Meet. - Parallels macOS VM: OpenClaw CLI/вузловий хост, Google Chrome, SoX, BlackHole 2ch - і профіль Chrome із входом у Google. -- Не потрібно у VM: служба Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування - provider моделі. + і профіль Chrome, авторизований у Google. +- Не потрібно у VM: сервіс Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування + провайдера моделі. Установіть залежності VM: @@ -219,7 +229,7 @@ system_profiler SPAudioDataType | grep -i BlackHole command -v sox ``` -Установіть або оновіть OpenClaw у VM, а потім увімкніть bundled Plugin там: +Установіть або оновіть OpenClaw у VM, а потім увімкніть там вбудований Plugin: ```bash openclaw plugins enable google-meet @@ -231,8 +241,8 @@ openclaw plugins enable google-meet openclaw node run --host --port 18789 --display-name parallels-macos ``` -Якщо `` — це LAN IP і ви не використовуєте TLS, вузол відхиляє -незашифрований WebSocket, якщо ви явно не погодитеся на це для цієї довіреної приватної мережі: +Якщо `` — це LAN IP і ви не використовуєте TLS, вузол відмовляється від +plain text WebSocket, якщо ви не погодитеся на це для цієї довіреної приватної мережі: ```bash OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ @@ -248,8 +258,8 @@ openclaw node restart ``` `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` — це середовище процесу, а не налаштування -`openclaw.json`. `openclaw node install` зберігає його в середовищі LaunchAgent, -коли воно присутнє в команді встановлення. +`openclaw.json`. `openclaw node install` зберігає його в середовищі LaunchAgent +, коли воно присутнє в команді встановлення. Схваліть вузол із хоста Gateway: @@ -303,85 +313,87 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij або попросіть агента використати інструмент `google_meet` з `transport: "chrome-node"`. -Для smoke-тесту однією командою, який створює або повторно використовує сеанс, промовляє відому -фразу та друкує стан сеансу: +Для smoke test однією командою, який створює або повторно використовує сесію, вимовляє відому +фразу та друкує стан сесії: ```bash openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij ``` -Під час realtime-приєднання автоматизація браузера OpenClaw заповнює ім’я гостя, натискає -Join/Ask to join і приймає перший вибір Meet "Use microphone", коли цей -запит з’являється. Під час приєднання лише для спостереження або створення зустрічі лише через браузер вона +Під час realtime приєднання автоматизація браузера OpenClaw заповнює ім’я гостя, натискає +Join/Ask to join і приймає вибір Meet першого запуску «Використовувати мікрофон», коли цей +запит з’являється. Під час приєднання лише для спостереження або створення зустрічі лише в браузері вона проходить той самий запит без мікрофона, коли такий вибір доступний. -Якщо профіль браузера не увійшов у систему, Meet чекає на допуск хостом, -Chrome потребує дозволу на мікрофон/камеру для realtime-приєднання або Meet завис -на запиті, який автоматизація не змогла вирішити, результат join/test-speech повідомляє +Якщо профіль браузера не авторизований, Meet чекає допуску хостом, +Chrome потребує дозволу на мікрофон/камеру для realtime приєднання або Meet застряг +на запиті, який автоматизація не змогла розв’язати, результат join/test-speech повідомляє `manualActionRequired: true` з `manualActionReason` і `manualActionMessage`. Агенти мають припинити повторювати приєднання, повідомити це точне повідомлення плюс поточні `browserUrl`/`browserTitle` і повторити спробу лише після завершення ручної дії в браузері. Якщо `chromeNode.node` пропущено, OpenClaw автоматично вибирає вузол лише тоді, коли рівно один -підключений вузол оголошує і `googlemeet.chrome`, і керування браузером. Якщо -підключено кілька придатних вузлів, установіть `chromeNode.node` на ідентифікатор вузла, +підключений вузол оголошує як `googlemeet.chrome`, так і керування браузером. Якщо +підключено кілька придатних вузлів, установіть `chromeNode.node` як ідентифікатор вузла, відображуване ім’я або віддалену IP-адресу. Поширені перевірки збоїв: - `Configured Google Meet node ... is not usable: offline`: закріплений вузол відомий Gateway, але недоступний. Агенти мають розглядати цей вузол як - діагностичний стан, а не як придатний до використання хост Chrome, і повідомляти - про блокер налаштування замість переходу на інший транспорт, якщо користувач - цього не просив. + діагностичний стан, а не як придатний до використання хост Chrome, і + повідомляти про блокер налаштування замість переходу на інший транспорт, + якщо користувач цього не просив. - `No connected Google Meet-capable node`: запустіть `openclaw node run` у VM, - підтвердьте сполучення та переконайтеся, що `openclaw plugins enable google-meet` і - `openclaw plugins enable browser` були виконані у VM. Також підтвердьте, що - хост Gateway дозволяє обидві команди вузла через + підтвердьте pairing і переконайтеся, що `openclaw plugins enable google-meet` + та `openclaw plugins enable browser` було виконано у VM. Також підтвердьте, + що хост Gateway дозволяє обидві команди вузла через `gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`. - `BlackHole 2ch audio device not found`: установіть `blackhole-2ch` на хості, - який перевіряється, і перезавантажтеся перед використанням локального аудіо Chrome. + який перевіряється, і перезавантажте його перед використанням локального аудіо Chrome. - `BlackHole 2ch audio device not found on the node`: установіть `blackhole-2ch` у VM і перезавантажте VM. -- Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM або - залиште `chrome.guestName` заданим для гостьового приєднання. Гостьове автоприєднання використовує - браузерну автоматизацію OpenClaw через браузерний проксі вузла; переконайтеся, що конфігурація - браузера вузла вказує на потрібний профіль, наприклад +- Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера + всередині VM або залиште `chrome.guestName` заданим для гостьового + приєднання. Гостьове автоматичне приєднання використовує браузерну автоматизацію + OpenClaw через проксі браузера вузла; переконайтеся, що конфігурація браузера + вузла вказує на потрібний профіль, наприклад `browser.defaultProfile: "user"` або іменований профіль наявного сеансу. -- Дублікати вкладок Meet: залиште `chrome.reuseExistingTab: true` увімкненим. OpenClaw - активує наявну вкладку для того самого URL Meet перед відкриттям нової, а - створення браузерної зустрічі повторно використовує відкриту вкладку `https://meet.google.com/new` - або вкладку запиту облікового запису Google перед відкриттям іншої. +- Дублікати вкладок Meet: залиште `chrome.reuseExistingTab: true` увімкненим. + OpenClaw активує наявну вкладку для тієї самої URL-адреси Meet перед відкриттям + нової, а створення зустрічі в браузері повторно використовує поточну вкладку + `https://meet.google.com/new` або вкладку запиту облікового запису Google перед + відкриттям іншої. - Немає аудіо: у Meet спрямуйте мікрофон/динамік через шлях віртуального аудіопристрою, - який використовує OpenClaw; використовуйте окремі віртуальні пристрої або маршрутизацію у стилі Loopback - для чистого дуплексного аудіо. + який використовує OpenClaw; використовуйте окремі віртуальні пристрої або маршрутизацію + в стилі Loopback для чистого двостороннього аудіо. -## Нотатки щодо встановлення +## Примітки щодо встановлення Типовий режим Chrome realtime використовує два зовнішні інструменти: -- `sox`: утиліта командного рядка для аудіо. Plugin використовує явні команди пристрою CoreAudio - для стандартного аудіомоста PCM16 24 кГц. +- `sox`: аудіоутиліта командного рядка. Plugin використовує явні команди пристроїв CoreAudio + для типового аудіомоста 24 kHz PCM16. - `blackhole-2ch`: віртуальний аудіодрайвер macOS. Він створює аудіопристрій `BlackHole 2ch`, - через який Chrome/Meet може маршрутизувати аудіо. + через який Chrome/Meet може виконувати маршрутизацію. -OpenClaw не вбудовує й не розповсюджує жоден із цих пакетів. Документація просить користувачів +OpenClaw не постачає й не розповсюджує жоден із цих пакетів. Документація просить користувачів установлювати їх як залежності хоста через Homebrew. SoX ліцензовано як -`LGPL-2.0-only AND GPL-2.0-only`; BlackHole має ліцензію GPL-3.0. Якщо ви збираєте -інсталятор або appliance, який постачається з BlackHole разом з OpenClaw, перегляньте -умови ліцензування upstream BlackHole або отримайте окрему ліцензію від Existential Audio. +`LGPL-2.0-only AND GPL-2.0-only`; BlackHole має ліцензію GPL-3.0. Якщо ви створюєте +інсталятор або пристрій, який постачає BlackHole разом з OpenClaw, перегляньте +умови ліцензування BlackHole від upstream або отримайте окрему ліцензію від Existential Audio. ## Транспорти ### Chrome -Транспорт Chrome відкриває URL Meet через керування браузером OpenClaw і приєднується -як виконаний вхід профіль браузера OpenClaw. На macOS Plugin перевіряє наявність +Транспорт Chrome відкриває URL-адресу Meet через керування браузером OpenClaw і приєднується +як виконаний вхід у браузерний профіль OpenClaw. На macOS Plugin перевіряє наявність `BlackHole 2ch` перед запуском. Якщо налаштовано, він також виконує команду перевірки -стану аудіомоста й команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли -Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо працюють -на сполученому вузлі, наприклад Parallels macOS VM. Для локального Chrome виберіть -профіль через `browser.defaultProfile`; `chrome.browserProfile` передається на +стану аудіомоста та команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли +Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо +працюють на спареному вузлі, наприклад VM Parallels macOS. Для локального Chrome виберіть +профіль за допомогою `browser.defaultProfile`; `chrome.browserProfile` передається на хости `chrome-node`. ```bash @@ -395,14 +407,14 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome ### Twilio -Транспорт Twilio — це строгий план набору, делегований Plugin голосових викликів. Він -не аналізує сторінки Meet на наявність телефонних номерів. +Транспорт Twilio — це строгий план набору, делегований Plugin Voice Call. Він +не аналізує сторінки Meet для пошуку телефонних номерів. -Використовуйте це, коли участь через Chrome недоступна або потрібен резервний -телефонний вхід. Google Meet має надати телефонний номер для набору та PIN для +Використовуйте це, коли участь через Chrome недоступна або потрібен резервний варіант +телефонного дозвону. Google Meet має надавати номер телефонного дозвону та PIN для зустрічі; OpenClaw не виявляє їх зі сторінки Meet. -Увімкніть Plugin голосових викликів на хості Gateway, а не на вузлі Chrome: +Увімкніть Plugin Voice Call на хості Gateway, а не на вузлі Chrome: ```json5 { @@ -427,8 +439,8 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome } ``` -Надайте облікові дані Twilio через середовище або конфігурацію. Середовище тримає -секрети поза `openclaw.json`: +Надайте облікові дані Twilio через середовище або конфігурацію. Середовище +не допускає потрапляння секретів у `openclaw.json`: ```bash export TWILIO_ACCOUNT_SID=AC... @@ -436,8 +448,8 @@ export TWILIO_AUTH_TOKEN=... export TWILIO_FROM_NUMBER=+15550001234 ``` -Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації plugin -не з’являються в уже запущеному процесі Gateway, доки він не перезавантажиться. +Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни +конфігурації Plugin не з’являються у вже запущеному процесі Gateway, доки він не перезавантажиться. Потім перевірте: @@ -458,7 +470,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 \ @@ -467,22 +479,22 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --dtmf-sequence ww123456# ``` -## OAuth і preflight +## OAuth і попередня перевірка OAuth є необов’язковим для створення посилання Meet, оскільки `googlemeet create` може -відступити до браузерної автоматизації. Налаштуйте OAuth, коли вам потрібне офіційне створення через API, -розв’язання space або preflight-перевірки Meet Media API. +повертатися до браузерної автоматизації. Налаштуйте OAuth, коли потрібне офіційне +створення через API, розв’язання простору або попередні перевірки Meet Media API. -Доступ до Google Meet API використовує користувацький OAuth: створіть OAuth-клієнт Google Cloud, -запросіть потрібні scopes, авторизуйте обліковий запис Google, а потім збережіть -отриманий refresh token у конфігурації Plugin Google Meet або надайте -змінні середовища `OPENCLAW_GOOGLE_MEET_*`. +Доступ до Google Meet API використовує користувацький OAuth: створіть клієнт Google Cloud OAuth, +запросіть потрібні області доступу, авторизуйте обліковий запис Google, а потім збережіть +отриманий токен оновлення в конфігурації Plugin Google Meet або надайте змінні середовища +`OPENCLAW_GOOGLE_MEET_*`. -OAuth не замінює шлях приєднання через Chrome. Транспорти Chrome і Chrome-node -все одно приєднуються через профіль Chrome із виконаним входом, BlackHole/SoX і підключений -вузол, коли ви використовуєте участь через браузер. OAuth призначений лише для офіційного -шляху Google Meet API: створення просторів зустрічей, розв’язання просторів і виконання -preflight-перевірок Meet Media API. +OAuth не замінює шлях приєднання Chrome. Транспорти Chrome і Chrome-node все одно +приєднуються через виконаний вхід у профіль Chrome, BlackHole/SoX і підключений вузол, +коли ви використовуєте участь через браузер. OAuth призначений лише для офіційного шляху +Google Meet API: створення просторів зустрічей, розв’язання просторів і виконання +попередніх перевірок Meet Media API. ### Створення облікових даних Google @@ -491,41 +503,41 @@ preflight-перевірок Meet Media API. 1. Створіть або виберіть проєкт Google Cloud. 2. Увімкніть **Google Meet REST API** для цього проєкту. 3. Налаштуйте екран згоди OAuth. - - **Internal** — найпростіший варіант для організації Google Workspace. - - **External** підходить для особистих/тестових налаштувань; доки застосунок перебуває в Testing, + - **Internal** є найпростішим для організації Google Workspace. + - **External** працює для особистих/тестових налаштувань; поки застосунок перебуває в Testing, додайте кожен обліковий запис Google, який авторизуватиме застосунок, як тестового користувача. -4. Додайте scopes, які запитує OpenClaw: +4. Додайте області доступу, які запитує OpenClaw: - `https://www.googleapis.com/auth/meetings.space.created` - `https://www.googleapis.com/auth/meetings.space.readonly` - `https://www.googleapis.com/auth/meetings.conference.media.readonly` -5. Створіть OAuth client ID. +5. Створіть ідентифікатор клієнта OAuth. - Тип застосунку: **Web application**. - - Авторизований redirect URI: + - Авторизований URI перенаправлення: ```text http://localhost:8085/oauth2callback ``` -6. Скопіюйте client ID і client secret. +6. Скопіюйте ідентифікатор клієнта та секрет клієнта. -`meetings.space.created` потрібен для Google Meet `spaces.create`. -`meetings.space.readonly` дає OpenClaw змогу розв’язувати URL/коди Meet у простори. -`meetings.conference.media.readonly` призначений для preflight і медіароботи Meet Media API; -Google може вимагати реєстрацію в Developer Preview для фактичного використання Media API. +`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. -### Створення refresh token +### Отримання токена оновлення Налаштуйте `oauth.clientId` і, за потреби, `oauth.clientSecret`, або передайте їх як -змінні середовища, потім виконайте: +змінні середовища, а потім виконайте: ```bash openclaw googlemeet auth login --json ``` -Команда друкує конфігураційний блок `oauth` з refresh token. Вона використовує PKCE, -localhost callback на `http://localhost:8085/oauth2callback` і ручний -потік копіювання/вставлення з `--manual`. +Команда виводить блок конфігурації `oauth` з токеном оновлення. Вона використовує PKCE, +зворотний виклик localhost на `http://localhost:8085/oauth2callback` і ручний потік +копіювання/вставлення з `--manual`. Приклади: @@ -535,7 +547,7 @@ OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \ openclaw googlemeet auth login --json ``` -Використовуйте ручний режим, коли браузер не може досягти локального callback: +Використовуйте ручний режим, коли браузер не може досягти локального зворотного виклику: ```bash OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \ @@ -579,16 +591,16 @@ openclaw googlemeet auth login --json --manual } ``` -Віддавайте перевагу змінним середовища, коли не хочете зберігати refresh token у конфігурації. -Якщо присутні і значення конфігурації, і значення середовища, Plugin спершу використовує конфігурацію, -а потім fallback із середовища. +Надавайте перевагу змінним середовища, коли не хочете зберігати токен оновлення +в конфігурації. Якщо присутні значення і в конфігурації, і в середовищі, Plugin спершу +використовує конфігурацію, а потім fallback до середовища. Згода OAuth включає створення просторів Meet, доступ на читання просторів Meet і доступ -на читання медіа конференцій Meet. Якщо ви автентифікувалися до появи підтримки -створення зустрічей, повторно виконайте `openclaw googlemeet auth login --json`, щоб refresh -token мав scope `meetings.space.created`. +на читання медіа конференцій Meet. Якщо ви автентифікувалися до появи підтримки створення +зустрічей, повторно виконайте `openclaw googlemeet auth login --json`, щоб токен оновлення +мав область доступу `meetings.space.created`. -### Перевірка OAuth через doctor +### Перевірка OAuth за допомогою doctor Запустіть OAuth doctor, коли потрібна швидка перевірка стану без секретів: @@ -597,51 +609,51 @@ openclaw googlemeet doctor --oauth --json ``` Це не завантажує runtime Chrome і не потребує підключеного вузла Chrome. Воно -перевіряє, що конфігурація OAuth існує і що refresh token може створити access -token. Звіт JSON містить лише поля стану, як-от `ok`, `configured`, -`tokenSource`, `expiresAt`, і повідомлення перевірок; він не друкує access -token, refresh token або client secret. +перевіряє, що конфігурація OAuth існує і що токен оновлення може отримати токен доступу. +Звіт JSON містить лише поля стану, як-от `ok`, `configured`, +`tokenSource`, `expiresAt`, і повідомлення перевірок; він не виводить токен доступу, +токен оновлення або секрет клієнта. Поширені результати: | Перевірка | Значення | | -------------------- | --------------------------------------------------------------------------------------- | -| `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` або кешований токен доступу. | +| `oauth-token` | Кешований токен доступу все ще чинний або токен оновлення отримав новий токен доступу. | +| `meet-spaces-get` | Необов’язкова перевірка `--meeting` розв’язала наявний простір Meet. | +| `meet-spaces-create` | Необов’язкова перевірка `--create-space` створила новий простір Meet. | -Щоб також довести ввімкнення Google Meet API і scope `spaces.create`, запустіть -перевірку створення з побічним ефектом: +Щоб також підтвердити ввімкнення Google Meet API і область доступу `spaces.create`, +запустіть перевірку створення з побічним ефектом: ```bash openclaw googlemeet doctor --oauth --create-space --json openclaw googlemeet create --no-join --json ``` -`--create-space` створює одноразовий URL Meet. Використовуйте його, коли потрібно підтвердити, -що в проєкті Google Cloud увімкнено Meet API і що авторизований -обліковий запис має scope `meetings.space.created`. +`--create-space` створює одноразову URL-адресу Meet. Використовуйте це, коли потрібно +підтвердити, що проєкт Google Cloud має ввімкнений Meet API і що авторизований обліковий +запис має область доступу `meetings.space.created`. -Щоб довести доступ на читання для наявного простору зустрічі: +Щоб підтвердити доступ на читання для наявного простору зустрічі: ```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` доводять доступ на читання до наявного +`doctor --oauth --meeting` і `resolve-space` підтверджують доступ на читання до наявного простору, до якого авторизований обліковий запис Google має доступ. `403` від цих перевірок -зазвичай означає, що Google Meet REST API вимкнено, погоджений refresh token -не має потрібного scope або обліковий запис Google не має доступу до цього простору Meet. -Помилка refresh-token означає, що потрібно повторно виконати `openclaw googlemeet auth login +зазвичай означає, що Google Meet REST API вимкнено, токен оновлення зі згодою не має +потрібної області доступу або обліковий запис Google не може отримати доступ до цього простору +Meet. Помилка токена оновлення означає, що потрібно повторно виконати `openclaw googlemeet auth login --json` і зберегти новий блок `oauth`. -Для browser fallback облікові дані OAuth не потрібні. У цьому режимі автентифікація Google -надходить із профілю Chrome із виконаним входом на вибраному вузлі, а не з +Для браузерного fallback облікові дані OAuth не потрібні. У цьому режимі автентифікація +Google надходить із виконаного входу в профіль Chrome на вибраному вузлі, а не з конфігурації OpenClaw. -Ці змінні середовища приймаються як fallbacks: +Ці змінні середовища приймаються як fallback: - `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` - `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` або `GOOGLE_MEET_CLIENT_SECRET` @@ -652,19 +664,19 @@ 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` -Розв’яжіть Meet URL, код або `spaces/{id}` через `spaces.get`: +Визначте URL Meet, код або `spaces/{id}` через `spaces.get`: ```bash openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij ``` -Запустіть preflight перед роботою з медіа: +Запустіть попередню перевірку перед роботою з медіа: ```bash openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij ``` -Перелічіть артефакти зустрічі та відвідуваність після того, як Meet створить записи конференції: +Перегляньте список артефактів зустрічі та відвідуваність після того, як Meet створить записи конференції: ```bash openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hij @@ -672,9 +684,12 @@ 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`, якщо потрібні всі збережені записи +для цієї зустрічі. -Пошук у Calendar може визначити URL зустрічі з Google Calendar перед читанням артефактів Meet: +Пошук у календарі може визначити URL зустрічі з Google Calendar перед читанням +артефактів Meet: ```bash openclaw googlemeet latest --today @@ -683,9 +698,14 @@ openclaw googlemeet artifacts --event "Weekly sync" openclaw googlemeet attendance --today --format csv --output attendance.csv ``` -`--today` шукає в сьогоднішньому календарі `primary` подію Calendar із посиланням Google Meet. Використовуйте `--event ` для пошуку відповідного тексту події, а `--calendar ` — для неосновного календаря. Пошук у Calendar потребує нового входу OAuth, який включає readonly scope подій Calendar. `calendar-events` попередньо показує відповідні події Meet і позначає подію, яку виберуть `latest`, `artifacts`, `attendance` або `export`. +`--today` шукає в сьогоднішньому календарі `primary` подію Calendar із +посиланням Google Meet. Використовуйте `--event ` для пошуку відповідного тексту події та +`--calendar ` для неосновного календаря. Пошук у календарі потребує нового +входу через OAuth, який включає область доступу лише для читання подій Calendar. +`calendar-events` попередньо показує відповідні події Meet і позначає подію, яку +виберуть `latest`, `artifacts`, `attendance` або `export`. -Якщо ви вже знаєте id запису конференції, зверніться до нього напряму: +Якщо ви вже знаєте ідентифікатор запису конференції, звертайтеся до нього напряму: ```bash openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hij @@ -708,9 +728,32 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --dry-run ``` -`artifacts` повертає метадані запису конференції, а також метадані ресурсів учасників, записів, транскриптів, структурованих записів транскрипту та smart-note, коли Google відкриває їх для зустрічі. Використовуйте `--no-transcript-entries`, щоб пропустити пошук записів для великих зустрічей. `attendance` розгортає учасників у рядки participant-session із часом першої й останньої появи, загальною тривалістю сесії, прапорцями запізнення/раннього виходу та дубльованими ресурсами учасників, об’єднаними за зареєстрованим користувачем або відображуваним іменем. Передайте `--no-merge-duplicates`, щоб залишити необроблені ресурси учасників окремо, `--late-after-minutes` — щоб налаштувати виявлення запізнення, і `--early-before-minutes` — щоб налаштувати виявлення раннього виходу. +`artifacts` повертає метадані запису конференції, а також метадані ресурсів учасників, записів, +транскриптів, структурованих записів транскрипту та розумних нотаток, коли +Google надає їх для зустрічі. Використовуйте `--no-transcript-entries`, щоб пропустити +пошук записів для великих зустрічей. `attendance` розгортає учасників у +рядки сеансів учасників із часом першої/останньої появи, загальною тривалістю сеансу, +позначками запізнення/раннього виходу та дубльованими ресурсами учасників, об’єднаними за користувачем, що ввійшов, +або відображуваним іменем. Передайте `--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`, щоб експортувати пов’язаний текст транскриптів і smart-note Google Docs через Google Drive `files.export`; для цього потрібен новий вхід OAuth, який включає readonly scope Drive Meet. Без `--include-doc-bodies` експорт містить лише метадані Meet і структуровані записи транскрипту. Якщо Google повертає часткову помилку артефакту, наприклад помилку списку smart-note, transcript-entry або тіла документа 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`, щоб експортувати пов’язаний транскрипт і +текст розумних нотаток Google Docs через Google Drive `files.export`; для цього потрібен +новий вхід через OAuth, який включає область доступу лише для читання Drive Meet. Без +`--include-doc-bodies` експорти містять лише метадані Meet і структуровані записи транскрипту. +Якщо Google повертає часткову помилку артефакту, наприклад помилку списку розумних нотаток, +запису транскрипту або тіла документа Drive, зведення й +маніфест зберігають попередження замість того, щоб провалити весь експорт. +Використовуйте `--dry-run`, щоб отримати ті самі дані артефактів/відвідуваності та вивести +JSON маніфесту без створення теки або ZIP. Це корисно перед записом +великого експорту або коли агенту потрібні лише лічильники, вибрані записи та +попередження. Агенти також можуть створити такий самий пакет через інструмент `google_meet`: @@ -724,9 +767,9 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \ } ``` -Встановіть `"dryRun": true`, щоб повернути лише manifest експорту та пропустити запис файлів. +Установіть `"dryRun": true`, щоб повернути лише маніфест експорту та пропустити запис файлів. -Запустіть захищений live smoke проти реальної збереженої зустрічі: +Запустіть захищений живий smoke-тест для реальної збереженої зустрічі: ```bash OPENCLAW_LIVE_TEST=1 \ @@ -734,21 +777,25 @@ 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: +Середовище живого smoke-тесту: -- `OPENCLAW_LIVE_TEST=1` вмикає захищені live-тести. -- `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` вказує на збережений Meet URL, код або +- `OPENCLAW_LIVE_TEST=1` вмикає захищені живі тести. +- `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` вказує на збережений URL Meet, код або `spaces/{id}`. -- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` надає OAuth - client id. +- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` надає ідентифікатор клієнта OAuth. - `OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN` або `GOOGLE_MEET_REFRESH_TOKEN` надає - refresh token. + токен оновлення. - Необов’язково: `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET`, `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN` і - `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` використовують ті самі fallback-імена + `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`. Пошук у Calendar потребує `https://www.googleapis.com/auth/calendar.events.readonly`. Експорт тіла документа Drive потребує `https://www.googleapis.com/auth/drive.meet.readonly`. +Базовому живому 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: @@ -756,9 +803,13 @@ pnpm test:live -- extensions/google-meet/google-meet.live.test.ts openclaw googlemeet create ``` -Команда друкує нові `meeting uri`, джерело та join session. З обліковими даними OAuth вона використовує офіційний Google Meet API. Без облікових даних OAuth вона використовує профіль браузера із виконаним входом pinned Chrome node як fallback. Агенти можуть використовувати інструмент `google_meet` з `action: "create"`, щоб створити та приєднатися за один крок. Для створення лише URL передайте `"join": false`. +Команда виводить новий `meeting uri`, джерело та сеанс приєднання. З обліковими даними OAuth +вона використовує офіційний Google Meet API. Без облікових даних OAuth вона +використовує профіль браузера закріпленого вузла Chrome, у якому виконано вхід, як резервний варіант. Агенти можуть +використовувати інструмент `google_meet` з `action: "create"`, щоб створити зустріч і приєднатися за один +крок. Для створення лише URL передайте `"join": false`. -Приклад JSON-виводу з browser fallback: +Приклад JSON-виводу з резервного браузерного варіанта: ```json { @@ -778,7 +829,9 @@ openclaw googlemeet create } ``` -Якщо browser fallback натрапляє на вхід Google або блокер дозволів Meet до того, як може створити URL, метод Gateway повертає невдалу відповідь, а інструмент `google_meet` повертає структуровані деталі замість простого рядка: +Якщо резервний браузерний варіант натикається на вхід у Google або блокування дозволів Meet до того, як +зможе створити URL, метод Gateway повертає невдалу відповідь, а +інструмент `google_meet` повертає структуровані деталі замість звичайного рядка: ```json { @@ -796,7 +849,9 @@ openclaw googlemeet create } ``` -Коли агент бачить `manualActionRequired: true`, він має повідомити `manualActionMessage` разом із контекстом browser node/tab і припинити відкривати нові вкладки Meet, доки оператор не завершить крок у браузері. +Коли агент бачить `manualActionRequired: true`, він має повідомити +`manualActionMessage` разом із контекстом вузла/вкладки браузера та припинити відкривати нові +вкладки Meet, доки оператор не завершить крок у браузері. Приклад JSON-виводу зі створення через API: @@ -819,13 +874,21 @@ openclaw googlemeet create } ``` -Створення Meet типово приєднує до зустрічі. Транспорту Chrome або Chrome-node усе ще потрібен профіль Google Chrome із виконаним входом, щоб приєднатися через браузер. Якщо з профілю виконано вихід, OpenClaw повідомляє `manualActionRequired: true` або помилку browser fallback і просить оператора завершити вхід 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 +проект, принципал OAuth і учасники зустрічі зареєстровані в Google +Workspace Developer Preview Program для медіа-API Meet. ## Конфігурація -Спільний realtime-шлях Chrome потребує лише ввімкненого Plugin, BlackHole, SoX і ключа backend realtime voice provider. OpenAI є типовим; встановіть `realtime.provider: "google"`, щоб використовувати Google Gemini Live: +Спільному шляху Chrome у реальному часі потрібні лише ввімкнений plugin, BlackHole, SoX +і ключ бекенд-провайдера голосу в реальному часі. OpenAI використовується за замовчуванням; установіть +`realtime.provider: "google"`, щоб використовувати Google Gemini Live: ```bash brew install blackhole-2ch sox @@ -834,7 +897,7 @@ export OPENAI_API_KEY=sk-... export GEMINI_API_KEY=... ``` -Встановіть конфігурацію Plugin у `plugins.entries.google-meet.config`: +Установіть конфігурацію plugin у `plugins.entries.google-meet.config`: ```json5 { @@ -849,31 +912,35 @@ export GEMINI_API_KEY=... } ``` -Типові значення: +Значення за замовчуванням: - `defaultTransport: "chrome"` - `defaultMode: "realtime"` -- `chromeNode.node`: необов’язковий node id/name/IP для `chrome-node` +- `chromeNode.node`: необов’язковий ідентифікатор/назва/IP вузла для `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 intro -- `chrome.audioFormat: "pcm16-24khz"`: аудіоформат command-pair. Використовуйте - `"g711-ulaw-8khz"` лише для legacy/custom command pairs, які все ще видають - telephony audio. +- `chrome.guestName: "OpenClaw Agent"`: ім’я, що використовується на гостьовому екрані Meet + без входу +- `chrome.autoJoin: true`: найкраща спроба заповнити ім’я гостя та натиснути Join Now + через браузерну автоматизацію OpenClaw на `chrome-node` +- `chrome.reuseExistingTab: true`: активувати наявну вкладку Meet замість + відкриття дублікатів +- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet повідомить про стан у дзвінку, + перш ніж запускати вступ у реальному часі +- `chrome.audioFormat: "pcm16-24khz"`: аудіоформат пари команд. Використовуйте + `"g711-ulaw-8khz"` лише для застарілих/користувацьких пар команд, які все ще генерують + телефонне аудіо. - `chrome.audioInputCommand`: команда SoX, що читає з CoreAudio `BlackHole 2ch` і записує аудіо у `chrome.audioFormat` - `chrome.audioOutputCommand`: команда SoX, що читає аудіо у `chrome.audioFormat` - і записує до CoreAudio `BlackHole 2ch` + і записує в CoreAudio `BlackHole 2ch` - `realtime.provider: "openai"` - `realtime.toolPolicy: "safe-read-only"` -- `realtime.instructions`: короткі усні відповіді, з +- `realtime.instructions`: короткі усні відповіді з `openclaw_agent_consult` для глибших відповідей -- `realtime.introMessage`: коротка усна перевірка готовності, коли realtime bridge - під’єднується; встановіть значення `""`, щоб приєднатися мовчки -- `realtime.agentId`: необов’язковий OpenClaw agent id для - `openclaw_agent_consult`; типово `main` +- `realtime.introMessage`: коротка усна перевірка готовності, коли міст реального часу + підключається; установіть значення `""`, щоб приєднатися без звуку +- `realtime.agentId`: необов’язковий ідентифікатор агента OpenClaw для + `openclaw_agent_consult`; за замовчуванням `main` Необов’язкові перевизначення: @@ -922,7 +989,10 @@ export GEMINI_API_KEY=... } ``` -`voiceCall.enabled` типово має значення `true`; з транспортом Twilio він делегує фактичний PSTN-дзвінок і DTMF до Voice Call plugin. Якщо `voice-call` не ввімкнено, Google Meet усе ще може перевірити й записати план набору, але не може здійснити Twilio-дзвінок. +`voiceCall.enabled` за замовчуванням має значення `true`; з транспортом Twilio він делегує +фактичний виклик PSTN і DTMF до Voice Call plugin. Якщо `voice-call` не +ввімкнено, Google Meet усе ще може перевірити й записати план набору, але не може +розмістити виклик Twilio. ## Інструмент @@ -938,32 +1008,32 @@ export GEMINI_API_KEY=... ``` Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. Використовуйте -`transport: "chrome-node"`, коли Chrome працює на спареному вузлі, наприклад Parallels -VM. В обох випадках модель реального часу й `openclaw_agent_consult` працюють на -хості Gateway, тому облікові дані моделі залишаються там. +`transport: "chrome-node"`, коли Chrome працює на спареному Node, наприклад у Parallels +VM. В обох випадках realtime-модель і `openclaw_agent_consult` працюють на хості +Gateway, тому облікові дані моделі залишаються там. -Використовуйте `action: "status"`, щоб перелічити активні сеанси або перевірити ID сеансу. Використовуйте -`action: "speak"` із `sessionId` і `message`, щоб агент реального часу -негайно заговорив. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сеанс, -запустити відому фразу й повернути стан `inCall`, коли хост Chrome може -повідомити його. `test_speech` завжди примусово встановлює `mode: "realtime"` і завершується помилкою, якщо його просять +Використовуйте `action: "status"`, щоб перелічити активні сеанси або переглянути ID сеансу. Використовуйте +`action: "speak"` із `sessionId` і `message`, щоб realtime-агент +заговорив негайно. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сеанс, +запустити відому фразу та повернути стан справності `inCall`, коли хост Chrome може +про нього повідомити. `test_speech` завжди примусово встановлює `mode: "realtime"` і завершується помилкою, якщо його просять працювати в `mode: "transcribe"`, тому що сеанси лише для спостереження навмисно не можуть -відтворювати мовлення. Його результат `speechOutputVerified` базується на збільшенні байтів аудіовиходу реального часу +виводити мовлення. Його результат `speechOutputVerified` базується на збільшенні байтів realtime-аудіовиходу під час цього тестового виклику, тому повторно використаний сеанс зі старішим аудіо -не зараховується як нова успішна перевірка мовлення. Використовуйте `action: "leave"`, щоб позначити +не зараховується як свіжа успішна перевірка мовлення. Використовуйте `action: "leave"`, щоб позначити сеанс завершеним. -`status` містить стан Chrome, коли він доступний: +`status` містить стан справності Chrome, коли він доступний: -- `inCall`: Chrome, схоже, перебуває всередині виклику Meet +- `inCall`: схоже, Chrome перебуває всередині виклику Meet - `micMuted`: приблизний стан мікрофона Meet - `manualActionRequired` / `manualActionReason` / `manualActionMessage`: профіль - браузера потребує ручного входу, допуску від організатора Meet, дозволів або + браузера потребує ручного входу, допуску від хоста Meet, дозволів або відновлення керування браузером, перш ніж мовлення зможе працювати - `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: чи - кероване мовлення Chrome зараз дозволене. `speechReady: false` означає, що OpenClaw - не надіслав вступну/тестову фразу в аудіоміст. -- `providerConnected` / `realtimeReady`: стан голосового мосту реального часу + кероване мовлення Chrome дозволене зараз. `speechReady: false` означає, що OpenClaw не + надіслав вступну/тестову фразу в аудіоміст. +- `providerConnected` / `realtimeReady`: стан realtime-голосового мосту - `lastInputAt` / `lastOutputAt`: останнє аудіо, отримане з мосту або надіслане до нього ```json @@ -974,32 +1044,32 @@ VM. В обох випадках модель реального часу й `op } ``` -## Консультація агента реального часу +## Консультація realtime-агента -Режим Chrome у реальному часі оптимізований для живого голосового циклу. Голосовий -провайдер реального часу чує аудіо зустрічі й говорить через налаштований аудіоміст. -Коли моделі реального часу потрібне глибше міркування, актуальна інформація або звичайні +Realtime-режим Chrome оптимізовано для живого голосового циклу. Realtime-провайдер голосу +чує аудіо зустрічі та говорить через налаштований аудіоміст. +Коли realtime-моделі потрібні глибші міркування, актуальна інформація або звичайні інструменти OpenClaw, вона може викликати `openclaw_agent_consult`. Інструмент консультації запускає звичайного агента OpenClaw у фоновому режимі з нещодавнім -контекстом транскрипту зустрічі й повертає стислу усну відповідь у голосовий сеанс -реального часу. Потім голосова модель може вимовити цю відповідь назад у зустріч. -Він використовує той самий спільний інструмент консультації реального часу, що й Voice Call. +контекстом транскрипту зустрічі та повертає стислу усну відповідь до realtime +голосового сеансу. Потім голосова модель може промовити цю відповідь назад у зустріч. +Він використовує той самий спільний realtime-інструмент консультації, що й Voice Call. За замовчуванням консультації виконуються для агента `main`. Встановіть `realtime.agentId`, коли -лінія Meet має звертатися до окремого робочого простору агента OpenClaw, типових налаштувань моделі, -політики інструментів, пам’яті й історії сеансу. +смуга Meet має консультуватися зі спеціальним робочим простором агента OpenClaw, типовими налаштуваннями моделі, +політикою інструментів, пам’яттю та історією сеансів. -`realtime.toolPolicy` керує запуском консультації: +`realtime.toolPolicy` керує виконанням консультації: -- `safe-read-only`: відкрити інструмент консультації й обмежити звичайного агента до +- `safe-read-only`: відкрити інструмент консультації та обмежити звичайного агента `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. -- `owner`: відкрити інструмент консультації й дозволити звичайному агенту використовувати звичайну +- `owner`: відкрити інструмент консультації та дозволити звичайному агенту використовувати звичайну політику інструментів агента. -- `none`: не відкривати інструмент консультації для голосової моделі реального часу. +- `none`: не відкривати інструмент консультації realtime-голосовій моделі. -Ключ сеансу консультації обмежений окремим сеансом Meet, тому подальші виклики консультації +Ключ сеансу консультації обмежений кожним сеансом Meet, тому подальші виклики консультації можуть повторно використовувати попередній контекст консультації під час тієї самої зустрічі. Щоб примусово виконати усну перевірку готовності після того, як Chrome повністю приєднався до виклику: @@ -1008,7 +1078,7 @@ VM. В обох випадках модель реального часу й `op openclaw googlemeet speak meet_... "Say exactly: I'm here and listening." ``` -Для повної перевірки smoke із приєднанням і мовленням: +Для повної smoke-перевірки приєднання й мовлення: ```bash openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ @@ -1018,7 +1088,7 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ ## Контрольний список live-тесту -Використовуйте цю послідовність перед передаванням зустрічі агенту без нагляду: +Використовуйте цю послідовність, перш ніж передати зустріч автономному агенту: ```bash openclaw googlemeet setup @@ -1032,10 +1102,10 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ - `googlemeet setup` повністю зелений. - `googlemeet setup` містить `chrome-node-connected`, коли Chrome-node є - стандартним транспортом або вузол закріплено. -- `nodes status` показує, що вибраний вузол під’єднано. -- Вибраний вузол оголошує і `googlemeet.chrome`, і `browser.proxy`. -- Вкладка Meet приєднується до виклику, а `test-speech` повертає стан Chrome з + типовим транспортом або Node закріплено. +- `nodes status` показує вибраний Node як підключений. +- Вибраний Node оголошує і `googlemeet.chrome`, і `browser.proxy`. +- Вкладка Meet приєднується до виклику, а `test-speech` повертає стан справності Chrome з `inCall: true`. Для віддаленого хоста Chrome, наприклад Parallels macOS VM, це найкоротша @@ -1050,11 +1120,11 @@ openclaw nodes invoke \ --params '{"action":"setup"}' ``` -Це доводить, що plugin Gateway завантажено, вузол VM під’єднано з +Це доводить, що Plugin Gateway завантажено, Node VM підключений із поточним токеном, а аудіоміст Meet доступний до того, як агент відкриє -справжню вкладку зустрічі. +реальну вкладку зустрічі. -Для smoke-перевірки Twilio використовуйте зустріч, що надає деталі телефонного підключення: +Для smoke-перевірки Twilio використовуйте зустріч, яка надає дані телефонного підключення: ```bash openclaw googlemeet setup @@ -1076,7 +1146,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ ### Агент не бачить інструмент Google Meet -Підтвердьте, що plugin увімкнено в конфігурації Gateway, і перезавантажте Gateway: +Підтвердьте, що Plugin увімкнено в конфігурації Gateway, і перезавантажте Gateway: ```bash openclaw plugins list | grep google-meet @@ -1084,12 +1154,11 @@ openclaw googlemeet setup ``` Якщо ви щойно редагували `plugins.entries.google-meet`, перезапустіть або перезавантажте Gateway. -Запущений агент бачить лише інструменти plugin, зареєстровані поточним процесом -Gateway. +Запущений агент бачить лише інструменти Plugin, зареєстровані поточним процесом Gateway. -### Немає під’єднаного вузла з підтримкою Google Meet +### Немає підключеного Node із підтримкою Google Meet -На хості вузла виконайте: +На хості Node виконайте: ```bash openclaw plugins enable google-meet @@ -1098,7 +1167,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node run --host --port 18789 --display-name parallels-macos ``` -На хості Gateway схваліть вузол і перевірте команди: +На хості Gateway схваліть Node і перевірте команди: ```bash openclaw devices list @@ -1106,8 +1175,8 @@ openclaw devices approve openclaw nodes status ``` -Вузол має бути під’єднаний і перелічувати `googlemeet.chrome` плюс `browser.proxy`. -Конфігурація Gateway має дозволяти ці команди вузла: +Node має бути підключений і перелічувати `googlemeet.chrome` разом із `browser.proxy`. +Конфігурація Gateway має дозволяти ці команди Node: ```json5 { @@ -1120,7 +1189,7 @@ openclaw nodes status ``` Якщо `googlemeet setup` не проходить `chrome-node-connected` або журнал Gateway повідомляє -`gateway token mismatch`, перевстановіть або перезапустіть вузол із поточним токеном Gateway. +`gateway token mismatch`, перевстановіть або перезапустіть Node із поточним токеном Gateway. Для LAN Gateway це зазвичай означає: ```bash @@ -1132,7 +1201,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ --force ``` -Потім перезавантажте службу вузла й повторно виконайте: +Потім перезавантажте службу Node і повторно виконайте: ```bash openclaw googlemeet setup @@ -1141,57 +1210,57 @@ openclaw nodes status --connected ### Браузер відкривається, але агент не може приєднатися -Запустіть `googlemeet test-speech` і перевірте повернений стан Chrome. Якщо він +Запустіть `googlemeet test-speech` і перегляньте повернений стан справності Chrome. Якщо він повідомляє `manualActionRequired: true`, покажіть `manualActionMessage` оператору -й припиніть повторювати спроби, доки дія в браузері не буде завершена. +і припиніть повторні спроби, доки дія в браузері не буде завершена. Поширені ручні дії: -- Увійдіть у профіль Chrome. -- Допустіть гостя з облікового запису організатора Meet. -- Надайте Chrome дозволи на мікрофон/камеру, коли з’явиться нативний запит дозволу +- Увійти в профіль Chrome. +- Допустити гостя з облікового запису хоста Meet. +- Надати Chrome дозволи на мікрофон/камеру, коли з’явиться нативний запит дозволу Chrome. -- Закрийте або відновіть завислий діалог дозволів Meet. +- Закрити або відновити завислий діалог дозволів Meet. Не повідомляйте "not signed in" лише тому, що Meet показує "Do you want people to hear you in the meeting?" Це проміжний екран вибору аудіо Meet; OpenClaw -натискає **Use microphone** через автоматизацію браузера, коли це доступно, і продовжує -очікувати на справжній стан зустрічі. Для резервного варіанта браузера лише для створення OpenClaw +натискає **Use microphone** через браузерну автоматизацію, коли вона доступна, і продовжує +очікувати реального стану зустрічі. Для резервного режиму браузера лише для створення OpenClaw може натиснути **Continue without microphone**, тому що створення URL не потребує -шляху аудіо реального часу. +realtime-аудіошляху. ### Не вдається створити зустріч `googlemeet create` спочатку використовує endpoint Google Meet API `spaces.create`, коли налаштовано облікові дані OAuth. Без облікових даних OAuth він переходить -до закріпленого браузера вузла Chrome. Підтвердьте: +до резервного браузера на закріпленому Chrome Node. Перевірте: - Для створення через API: налаштовано `oauth.clientId` і `oauth.refreshToken`, або присутні відповідні змінні середовища `OPENCLAW_GOOGLE_MEET_*`. -- Для створення через API: refresh token було створено після додавання підтримки створення. +- Для створення через API: refresh token був створений після додавання підтримки створення. Старішим токенам може бракувати scope `meetings.space.created`; повторно виконайте - `openclaw googlemeet auth login --json` і оновіть конфігурацію plugin. -- Для резервного варіанта браузера: `defaultTransport: "chrome-node"` і - `chromeNode.node` вказують на під’єднаний вузол із `browser.proxy` і + `openclaw googlemeet auth login --json` і оновіть конфігурацію Plugin. +- Для резервного браузера: `defaultTransport: "chrome-node"` і + `chromeNode.node` вказують на підключений Node із `browser.proxy` і `googlemeet.chrome`. -- Для резервного варіанта браузера: профіль Chrome OpenClaw на цьому вузлі виконано вхід - у Google і він може відкрити `https://meet.google.com/new`. -- Для резервного варіанта браузера: повторні спроби повторно використовують наявну вкладку - `https://meet.google.com/new` або вкладку запиту облікового запису Google, перш ніж відкривати нову вкладку. Якщо час очікування агента сплив, +- Для резервного браузера: профіль OpenClaw Chrome на цьому Node увійшов + у Google і може відкрити `https://meet.google.com/new`. +- Для резервного браузера: повторні спроби використовують наявну вкладку `https://meet.google.com/new` + або вкладку запиту облікового запису Google, перш ніж відкривати нову вкладку. Якщо агент перевищує час очікування, повторіть виклик інструмента замість ручного відкриття ще однієї вкладки Meet. -- Для резервного варіанта браузера: якщо інструмент повертає `manualActionRequired: true`, використовуйте +- Для резервного браузера: якщо інструмент повертає `manualActionRequired: true`, використовуйте повернені `browser.nodeId`, `browser.targetId`, `browserUrl` і `manualActionMessage`, щоб скерувати оператора. Не повторюйте спроби в циклі, доки ця дія не буде завершена. -- Для резервного варіанта браузера: якщо Meet показує "Do you want people to hear you in the +- Для резервного браузера: якщо Meet показує "Do you want people to hear you in the meeting?", залиште вкладку відкритою. OpenClaw має натиснути **Use microphone** або, для - резервного створення лише URL, **Continue without microphone** через автоматизацію - браузера й продовжити чекати на згенерований URL Meet. Якщо не може, помилка - має згадувати `meet-audio-choice-required`, а не `google-login-required`. + резервного режиму лише створення, **Continue without microphone** через браузерну + автоматизацію та продовжити очікування згенерованого URL Meet. Якщо він не може, у + помилці має згадуватися `meet-audio-choice-required`, а не `google-login-required`. ### Агент приєднується, але не говорить -Перевірте шлях реального часу: +Перевірте realtime-шлях: ```bash openclaw googlemeet setup @@ -1199,54 +1268,54 @@ openclaw googlemeet doctor ``` Використовуйте `mode: "realtime"` для прослуховування/відповіді голосом. `mode: "transcribe"` навмисно -не запускає дуплексний голосовий міст реального часу. `googlemeet test-speech` -завжди перевіряє шлях реального часу й повідомляє, чи було помічено вихідні байти мосту -для цього виклику. Якщо `speechOutputVerified` є false і -`speechOutputTimedOut` є true, провайдер реального часу міг прийняти -висловлювання, але OpenClaw не побачив, щоб нові вихідні байти дійшли до аудіомосту +не запускає дуплексний realtime-голосовий міст. `googlemeet test-speech` +завжди перевіряє realtime-шлях і повідомляє, чи були помічені байти виходу мосту +для цього виклику. Якщо `speechOutputVerified` має значення false, а +`speechOutputTimedOut` має значення true, realtime-провайдер міг прийняти +висловлювання, але OpenClaw не побачив, що нові вихідні байти дійшли до аудіомосту Chrome. Також перевірте: -- Ключ провайдера реального часу доступний на хості Gateway, наприклад +- Ключ realtime-провайдера доступний на хості Gateway, наприклад `OPENAI_API_KEY` або `GEMINI_API_KEY`. - `BlackHole 2ch` видимий на хості Chrome. - `sox` існує на хості Chrome. -- Мікрофон і динамік Meet маршрутизовано через віртуальний аудіошлях, який використовує +- Мікрофон і динамік Meet спрямовані через віртуальний аудіошлях, який використовує OpenClaw. -`googlemeet doctor [session-id]` друкує сеанс, вузол, стан перебування у виклику, -причину ручної дії, підключення провайдера реального часу, `realtimeReady`, активність -аудіовходу/виходу, останні часові позначки аудіо, лічильники байтів і URL браузера. -Використовуйте `googlemeet status [session-id] --json`, коли потрібен необроблений JSON. Використовуйте -`googlemeet doctor --oauth`, коли потрібно перевірити оновлення Google Meet OAuth -без розкриття токенів; додайте `--meeting` або `--create-space`, коли вам також потрібне -підтвердження Google Meet API. +`googlemeet doctor [session-id]` виводить сеанс, Node, стан у виклику, +причину ручної дії, підключення realtime-провайдера, `realtimeReady`, активність +аудіовходу/аудіовиходу, останні аудіомітки часу, лічильники байтів і URL браузера. +Використовуйте `googlemeet status [session-id] --json`, коли потрібен сирий JSON. Використовуйте +`googlemeet doctor --oauth`, коли потрібно перевірити оновлення OAuth Google Meet +без розкриття токенів; додайте `--meeting` або `--create-space`, коли також потрібен +доказ Google Meet API. -Якщо час очікування агента сплив, а ви бачите вже відкриту вкладку Meet, перевірте цю вкладку -без відкриття нової: +Якщо агент перевищив час очікування і ви бачите вже відкриту вкладку 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. Вона не відкриває нову вкладку й не створює новий сеанс; вона повідомляє +Chrome Node. Вона не відкриває нову вкладку й не створює новий сеанс; вона повідомляє поточний блокер, наприклад вхід, допуск, дозволи або стан вибору аудіо. Команда CLI звертається до налаштованого Gateway, тому Gateway має бути запущений; -`chrome-node` також потребує, щоб вузол Chrome був під’єднаний. +`chrome-node` також вимагає, щоб Chrome Node був підключений. ### Перевірки налаштування Twilio не проходять -`twilio-voice-call-plugin` завершується помилкою, коли `voice-call` не дозволено або не ввімкнено. +`twilio-voice-call-plugin` завершується з помилкою, коли `voice-call` не дозволено або не ввімкнено. Додайте його до `plugins.allow`, увімкніть `plugins.entries.voice-call` і перезавантажте Gateway. -`twilio-voice-call-credentials` завершується помилкою, коли у бекенді Twilio бракує -SID облікового запису, токена автентифікації або номера абонента, що телефонує. Задайте їх на хості Gateway: +`twilio-voice-call-credentials` завершується з помилкою, коли в бекенді Twilio бракує account +SID, auth token або номера абонента, що телефонує. Задайте їх на хості Gateway: ```bash export TWILIO_ACCOUNT_SID=AC... @@ -1254,27 +1323,69 @@ export TWILIO_AUTH_TOKEN=... export TWILIO_FROM_NUMBER=+15550001234 ``` -`twilio-voice-call-webhook` завершується помилкою, коли `voice-call` не має публічної -експозиції Webhook або коли `publicUrl` вказує на local loopback чи простір приватної мережі. +`twilio-voice-call-webhook` завершується з помилкою, коли `voice-call` не має публічного +доступу Webhook або коли `publicUrl` вказує на local loopback чи простір приватної мережі. Задайте `plugins.entries.voice-call.config.publicUrl` як публічну URL-адресу провайдера або -налаштуйте тунель/Tailscale-експозицію для `voice-call`. +налаштуйте тунель/Tailscale-доступ для `voice-call`. + +Loopback і приватні URL-адреси не підходять для зворотних викликів операторів. Не використовуйте +`localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`, +`192.168.x`, `169.254.x`, `fc00::/7` або `fd00::/8` як `publicUrl`. + +Для стабільної публічної URL-адреси: + +```json5 +{ + plugins: { + entries: { + "voice-call": { + enabled: true, + config: { + provider: "twilio", + fromNumber: "+15550001234", + publicUrl: "https://voice.example.com/voice/webhook", + }, + }, + }, + }, +} +``` + +Для локальної розробки використовуйте тунель або Tailscale-доступ замість приватної +URL-адреси хоста: + +```json5 +{ + plugins: { + entries: { + "voice-call": { + config: { + tunnel: { provider: "ngrok" }, + // or + tailscale: { mode: "funnel", path: "/voice/webhook" }, + }, + }, + }, + }, +} +``` Потім перезапустіть або перезавантажте Gateway і виконайте: ```bash -openclaw googlemeet setup +openclaw googlemeet setup --transport twilio openclaw voicecall setup openclaw voicecall smoke ``` -`voicecall smoke` за замовчуванням лише перевіряє готовність. Щоб виконати пробний запуск для конкретного номера: +`voicecall smoke` за замовчуванням перевіряє лише готовність. Щоб виконати пробний запуск для конкретного номера: ```bash openclaw voicecall smoke --to "+15555550123" ``` -Додавайте `--yes` лише тоді, коли навмисно хочете здійснити живий вихідний -дзвінок-сповіщення: +Додавайте `--yes` лише тоді, коли навмисно хочете здійснити живий вихідний сповіщувальний +дзвінок: ```bash openclaw voicecall smoke --to "+15555550123" --yes @@ -1282,8 +1393,8 @@ openclaw voicecall smoke --to "+15555550123" --yes ### Виклик Twilio починається, але ніколи не входить у зустріч -Переконайтеся, що подія Meet надає дані телефонного входу. Передайте точний номер -для набору та PIN або власну DTMF-послідовність: +Переконайтеся, що подія Meet надає дані для телефонного підключення. Передайте точний номер для +телефонного підключення та PIN або власну DTMF-послідовність: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij \ @@ -1292,35 +1403,52 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --dtmf-sequence ww123456# ``` -Використовуйте початкову `w` або коми в `--dtmf-sequence`, якщо провайдеру потрібна пауза +Використовуйте початкові `w` або коми в `--dtmf-sequence`, якщо провайдеру потрібна пауза перед введенням PIN. -## Примітки +Якщо телефонний виклик створено, але список учасників Meet ніколи не показує учасника +телефонного підключення: -Офіційний медіа-API Google Meet орієнтований на отримання, тому для мовлення в -дзвінок Meet усе ще потрібен шлях учасника. Цей Plugin робить цю межу видимою: +- Виконайте `openclaw voicecall status --call-id ` і переконайтеся, що виклик досі + активний. +- Виконайте `openclaw voicecall tail` і перевірте, що Webhook-и Twilio надходять до + Gateway. +- Повторно виконайте `openclaw googlemeet setup --transport twilio`; зелена перевірка налаштування + обов’язкова, але не доводить, що послідовність PIN для зустрічі правильна. +- Переконайтеся, що номер для телефонного підключення належить тому самому запрошенню Meet і регіону, що й + PIN. +- Збільште початкові паузи в `--dtmf-sequence`, якщо Meet відповідає повільно, наприклад + `wwww123456#`. + +Якщо Webhook-и не надходять, спочатку налагодьте Plugin Voice Call: провайдер має +досягати `plugins.entries.voice-call.config.publicUrl` або налаштованого тунелю. +Див. [усунення проблем із голосовими викликами](/uk/plugins/voice-call#troubleshooting). + +## Нотатки + +Офіційний медіа-API Google Meet орієнтований на приймання, тому для мовлення в +дзвінку Meet все одно потрібен шлях учасника. Цей Plugin робить цю межу видимою: Chrome обробляє участь у браузері та локальну маршрутизацію аудіо; Twilio обробляє -участь через телефонний набір. +участь через телефонне підключення. -Режиму реального часу Chrome потрібен `BlackHole 2ch` плюс один із варіантів: +Для режиму реального часу Chrome потрібен `BlackHole 2ch` плюс один із варіантів: -- `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw володіє - мостом моделі реального часу й передає аудіо у `chrome.audioFormat` між цими - командами та вибраним голосовим провайдером реального часу. Типовий шлях Chrome — - 24 кГц PCM16; 8 кГц G.711 mu-law залишається доступним для застарілих пар команд. -- `chrome.audioBridgeCommand`: зовнішня команда моста володіє всім локальним +- `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw керує + мостом моделі реального часу та передає аудіо в `chrome.audioFormat` між цими + командами й вибраним голосовим провайдером реального часу. Стандартний шлях Chrome — + 24 kHz PCM16; 8 kHz G.711 mu-law залишається доступним для застарілих пар команд. +- `chrome.audioBridgeCommand`: зовнішня команда моста керує всім локальним аудіошляхом і має завершитися після запуску або перевірки свого демона. Для чистого дуплексного аудіо маршрутизуйте вихід Meet і мікрофон Meet через окремі віртуальні пристрої або граф віртуальних пристроїв у стилі Loopback. Один спільний -пристрій BlackHole може повертати інших учасників луною назад у дзвінок. +пристрій BlackHole може відлунювати інших учасників назад у дзвінок. -`googlemeet speak` запускає активний аудіоміст реального часу для сеансу Chrome. -`googlemeet leave` зупиняє цей міст. Для сеансів Twilio, делегованих через Plugin Voice Call, -`leave` також завершує базовий голосовий дзвінок. +`googlemeet speak` запускає активний аудіоміст реального часу для сесії Chrome. `googlemeet leave` зупиняє цей міст. Для сесій Twilio, делегованих +через Plugin Voice Call, `leave` також завершує базовий голосовий виклик. ## Пов’язане - [Plugin голосових викликів](/uk/plugins/voice-call) - [Режим розмови](/uk/nodes/talk) -- [Створення Plugin](/uk/plugins/building-plugins) +- [Створення plugins](/uk/plugins/building-plugins) diff --git a/docs/uk/plugins/voice-call.md b/docs/uk/plugins/voice-call.md index 5d2175a13..7271c72dc 100644 --- a/docs/uk/plugins/voice-call.md +++ b/docs/uk/plugins/voice-call.md @@ -1,45 +1,45 @@ --- read_when: - - Ви хочете здійснити вихідний голосовий виклик з OpenClaw + - Ви хочете здійснити вихідний голосовий дзвінок з OpenClaw - Ви налаштовуєте або розробляєте Plugin для голосових викликів - - Вам потрібен голосовий зв’язок у реальному часі або потокова транскрипція для телефонії + - Вам потрібен голос у реальному часі або потокова транскрипція в телефонії sidebarTitle: Voice call -summary: Здійснюйте вихідні та приймайте вхідні голосові виклики через Twilio, Telnyx або Plivo, з опційним голосовим зв’язком у реальному часі та потоковою транскрипцією +summary: Здійснюйте вихідні та приймайте вхідні голосові дзвінки через Twilio, Telnyx або Plivo, з необов’язковим голосовим зв’язком у реальному часі та потоковою транскрипцією title: Plugin голосових викликів x-i18n: - generated_at: "2026-05-01T05:39:49Z" + generated_at: "2026-05-01T05:53:21Z" model: gpt-5.5 provider: openai - source_hash: 08690f9f27de8a3d4d2c6056cd08edcc42f60f0592272a464c07cb1dc7fee26e + source_hash: 9ec854553cbba692ac9b3e929b107937332949c62aabe7192cdc9dcaa5537d74 source_path: plugins/voice-call.md workflow: 16 --- -Голосові виклики для OpenClaw через плагін. Підтримує вихідні сповіщення, -багатоходові розмови, повнодуплексний голос у реальному часі, потокову -транскрипцію та вхідні виклики з політиками allowlist. +Дзвінки голосом для OpenClaw через Plugin. Підтримує вихідні сповіщення, +багатоетапні розмови, повнодуплексний голос у реальному часі, потокову +транскрипцію та вхідні дзвінки з політиками списку дозволених. **Поточні провайдери:** `twilio` (Programmable Voice + Media Streams), `telnyx` (Call Control v2), `plivo` (Voice API + XML transfer + GetInput speech), `mock` (розробка/без мережі). -Плагін Voice Call працює **всередині процесу Gateway**. Якщо ви використовуєте -віддалений Gateway, установіть і налаштуйте плагін на машині, де запущено +Plugin дзвінків голосом працює **всередині процесу 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,38 +48,38 @@ Gateway, а потім перезапустіть Gateway, щоб заванта - Якщо npm повідомляє, що пакет, який належить OpenClaw, є застарілим, ця версія пакета + Якщо npm повідомляє, що пакет, яким володіє OpenClaw, застарілий, ця версія пакета походить зі старішої зовнішньої лінійки пакетів; використовуйте поточну пакетовану збірку OpenClaw - або шлях до локальної папки, доки не буде опубліковано новіший пакет npm. + або шлях до локальної папки, доки не буде опубліковано новіший npm-пакет. - Після цього перезапустіть Gateway, щоб плагін завантажився. + Після цього перезапустіть Gateway, щоб Plugin завантажився. - - Задайте конфігурацію в `plugins.entries.voice-call.config` (повну структуру див. - у розділі [Конфігурація](#configuration) нижче). Мінімально потрібні: - `provider`, облікові дані провайдера, `fromNumber` і загальнодоступна - URL-адреса webhook. + + Установіть конфігурацію в `plugins.entries.voice-call.config` (див. + [Конфігурація](#configuration) нижче для повної структури). Мінімально потрібні: + `provider`, облікові дані провайдера, `fromNumber` і публічно + доступна URL-адреса Webhook. - + ```bash openclaw voicecall setup ``` - Типовий вивід зручно читати в журналах чатів і терміналах. Він перевіряє - ввімкнення плагіна, облікові дані провайдера, доступність webhook і те, що - активний лише один аудіорежим (`streaming` або `realtime`). Для скриптів використовуйте - `--json`. + Вивід за замовчуванням зручно читати в журналах чату й терміналах. Він перевіряє, + чи ввімкнено Plugin, облікові дані провайдера, доступність Webhook і те, що + активний лише один аудіорежим (`streaming` або `realtime`). Використовуйте + `--json` для скриптів. - + ```bash openclaw voicecall smoke openclaw voicecall smoke --to "+15555550123" ``` - Обидві команди за замовчуванням виконуються як пробні запуски. Додайте `--yes`, щоб фактично здійснити короткий - вихідний дзвінок зі сповіщенням: + Обидва варіанти за замовчуванням є пробними запусками. Додайте `--yes`, щоб фактично здійснити короткий + вихідний дзвінок-сповіщення: ```bash openclaw voicecall smoke --to "+15555550123" --yes @@ -89,21 +89,21 @@ Gateway, а потім перезапустіть Gateway, щоб заванта -Для Twilio, Telnyx і Plivo налаштування має визначати **публічну URL-адресу webhook**. +Для Twilio, Telnyx і Plivo налаштування має визначатися як **публічна URL-адреса Webhook**. Якщо `publicUrl`, URL-адреса тунелю, URL-адреса Tailscale або резервний варіант serve -визначається як loopback чи простір приватної мережі, налаштування завершується помилкою замість -запуску провайдера, який не зможе отримувати webhook від оператора. +визначаються як loopback або приватний мережевий простір, налаштування завершується помилкою замість +запуску провайдера, який не може отримувати Webhook від оператора. ## Конфігурація Якщо `enabled: true`, але для вибраного провайдера бракує облікових даних, -під час запуску Gateway записує попередження про неповне налаштування з відсутніми ключами та -пропускає запуск runtime. Команди, RPC-виклики й інструменти агента все одно +під час запуску Gateway у журнал записується попередження про неповне налаштування з відсутніми ключами, і +запуск runtime пропускається. Команди, RPC-виклики й інструменти агента все одно повертають точну відсутню конфігурацію провайдера під час використання. -Облікові дані 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). +Облікові дані 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 @@ -164,24 +164,24 @@ 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` є loopback (локальний агент ngrok). Лише для локальної розробки. - - URL-адреси безкоштовного рівня Ngrok можуть змінюватися або додавати проміжну поведінку; якщо `publicUrl` відхиляється, підписи Twilio не проходять перевірку. Для production краще використовуйте стабільний домен або funnel Tailscale. + - На безплатному тарифі ngrok встановіть `publicUrl` на точну URL-адресу ngrok; перевірка підпису завжди примусово застосовується. + - `tunnel.allowNgrokFreeTierLoopbackBypass: true` дозволяє Webhook Twilio з недійсними підписами **лише** коли `tunnel.provider="ngrok"` і `serve.bind` є loopback (локальний агент ngrok). Лише для локальної розробки. + - URL-адреси безплатного тарифу Ngrok можуть змінюватися або додавати проміжну сторінку; якщо `publicUrl` зміщується, підписи Twilio не проходять перевірку. Продакшн: надавайте перевагу стабільному домену або funnel Tailscale. - + - `streaming.preStartTimeoutMs` закриває сокети, які ніколи не надсилають дійсний кадр `start`. - - `streaming.maxPendingConnections` обмежує загальну кількість неавтентифікованих сокетів перед стартом. - - `streaming.maxPendingConnectionsPerIp` обмежує неавтентифіковані сокети перед стартом для однієї вихідної IP-адреси. - - `streaming.maxConnections` обмежує загальну кількість відкритих сокетів медіапотоку (очікувані + активні). + - `streaming.maxPendingConnections` обмежує загальну кількість неавтентифікованих сокетів до старту. + - `streaming.maxPendingConnectionsPerIp` обмежує неавтентифіковані сокети до старту для кожної вихідної IP-адреси. + - `streaming.maxConnections` обмежує загальну кількість відкритих сокетів медіапотоку (очікуваних + активних). - + Старіші конфігурації, що використовують `provider: "log"`, `twilio.from` або застарілі ключі OpenAI `streaming.*`, переписуються командою `openclaw doctor --fix`. Резервний runtime поки що все ще приймає старі ключі voice-call, але @@ -201,34 +201,34 @@ Gateway, а потім перезапустіть Gateway, щоб заванта ## Голосові розмови в реальному часі -`realtime` вибирає повнодуплексного провайдера голосу в реальному часі для живого аудіо виклику. -Він відокремлений від `streaming`, який лише пересилає аудіо +`realtime` вибирає повнодуплексного голосового провайдера реального часу для аудіо +дзвінка наживо. Це окремо від `streaming`, який лише пересилає аудіо провайдерам транскрипції в реальному часі. `realtime.enabled` не можна поєднувати з `streaming.enabled`. Виберіть один -аудіорежим для кожного виклику. +аудіорежим для кожного дзвінка. Поточна поведінка runtime: - `realtime.enabled` підтримується для Twilio Media Streams. -- `realtime.provider` є необов’язковим. Якщо його не задано, Voice Call використовує першого зареєстрованого провайдера голосу в реальному часі. -- Вбудовані провайдери голосу в реальному часі: Google Gemini Live (`google`) і OpenAI (`openai`), зареєстровані їхніми плагінами провайдерів. -- Необроблена конфігурація, що належить провайдеру, міститься в `realtime.providers.`. -- Voice Call за замовчуванням відкриває спільний інструмент реального часу `openclaw_agent_consult`. Модель реального часу може викликати його, коли абонент просить глибше міркування, актуальну інформацію або звичайні інструменти OpenClaw. -- Якщо `realtime.provider` вказує на незареєстрованого провайдера або взагалі не зареєстровано жодного провайдера голосу в реальному часі, Voice Call записує попередження й пропускає медіа реального часу замість того, щоб зупиняти весь плагін з помилкою. -- Ключі сесії consult повторно використовують наявну голосову сесію, коли вона доступна, а потім переходять до номера телефону абонента/одержувача, щоб подальші виклики consult зберігали контекст під час дзвінка. +- `realtime.provider` є необов’язковим. Якщо не задано, Voice Call використовує першого зареєстрованого голосового провайдера реального часу. +- Вбудовані голосові провайдери реального часу: Google Gemini Live (`google`) і OpenAI (`openai`), зареєстровані їхніми провайдерськими Plugin. +- Необроблена конфігурація, якою володіє провайдер, розміщується в `realtime.providers.`. +- Voice Call за замовчуванням надає спільний інструмент реального часу `openclaw_agent_consult`. Модель реального часу може викликати його, коли абонент просить глибшого міркування, актуальної інформації або звичайних інструментів OpenClaw. +- Якщо `realtime.provider` вказує на незареєстрованого провайдера або взагалі не зареєстровано жодного голосового провайдера реального часу, Voice Call записує попередження в журнал і пропускає медіа реального часу замість того, щоб зупиняти весь Plugin з помилкою. +- Ключі сеансу консультації повторно використовують наявний голосовий сеанс, коли він доступний, а потім повертаються до номера телефону абонента/отримувача, щоб подальші consult-виклики зберігали контекст під час дзвінка. ### Політика інструментів `realtime.toolPolicy` керує запуском consult: -| Політика | Поведінка | +| Політика | Поведінка | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| `safe-read-only` | Відкрити інструмент consult і обмежити звичайного агента до `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. | -| `owner` | Відкрити інструмент consult і дозволити звичайному агенту використовувати стандартну політику інструментів агента. | -| `none` | Не відкривати інструмент consult. Власні `realtime.tools` усе одно передаються провайдеру реального часу. | +| `safe-read-only` | Надає інструмент consult і обмежує звичайного агента до `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. | +| `owner` | Надає інструмент consult і дозволяє звичайному агенту використовувати нормальну політику інструментів агента. | +| `none` | Не надає інструмент consult. Користувацькі `realtime.tools` усе одно передаються провайдеру реального часу. | ### Приклади провайдерів реального часу @@ -292,20 +292,20 @@ Gateway, а потім перезапустіть Gateway, щоб заванта Див. [провайдера Google](/uk/providers/google) і -[провайдера OpenAI](/uk/providers/openai), щоб дізнатися про параметри голосу в реальному часі, -специфічні для провайдера. +[провайдера OpenAI](/uk/providers/openai) для параметрів голосу в реальному часі, +специфічних для провайдера. ## Потокова транскрипція -`streaming` вибирає провайдера транскрипції в реальному часі для живого аудіо виклику. +`streaming` вибирає провайдера транскрипції в реальному часі для аудіо дзвінка наживо. Поточна поведінка runtime: -- `streaming.provider` є необов’язковим. Якщо його не задано, Voice Call використовує першого зареєстрованого провайдера транскрипції в реальному часі. -- Вбудовані провайдери транскрипції в реальному часі: Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) і xAI (`xai`), зареєстровані їхніми плагінами провайдерів. -- Необроблена конфігурація, що належить провайдеру, міститься в `streaming.providers.`. -- Після того як Twilio надсилає прийняте повідомлення потоку `start`, Voice Call негайно реєструє потік, ставить вхідні медіа в чергу через провайдера транскрипції, поки провайдер під’єднується, і запускає початкове привітання лише після готовності транскрипції в реальному часі. -- Якщо `streaming.provider` вказує на незареєстрованого провайдера або жодного не зареєстровано, Voice Call записує попередження й пропускає потокове медіа замість того, щоб зупиняти весь плагін з помилкою. +- `streaming.provider` є необов’язковим. Якщо не задано, Voice Call використовує першого зареєстрованого провайдера транскрипції в реальному часі. +- Вбудовані провайдери транскрипції в реальному часі: Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) і xAI (`xai`), зареєстровані їхніми провайдерськими Plugin. +- Необроблена конфігурація, якою володіє провайдер, розміщується в `streaming.providers.`. +- Після того як Twilio надсилає прийняте повідомлення `start` потоку, Voice Call негайно реєструє потік, ставить вхідні медіа в чергу через провайдера транскрипції, поки провайдер підключається, і запускає початкове привітання лише після готовності транскрипції в реальному часі. +- Якщо `streaming.provider` вказує на незареєстрованого провайдера або жодного не зареєстровано, Voice Call записує попередження в журнал і пропускає потокове передавання медіа замість того, щоб зупиняти весь Plugin з помилкою. ### Приклади провайдерів streaming @@ -344,7 +344,7 @@ Gateway, а потім перезапустіть Gateway, щоб заванта Типові значення: ключ API `streaming.providers.xai.apiKey` або `XAI_API_KEY`; - кінцева точка `wss://api.x.ai/v1/stt`; кодування `mulaw`; частота дискретизації `8000`; + endpoint `wss://api.x.ai/v1/stt`; кодування `mulaw`; частота дискретизації `8000`; `endpointingMs: 800`; `interimResults: true`. ```json5 @@ -378,8 +378,8 @@ Gateway, а потім перезапустіть Gateway, щоб заванта ## TTS для викликів Voice Call використовує основну конфігурацію `messages.tts` для потокового -мовлення під час викликів. Її можна перевизначити в конфігурації plugin з -**тією самою структурою** — вона глибоко об'єднується з `messages.tts`. +мовлення під час викликів. Її можна перевизначити в конфігурації Plugin із +**такою самою формою** — вона глибоко об’єднується з `messages.tts`. ```json5 { @@ -396,22 +396,22 @@ Voice Call використовує основну конфігурацію `mes ``` -**Microsoft speech ігнорується для голосових викликів.** Телефонний звук потребує PCM; -поточний транспорт Microsoft не надає телефонний вихід 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.`. +- Основний TTS використовується, коли потокове передавання медіа Twilio увімкнене; інакше виклики повертаються до голосів, нативних для провайдера. - Якщо медіапотік Twilio вже активний, Voice Call не повертається до TwiML ``. Якщо телефонний TTS у цьому стані недоступний, запит відтворення завершується помилкою замість змішування двох шляхів відтворення. - Коли телефонний TTS повертається до вторинного провайдера, Voice Call записує попередження з ланцюжком провайдерів (`from`, `to`, `attempts`) для налагодження. -- Коли Twilio barge-in або завершення потоку очищає чергу TTS, запити відтворення в черзі завершуються, а не залишають абонентів у завислому стані в очікуванні завершення відтворення. +- Коли barge-in Twilio або демонтаж потоку очищає чергу TTS, що очікує, запити відтворення в черзі завершуються, а не зависають для абонентів, які очікують завершення відтворення. ### Приклади TTS - + ```json5 { messages: { @@ -425,7 +425,7 @@ Voice Call використовує основну конфігурацію `mes } ``` - + ```json5 { plugins: { @@ -449,7 +449,7 @@ Voice Call використовує основну конфігурацію `mes } ``` - + ```json5 { plugins: { @@ -486,21 +486,20 @@ Voice Call використовує основну конфігурацію `mes ``` -`inboundPolicy: "allowlist"` — це перевірка caller ID із низьким рівнем достовірності. Plugin +`inboundPolicy: "allowlist"` — це перевірка ідентифікатора абонента з низькою надійністю. Plugin нормалізує надане провайдером значення `From` і порівнює його з `allowFrom`. Перевірка Webhook автентифікує доставку провайдером і -цілісність корисного навантаження, але вона **не** доводить право власності -на номер абонента PSTN/VoIP. Сприймайте `allowFrom` як фільтрацію caller ID, а не як надійну +цілісність payload, але **не** доводить володіння номером абонента +PSTN/VoIP. Сприймайте `allowFrom` як фільтрацію за ідентифікатором абонента, а не як сильну ідентичність абонента. -Автовідповіді використовують систему агента. Налаштовуйте за допомогою `responseModel`, +Автовідповіді використовують систему агентів. Налаштовуйте за допомогою `responseModel`, `responseSystemPrompt` і `responseTimeoutMs`. ### Контракт мовленнєвого виводу -Для автовідповідей Voice Call додає строгий контракт мовленнєвого виводу до -системного промпта: +Для автовідповідей Voice Call додає до системного промпта суворий контракт мовленнєвого виводу: ```text {"spoken":"..."} @@ -508,23 +507,23 @@ Voice Call використовує основну конфігурацію `mes Voice Call захисно витягує текст мовлення: -- Ігнорує корисні навантаження, позначені як вміст міркувань або помилок. -- Розбирає прямий JSON, JSON у fenced-блоці або вбудовані ключі `"spoken"`. -- Повертається до звичайного тексту та видаляє ймовірні вступні абзаци планування чи метаданих. +- Ігнорує payload, позначені як вміст міркування/помилки. +- Розбирає прямий JSON, JSON у fenced-блоці або inline-ключі `"spoken"`. +- Повертається до звичайного тексту й видаляє ймовірні вступні абзаци планування/мета-вмісту. -Це зберігає мовленнєве відтворення зосередженим на тексті для абонента та запобігає -потраплянню тексту планування в аудіо. +Це утримує мовленнєве відтворення зосередженим на тексті для абонента й уникає +витоку тексту планування в аудіо. ### Поведінка запуску розмови -Для вихідних викликів `conversation` обробка першого повідомлення прив'язана до поточного +Для вихідних викликів `conversation` обробка першого повідомлення прив’язана до живого стану відтворення: -- Очищення черги barge-in і автовідповідь пригнічуються лише тоді, коли початкове привітання активно промовляється. -- Якщо початкове відтворення не вдається, виклик повертається до `listening`, а початкове повідомлення залишається в черзі для повторної спроби. -- Початкове відтворення для потокового передавання Twilio починається після підключення потоку без додаткової затримки. -- Barge-in перериває активне відтворення та очищає записи Twilio TTS, які стоять у черзі, але ще не відтворюються. Очищені записи завершуються як пропущені, тому логіка наступної відповіді може продовжитися без очікування аудіо, яке ніколи не відтвориться. -- Голосові розмови Realtime використовують власний початковий хід realtime-потоку. Voice Call **не** надсилає застаріле оновлення TwiML `` для цього початкового повідомлення, тому вихідні сеанси `` залишаються підключеними. +- Очищення черги через barge-in і автовідповідь пригнічуються лише тоді, коли початкове привітання активно озвучується. +- Якщо початкове відтворення завершується помилкою, виклик повертається до `listening`, а початкове повідомлення залишається в черзі для повторної спроби. +- Початкове відтворення для потокового передавання Twilio стартує під час підключення потоку без додаткової затримки. +- Barge-in перериває активне відтворення й очищає записи Twilio TTS, які стоять у черзі, але ще не відтворюються. Очищені записи завершуються як пропущені, тож логіка наступної відповіді може продовжити роботу без очікування аудіо, яке ніколи не відтвориться. +- Голосові розмови в реальному часі використовують власний початковий хід realtime-потоку. Voice Call **не** публікує застаріле оновлення TwiML `` для цього початкового повідомлення, тому вихідні сеанси `` залишаються приєднаними. ### Пільговий період відключення потоку Twilio @@ -534,16 +533,16 @@ Voice Call захисно витягує текст мовлення: - Якщо потік повторно підключається протягом цього вікна, автоматичне завершення скасовується. - Якщо після пільгового періоду жоден потік не реєструється повторно, виклик завершується, щоб запобігти завислим активним викликам. -## Очищувач застарілих викликів +## Прибирач застарілих викликів -Використовуйте `staleCallReaperSeconds`, щоб завершувати виклики, які ніколи не отримують фінальний -Webhook (наприклад, виклики в режимі сповіщення, що ніколи не завершуються). Типове значення — -`0` (вимкнено). +Використовуйте `staleCallReaperSeconds`, щоб завершувати виклики, які ніколи не отримують термінальний +Webhook (наприклад, виклики в режимі сповіщення, які ніколи не завершуються). Типове значення +— `0` (вимкнено). Рекомендовані діапазони: - **Продакшн:** `120`–`300` секунд для потоків у стилі сповіщень. -- Тримайте це значення **вищим за `maxDurationSeconds`**, щоб звичайні виклики могли завершитися. Хороша початкова точка — `maxDurationSeconds + 30–60` секунд. +- Тримайте це значення **вищим за `maxDurationSeconds`**, щоб звичайні виклики могли завершитися. Добра початкова точка — `maxDurationSeconds + 30–60` секунд. ```json5 { @@ -562,28 +561,28 @@ Webhook (наприклад, виклики в режимі сповіщення ## Безпека Webhook -Коли проксі або тунель розташований перед Gateway, plugin -реконструює публічну URL-адресу для перевірки підпису. Ці параметри -керують тим, яким перенаправленим заголовкам можна довіряти: +Коли проксі або тунель стоїть перед Gateway, plugin +відтворює публічну URL-адресу для перевірки підпису. Ці параметри +керують тим, яким перенаправленим заголовкам довіряти: - Дозволяє hosts із заголовків forwarding за списком allowlist. + Список дозволених хостів із заголовків переспрямування. - Довіряє перенаправленим заголовкам без allowlist. + Довіряти перенаправленим заголовкам без списку дозволених. - Довіряє перенаправленим заголовкам лише тоді, коли віддалена IP-адреса запиту відповідає списку. + Довіряти перенаправленим заголовкам лише тоді, коли віддалена IP-адреса запиту збігається зі списком. Додаткові засоби захисту: -- **Захист від повторного відтворення** Webhook увімкнено для Twilio і Plivo. Повторно відтворені дійсні Webhook-запити підтверджуються, але пропускаються щодо побічних ефектів. -- Ходи розмови Twilio містять токен для кожного ходу у callback-ах ``, тому застарілі або повторно відтворені callback-и мовлення не можуть задовольнити новіший очікуваний хід транскрипту. -- Неавтентифіковані Webhook-запити відхиляються до читання тіла, якщо відсутні потрібні провайдером заголовки підпису. -- Webhook voice-call використовує спільний pre-auth профіль тіла (64 КБ / 5 секунд) плюс обмеження одночасних запитів для кожної IP-адреси перед перевіркою підпису. +- Захист Webhook **від повторного відтворення** увімкнено для Twilio і Plivo. Повторно відтворені дійсні запити Webhook підтверджуються, але пропускаються щодо побічних ефектів. +- Ходи розмови Twilio містять токен для кожного ходу в callback-викликах ``, тому застарілі або повторно відтворені callback-виклики мовлення не можуть задовольнити новіший очікуваний хід стенограми. +- Неавтентифіковані запити Webhook відхиляються до читання тіла, коли відсутні обов’язкові заголовки підпису провайдера. +- Webhook voice-call використовує спільний профіль тіла до автентифікації (64 КБ / 5 секунд) плюс обмеження одночасних запитів для кожної IP-адреси до перевірки підпису. -Приклад зі стабільним публічним host: +Приклад зі стабільним публічним хостом: ```json5 { @@ -617,15 +616,15 @@ openclaw voicecall latency # summarize turn latency from lo openclaw voicecall expose --mode funnel ``` -Коли Gateway уже запущено, операційні команди `voicecall` делегують виконання -runtime voice-call, яким володіє Gateway, щоб CLI не прив'язував другий -Webhook-сервер. Якщо Gateway недоступний, команди повертаються до +Коли Gateway уже запущений, операційні команди `voicecall` делегуються +runtime voice-call, яким володіє Gateway, щоб CLI не прив’язував другий +сервер Webhook. Якщо Gateway недосяжний, команди повертаються до автономного runtime CLI. `latency` читає `calls.jsonl` зі стандартного шляху сховища voice-call. -Використовуйте `--file `, щоб вказати інший журнал, і `--last `, щоб обмежити +Використовуйте `--file `, щоб указати інший журнал, і `--last `, щоб обмежити аналіз останніми N записами (типово 200). Вивід містить p50/p90/p99 -для затримки ходу та часу очікування слухання. +для затримки ходу та часу очікування прослуховування. ## Інструмент агента @@ -642,9 +641,9 @@ Webhook-сервер. Якщо Gateway недоступний, команди п Цей репозиторій постачає відповідний документ skill за адресою `skills/voice-call/SKILL.md`. -## RPC Gateway +## Gateway RPC -| Метод | Аргументи | +| Метод | Аргументи | | -------------------- | ------------------------- | | `voicecall.initiate` | `to?`, `message`, `mode?` | | `voicecall.continue` | `callId`, `message` | @@ -653,8 +652,141 @@ Webhook-сервер. Якщо Gateway недоступний, команди п | `voicecall.end` | `callId` | | `voicecall.status` | `callId` | +## Усунення несправностей + +### Не вдається налаштувати експонування Webhook + +Запускайте налаштування з того самого середовища, у якому працює Gateway: + +```bash +openclaw voicecall setup +openclaw voicecall setup --json +``` + +Для `twilio`, `telnyx` і `plivo` `webhook-exposure` має бути зеленим. Налаштований +`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 +{ + plugins: { + entries: { + "voice-call": { + config: { + publicUrl: "https://voice.example.com/voice/webhook", + // or + tunnel: { provider: "ngrok" }, + // or + tailscale: { mode: "funnel", path: "/voice/webhook" }, + }, + }, + }, + }, +} +``` + +Після зміни конфігурації перезапустіть або перезавантажте Gateway, потім виконайте: + +```bash +openclaw voicecall setup +openclaw voicecall smoke +``` + +`voicecall smoke` є пробним запуском, якщо не передати `--yes`. + +### Помилка облікових даних провайдера + +Перевірте вибраного провайдера та обов’язкові поля облікових даних: + +- Twilio: `twilio.accountSid`, `twilio.authToken` і `fromNumber`, або + `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN` і `TWILIO_FROM_NUMBER`. +- Telnyx: `telnyx.apiKey`, `telnyx.connectionId`, `telnyx.publicKey` і + `fromNumber`. +- Plivo: `plivo.authId`, `plivo.authToken` і `fromNumber`. + +Облікові дані мають існувати на хості Gateway. Редагування локального профілю оболонки +не впливає на вже запущений Gateway, доки він не перезапуститься або не перезавантажить своє +середовище. + +### Виклики запускаються, але вебхуки провайдера не надходять + +Переконайтеся, що консоль провайдера вказує на точну публічну URL-адресу вебхука: + +```text +https://voice.example.com/voice/webhook +``` + +Потім перевірте стан виконання: + +```bash +openclaw voicecall status --call-id +openclaw voicecall tail +``` + +Поширені причини: + +- `publicUrl` вказує на інший шлях, ніж `serve.path`. +- URL тунелю змінився після запуску Gateway. +- Проксі пересилає запит, але вилучає або переписує заголовки host/proto. +- Фаєрвол або DNS спрямовує публічне ім'я хоста кудись, окрім Gateway. +- Gateway було перезапущено без увімкненого Plugin Voice Call. + +Коли перед Gateway стоїть зворотний проксі або тунель, задайте +`webhookSecurity.allowedHosts` як публічне ім'я хоста або використайте +`webhookSecurity.trustedProxyIPs` для відомої адреси проксі. Використовуйте +`webhookSecurity.trustForwardingHeaders` лише тоді, коли межа проксі перебуває під +вашим контролем. + +### Не вдається перевірити підпис + +Підписи провайдера перевіряються за публічною URL-адресою, яку OpenClaw відтворює +з вхідного запиту. Якщо перевірка підписів не вдається: + +- Переконайтеся, що URL-адреса вебхука провайдера точно збігається з `publicUrl`, включно зі + схемою, хостом і шляхом. +- Для URL-адрес безкоштовного рівня ngrok оновіть `publicUrl`, коли змінюється ім'я хоста тунелю. +- Переконайтеся, що проксі зберігає початкові заголовки host і proto, або налаштуйте + `webhookSecurity.allowedHosts`. +- Не вмикайте `skipSignatureVerification` поза локальним тестуванням. + +### Не вдається приєднання Google Meet через Twilio + +Google Meet використовує цей Plugin для приєднань через набір номера Twilio. Спочатку перевірте Voice Call: + +```bash +openclaw voicecall setup +openclaw voicecall smoke --to "+15555550123" +``` + +Потім явно перевірте транспорт Google Meet: + +```bash +openclaw googlemeet setup --transport twilio +``` + +Якщо Voice Call працює, але учасник Meet так і не приєднується, перевірте номер +дозвону Meet, PIN і `--dtmf-sequence`. Телефонний виклик може бути справним, тоді як +зустріч відхиляє або ігнорує неправильну DTMF-послідовність. + +### У виклику realtime немає мовлення + +Переконайтеся, що увімкнено лише один аудіорежим. `realtime.enabled` і +`streaming.enabled` не можуть одночасно мати значення true. + +Для викликів Twilio у режимі realtime також перевірте: + +- Plugin провайдера realtime завантажено й зареєстровано. +- `realtime.provider` не задано або він називає зареєстрованого провайдера. +- API-ключ провайдера доступний процесу Gateway. +- `openclaw voicecall tail` показує, що медіапотік прийнято, а провайдер realtime готовий + до початкового привітання. + ## Пов'язане - [Режим розмови](/uk/nodes/talk) - [Перетворення тексту на мовлення](/uk/tools/tts) -- [Голосова активація](/uk/nodes/voicewake) +- [Голосове пробудження](/uk/nodes/voicewake)