> ## Documentation Index
> Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Плагін Google Meet

Підтримка учасника Google Meet для OpenClaw — Plugin навмисно явний за задумом:

* Він приєднується лише до явної URL-адреси `https://meet.google.com/...`.
* Він може створити новий простір Meet через Google Meet API, а потім приєднатися до
  поверненої URL-адреси.
* `agent` — режим відповіді за замовчуванням: транскрипція в реальному часі слухає,
  налаштований агент OpenClaw відповідає, а звичайний OpenClaw TTS говорить у Meet.
* `bidi` залишається доступним як резервний режим прямої голосової моделі в реальному часі.
* Агенти вибирають поведінку приєднання за допомогою `mode`: використовуйте `agent` для живого
  прослуховування/відповіді, `bidi` для прямого резервного голосового режиму в реальному часі або `transcribe`
  для приєднання/керування браузером без моста відповіді.
* Автентифікація починається як особистий Google OAuth або вже авторизований профіль Chrome.
* Автоматичного оголошення згоди немає.
* Стандартний аудіобекенд Chrome — `BlackHole 2ch`.
* Chrome може працювати локально або на спареному вузловому хості.
* Twilio приймає номер для дозвону плюс необов'язковий PIN або DTMF-послідовність; він
  не може напряму набрати URL Meet.
* Команда CLI — `googlemeet`; `meet` зарезервовано для ширших
  агентських робочих процесів телеконференцій.

## Швидкий старт

Установіть локальні аудіозалежності та налаштуйте постачальника транскрипції в реальному часі
плюс звичайний OpenClaw TTS. OpenAI є стандартним постачальником транскрипції;
Google Gemini Live також працює як окремий голосовий резерв `bidi` з
`realtime.voiceProvider: "google"`:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
brew install blackhole-2ch sox
export OPENAI_API_KEY=sk-...
# only needed when realtime.voiceProvider is "google" for bidi mode
export GEMINI_API_KEY=...
```

`blackhole-2ch` встановлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор
Homebrew потребує перезавантаження, перш ніж macOS покаже пристрій:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
sudo reboot
```

Після перезавантаження перевірте обидві частини:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox
```

Увімкніть Plugin:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  plugins: {
    entries: {
      "google-meet": {
        enabled: true,
        config: {},
      },
    },
  },
}
```

Перевірте налаштування:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup
```

Вивід налаштування призначений бути читабельним для агента та враховувати режим. Він повідомляє про профіль Chrome,
прив'язку до вузла та, для приєднань Chrome у реальному часі, аудіоміст BlackHole/SoX
і відкладені перевірки вступу в реальному часі. Для приєднань лише для спостереження перевірте той самий
транспорт за допомогою `--mode transcribe`; цей режим пропускає передумови аудіо в реальному часі,
бо він не слухає через міст і не говорить через нього:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup --transport chrome-node --mode transcribe
```

Коли налаштовано делегування Twilio, налаштування також повідомляє, чи готові
Plugin `voice-call`, облікові дані Twilio та публічна доступність Webhook.
Сприймайте будь-яку перевірку `ok: false` як блокер для перевіреного транспорту й режиму
перед тим, як просити агента приєднатися. Використовуйте `openclaw googlemeet setup --json` для
скриптів або машинно-читабельного виводу. Використовуйте `--transport chrome`,
`--transport chrome-node` або `--transport twilio`, щоб попередньо перевірити конкретний
транспорт перед спробою агента.

Для Twilio завжди явно попередньо перевіряйте транспорт, коли стандартним транспортом
є Chrome:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup --transport twilio
```

Це виявляє відсутнє підключення `voice-call`, облікові дані Twilio або недоступну
публічну Webhook-експозицію до того, як агент спробує набрати зустріч.

Приєднайтеся до зустрічі:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet join https://meet.google.com/abc-defg-hij
```

Або дозвольте агенту приєднатися через інструмент `google_meet`:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "action": "join",
  "url": "https://meet.google.com/abc-defg-hij",
  "transport": "chrome-node",
  "mode": "agent"
}
```

Агентський інструмент `google_meet` залишається доступним на хостах не macOS для
артефактів, календаря, налаштування, транскрипції, Twilio та потоків `chrome-node`. Локальні
дії відповіді Chrome там заблоковані, бо вбудований аудіошлях Chrome
зараз залежить від macOS `BlackHole 2ch`. На Linux використовуйте `mode: "transcribe"`,
дозвін Twilio або macOS-хост `chrome-node` для участі Chrome з відповіддю.

Створіть нову зустріч і приєднайтеся до неї:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet create --transport chrome-node --mode agent
```

Для кімнат, створених через API, використовуйте Google Meet `SpaceConfig.accessType`, коли хочете,
щоб політика кімнати без стуку була явною, а не успадкованою зі стандартних налаштувань облікового запису Google:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet create --access-type OPEN --transport chrome-node --mode agent
```

`OPEN` дозволяє будь-кому з URL Meet приєднуватися без стуку. `TRUSTED` дозволяє
довіреним користувачам організації хоста, запрошеним зовнішнім користувачам і користувачам дозвону
приєднуватися без стуку. `RESTRICTED` обмежує вхід без стуку лише запрошеними. Ці
налаштування застосовуються лише до офіційного шляху створення Google Meet API, тому OAuth
облікові дані мають бути налаштовані.

Якщо ви автентифікували Google Meet до появи цієї опції, повторно запустіть
`openclaw googlemeet auth login --json` після додавання області
`meetings.space.settings` до екрана згоди Google OAuth.

Створіть лише URL без приєднання:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet create --no-join
```

`googlemeet create` має два шляхи:

* Створення через API: використовується, коли налаштовано облікові дані Google Meet OAuth. Це
  найдетермінованіший шлях, який не залежить від стану інтерфейсу браузера.
* Резервний браузерний шлях: використовується, коли облікових даних OAuth немає. OpenClaw використовує
  закріплений вузол Chrome, відкриває `https://meet.google.com/new`, чекає, поки Google
  перенаправить на реальну URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях вимагає,
  щоб профіль OpenClaw Chrome на вузлі вже був авторизований у Google.
  Браузерна автоматизація обробляє власний запит Meet на мікрофон під час першого запуску; цей запит
  не вважається помилкою входу Google.
  Потоки приєднання та створення також намагаються повторно використати наявну вкладку Meet перед відкриттям
  нової. Зіставлення ігнорує нешкідливі рядки запиту URL, як-от `authuser`, тому
  повторна спроба агента має сфокусувати вже відкриту зустріч замість створення другої
  вкладки Chrome.

Вивід команди/інструмента містить поле `source` (`api` або `browser`), щоб агенти
могли пояснити, який шлях було використано. `create` за замовчуванням приєднується до нової зустрічі та
повертає `joined: true` плюс сесію приєднання. Щоб лише створити URL, використовуйте
`create --no-join` у CLI або передайте `"join": false` інструменту.

