8.9 KiB
summary, read_when, title
| summary | read_when | title | ||
|---|---|---|---|---|
| Google Meet plugin: join explicit Meet URLs through Chrome or Twilio with realtime voice defaults |
|
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. realtimevoice 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;meetis reserved for broader agent teleconference workflows.
Quick start
Install the local audio dependencies and make sure the realtime provider can use OpenAI:
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:
sudo reboot
After reboot, verify both pieces:
system_profiler SPAudioDataType | grep -i BlackHole
command -v rec play
Enable the plugin:
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {},
},
},
},
}
Check setup:
openclaw googlemeet setup
Join a meeting:
openclaw googlemeet join https://meet.google.com/abc-defg-hij
Or let an agent join through the google_meet tool:
{
"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 itsrecandplaycommands for the default 8 kHz G.711 mu-law audio bridge.blackhole-2ch: macOS virtual audio driver. It creates theBlackHole 2chaudio 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.
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.
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:
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:
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_IDorGOOGLE_MEET_CLIENT_IDOPENCLAW_GOOGLE_MEET_CLIENT_SECRETorGOOGLE_MEET_CLIENT_SECRETOPENCLAW_GOOGLE_MEET_REFRESH_TOKENorGOOGLE_MEET_REFRESH_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKENorGOOGLE_MEET_ACCESS_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATorGOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATOPENCLAW_GOOGLE_MEET_DEFAULT_MEETINGorGOOGLE_MEET_DEFAULT_MEETINGOPENCLAW_GOOGLE_MEET_PREVIEW_ACKorGOOGLE_MEET_PREVIEW_ACK
Resolve a Meet URL, code, or spaces/{id} through spaces.get:
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
Run preflight before media work:
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:
brew install blackhole-2ch sox
export OPENAI_API_KEY=sk-...
Set the plugin config under plugins.entries.google-meet.config:
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {},
},
},
},
}
Defaults:
defaultTransport: "chrome"defaultMode: "realtime"chrome.audioBackend: "blackhole-2ch"chrome.audioInputCommand: SoXreccommand writing 8 kHz G.711 mu-law audio to stdoutchrome.audioOutputCommand: SoXplaycommand reading 8 kHz G.711 mu-law audio from stdinrealtime.provider: "openai"realtime.toolPolicy: "safe-read-only"realtime.instructions: brief spoken replies, withopenclaw_agent_consultfor deeper answers
Optional overrides:
{
defaults: {
meeting: "https://meet.google.com/abc-defg-hij",
},
chrome: {
browserProfile: "Default",
},
realtime: {
toolPolicy: "owner",
},
}
Twilio-only config:
{
defaultTransport: "twilio",
twilio: {
defaultDialInNumber: "+15551234567",
defaultPin: "123456",
},
voiceCall: {
gatewayUrl: "ws://127.0.0.1:18789",
},
}
Tool
Agents can use the google_meet tool:
{
"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 toread,web_search,web_fetch,x_search,memory_search, andmemory_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.audioInputCommandpluschrome.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.