Bundled plugin guides

Плагін 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
brew install blackhole-2ch soxexport OPENAI_API_KEY=sk-...# only needed when realtime.voiceProvider is "google" for bidi modeexport GEMINI_API_KEY=...

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

bash
sudo reboot

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

bash
system_profiler SPAudioDataType | grep -i BlackHolecommand -v sox

Увімкніть Plugin:

json5
{  plugins: {    entries: {      "google-meet": {        enabled: true,        config: {},      },    },  },}

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

bash
openclaw googlemeet setup

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

bash
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
openclaw googlemeet setup --transport twilio

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

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

bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij

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

json
{  "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
openclaw googlemeet create --transport chrome-node --mode agent

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

bash
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
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
{  "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
brew install blackhole-2ch sox

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

bash
sudo reboot

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

bash
system_profiler SPAudioDataType | grep -i BlackHolecommand -v sox

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

bash
openclaw plugins enable google-meet

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

bash
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos

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

bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \  openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos

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

bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \  openclaw node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --forceopenclaw node restart

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

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

bash
openclaw devices listopenclaw devices approve <requestId>

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

bash
openclaw nodes status

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

json5
{  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
openclaw googlemeet join https://meet.google.com/abc-defg-hij

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

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

bash
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
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chromeopenclaw 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
{  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
export TWILIO_ACCOUNT_SID=AC...export TWILIO_AUTH_TOKEN=...export TWILIO_FROM_NUMBER=+15550001234export GEMINI_API_KEY=...

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

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

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

bash
openclaw config validateopenclaw 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
openclaw googlemeet join https://meet.google.com/abc-defg-hij \  --transport twilio \  --dial-in-number +15551234567 \  --pin 123456

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

bash
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
      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
openclaw googlemeet auth login --json

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

Приклади:

bash
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \openclaw googlemeet auth login --json

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

bash
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \openclaw googlemeet auth login --json --manual

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

json
{  "oauth": {    "clientId": "your-client-id",    "clientSecret": "your-client-secret",    "refreshToken": "refresh-token",    "accessToken": "access-token",    "expiresAt": 1770000000000  },  "scope": "..."}

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

json5
{  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
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
openclaw googlemeet doctor --oauth --create-space --jsonopenclaw googlemeet create --no-join --json

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

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

bash
openclaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --jsonopenclaw 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
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij

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

bash
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij

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

bash
openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-export

З --meeting команди artifacts і attendance типово використовують найновіший запис конференції. Передайте --all-conference-records, коли потрібен кожен збережений запис для цієї зустрічі.

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

bash
openclaw googlemeet latest --todayopenclaw googlemeet calendar-events --today --jsonopenclaw 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
openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet artifacts --conference-record conferenceRecords/abc123 --jsonopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 --json

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

bash
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
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 \  --format markdown --output meet-artifacts.mdopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 \  --format markdown --output meet-attendance.mdopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 \  --format csv --output meet-attendance.csvopenclaw googlemeet export --conference-record conferenceRecords/abc123 \  --include-doc-bodies --zip --output meet-exportopenclaw 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
{  "action": "export",  "conferenceRecord": "conferenceRecords/abc123",  "includeDocumentBodies": true,  "outputDir": "meet-export",  "zip": true}

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

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

json
{  "action": "create",  "transport": "chrome-node",  "mode": "agent",  "accessType": "OPEN"}

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

json
{  "action": "end_active_conference",  "meeting": "https://meet.google.com/abc-defg-hij"}

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

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

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

bash
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
openclaw googlemeet setup --transport chrome-node --mode transcribeopenclaw 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
openclaw googlemeet create

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

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

json
{  "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
{  "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
{  "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
brew install blackhole-2ch soxexport OPENAI_API_KEY=sk-...# orexport GEMINI_API_KEY=...

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

json5
{  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
{  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
{  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
{  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
{  "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
{  "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
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."

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

bash
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \  --transport chrome-node \  --message "Say exactly: I'm here and listening."

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

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

bash
openclaw googlemeet setupopenclaw nodes statusopenclaw 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
openclaw googlemeet setupopenclaw nodes status --connectedopenclaw nodes invoke \  --node parallels-macos \  --command googlemeet.chrome \  --params '{"action":"setup"}'

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

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

bash
openclaw googlemeet setupopenclaw 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
openclaw plugins list | grep google-meetopenclaw 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
openclaw plugins enable google-meetopenclaw plugins enable browserOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \  openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos

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

bash
openclaw devices listopenclaw devices approve <requestId>openclaw nodes status

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

json5
{  gateway: {    nodes: {      allowCommands: ["browser.proxy", "googlemeet.chrome"],    },  },}

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

bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \  openclaw node install \  --host <gateway-lan-ip> \  --port 18789 \  --display-name parallels-macos \  --force

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

bash
openclaw googlemeet setupopenclaw 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
openclaw googlemeet setupopenclaw 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
openclaw googlemeet recover-tabopenclaw 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
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
{  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 --transport twilioopenclaw voicecall setupopenclaw voicecall smoke

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

bash
openclaw voicecall smoke --to "+15555550123"

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

bash
openclaw voicecall smoke --to "+15555550123" --yes

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

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

bash
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 OPENCLAW_DOCS_MARKER:calloutOpen:U2F5. Якщо транскрипт дзвінка досі містить "enter the meeting PIN", телефонна гілка ще не приєдналася до кімнати Meet, тож учасники зустрічі не почують мовлення.

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

Примітки

Офіційний медіа-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.

Пов'язане

Was this useful?
On this page

On this page