Або скажіть агенту: "Створи Google Meet, приєднайся до нього в режимі відповіді агента
та надішли мені посилання." Агент має викликати `google_meet` з
`action: "create"`, а потім поділитися поверненим `meetingUri`.

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "action": "create",
  "transport": "chrome-node",
  "mode": "agent"
}
```

Для приєднання лише для спостереження/керування браузером установіть `"mode": "transcribe"`. Це
не запускає дуплексний голосовий міст у реальному часі, не потребує BlackHole або SoX
і не відповідатиме голосом у зустріч. Приєднання Chrome у цьому режимі також уникають
надання дозволів OpenClaw на мікрофон/камеру та уникають шляху Meet **Використати
мікрофон**. Якщо Meet показує проміжний екран вибору аудіо, автоматизація намагається
обрати шлях без мікрофона, а інакше повідомляє про ручну дію замість відкриття
локального мікрофона. У режимі transcribe керовані транспорти Chrome також встановлюють
спостерігач субтитрів Meet за принципом найкращих зусиль. `googlemeet status --json` і
`googlemeet doctor` показують `captioning`, `captionsEnabledAttempted`,
`transcriptLines`, `lastCaptionAt`, `lastCaptionSpeaker`, `lastCaptionText`,
і короткий хвіст `recentTranscript`, щоб оператори могли зрозуміти, чи браузер
приєднався до дзвінка та чи субтитри Meet генерують текст.
Використовуйте `openclaw googlemeet test-listen <meet-url> --transport chrome-node`, коли
потрібна перевірка так/ні: він приєднується в режимі transcribe, чекає свіжого руху субтитрів або
транскрипту та повертає `listenVerified`, `listenTimedOut`, поля ручної
дії й останній стан субтитрів.

Під час сесій у реальному часі статус `google_meet` містить стан браузера й аудіомоста,
як-от `inCall`, `manualActionRequired`, `providerConnected`,
`realtimeReady`, `audioInputActive`, `audioOutputActive`, останні часові мітки вводу/виводу,
лічильники байтів і стан закриття моста. Якщо з'являється безпечний запит сторінки Meet,
браузерна автоматизація обробляє його, коли може. Вхід, допуск хостом і
запити дозволів браузера/ОС повідомляються як ручна дія з причиною та
повідомленням, яке агент має передати. Керовані сесії Chrome виводять вступну або
тестову фразу лише після того, як стан браузера повідомить `inCall: true`; інакше статус повідомляє
`speechReady: false`, а спроба мовлення блокується замість удавання, що
агент говорив у зустріч.

Локальні приєднання Chrome використовують авторизований браузерний профіль OpenClaw. Режим реального часу
потребує `BlackHole 2ch` для шляху мікрофона/динаміка, який використовує OpenClaw. Для
чистого дуплексного аудіо використовуйте окремі віртуальні пристрої або граф у стилі Loopback; одного
пристрою BlackHole достатньо для першого smoke-тесту, але він може створювати відлуння.

### Локальний Gateway + Parallels Chrome

Вам **не** потрібен повний OpenClaw Gateway або ключ API моделі всередині macOS VM
лише для того, щоб VM володіла Chrome. Запустіть Gateway і агента локально, а потім запустіть
вузловий хост у VM. Увімкніть вбудований Plugin на VM один раз, щоб вузол
оголошував команду Chrome:

Що де працює:

* Хост Gateway: OpenClaw Gateway, робочий простір агента, ключі моделі/API, постачальник
  реального часу та конфігурація Google Meet Plugin.
* Parallels macOS VM: OpenClaw CLI/вузловий хост, Google Chrome, SoX, BlackHole 2ch
  і профіль Chrome, авторизований у Google.
* Не потрібно у VM: сервіс Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування
  постачальника моделі.

Установіть залежності VM:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
brew install blackhole-2ch sox
```

Перезавантажте VM після встановлення BlackHole, щоб macOS показала `BlackHole 2ch`:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
sudo reboot
```

Після перезавантаження перевірте, що VM бачить аудіопристрій і команди SoX:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox
```

Установіть або оновіть OpenClaw у VM, а потім увімкніть там вбудований Plugin:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw plugins enable google-meet
```

Запустіть вузловий хост у VM:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
```

Якщо `<gateway-host>` — LAN IP і ви не використовуєте TLS, вузол відхиляє
незашифрований WebSocket, якщо ви явно не погодитеся на це для довіреної приватної мережі:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
  openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
```

Використовуйте ту саму змінну середовища під час установлення вузла як LaunchAgent:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
  openclaw node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --force
openclaw node restart
```

`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` — це середовище процесу, а не налаштування
`openclaw.json`. `openclaw node install` зберігає його в середовищі LaunchAgent,
коли воно присутнє в команді встановлення.

Схваліть вузол з хоста Gateway:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw devices list
openclaw devices approve <requestId>
```

Підтвердьте, що Gateway бачить вузол і що він оголошує як `googlemeet.chrome`,
так і можливість браузера/`browser.proxy`:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw nodes status
```

Спрямуйте Meet через цей вузол на хості Gateway:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  gateway: {
    nodes: {
      allowCommands: ["googlemeet.chrome", "browser.proxy"],
    },
  },
  plugins: {
    entries: {
      "google-meet": {
        enabled: true,
        config: {
          defaultTransport: "chrome-node",
          chrome: {
            guestName: "OpenClaw Agent",
            autoJoin: true,
            reuseExistingTab: true,
          },
          chromeNode: {
            node: "parallels-macos",
          },
        },
      },
    },
  },
}
```

Тепер приєднуйтеся як зазвичай з хоста Gateway:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet join https://meet.google.com/abc-defg-hij
```

або попросіть агента використати інструмент `google_meet` з `transport: "chrome-node"`.

Для smoke-тесту однією командою, який створює або повторно використовує сесію, промовляє відому
фразу та друкує стан сесії:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij
```

Під час realtime-приєднання браузерна автоматизація OpenClaw заповнює ім’я гостя, натискає
Приєднатися/Попросити приєднатися та приймає перший вибір Meet «Використовувати мікрофон», коли цей
запит з’являється. Під час приєднання лише для спостереження або створення зустрічі лише в браузері вона
проходить повз той самий запит без мікрофона, коли такий вибір доступний.
Якщо профіль браузера не ввійшов в обліковий запис, Meet очікує допуску від організатора,
Chrome потребує дозволу на мікрофон/камеру для realtime-приєднання, або Meet застряг
на запиті, який автоматизація не змогла розв’язати, результат join/test-speech повідомляє
`manualActionRequired: true` з `manualActionReason` і
`manualActionMessage`. Агенти мають припинити повторювати приєднання, повідомити саме це
повідомлення разом із поточними `browserUrl`/`browserTitle` і повторити спробу лише після
завершення ручної дії в браузері.

Якщо `chromeNode.node` пропущено, OpenClaw автоматично вибирає лише тоді, коли рівно один
підключений вузол оголошує і `googlemeet.chrome`, і керування браузером. Якщо
підключено кілька придатних вузлів, задайте `chromeNode.node` як id вузла,
відображуване ім’я або віддалену IP-адресу.

Типові перевірки збоїв:

* `Configured Google Meet node ... is not usable: offline`: закріплений вузол
  відомий Gateway, але недоступний. Агенти мають трактувати цей вузол як
  діагностичний стан, а не як придатний хост Chrome, і повідомити блокер налаштування
  замість переходу на інший транспорт, якщо користувач цього не просив.
* `No connected Google Meet-capable node`: запустіть `openclaw node run` у VM,
  схваліть спарювання та переконайтеся, що `openclaw plugins enable google-meet` і
  `openclaw plugins enable browser` були виконані у VM. Також підтвердьте, що
  хост Gateway дозволяє обидві команди вузла через
  `gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`.
* `BlackHole 2ch audio device not found`: установіть `blackhole-2ch` на хості,
  який перевіряється, і перезавантажтеся перед використанням локального аудіо Chrome.
* `BlackHole 2ch audio device not found on the node`: установіть `blackhole-2ch`
  у VM і перезавантажте VM.
* Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM або
  залиште `chrome.guestName` заданим для гостьового приєднання. Гостьове автоматичне приєднання використовує браузерну
  автоматизацію OpenClaw через проксі браузера вузла; переконайтеся, що конфігурація браузера вузла
  вказує на потрібний профіль, наприклад
  `browser.defaultProfile: "user"` або іменований профіль наявного сеансу.
* Дублікати вкладок Meet: залиште `chrome.reuseExistingTab: true` увімкненим. OpenClaw
  активує наявну вкладку для тієї самої URL-адреси Meet перед відкриттям нової, а
  створення зустрічі в браузері повторно використовує поточну вкладку `https://meet.google.com/new`
  або вкладку запиту облікового запису Google перед відкриттям іншої.
* Немає аудіо: у Meet спрямуйте мікрофон/динамік через шлях віртуального аудіопристрою,
  який використовує OpenClaw; використовуйте окремі віртуальні пристрої або маршрутизацію в стилі Loopback
  для чистого дуплексного аудіо.

## Примітки щодо встановлення

Стандартний режим зворотного мовлення Chrome використовує два зовнішні інструменти:

* `sox`: утиліта командного рядка для аудіо. Plugin використовує явні команди пристроїв CoreAudio
  для стандартного аудіомоста 24 kHz PCM16.
* `blackhole-2ch`: віртуальний аудіодрайвер macOS. Він створює аудіопристрій `BlackHole 2ch`,
  через який Chrome/Meet можуть маршрутизувати аудіо.

OpenClaw не комплектує і не розповсюджує жоден із цих пакетів. Документація просить користувачів
установити їх як залежності хоста через Homebrew. SoX ліцензовано як
`LGPL-2.0-only AND GPL-2.0-only`; BlackHole має GPL-3.0. Якщо ви створюєте
інсталятор або appliance, що комплектує BlackHole з OpenClaw, перегляньте ліцензійні умови
upstream BlackHole або отримайте окрему ліцензію від Existential Audio.

