--- summary: "Google Meet plugin: join explicit Meet URLs through Chrome or Twilio with realtime voice defaults" read_when: - You want an OpenClaw agent to join a Google Meet call - You are configuring Chrome or Twilio as a Google Meet transport title: "Google Meet Plugin" --- # Google Meet (plugin) Google Meet participant support for OpenClaw. The plugin is explicit by design: - It only joins an explicit `https://meet.google.com/...` URL. - `realtime` voice is the default mode. - Realtime voice can call back into the full OpenClaw agent when deeper reasoning or tools are needed. - Auth starts as personal Google OAuth or an already signed-in Chrome profile. - There is no automatic consent announcement. - The default Chrome audio backend is `BlackHole 2ch`. - Twilio accepts a dial-in number plus optional PIN or DTMF sequence. - The CLI command is `googlemeet`; `meet` is reserved for broader agent teleconference workflows. ## Quick start Install the local audio dependencies and make sure the realtime provider can use OpenAI: ```bash brew install blackhole-2ch sox export OPENAI_API_KEY=sk-... ``` `blackhole-2ch` installs the `BlackHole 2ch` virtual audio device. Homebrew's installer requires a reboot before macOS exposes the device: ```bash sudo reboot ``` After reboot, verify both pieces: ```bash system_profiler SPAudioDataType | grep -i BlackHole command -v rec play ``` Enable the plugin: ```json5 { plugins: { entries: { "google-meet": { enabled: true, config: {}, }, }, }, } ``` Check setup: ```bash openclaw googlemeet setup ``` Join a meeting: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij ``` Or let an agent join through the `google_meet` tool: ```json { "action": "join", "url": "https://meet.google.com/abc-defg-hij" } ``` Chrome joins as the signed-in Chrome profile. In Meet, pick `BlackHole 2ch` for the microphone/speaker path used by OpenClaw. For clean duplex audio, use separate virtual devices or a Loopback-style graph; a single BlackHole device is enough for a first smoke test but can echo. ## Install notes The Chrome realtime default uses two external tools: - `sox`: command-line audio utility. The plugin uses its `rec` and `play` commands for the default 8 kHz G.711 mu-law audio bridge. - `blackhole-2ch`: macOS virtual audio driver. It creates the `BlackHole 2ch` audio device that Chrome/Meet can route through. OpenClaw does not bundle or redistribute either package. The docs ask users to install them as host dependencies through Homebrew. SoX is licensed as `LGPL-2.0-only AND GPL-2.0-only`; BlackHole is GPL-3.0. If you build an installer or appliance that bundles BlackHole with OpenClaw, review BlackHole's upstream licensing terms or get a separate license from Existential Audio. ## Transports ### Chrome Chrome transport opens the Meet URL in Google Chrome and joins as the signed-in Chrome profile. On macOS, the plugin checks for `BlackHole 2ch` before launch. If configured, it also runs an audio bridge health command and startup command before opening Chrome. ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome ``` Route Chrome microphone and speaker audio through the local OpenClaw audio bridge. If `BlackHole 2ch` is not installed, the join fails with a setup error instead of silently joining without an audio path. ### Twilio Twilio transport is a strict dial plan delegated to the Voice Call plugin. It does not parse Meet pages for phone numbers. ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --pin 123456 ``` Use `--dtmf-sequence` when the meeting needs a custom sequence: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --dtmf-sequence ww123456# ``` ## OAuth and preflight Google Meet Media API access uses a personal OAuth client first. Configure `oauth.clientId` and optionally `oauth.clientSecret`, then run: ```bash openclaw googlemeet auth login --json ``` The command prints an `oauth` config block with a refresh token. It uses PKCE, localhost callback on `http://localhost:8085/oauth2callback`, and a manual copy/paste flow with `--manual`. These environment variables are accepted as fallbacks: - `OPENCLAW_GOOGLE_MEET_CLIENT_ID` or `GOOGLE_MEET_CLIENT_ID` - `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` or `GOOGLE_MEET_CLIENT_SECRET` - `OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN` or `GOOGLE_MEET_REFRESH_TOKEN` - `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN` or `GOOGLE_MEET_ACCESS_TOKEN` - `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` or `GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` - `OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING` or `GOOGLE_MEET_DEFAULT_MEETING` - `OPENCLAW_GOOGLE_MEET_PREVIEW_ACK` or `GOOGLE_MEET_PREVIEW_ACK` Resolve a Meet URL, code, or `spaces/{id}` through `spaces.get`: ```bash openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij ``` Run preflight before media work: ```bash openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij ``` Set `preview.enrollmentAcknowledged: true` only after confirming your Cloud project, OAuth principal, and meeting participants are enrolled in the Google Workspace Developer Preview Program for Meet media APIs. ## Config The common Chrome realtime path only needs the plugin enabled, BlackHole, SoX, and an OpenAI key: ```bash brew install blackhole-2ch sox export OPENAI_API_KEY=sk-... ``` Set the plugin config under `plugins.entries.google-meet.config`: ```json5 { plugins: { entries: { "google-meet": { enabled: true, config: {}, }, }, }, } ``` Defaults: - `defaultTransport: "chrome"` - `defaultMode: "realtime"` - `chrome.audioBackend: "blackhole-2ch"` - `chrome.audioInputCommand`: SoX `rec` command writing 8 kHz G.711 mu-law audio to stdout - `chrome.audioOutputCommand`: SoX `play` command reading 8 kHz G.711 mu-law audio from stdin - `realtime.provider: "openai"` - `realtime.toolPolicy: "safe-read-only"` - `realtime.instructions`: brief spoken replies, with `openclaw_agent_consult` for deeper answers Optional overrides: ```json5 { defaults: { meeting: "https://meet.google.com/abc-defg-hij", }, chrome: { browserProfile: "Default", }, realtime: { toolPolicy: "owner", }, } ``` Twilio-only config: ```json5 { defaultTransport: "twilio", twilio: { defaultDialInNumber: "+15551234567", defaultPin: "123456", }, voiceCall: { gatewayUrl: "ws://127.0.0.1:18789", }, } ``` ## Tool Agents can use the `google_meet` tool: ```json { "action": "join", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome", "mode": "realtime" } ``` Use `action: "status"` to list active sessions or inspect a session ID. Use `action: "leave"` to mark a session ended. ## Realtime agent consult Chrome realtime mode is optimized for a live voice loop. The realtime voice provider hears the meeting audio and speaks through the configured audio bridge. When the realtime model needs deeper reasoning, current information, or normal OpenClaw tools, it can call `openclaw_agent_consult`. The consult tool runs the regular OpenClaw agent behind the scenes with recent meeting transcript context and returns a concise spoken answer to the realtime voice session. The voice model can then speak that answer back into the meeting. `realtime.toolPolicy` controls the consult run: - `safe-read-only`: expose the consult tool and limit the regular agent to `read`, `web_search`, `web_fetch`, `x_search`, `memory_search`, and `memory_get`. - `owner`: expose the consult tool and let the regular agent use the normal agent tool policy. - `none`: do not expose the consult tool to the realtime voice model. The consult session key is scoped per Meet session, so follow-up consult calls can reuse prior consult context during the same meeting. ## Notes Google Meet's official media API is receive-oriented, so speaking into a Meet call still needs a participant path. This plugin keeps that boundary visible: Chrome handles browser participation and local audio routing; Twilio handles phone dial-in participation. Chrome realtime mode needs either: - `chrome.audioInputCommand` plus `chrome.audioOutputCommand`: OpenClaw owns the realtime model bridge and pipes 8 kHz G.711 mu-law audio between those commands and the selected realtime voice provider. - `chrome.audioBridgeCommand`: an external bridge command owns the whole local audio path and must exit after starting or validating its daemon. For clean duplex audio, route Meet output and Meet microphone through separate virtual devices or a Loopback-style virtual device graph. A single shared BlackHole device can echo other participants back into the call. `googlemeet leave` stops the command-pair realtime audio bridge for Chrome sessions. For Twilio sessions delegated through the Voice Call plugin, it also hangs up the underlying voice call.