## Транспорти

### Chrome

Транспорт Chrome відкриває URL-адресу Meet через керування браузером OpenClaw і приєднується
як профіль браузера OpenClaw, що ввійшов в обліковий запис. На macOS Plugin перевіряє наявність
`BlackHole 2ch` перед запуском. Якщо налаштовано, він також виконує команду перевірки стану
аудіомоста й команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли
Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо працюють
на спареному вузлі, наприклад VM macOS у Parallels. Для локального Chrome виберіть
профіль через `browser.defaultProfile`; `chrome.browserProfile` передається хостам
`chrome-node`.

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node
```

Спрямуйте аудіо мікрофона й динаміка Chrome через локальний аудіоміст OpenClaw.
Якщо `BlackHole 2ch` не встановлено, приєднання завершується помилкою налаштування
замість непомітного приєднання без аудіошляху.

### Twilio

Транспорт Twilio — це строгий план набору, делегований Plugin Voice Call. Він
не аналізує сторінки Meet для пошуку телефонних номерів.

Використовуйте це, коли участь через Chrome недоступна або потрібен резервний варіант телефонного набору.
Google Meet має показувати номер телефонного входу й PIN для
зустрічі; OpenClaw не виявляє їх зі сторінки Meet.

Увімкніть Plugin Voice Call на хості Gateway, а не на вузлі Chrome:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  plugins: {
    allow: ["google-meet", "voice-call", "google"],
    entries: {
      "google-meet": {
        enabled: true,
        config: {
          defaultTransport: "chrome-node",
          // or set "twilio" if Twilio should be the default
        },
      },
      "voice-call": {
        enabled: true,
        config: {
          provider: "twilio",
          inboundPolicy: "allowlist",
          realtime: {
            enabled: true,
            provider: "google",
            instructions: "Join this Google Meet as an OpenClaw agent. Be brief.",
            toolPolicy: "safe-read-only",
            providers: {
              google: {
                silenceDurationMs: 500,
                startSensitivity: "high",
              },
            },
          },
        },
      },
      google: {
        enabled: true,
      },
    },
  },
}
```

Надайте облікові дані Twilio через середовище або конфігурацію. Середовище тримає
секрети поза `openclaw.json`:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
export TWILIO_ACCOUNT_SID=AC...
export TWILIO_AUTH_TOKEN=...
export TWILIO_FROM_NUMBER=+15550001234
export GEMINI_API_KEY=...
```

Натомість використовуйте `realtime.provider: "openai"` з Plugin провайдера OpenAI і
`OPENAI_API_KEY`, якщо це ваш провайдер realtime-голосу.

Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації Plugin
не з’являються в уже запущеному процесі Gateway, доки він не перезавантажиться.

Потім перевірте:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw config validate
openclaw plugins list | grep -E 'google-meet|voice-call'
openclaw googlemeet setup
```

Коли делегування Twilio підключено, `googlemeet setup` містить успішні перевірки
`twilio-voice-call-plugin`, `twilio-voice-call-credentials` і
`twilio-voice-call-webhook`.

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
  --transport twilio \
  --dial-in-number +15551234567 \
  --pin 123456
```

Використовуйте `--dtmf-sequence`, коли зустріч потребує власної послідовності:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
  --transport twilio \
  --dial-in-number +15551234567 \
  --dtmf-sequence ww123456#
```

## OAuth і preflight

OAuth необов’язковий для створення посилання Meet, тому що `googlemeet create` може
повернутися до браузерної автоматизації. Налаштуйте OAuth, коли потрібні офіційне створення через API,
розв’язання space або preflight-перевірки Meet Media API.

Доступ до Google Meet API використовує користувацький OAuth: створіть клієнт Google Cloud OAuth,
запросіть потрібні scopes, авторизуйте обліковий запис Google, а потім збережіть
отриманий refresh token у конфігурації Plugin Google Meet або надайте
змінні середовища `OPENCLAW_GOOGLE_MEET_*`.

OAuth не замінює шлях приєднання Chrome. Транспорти Chrome і Chrome-node
все ще приєднуються через профіль Chrome, що ввійшов в обліковий запис, BlackHole/SoX і підключений
вузол, коли ви використовуєте браузерну участь. OAuth призначений лише для офіційного шляху
Google Meet API: створювати meeting spaces, розв’язувати spaces і запускати preflight-перевірки Meet Media API.

### Створення облікових даних Google

У Google Cloud Console:

1. Створіть або виберіть проєкт Google Cloud.

2. Увімкніть **Google Meet REST API** для цього проєкту.

3. Налаштуйте екран згоди OAuth.
   * **Internal** найпростіший для організації Google Workspace.
   * **External** працює для персональних/тестових налаштувань; поки застосунок перебуває в Testing,
     додайте кожен обліковий запис Google, який авторизуватиме застосунок, як тестового користувача.

4. Додайте scopes, які запитує OpenClaw:
   * `https://www.googleapis.com/auth/meetings.space.created`
   * `https://www.googleapis.com/auth/meetings.space.readonly`
   * `https://www.googleapis.com/auth/meetings.space.settings`
   * `https://www.googleapis.com/auth/meetings.conference.media.readonly`

5. Створіть OAuth client ID.
   * Тип застосунку: **Web application**.
   * Авторизований redirect URI:

     ```text theme={"theme":{"light":"min-light","dark":"min-dark"}}
     http://localhost:8085/oauth2callback
     ```

6. Скопіюйте client ID і client secret.

`meetings.space.created` потрібен Google Meet `spaces.create`.
`meetings.space.readonly` дає OpenClaw змогу розв’язувати URL-адреси/коди Meet у spaces.
`meetings.space.settings` дає OpenClaw змогу передавати налаштування `SpaceConfig`, як-от
`accessType`, під час створення кімнати через API.
`meetings.conference.media.readonly` призначений для preflight Meet Media API і роботи з медіа;
Google може вимагати реєстрацію в Developer Preview для фактичного використання Media API.
Якщо вам потрібні лише браузерні приєднання Chrome, повністю пропустіть OAuth.

### Випуск refresh token

Налаштуйте `oauth.clientId` і, за бажанням, `oauth.clientSecret`, або передайте їх як
змінні середовища, а потім виконайте:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet auth login --json
```

Команда друкує конфігураційний блок `oauth` з refresh token. Вона використовує PKCE,
localhost callback на `http://localhost:8085/oauth2callback` і ручний
потік копіювання/вставлення з `--manual`.

Приклади:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
openclaw googlemeet auth login --json
```

Використовуйте ручний режим, коли браузер не може досягти локального callback:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
openclaw googlemeet auth login --json --manual
```

Вивід JSON містить:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "oauth": {
    "clientId": "your-client-id",
    "clientSecret": "your-client-secret",
    "refreshToken": "refresh-token",
    "accessToken": "access-token",
    "expiresAt": 1770000000000
  },
  "scope": "..."
}
```

Збережіть об’єкт `oauth` у конфігурації Plugin Google Meet:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  plugins: {
    entries: {
      "google-meet": {
        enabled: true,
        config: {
          oauth: {
            clientId: "your-client-id",
            clientSecret: "your-client-secret",
            refreshToken: "refresh-token",
          },
        },
      },
    },
  },
}
```

Надавайте перевагу змінним середовища, якщо не хочете зберігати refresh token у конфігурації.
Якщо присутні і значення конфігурації, і значення середовища, Plugin спершу використовує конфігурацію,
а потім fallback середовища.

Згода OAuth включає створення Meet space, доступ на читання Meet space і доступ на читання медіа
конференції Meet. Якщо ви автентифікувалися до появи підтримки створення зустрічей,
повторно виконайте `openclaw googlemeet auth login --json`, щоб refresh token мав scope
`meetings.space.created`.

### Перевірка OAuth через doctor

Запустіть OAuth doctor, коли потрібна швидка перевірка стану без секретів:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
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-config`       | Наявний `oauth.clientId` разом з `oauth.refreshToken` або кешований токен доступу. |
| `oauth-token`        | Кешований токен доступу ще чинний, або токен оновлення видав новий токен доступу.  |
| `meet-spaces-get`    | Необов’язкова перевірка `--meeting` розпізнала наявний простір Meet.               |
| `meet-spaces-create` | Необов’язкова перевірка `--create-space` створила новий простір Meet.              |

Щоб також підтвердити ввімкнення Google Meet API та область доступу `spaces.create`, запустіть
перевірку створення з побічним ефектом:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet doctor --oauth --create-space --json
openclaw googlemeet create --no-join --json
```

`--create-space` створює одноразову URL-адресу Meet. Використовуйте це, коли потрібно підтвердити,
що в проєкті Google Cloud увімкнено Meet API і що авторизований обліковий запис
має область доступу `meetings.space.created`.

Щоб підтвердити доступ на читання до наявного простору зустрічі:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --json
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
```

`doctor --oauth --meeting` і `resolve-space` підтверджують доступ на читання до наявного
простору, до якого має доступ авторизований обліковий запис Google. `403` від цих перевірок
зазвичай означає, що Google Meet REST API вимкнено, погодженому токену оновлення
бракує потрібної області доступу або обліковий запис Google не може отримати доступ до цього
простору Meet. Помилка токена оновлення означає, що потрібно повторно виконати `openclaw googlemeet auth login --json` і зберегти новий блок `oauth`.

Для резервного браузерного режиму облікові дані OAuth не потрібні. У цьому режимі автентифікація Google
надходить із профілю Chrome із виконаним входом на вибраному вузлі, а не з
конфігурації OpenClaw.

Ці змінні середовища приймаються як резервні:

* `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID`
* `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` або `GOOGLE_MEET_CLIENT_SECRET`
* `OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN` або `GOOGLE_MEET_REFRESH_TOKEN`
* `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN` або `GOOGLE_MEET_ACCESS_TOKEN`
* `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` або
  `GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT`
* `OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING` або `GOOGLE_MEET_DEFAULT_MEETING`
* `OPENCLAW_GOOGLE_MEET_PREVIEW_ACK` або `GOOGLE_MEET_PREVIEW_ACK`

Розпізнайте URL-адресу Meet, код або `spaces/{id}` через `spaces.get`:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
```

Запустіть попередню перевірку перед роботою з медіа:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
```

Перелічіть артефакти зустрічі та відвідуваність після того, як Meet створить записи конференції:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hij
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`, коли потрібен кожен збережений запис
для цієї зустрічі.

Пошук у календарі може розпізнати URL-адресу зустрічі з Google Calendar перед читанням
артефактів Meet:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet latest --today
openclaw googlemeet calendar-events --today --json
openclaw googlemeet artifacts --event "Weekly sync"
openclaw googlemeet attendance --today --format csv --output attendance.csv
```

`--today` шукає в сьогоднішньому календарі `primary` подію Calendar із
посиланням Google Meet. Використовуйте `--event <query>` для пошуку відповідного тексту події, а
`--calendar <id>` для неосновного календаря. Пошук у календарі потребує свіжого
входу OAuth, який включає область доступу лише для читання подій Calendar.
`calendar-events` попередньо показує відповідні події Meet і позначає подію, яку
вибере `latest`, `artifacts`, `attendance` або `export`.

Якщо ви вже знаєте ідентифікатор запису конференції, зверніться до нього напряму:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 --json
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 --json
```

Завершіть активну конференцію для простору, створеного через API, коли потрібно закрити
кімнату після дзвінка:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet end-active-conference https://meet.google.com/abc-defg-hij
```

Це викликає Google Meet `spaces.endActiveConference` і потребує OAuth з
областю доступу `meetings.space.created` для простору, яким авторизований обліковий запис може керувати.
OpenClaw приймає URL-адресу Meet, код зустрічі або вхідні дані `spaces/{id}` і розпізнає їх
до ресурсу простору API перед завершенням активної конференції.
Це окремо від `googlemeet leave`: `leave` зупиняє локальну/сеансову
участь OpenClaw, тоді як `end-active-conference` просить Google Meet завершити активну
конференцію для простору.

Запишіть читабельний звіт:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 \
  --format markdown --output meet-artifacts.md
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 \
  --format markdown --output meet-attendance.md
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 \
  --format csv --output meet-attendance.csv
openclaw googlemeet export --conference-record conferenceRecords/abc123 \
  --include-doc-bodies --zip --output meet-export
openclaw googlemeet export --conference-record conferenceRecords/abc123 \
  --include-doc-bodies --dry-run
```

`artifacts` повертає метадані запису конференції, а також метадані ресурсів учасників, записів,
транскриптів, структурованих записів транскрипту та розумних нотаток, коли
Google надає їх для зустрічі. Використовуйте `--no-transcript-entries`, щоб пропустити
пошук записів для великих зустрічей. `attendance` розгортає учасників у
рядки сеансів учасників із часом першої/останньої появи, загальною тривалістю сеансу,
позначками запізнення/раннього виходу та дубльованими ресурсами учасників, об’єднаними за користувачем
із виконаним входом або відображуваним іменем. Передайте `--no-merge-duplicates`, щоб залишити необроблені ресурси
учасників окремо, `--late-after-minutes`, щоб налаштувати виявлення запізнення, і
`--early-before-minutes`, щоб налаштувати виявлення раннього виходу.

`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`:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "action": "export",
  "conferenceRecord": "conferenceRecords/abc123",
  "includeDocumentBodies": true,
  "outputDir": "meet-export",
  "zip": true
}
```

Установіть `"dryRun": true`, щоб повернути лише маніфест експорту та пропустити запис файлів.

Агенти також можуть створити кімнату з підтримкою API з явною політикою доступу:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "action": "create",
  "transport": "chrome-node",
  "mode": "agent",
  "accessType": "OPEN"
}
```

І вони можуть завершити активну конференцію для відомої кімнати:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "action": "end_active_conference",
  "meeting": "https://meet.google.com/abc-defg-hij"
}
```

Для перевірки з пріоритетом прослуховування агенти мають використовувати `test_listen`, перш ніж стверджувати, що
зустріч корисна:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "action": "test_listen",
  "url": "https://meet.google.com/abc-defg-hij",
  "transport": "chrome-node",
  "timeoutMs": 30000
}
```

Запустіть захищену live smoke-перевірку проти реальної збереженої зустрічі:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
OPENCLAW_LIVE_TEST=1 \
OPENCLAW_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \
pnpm test:live -- extensions/google-meet/google-meet.live.test.ts
```

Запустіть live браузерну пробу з пріоритетом прослуховування проти зустрічі, де хтось
говоритиме з доступними субтитрами Meet:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup --transport chrome-node --mode transcribe
openclaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport chrome-node --timeout-ms 30000
```

Середовище live smoke:

* `OPENCLAW_LIVE_TEST=1` вмикає захищені live-тести.
* `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` вказує на збережену URL-адресу Meet, код або
  `spaces/{id}`.
* `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` надає ідентифікатор
  клієнта OAuth.
* `OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN` або `GOOGLE_MEET_REFRESH_TOKEN` надає
  токен оновлення.
* Необов’язково: `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET`,
  `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN` і
  `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` використовують ті самі резервні назви
  без префікса `OPENCLAW_`.

Базова live smoke-перевірка артефактів/відвідуваності потребує
`https://www.googleapis.com/auth/meetings.space.readonly` і
`https://www.googleapis.com/auth/meetings.conference.media.readonly`. Пошук у календарі
потребує `https://www.googleapis.com/auth/calendar.events.readonly`. Експорт
тіла документа Drive потребує
`https://www.googleapis.com/auth/drive.meet.readonly`.

Створіть свіжий простір Meet:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet create
```

Команда друкує новий `meeting uri`, джерело та сеанс приєднання. З обліковими даними OAuth
вона використовує офіційний Google Meet API. Без облікових даних OAuth вона
використовує профіль браузера з виконаним входом закріпленого вузла Chrome як резервний варіант. Агенти можуть
використовувати інструмент `google_meet` з `action: "create"`, щоб створити й приєднатися за один
крок. Для створення лише URL-адреси передайте `"join": false`.

Приклад JSON-виводу з резервного браузерного режиму:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "source": "browser",
  "meetingUri": "https://meet.google.com/abc-defg-hij",
  "joined": true,
  "browser": {
    "nodeId": "ba0f4e4bc...",
    "targetId": "tab-1"
  },
  "join": {
    "session": {
      "id": "meet_...",
      "url": "https://meet.google.com/abc-defg-hij"
    }
  }
}
```

Якщо резервний браузерний режим натрапляє на вхід Google або блокування дозволу Meet до того, як
може створити URL-адресу, метод Gateway повертає невдалу відповідь, а
інструмент `google_meet` повертає структуровані деталі замість звичайного рядка:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "source": "browser",
  "error": "google-login-required: Sign in to Google in the OpenClaw browser profile, then retry meeting creation.",
  "manualActionRequired": true,
  "manualActionReason": "google-login-required",
  "manualActionMessage": "Sign in to Google in the OpenClaw browser profile, then retry meeting creation.",
  "browser": {
    "nodeId": "ba0f4e4bc...",
    "targetId": "tab-1",
    "browserUrl": "https://accounts.google.com/signin",
    "browserTitle": "Sign in - Google Accounts"
  }
}
```

Коли агент бачить `manualActionRequired: true`, він має повідомити
`manualActionMessage` разом із контекстом браузерного вузла/вкладки та припинити відкривати нові
вкладки Meet, доки оператор не завершить браузерний крок.

Приклад JSON-виводу зі створення через API:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "source": "api",
  "meetingUri": "https://meet.google.com/abc-defg-hij",
  "joined": true,
  "space": {
    "name": "spaces/abc-defg-hij",
    "meetingCode": "abc-defg-hij",
    "meetingUri": "https://meet.google.com/abc-defg-hij"
  },
  "join": {
    "session": {
      "id": "meet_...",
      "url": "https://meet.google.com/abc-defg-hij"
    }
  }
}
```

Створення Meet типово виконує приєднання. Транспорт Chrome або Chrome-node усе ще
потребує профілю Google Chrome із виконаним входом, щоб приєднатися через браузер. Якщо з
профілю виконано вихід, OpenClaw повідомляє `manualActionRequired: true` або
помилку резервного переходу браузера й просить оператора завершити вхід у Google перед
повторною спробою.

Установлюйте `preview.enrollmentAcknowledged: true` лише після підтвердження, що ваш Cloud
project, OAuth principal і учасники зустрічі зареєстровані в Google
Workspace Developer Preview Program для Meet media APIs.

## Конфігурація

Спільний шлях агента Chrome потребує лише ввімкненого Plugin, BlackHole, SoX,
ключа провайдера транскрибування в реальному часі та налаштованого провайдера TTS OpenClaw.
OpenAI є типовим провайдером транскрибування; задайте `realtime.voiceProvider` як
`"google"` і `realtime.model`, щоб використовувати Google Gemini Live для режиму `bidi`
без зміни типового провайдера транскрибування режиму агента:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
brew install blackhole-2ch sox
export OPENAI_API_KEY=sk-...
# or
export GEMINI_API_KEY=...
```

Задайте конфігурацію Plugin у `plugins.entries.google-meet.config`:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  plugins: {
    entries: {
      "google-meet": {
        enabled: true,
        config: {},
      },
    },
  },
}
```

Типові значення:

* `defaultTransport: "chrome"`
* `defaultMode: "agent"` (`"realtime"` приймається лише як застарілий
  сумісний псевдонім для `"agent"`; нові виклики інструментів мають указувати `"agent"`)
* `chromeNode.node`: необов’язковий ідентифікатор/назва/IP вузла для `chrome-node`
* `chrome.audioBackend: "blackhole-2ch"`
* `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.audioBufferBytes: 4096`: буфер обробки SoX для згенерованих аудіокоманд
  пари команд Chrome. Це половина типового 8192-байтового буфера SoX,
  що зменшує типову затримку каналу, залишаючи можливість збільшити його на завантажених хостах.
  Значення нижче мінімуму SoX обмежуються до 17 байтів.
* `chrome.audioInputCommand`: команда SoX, що читає з CoreAudio `BlackHole 2ch`
  і записує аудіо у форматі `chrome.audioFormat`
* `chrome.audioOutputCommand`: команда SoX, що читає аудіо у форматі `chrome.audioFormat`
  і записує до CoreAudio `BlackHole 2ch`
* `chrome.bargeInInputCommand`: необов’язкова команда локального мікрофона, яка записує
  підписаний 16-бітний little-endian моно PCM для виявлення людського перебивання, поки
  активне відтворення асистента. Наразі це застосовується до розміщеного на Gateway
  мосту пари команд `chrome`.
* `chrome.bargeInRmsThreshold: 650`: рівень RMS, який вважається людським
  перебиванням на `chrome.bargeInInputCommand`
* `chrome.bargeInPeakThreshold: 2500`: піковий рівень, який вважається людським
  перебиванням на `chrome.bargeInInputCommand`
* `chrome.bargeInCooldownMs: 900`: мінімальна затримка між повторними очищеннями
  людського перебивання
* `mode: "agent"`: типовий режим голосової відповіді. Мовлення учасників транскрибується
  налаштованим провайдером транскрибування в реальному часі, надсилається налаштованому
  агенту OpenClaw у підсеансі агента для окремої зустрічі й озвучується назад через
  звичайне середовище виконання OpenClaw TTS.
* `mode: "bidi"`: резервний прямий двоспрямований режим моделі в реальному часі. Провайдер
  голосу в реальному часі відповідає на мовлення учасників напряму й може викликати
  `openclaw_agent_consult` для глибших відповідей або відповідей з інструментами.
* `mode: "transcribe"`: режим лише спостереження без мосту голосової відповіді.
* `realtime.provider: "openai"`: сумісний резервний варіант, який використовується, коли
  наведені нижче поля провайдера в межах області не задано.
* `realtime.transcriptionProvider: "openai"`: ідентифікатор провайдера, який режим `agent`
  використовує для транскрибування в реальному часі.
* `realtime.voiceProvider`: ідентифікатор провайдера, який режим `bidi` використовує для
  прямого голосу в реальному часі. Задайте його як `"google"`, щоб використовувати Gemini Live,
  зберігаючи транскрибування режиму агента на OpenAI.
* `realtime.toolPolicy: "safe-read-only"`
* `realtime.instructions`: короткі усні відповіді з
  `openclaw_agent_consult` для глибших відповідей
* `realtime.introMessage`: коротка усна перевірка готовності, коли міст реального часу
  підключається; задайте `""`, щоб приєднатися мовчки
* `realtime.agentId`: необов’язковий ідентифікатор агента OpenClaw для
  `openclaw_agent_consult`; типово `main`

Необов’язкові перевизначення:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  defaults: {
    meeting: "https://meet.google.com/abc-defg-hij",
  },
  browser: {
    defaultProfile: "openclaw",
  },
  chrome: {
    guestName: "OpenClaw Agent",
    waitForInCallMs: 30000,
    bargeInInputCommand: [
      "sox",
      "-q",
      "-t",
      "coreaudio",
      "External Microphone",
      "-r",
      "24000",
      "-c",
      "1",
      "-b",
      "16",
      "-e",
      "signed-integer",
      "-t",
      "raw",
      "-",
    ],
  },
  chromeNode: {
    node: "parallels-macos",
  },
  defaultMode: "agent",
  realtime: {
    provider: "openai",
    transcriptionProvider: "openai",
    voiceProvider: "google",
    model: "gemini-2.5-flash-native-audio-preview-12-2025",
    agentId: "jay",
    toolPolicy: "owner",
    introMessage: "Say exactly: I'm here.",
    providers: {
      google: {
        speakerVoice: "Kore",
      },
    },
  },
}
```

ElevenLabs для прослуховування та мовлення в режимі агента:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  messages: {
    tts: {
      provider: "elevenlabs",
      providers: {
        elevenlabs: {
          modelId: "eleven_v3",
          speakerVoiceId: "pMsXgVXv3BLzUgSXRplE",
        },
      },
    },
  },
  plugins: {
    entries: {
      "google-meet": {
        config: {
          realtime: {
            transcriptionProvider: "elevenlabs",
            providers: {
              elevenlabs: {
                modelId: "scribe_v2_realtime",
                audioFormat: "ulaw_8000",
                sampleRate: 8000,
                commitStrategy: "vad",
              },
            },
          },
        },
      },
    },
  },
}
```

Постійний голос Meet надходить із
`messages.tts.providers.elevenlabs.speakerVoiceId`. Відповіді агента також можуть використовувати
директиви для окремих відповідей `[[tts:speakerVoiceId=... model=eleven_v3]]`, коли перевизначення
моделі TTS увімкнено, але конфігурація є детермінованим типовим значенням для зустрічей.
Під час приєднання журнали мають показувати `transcriptionProvider=elevenlabs`, а кожна
озвучена відповідь має журналювати `provider=elevenlabs model=eleven_v3 speakerVoiceId=<voiceId>`.

Конфігурація лише для Twilio:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  defaultTransport: "twilio",
  twilio: {
    defaultDialInNumber: "+15551234567",
    defaultPin: "123456",
  },
  voiceCall: {
    gatewayUrl: "ws://127.0.0.1:18789",
  },
}
```

`voiceCall.enabled` типово дорівнює `true`; з транспортом Twilio він делегує
фактичний виклик PSTN, DTMF і вступне привітання Plugin Voice Call. Voice Call
відтворює послідовність DTMF перед відкриттям медіапотоку в реальному часі, а потім використовує
збережений вступний текст як початкове привітання в реальному часі. Якщо `voice-call` не
ввімкнено, Google Meet усе ще може перевірити й записати план набору, але не може
здійснити виклик Twilio.

## Інструмент

Агенти можуть використовувати інструмент `google_meet`:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "action": "join",
  "url": "https://meet.google.com/abc-defg-hij",
  "transport": "chrome-node",
  "mode": "agent"
}
```

Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. Використовуйте
`transport: "chrome-node"`, коли Chrome працює на спареному вузлі, наприклад Parallels
VM. В обох випадках провайдери моделей і `openclaw_agent_consult` працюють на
хості Gateway, тож облікові дані моделей залишаються там. Із типовим `mode: "agent"`
провайдер транскрибування в реальному часі обробляє прослуховування, налаштований агент OpenClaw
створює відповідь, а звичайний OpenClaw TTS озвучує її в Meet. Використовуйте
`mode: "bidi"`, коли хочете, щоб голосова модель у реальному часі відповідала напряму.
Необроблений `mode: "realtime"` досі приймається як застарілий сумісний псевдонім для
`mode: "agent"`, але більше не рекламується в схемі інструмента агента.
Журнали режиму агента містять визначеного провайдера/модель транскрибування під час запуску
мосту, а також провайдера TTS, модель, голос, формат виводу й частоту дискретизації після
кожної синтезованої відповіді.

Використовуйте `action: "status"`, щоб перелічити активні сеанси або переглянути ідентифікатор сеансу. Використовуйте
`action: "speak"` із `sessionId` і `message`, щоб агент реального часу
заговорив негайно. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сеанс,
запустити відому фразу й повернути стан `inCall`, коли хост Chrome може
про нього повідомити. `test_speech` завжди примусово встановлює `mode: "agent"` і завершується помилкою, якщо його просять
працювати в `mode: "transcribe"`, бо сеанси лише спостереження навмисно не можуть
видавати мовлення. Його результат `speechOutputVerified` базується на збільшенні байтів аудіовиходу
в реальному часі під час цього тестового виклику, тож повторно використаний сеанс зі старішим аудіо
не зараховується як свіжа успішна перевірка мовлення. Використовуйте `action: "leave"`, щоб позначити
сеанс завершеним.

`status` містить стан Chrome, коли він доступний:

* `inCall`: Chrome, схоже, перебуває всередині виклику Meet
* `micMuted`: найкраща оцінка стану мікрофона Meet
* `manualActionRequired` / `manualActionReason` / `manualActionMessage`: профілю
  браузера потрібні ручний вхід, допуск хостом Meet, дозволи або
  ремонт керування браузером, перш ніж мовлення зможе працювати
* `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: чи
  дозволено кероване мовлення Chrome зараз. `speechReady: false` означає, що OpenClaw не
  надіслав вступну/тестову фразу в аудіоміст.
* `providerConnected` / `realtimeReady`: стан голосового мосту в реальному часі
* `lastInputAt` / `lastOutputAt`: останнє аудіо, побачене з мосту або надіслане до нього
* `audioOutputRouted` / `audioOutputDeviceLabel`: чи було медіавиведення вкладки Meet
  активно спрямоване на пристрій BlackHole, який використовує міст
* `lastSuppressedInputAt` / `suppressedInputBytes`: вхід loopback, проігнорований, поки
  активне відтворення асистента

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "action": "speak",
  "sessionId": "meet_...",
  "message": "Say exactly: I'm here and listening."
}
```

## Режими агента та bidi

Режим Chrome `agent` оптимізовано для поведінки "мій агент на зустрічі". Провайдер
транскрибування в реальному часі чує аудіо зустрічі, фінальні транскрипти
учасників спрямовуються через налаштованого агента OpenClaw, а відповідь
озвучується через звичайне середовище виконання OpenClaw TTS. Задайте `mode: "bidi"`, коли хочете,
щоб голосова модель у реальному часі відповідала напряму.
Близькі фінальні фрагменти транскрипту об’єднуються перед консультацією, щоб один усний
хід не створював кілька застарілих часткових відповідей. Вхід у реальному часі також
приглушується, поки поставлене в чергу аудіо асистента ще відтворюється,
а нещодавні схожі на асистента відлуння транскриптів ігноруються перед консультацією агента,
щоб loopback BlackHole не змушував агента відповідати на власне мовлення.

| Режим   | Хто визначає відповідь           | Шлях мовного виводу                                   | Коли використовувати                                      |
| ------- | -------------------------------- | ----------------------------------------------------- | --------------------------------------------------------- |
| `agent` | Налаштований агент OpenClaw      | Звичайне середовище виконання OpenClaw TTS            | Потрібна поведінка "мій агент на зустрічі"                |
| `bidi`  | Голосова модель у реальному часі | Аудіовідповідь голосового провайдера в реальному часі | Потрібен голосовий діалоговий цикл із найменшою затримкою |

У режимі `bidi`, коли моделі реального часу потрібні глибше міркування, актуальна
інформація або звичайні інструменти OpenClaw, вона може викликати `openclaw_agent_consult`.

Інструмент consult запускає звичайного агента OpenClaw за лаштунками з контекстом
нещодавньої стенограми зустрічі та повертає стислу усну відповідь. У режимі `agent`
OpenClaw надсилає цю відповідь безпосередньо до середовища виконання TTS; у режимі `bidi`
модель голосу реального часу може озвучити результат consult назад у зустрічі. Він використовує
той самий спільний механізм consult, що й Voice Call.

За замовчуванням consult-запити виконуються для агента `main`. Задайте `realtime.agentId`, коли
канал Meet має звертатися до окремого робочого простору агента OpenClaw, типових значень моделі,
політики інструментів, пам’яті та історії сеансів.

Consult-запити в режимі агента використовують ключ сеансу для кожної зустрічі
`agent:<id>:subagent:google-meet:<session>`, щоб додаткові запитання зберігали контекст зустрічі,
успадковуючи звичайну політику агента від налаштованого агента.

`realtime.toolPolicy` керує запуском consult:

* `safe-read-only`: відкрити інструмент consult і обмежити звичайного агента до
  `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і
  `memory_get`.
* `owner`: відкрити інструмент consult і дозволити звичайному агенту використовувати звичайну
  політику інструментів агента.
* `none`: не відкривати інструмент consult для моделі голосу реального часу.

Ключ сеансу consult обмежений окремим сеансом Meet, тому наступні виклики consult
можуть повторно використовувати попередній контекст consult під час тієї самої зустрічі.

Щоб примусово виконати усну перевірку готовності після того, як Chrome повністю приєднався до дзвінка:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."
```

Для повної smoke-перевірки приєднання й озвучення:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
  --transport chrome-node \
  --message "Say exactly: I'm here and listening."
```

## Контрольний список live-тесту

Використовуйте цю послідовність перед передаванням зустрічі автономному агенту:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup
openclaw nodes status
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
  --transport chrome-node \
  --message "Say exactly: Google Meet speech test complete."
```

Очікуваний стан Chrome-node:

* `googlemeet setup` повністю зелений.
* `googlemeet setup` містить `chrome-node-connected`, коли Chrome-node є
  типовим транспортом або вузол закріплено.
* `nodes status` показує, що вибраний вузол підключено.
* Вибраний вузол оголошує і `googlemeet.chrome`, і `browser.proxy`.
* Вкладка Meet приєднується до дзвінка, а `test-speech` повертає стан Chrome із
  `inCall: true`.

Для віддаленого хоста Chrome, наприклад macOS VM у Parallels, це найкоротша
безпечна перевірка після оновлення Gateway або VM:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup
openclaw nodes status --connected
openclaw nodes invoke \
  --node parallels-macos \
  --command googlemeet.chrome \
  --params '{"action":"setup"}'
```

Це доводить, що Plugin Gateway завантажено, вузол VM підключено з
поточним токеном, а аудіоміст Meet доступний до того, як агент відкриє
справжню вкладку зустрічі.

Для Twilio smoke використовуйте зустріч, яка надає дані телефонного дозвону:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
  --transport twilio \
  --dial-in-number +15551234567 \
  --pin 123456
```

Очікуваний стан Twilio:

* `googlemeet setup` містить зелені перевірки `twilio-voice-call-plugin`,
  `twilio-voice-call-credentials` і `twilio-voice-call-webhook`.
* `voicecall` доступний у CLI після перезавантаження Gateway.
* Повернений сеанс має `transport: "twilio"` і `twilio.voiceCallId`.
* `openclaw logs --follow` показує, що DTMF TwiML віддано перед TwiML реального часу, а потім
  міст реального часу з поставленим у чергу початковим привітанням.
* `googlemeet leave <sessionId>` завершує делегований голосовий дзвінок.

## Усунення несправностей

### Агент не бачить інструмент Google Meet

Переконайтеся, що Plugin увімкнено в конфігурації Gateway, і перезавантажте Gateway:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw plugins list | grep google-meet
openclaw googlemeet setup
```

Якщо ви щойно редагували `plugins.entries.google-meet`, перезапустіть або перезавантажте Gateway.
Запущений агент бачить лише інструменти Plugin, зареєстровані поточним процесом
Gateway.

На хостах Gateway не з macOS інструмент `google_meet`, видимий агенту, залишається доступним,
але локальні дії Chrome для зворотного мовлення блокуються до того, як вони потраплять в аудіоміст.
Аудіо локального зворотного мовлення Chrome наразі залежить від macOS `BlackHole 2ch`, тому
агентам Linux слід використовувати `mode: "transcribe"`, дозвін Twilio або хост macOS
`chrome-node` замість типового шляху локального агента Chrome.

### Немає підключеного вузла з підтримкою Google Meet

На хості вузла виконайте:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw plugins enable google-meet
openclaw plugins enable browser
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
  openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
```

На хості Gateway схваліть вузол і перевірте команди:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw devices list
openclaw devices approve <requestId>
openclaw nodes status
```

Вузол має бути підключений і перелічувати `googlemeet.chrome` разом із `browser.proxy`.
Конфігурація Gateway має дозволяти ці команди вузла:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  gateway: {
    nodes: {
      allowCommands: ["browser.proxy", "googlemeet.chrome"],
    },
  },
}
```

Якщо `googlemeet setup` не проходить `chrome-node-connected` або журнал Gateway повідомляє
`gateway token mismatch`, перевстановіть або перезапустіть вузол із поточним токеном Gateway.
Для LAN Gateway це зазвичай означає:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
  openclaw node install \
  --host <gateway-lan-ip> \
  --port 18789 \
  --display-name parallels-macos \
  --force
```

Потім перезавантажте службу вузла й повторно виконайте:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup
openclaw nodes status --connected
```

### Браузер відкривається, але агент не може приєднатися

Виконайте `googlemeet test-listen` для приєднань лише для спостереження або `googlemeet test-speech`
для приєднань у реальному часі, а потім перевірте повернений стан Chrome. Якщо будь-який зонд
повідомляє `manualActionRequired: true`, покажіть `manualActionMessage` оператору
і припиніть повторні спроби, доки дію в браузері не буде завершено.

Поширені ручні дії:

* Увійдіть у профіль Chrome.
* Допустіть гостя з облікового запису хоста Meet.
* Надайте Chrome дозволи на мікрофон/камеру, коли з’явиться нативний запит дозволу
  Chrome.
* Закрийте або виправте завислий діалог дозволів Meet.

Не повідомляйте "not signed in" лише тому, що Meet показує "Do you want people to
hear you in the meeting?" Це проміжний екран вибору аудіо Meet; OpenClaw
натискає **Use microphone** через автоматизацію браузера, коли це доступно, і продовжує
чекати справжнього стану зустрічі. Для браузерного резервного шляху лише створення OpenClaw
може натиснути **Continue without microphone**, оскільки створення URL не потребує
аудіошляху реального часу.

### Не вдається створити зустріч

`googlemeet create` спершу використовує endpoint Google Meet API `spaces.create`,
коли налаштовано облікові дані OAuth. Без облікових даних OAuth він переходить
до резервного браузера закріпленого вузла Chrome. Переконайтеся:

* Для створення через API: `oauth.clientId` і `oauth.refreshToken` налаштовані,
  або наявні відповідні змінні середовища `OPENCLAW_GOOGLE_MEET_*`.
* Для створення через API: refresh token було створено після додавання підтримки створення.
  Старішим токенам може бракувати scope `meetings.space.created`; повторно виконайте
  `openclaw googlemeet auth login --json` і оновіть конфігурацію Plugin.
* Для браузерного резервного шляху: `defaultTransport: "chrome-node"` і
  `chromeNode.node` вказують на підключений вузол із `browser.proxy` та
  `googlemeet.chrome`.
* Для браузерного резервного шляху: профіль OpenClaw Chrome на цьому вузлі ввійшов
  у Google і може відкрити `https://meet.google.com/new`.
* Для браузерного резервного шляху: повторні спроби повторно використовують наявну вкладку
  `https://meet.google.com/new` або вкладку запиту облікового запису Google перед відкриттям нової вкладки.
  Якщо час очікування агента вичерпано, повторіть виклик інструмента, а не відкривайте вручну
  ще одну вкладку Meet.
* Для браузерного резервного шляху: якщо інструмент повертає `manualActionRequired: true`, використовуйте
  повернені `browser.nodeId`, `browser.targetId`, `browserUrl` і
  `manualActionMessage`, щоб скерувати оператора. Не повторюйте спроби в циклі, доки цю
  дію не буде завершено.
* Для браузерного резервного шляху: якщо Meet показує "Do you want people to hear you in the
  meeting?", залиште вкладку відкритою. OpenClaw має натиснути **Use microphone** або, для
  резервного створення лише URL, **Continue without microphone** через автоматизацію браузера
  і продовжити чекати згенерований URL Meet. Якщо це неможливо, помилка
  має згадувати `meet-audio-choice-required`, а не `google-login-required`.

### Агент приєднується, але не говорить

Перевірте шлях реального часу:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup
openclaw googlemeet doctor
```

Використовуйте `mode: "agent"` для звичайного шляху STT -> агент OpenClaw -> зворотне мовлення TTS,
або `mode: "bidi"` для прямого резервного голосового шляху реального часу. `mode: "transcribe"`
навмисно не запускає міст зворотного мовлення. Для налагодження лише спостереження
виконайте `openclaw googlemeet status --json <session-id>` після того, як учасники заговорять,
і перевірте `captioning`, `transcriptLines` та `lastCaptionText`. Якщо `inCall` дорівнює
true, але `transcriptLines` лишається `0`, субтитри Meet можуть бути вимкнені, ніхто
не говорив після встановлення спостерігача, інтерфейс Meet змінився або live-субтитри
недоступні для мови/облікового запису зустрічі.

`googlemeet test-speech` завжди перевіряє шлях реального часу й повідомляє, чи
було зафіксовано байти виводу мосту для цього виклику. Якщо `speechOutputVerified` дорівнює false і
`speechOutputTimedOut` дорівнює true, провайдер реального часу міг прийняти
висловлювання, але OpenClaw не побачив, щоб нові байти виводу дійшли до аудіомоста
Chrome.

Також перевірте:

* Ключ провайдера реального часу доступний на хості Gateway, наприклад
  `OPENAI_API_KEY` або `GEMINI_API_KEY`.
* `BlackHole 2ch` видимий на хості Chrome.
* `sox` існує на хості Chrome.
* Мікрофон і динамік Meet спрямовані через віртуальний аудіошлях, який використовує
  OpenClaw. `doctor` має показувати `meet output routed: yes` для локальних приєднань
  Chrome у реальному часі.

`googlemeet doctor [session-id]` друкує сеанс, вузол, стан перебування в дзвінку,
причину ручної дії, підключення провайдера реального часу, `realtimeReady`, активність
аудіовходу/виходу, останні аудіомітки часу, лічильники байтів і URL браузера.
Використовуйте `googlemeet status [session-id] --json`, коли потрібен сирий JSON. Використовуйте
`googlemeet doctor --oauth`, коли потрібно перевірити Google Meet OAuth refresh
без розкриття токенів; додайте `--meeting` або `--create-space`, коли також потрібен
доказ Google Meet API.

Якщо час очікування агента вичерпано і ви бачите вже відкриту вкладку Meet, перевірте цю вкладку
без відкриття іншої:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet recover-tab
openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij
```

Еквівалентна дія інструмента — `recover_current_tab`. Вона фокусує й перевіряє
наявну вкладку Meet для вибраного транспорту. З `chrome` вона використовує локальне
керування браузером через Gateway; з `chrome-node` вона використовує налаштований
вузол Chrome. Вона не відкриває нову вкладку й не створює новий сеанс; вона повідомляє
поточний блокер, наприклад вхід, допуск, дозволи або стан вибору аудіо.
Команда CLI звертається до налаштованого Gateway, тому Gateway має бути запущений;
`chrome-node` також потребує підключеного вузла Chrome.

### Перевірки налаштування Twilio не проходять

`twilio-voice-call-plugin` не проходить, коли `voice-call` не дозволено або не ввімкнено.
Додайте його до `plugins.allow`, увімкніть `plugins.entries.voice-call` і перезавантажте
Gateway.

`twilio-voice-call-credentials` не проходить, коли backend Twilio не має account
SID, auth token або номера абонента. Задайте їх на хості Gateway:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
export TWILIO_ACCOUNT_SID=AC...
export TWILIO_AUTH_TOKEN=...
export TWILIO_FROM_NUMBER=+15550001234
```

`twilio-voice-call-webhook` не проходить, коли `voice-call` не має публічного Webhook
доступу або коли `publicUrl` вказує на local loopback чи приватний мережевий простір.
Задайте `plugins.entries.voice-call.config.publicUrl` як URL публічного провайдера або
налаштуйте тунель/Tailscale-доступ для `voice-call`.

Loopback і приватні URL не є дійсними для carrier callbacks. Не використовуйте
`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 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  plugins: {
    entries: {
      "voice-call": {
        enabled: true,
        config: {
          provider: "twilio",
          fromNumber: "+15550001234",
          publicUrl: "https://voice.example.com/voice/webhook",
        },
      },
    },
  },
}
```

Для локальної розробки використовуйте тунель або відкриття через Tailscale замість приватної
URL-адреси хоста:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  plugins: {
    entries: {
      "voice-call": {
        config: {
          tunnel: { provider: "ngrok" },
          // or
          tailscale: { mode: "funnel", path: "/voice/webhook" },
        },
      },
    },
  },
}
```

Потім перезапустіть або перезавантажте Gateway і виконайте:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet setup --transport twilio
openclaw voicecall setup
openclaw voicecall smoke
```

`voicecall smoke` за замовчуванням лише перевіряє готовність. Щоб пробно перевірити конкретний номер:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw voicecall smoke --to "+15555550123"
```

Додавайте `--yes` лише тоді, коли ви навмисно хочете здійснити реальний вихідний
сповіщувальний дзвінок:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw voicecall smoke --to "+15555550123" --yes
```

### Дзвінок Twilio починається, але так і не входить у зустріч

Переконайтеся, що подія Meet надає дані для телефонного дозвону. Передайте точний номер
дозвону та PIN або власну послідовність DTMF:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
  --transport twilio \
  --dial-in-number +15551234567 \
  --dtmf-sequence ww123456#
```

Використовуйте початкові `w` або коми в `--dtmf-sequence`, якщо провайдеру потрібна пауза
перед введенням PIN.

Якщо телефонний дзвінок створено, але в списку учасників Meet так і не з'являється
учасник із дозвону:

* Виконайте `openclaw googlemeet doctor <session-id>`, щоб підтвердити делегований Twilio
  call ID, чи було поставлено DTMF у чергу, і чи було запитано вступне привітання.
* Виконайте `openclaw voicecall status --call-id <id>` і переконайтеся, що дзвінок досі
  активний.
* Виконайте `openclaw voicecall tail` і перевірте, що Webhook-и Twilio надходять до
  Gateway.
* Виконайте `openclaw logs --follow` і знайдіть послідовність Twilio Meet: Google
  Meet делегує приєднання, Voice Call зберігає та віддає pre-connect DTMF TwiML,
  Voice Call віддає realtime TwiML для дзвінка Twilio, після чого Google Meet запитує
  вступне мовлення через `voicecall.speak`.
* Повторно виконайте `openclaw googlemeet setup --transport twilio`; успішна перевірка
  налаштування є обов'язковою, але не доводить, що послідовність PIN для зустрічі правильна.
* Переконайтеся, що номер дозвону належить до того самого запрошення Meet і регіону, що й
  PIN.
* Збільште `voiceCall.dtmfDelayMs` від стандартних 12 секунд, якщо Meet відповідає
  повільно або транскрипт дзвінка досі показує запит на PIN після надсилання
  pre-connect DTMF.
* Якщо учасник приєднується, але ви не чуєте привітання, перевірте
  `openclaw logs --follow` на наявність post-DTMF запиту `voicecall.speak` і
  або відтворення TTS через медіапотік, або fallback Twilio `<Say>`. Якщо транскрипт
  дзвінка досі містить "enter the meeting PIN", телефонна гілка ще не приєдналася
  до кімнати Meet, тож учасники зустрічі не почують мовлення.

Якщо Webhook-и не надходять, спочатку налагодьте Plugin Voice Call: провайдер має
дістатися `plugins.entries.voice-call.config.publicUrl` або налаштованого тунелю.
Див. [усунення несправностей голосового дзвінка](/uk/plugins/voice-call#troubleshooting).

## Примітки

Офіційний медіа-API Google Meet орієнтований на приймання, тому для мовлення в дзвінку
Meet усе одно потрібен шлях учасника. Цей Plugin залишає цю межу видимою:
Chrome відповідає за участь у браузері та маршрутизацію локального аудіо; Twilio відповідає
за участь через телефонний дозвін.

Режими talk-back у Chrome потребують `BlackHole 2ch` плюс одне з такого:

* `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw володіє
  мостом і передає аудіо у форматі `chrome.audioFormat` між цими командами та
  вибраним провайдером. Режим агента використовує realtime-транскрипцію плюс звичайний TTS;
  bidi-режим використовує realtime-провайдера голосу. Стандартний шлях Chrome — це 24 кГц
  PCM16 з `chrome.audioBufferBytes: 4096`; 8 кГц G.711 mu-law залишається
  доступним для застарілих пар команд.
* `chrome.audioBridgeCommand`: зовнішня команда мосту володіє всім локальним
  аудіошляхом і має завершитися після запуску або перевірки свого daemon. Це дійсно лише
  для `bidi`, бо режим `agent` потребує прямого доступу до пари команд для TTS.

Коли агент викликає інструмент `google_meet` у режимі агента, сеанс консультанта зустрічі
форкає поточний транскрипт викликача перед відповіддю на мовлення учасника. Сеанс Meet
все одно залишається окремим (`agent:<agentId>:subagent:google-meet:<sessionId>`),
тому подальші дії зустрічі не змінюють транскрипт викликача напряму.

Для чистого дуплексного аудіо маршрутизуйте вихід Meet і мікрофон Meet через окремі
віртуальні пристрої або граф віртуальних пристроїв у стилі Loopback. Один спільний
пристрій BlackHole може повертати ехо інших учасників назад у дзвінок.

З командною парою мосту Chrome `chrome.bargeInInputCommand` може слухати
окремий локальний мікрофон і очищати відтворення асистента, коли людина починає
говорити. Це утримує людське мовлення попереду виводу асистента навіть тоді, коли спільний
loopback-вхід BlackHole тимчасово приглушено під час відтворення асистента.
Як і `chrome.audioInputCommand` та `chrome.audioOutputCommand`, це
локальна команда, налаштована оператором. Використовуйте явний довірений шлях команди або
список аргументів і не спрямовуйте її на скрипти з недовірених розташувань.

`googlemeet speak` запускає активний talk-back аудіоміст для сеансу Chrome.
`googlemeet leave` зупиняє цей міст. Для сеансів Twilio, делегованих
через Plugin Voice Call, `leave` також завершує базовий голосовий дзвінок.
Використовуйте `googlemeet end-active-conference`, коли також хочете закрити активну
конференцію Google Meet для простору, керованого API.

## Пов'язане

* [Plugin голосового дзвінка](/uk/plugins/voice-call)
* [Режим розмови](/uk/nodes/talk)
* [Створення Plugins](/uk/plugins/building-plugins)
