Google Meet plugin
기준일: 2026-07-26
공식 기준: Google Meet plugin
Google Meet plugin 문서는 OpenClaw 공식 문서(plugins/google-meet)를 한국어로 정리한 가이드입니다. Google Meet plugin: join explicit Meet URLs through Chrome or Twilio with agent talk-back defaults 명령·설정 키·코드 예시는 공식 문서를 그대로 보존하며, 해석과 절차 안내는 한국어로 제공합니다. 최종 동작은 설치된 CLI 버전과 공식 원문을 확인하세요.
핵심 요약
Google Meet plugin: join explicit Meet URLs through Chrome or Twilio with agent talk-back defaults
한국어 가이드 범위: plugins/google-meet 경로의 설정·명령·제약·예시를 학습용으로 재구성합니다.
문서 구성
공식 문서의 주요 섹션은 다음과 같습니다.
- 빠른 시작
- only needed when realtime.voiceProvider is "google" for bidi mode
- Create a meeting
- Observe-only join
- Realtime session health
- Local Gateway + Parallels Chrome
- Common failure checks
- Install notes
- Transports
- Chrome
- Twilio
- OAuth and preflight
- Create Google credentials
- Mint the refresh token
- Verify OAuth with doctor
- Resolve, preflight, and read artifacts
- Live smoke test
- Create examples
- 구성
- Defaults
- Optional overrides
- Tool
- Agent and bidi modes
- Live test checklist
- 트러블슈팅
- Agent cannot see the Google Meet tool
- No connected Google Meet-capable node
- Browser opens but agent cannot join
- Meeting creation fails
- Agent joins but does not talk
상세 내용
본문
The google-meet plugin joins explicit Meet URLs on behalf of an OpenClaw agent. It is deliberately narrow:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
- It only joins
https://meet.google.com/...URLs; it never dials into a meeting from a phone number it discovers itself. googlemeet createcan mint a new Meet URL through the Google Meet API (or a browser fallback) and join it by default.- Chrome participation uses a signed-in Chrome profile, optionally on a paired node. Twilio participation dials a phone number plus PIN/DTMF through the Voice call plugin; it cannot dial a Meet URL directly.
mode: "agent"(default) transcribes participant speech with a realtime provider, routes it to the configured OpenClaw agent, and speaks the answer with regular OpenClaw TTS.mode: "bidi"lets a realtime voice model answer directly.mode: "transcribe"joins observe-only with no talk-back.- There is no automatic consent announcement when the plugin joins a call.
- The CLI command is
googlemeet;meetis reserved for broader agent teleconference workflows.
빠른 시작
Install the plugin and local audio dependencies, then set a realtime provider key. OpenAI is the default transcription provider for agent mode; Google Gemini Live is available as the bidi-mode voice provider:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
only needed when realtime.voiceProvider is "google" for bidi mode
bash sudo reboot bash system_profiler SPAudioDataType | grep -i BlackHole command -v sox json5 { plugins: { entries: { "google-meet": { config: {}, }, }, }, } bash openclaw googlemeet setup openclaw googlemeet join https://meet.google.com/abc-defg-hij bash openclaw googlemeet setup --transport chrome-node --mode transcribe bash openclaw googlemeet setup --transport twilio json { "action": "join", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "mode": "agent" } ```
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
`blackhole-2ch` installs the `BlackHole 2ch` virtual audio device Chrome routes through. Homebrew's installer requires a reboot before macOS exposes the device:
After reboot, verify both pieces:
The plugin is enabled by default after installation. Add an entry only to customize it:
Run `openclaw plugins disable google-meet` if you do not want the plugin active.
Check setup, then join:
Create a meeting
create has two paths, reported in the result's source field:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
api: used when Google Meet OAuth credentials are configured. Deterministic; does not depend on browser UI state.browser: used without OAuth credentials. OpenClaw openshttps://meet.google.com/newon the pinned Chrome node and waits for Google to redirect to a real meeting-code URL; the OpenClaw Chrome profile on that node must already be signed in to Google. Join and create both reuse an existing Meet tab (or an in-progress.../new/ Google account prompt tab) before opening a new one; tab matching ignores harmless query strings likeauthuser.
--access-type |
Who can join without knocking |
|---|---|
OPEN |
Anyone with the Meet URL |
TRUSTED |
Host org's trusted users, invited external users, and dial-in users |
RESTRICTED |
Invitees only |
openclaw googlemeet create --transport chrome-node --mode agent
openclaw googlemeet create --no-join
openclaw googlemeet create --access-type OPEN --transport chrome-node --mode agent
Observe-only join
Set "mode": "transcribe" to skip the duplex realtime bridge (no BlackHole/SoX requirement, no talk-back). Transcribe-mode Chrome joins also skip OpenClaw's microphone/camera permission grant and the Meet Use microphone path; if Meet shows the audio-choice interstitial, automation tries Continue without microphone first. Managed Chrome transports install a best-effort Meet caption observer in every mode so durable notes are available without changing the live agent-consult path. googlemeet status --json and googlemeet doctor report captioning, captionsEnabledAttempted, transcriptLines, lastCaptionAt, lastCaptionSpeaker, lastCaptionText, and a recentTranscript tail.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
openclaw googlemeet transcript <session-id>
openclaw googlemeet transcript <session-id> --since <next-index> --json
openclaw googlemeet test-listen <meet-url> --transport chrome-node
Realtime session health
During talk-back sessions, google_meet status reports Chrome/audio bridge health: inCall, manualActionRequired, providerConnected, realtimeReady, audioInputActive, audioOutputActive, last input/output timestamps, byte counters, and bridge-closed state. Managed Chrome sessions only speak the intro/test phrase after health reports inCall: true; otherwise speechReady: false and the speech attempt is blocked rather than silently no-opping.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
Local Gateway + Parallels Chrome
A full Gateway or model API key is not required inside a macOS VM just to give it Chrome. Run the Gateway and agent locally; run a node host in the VM.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
| Runs where | What |
|---|---|
| Gateway host | OpenClaw Gateway, agent workspace, model/API keys, realtime provider, Google Meet plugin config |
| Parallels macOS VM | OpenClaw CLI/node host, Chrome, SoX, BlackHole 2ch, a Chrome profile signed in to Google |
| Not needed in the VM | Gateway service, agent config, model provider setup |
brew install blackhole-2ch sox
sudo reboot
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox
openclaw plugins install npm:@openclaw/google-meet
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --force
openclaw node restart
Common failure checks
| Symptom | Fix |
|---|---|
Configured Google Meet node ... is not usable: offline |
The pinned node is known but unavailable. Report the setup blocker; do not silently fall back to another transport unless asked. |
No connected Google Meet-capable node |
Install npm:@openclaw/google-meet in the VM, run openclaw plugins enable browser, start openclaw node run, and approve pairing. If Google Meet was explicitly disabled, enable it too. Confirm gateway.nodes.commands.allow includes googlemeet.chrome and browser.proxy. |
BlackHole 2ch audio device not found |
Install blackhole-2ch on the host being checked and reboot. |
BlackHole 2ch audio device not found on the node |
Install blackhole-2ch in the VM and reboot the VM. |
| Chrome opens but cannot join | Sign in to the browser profile in the VM, or keep chrome.guestName set. Guest auto-join uses OpenClaw browser automation through the node browser proxy; point the node's browser.defaultProfile (or a named existing-session profile) at the profile you want. |
| Duplicate Meet tabs | Leave chrome.reuseExistingTab: true. OpenClaw activates an existing tab for the same URL, and creation reuses an in-progress .../new or Google account prompt tab, before opening another. |
| No audio | Route Meet mic/speaker through the virtual audio path used by OpenClaw; use separate virtual devices or Loopback-style routing for clean duplex audio. |
Install notes
The Chrome talk-back default uses two external tools that OpenClaw does not bundle or redistribute; install them as host dependencies through Homebrew:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
sox: command-line audio utility. The plugin issues explicit CoreAudio device commands for the default 24 kHz PCM16 audio bridge.blackhole-2ch: macOS virtual audio driver providing theBlackHole 2chdevice Chrome/Meet route through.
Transports
| Transport | Use when |
|---|---|
chrome |
Chrome/audio live on the Gateway host |
chrome-node |
Chrome/audio live on a paired node (for example a Parallels macOS VM) |
twilio |
Phone dial-in fallback via the Voice Call plugin, when Chrome participation is not available |
Chrome
Opens the Meet URL through OpenClaw browser control and joins as the signed-in OpenClaw browser profile. On macOS, the plugin checks for BlackHole 2ch before launch and, if configured, runs an audio bridge health/startup command before opening Chrome. For local Chrome, pick the profile with browser.defaultProfile; chrome.browserProfile is passed to chrome-node hosts instead.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
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
Twilio
A strict dial plan delegated to the Voice call plugin. It does not parse Meet pages for phone numbers; Google Meet must expose a phone dial-in number and PIN for the meeting.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
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,
},
},
},
}
openclaw config validate
openclaw plugins list | grep -E 'google-meet|voice-call'
openclaw googlemeet setup
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--transport twilio \
--dial-in-number +15551234567 \
--pin 123456
OAuth and preflight
OAuth is optional for creating a Meet link, because googlemeet create can fall back to browser automation. Configure OAuth for official API create, space resolution, or Meet Media API preflight. Chrome/Chrome-node joins never depend on OAuth; they use a signed-in Chrome profile, BlackHole/SoX, and (for chrome-node) a connected node either way.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
Create Google credentials
Internal is simplest for a Google Workspace organization. External works for personal/test setups; while the app is in Testing, add each Google account that will authorize it as a test user.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
https://www.googleapis.com/auth/meetings.space.createdhttps://www.googleapis.com/auth/meetings.space.readonlyhttps://www.googleapis.com/auth/meetings.space.settingshttps://www.googleapis.com/auth/meetings.conference.media.readonlyhttps://www.googleapis.com/auth/calendar.events.readonly(Calendar lookup)https://www.googleapis.com/auth/drive.meet.readonly(transcript/smart-note document body export)
http://localhost:8085/oauth2callback
Mint the refresh token
Configure oauth.clientId and optionally oauth.clientSecret (or pass them as environment variables), then run:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
openclaw googlemeet auth login --json
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
openclaw googlemeet auth login --json --manual
{
"oauth": {
"clientId": "your-client-id",
"clientSecret": "your-client-secret",
"refreshToken": "refresh-token",
"accessToken": "access-token",
"expiresAt": 1770000000000
},
"scope": "..."
}
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {
oauth: {
clientId: "your-client-id",
clientSecret: "your-client-secret",
refreshToken: "refresh-token",
},
},
},
},
},
}
Verify OAuth with doctor
This checks OAuth config exists and the refresh token can mint an access token, without loading the Chrome runtime or requiring a connected node. The report includes only status fields (ok, configured, tokenSource, expiresAt, check messages) and never prints the access token, refresh token, or client secret.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
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
| Check | Meaning |
|---|---|
oauth-config |
oauth.clientId plus oauth.refreshToken, or a cached access token, is present |
oauth-token |
The cached access token is still valid, or the refresh token minted a new one |
meet-spaces-get |
Optional --meeting check resolved an existing Meet space |
meet-spaces-create |
Optional --create-space check created a new Meet space |
openclaw googlemeet doctor --oauth --json
openclaw googlemeet doctor --oauth --create-space --json
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
Resolve, preflight, and read artifacts
After Meet has created conference records:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
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
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
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
Live smoke test
The base artifact/attendance smoke needs meetings.space.readonly and meetings.conference.media.readonly. Calendar lookup needs calendar.events.readonly. Drive document-body export needs drive.meet.readonly.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
| Variable | Purpose |
|---|---|
OPENCLAW_LIVE_TEST=1 |
Enables guarded live tests |
OPENCLAW_GOOGLE_MEET_LIVE_MEETING |
Retained Meet URL, code, or spaces/{id} |
OPENCLAW_GOOGLE_MEET_CLIENT_ID / GOOGLE_MEET_CLIENT_ID |
OAuth client id |
OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN / GOOGLE_MEET_REFRESH_TOKEN |
Refresh token |
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET, OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN, OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT |
Optional; same fallback names without the OPENCLAW_ prefix also work |
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
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
Create examples
Prints the new meeting URI, source, and join session. With OAuth it uses the Meet API; without it, the pinned Chrome node's signed-in profile. Browser fallback JSON:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
openclaw googlemeet create
{
"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"
}
}
}
{
"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"
}
}
{
"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"
}
}
}
구성
The common Chrome agent path only needs the plugin enabled, BlackHole, SoX, a realtime provider key, and a configured OpenClaw TTS provider:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {},
},
},
},
}
Defaults
chrome.audioBridgeCommand and chrome.audioBridgeHealthCommand let an external bridge own the whole local audio path instead of chrome.audioInputCommand/chrome.audioOutputCommand; see Notes for the constraint on which mode can use them.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
| Key | Default | Notes |
|---|---|---|
defaultTransport |
"chrome" |
|
defaultMode |
"agent" |
"realtime" is accepted as a legacy alias for "agent"; new callers should say "agent" |
chromeNode.node |
unset | Node id/name/IP for chrome-node; required when more than one capable node may be connected |
chrome.launch |
true |
Launch Chrome for the join; set false only when reusing an already-open session |
chrome.audioBackend |
"blackhole-2ch" |
|
chrome.guestName |
"OpenClaw Agent" |
Shown on the signed-out Meet guest screen |
chrome.autoJoin |
true |
Best-effort guest-name fill and Join Now click on chrome-node |
chrome.reuseExistingTab |
true |
Activates an existing Meet tab instead of opening duplicates |
chrome.waitForInCallMs |
20000 |
Wait for the Meet tab to report in-call before the talk-back intro fires |
chrome.audioFormat |
"pcm16-24khz" |
Command-pair audio format; "g711-ulaw-8khz" is only for legacy/custom command pairs that emit telephony audio |
chrome.audioBufferBytes |
4096 |
SoX processing buffer for generated command-pair audio commands (half SoX's default 8192-byte buffer, lowering pipe latency); values are clamped to a minimum of 17 bytes |
chrome.audioInputCommand |
generated SoX command | Reads from CoreAudio BlackHole 2ch, writes audio in chrome.audioFormat |
chrome.audioOutputCommand |
generated SoX command | Reads audio in chrome.audioFormat, writes to CoreAudio BlackHole 2ch |
chrome.bargeInInputCommand |
unset | Optional local microphone command writing signed 16-bit little-endian mono PCM for human barge-in detection during assistant playback; applies to the Gateway-hosted command-pair bridge |
chrome.bargeInRmsThreshold |
650 |
RMS level counted as human interruption |
chrome.bargeInPeakThreshold |
2500 |
Peak level counted as human interruption |
chrome.bargeInCooldownMs |
900 |
Minimum delay between repeated interruption clears |
mode (per-request) |
"agent" |
Talk-back mode; see the Agent and bidi modes table |
realtime.provider |
"openai" |
Compatibility fallback used when the scoped fields below are unset |
realtime.transcriptionProvider |
"openai" |
Provider id used by agent mode for realtime transcription |
realtime.voiceProvider |
unset | Provider id used by bidi mode for direct realtime voice; set to "google" for Gemini Live while keeping agent-mode transcription on OpenAI. Pair with realtime.model to pick the specific Gemini Live model. |
realtime.toolPolicy |
"safe-read-only" |
See Agent and bidi modes |
realtime.instructions |
brief spoken-reply instructions | Tells the model to speak briefly and use openclaw_agent_consult for deeper answers |
realtime.introMessage |
"Say exactly: I'm here and listening." |
Spoken once when the realtime bridge connects; set to "" to join silently |
realtime.agentId |
"main" |
OpenClaw agent id used for openclaw_agent_consult |
voiceCall.enabled |
true |
Delegates the Twilio PSTN call, DTMF, and intro greeting to the Voice Call plugin |
voiceCall.dtmfDelayMs |
12000 |
Leading wait before playing a PIN-derived DTMF sequence over Twilio |
voiceCall.postDtmfSpeechDelayMs |
5000 |
Delay before requesting the realtime intro greeting after Voice Call starts the Twilio leg |
Optional overrides
ElevenLabs for both agent-mode listening and speaking:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
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-3.1-flash-live-preview",
agentId: "jay",
toolPolicy: "owner",
introMessage: "Say exactly: I'm here.",
providers: {
google: {
speakerVoice: "Kore",
},
},
},
}
{
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",
},
},
},
},
},
},
},
}
{
defaultTransport: "twilio",
twilio: {
defaultDialInNumber: "+15551234567",
defaultPin: "123456",
},
voiceCall: {
gatewayUrl: "ws://127.0.0.1:18789",
},
}
Tool
test_speech always forces mode: "agent" or "bidi" and fails if asked to run in mode: "transcribe", because observe-only sessions cannot emit speech. speechOutputVerified requires both fresh realtime output bytes and fresh non-silent audio returning on the bridge's microphone capture path during that output. A reused session's older output or loopback signal does not count, and sink-byte growth alone no longer reports verified speech.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
action |
Purpose |
|---|---|
join |
Join an explicit Meet URL |
create |
Create a space (and join by default); supports accessType/entryPointAccess |
status |
List active sessions, or inspect one by sessionId |
setup_status |
Run the same checks as googlemeet setup |
resolve_space |
Resolve a URL/code/spaces/{id} via spaces.get |
preflight |
Validate OAuth + meeting resolution prerequisites |
latest |
Find the latest conference record for a meeting |
calendar_events |
Preview Calendar events with Meet links |
artifacts |
List conference records and participant/recording/transcript/smart-note metadata |
attendance |
List participants and participant sessions |
export |
Write the artifacts/attendance/transcript/manifest bundle; set "dryRun": true for manifest-only |
recover_current_tab |
Focus/inspect an existing Meet tab without opening a new one |
transcript |
Read the bounded caption transcript; sinceIndex resumes from the previous nextIndex |
leave |
End a session (Chrome clicks Leave; closes only tabs it opened; Twilio hangs up) |
end_active_conference |
End the active Google Meet conference for an API-managed space |
speak |
Make the realtime agent speak immediately, given sessionId and message |
test_speech |
Create/reuse a session, trigger a known phrase, return Chrome health |
test_listen |
Create/reuse an observe-only session, wait for caption/transcript movement |
| Field | Meaning |
|---|---|
inCall |
Chrome appears to be inside the Meet call |
micMuted |
Best-effort Meet microphone state |
manualActionRequired / manualActionReason / manualActionMessage |
Browser profile needs manual login, Meet host admission, permissions, or browser-control repair before speech can work |
speechReady / speechBlockedReason / speechBlockedMessage |
Whether managed Chrome speech is allowed now; speechReady: false means OpenClaw did not send the intro/test phrase |
providerConnected / realtimeReady |
Realtime voice bridge state |
lastInputAt / lastOutputAt |
Last audio seen from/sent to the bridge |
audioOutputRouted / audioOutputDeviceLabel |
Whether the Meet tab's media output was actively routed to the bridge's BlackHole device |
lastOutputLoopbackAt / outputLoopbackSignalBytes |
Fresh output whose waveform fingerprint was correlated on the BlackHole microphone capture path |
lastOutputLoopbackCorrelation |
Correlation score tying the captured signal to the current assistant-output generation |
outputGeneration / verifiedOutputGeneration |
Monotonic ids; equality means the current output, rather than an older utterance, passed loopback proof |
lastOutputLoopbackRms / lastOutputLoopbackPeak |
Audio-energy diagnostics for the latest verified loopback capture chunk |
lastSuppressedInputAt / suppressedInputBytes |
Loopback input ignored while assistant playback is active |
{
"action": "join",
"url": "https://meet.google.com/abc-defg-hij",
"transport": "chrome-node",
"mode": "agent"
}
{
"action": "create",
"transport": "chrome-node",
"mode": "agent",
"accessType": "OPEN"
}
{
"action": "end_active_conference",
"meeting": "https://meet.google.com/abc-defg-hij"
}
{
"action": "test_listen",
"url": "https://meet.google.com/abc-defg-hij",
"transport": "chrome-node",
"timeoutMs": 30000
}
Agent and bidi modes
agent mode: the realtime transcription provider hears meeting audio, final participant transcripts route through the configured OpenClaw agent, and the answer is spoken through regular OpenClaw TTS. Nearby final-transcript fragments are coalesced before the consult so one spoken turn does not produce several stale partial answers; realtime input is suppressed while queued assistant audio is still playing, and recent assistant-like transcript echoes are ignored before the consult so BlackHole loopback does not make the agent answer its own speech.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
| Mode | Who decides the answer | Speech output path | Use when |
|---|---|---|---|
agent |
The configured OpenClaw agent | Normal OpenClaw TTS runtime | You want "my agent is in the meeting" behavior |
bidi |
The realtime voice model | Realtime voice provider audio response | You want the lowest-latency conversational voice loop |
| Policy | Behavior |
|---|---|
safe-read-only |
Expose the consult tool; limit the regular agent to read, web_search, web_fetch, x_search, memory_search, memory_get |
owner |
Expose the consult tool; let the regular agent use its normal tool policy |
none |
Do not expose the consult tool to the realtime voice model |
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
--transport chrome-node \
--message "Say exactly: I'm here and listening."
Live test checklist
Before handing a meeting to an unattended agent:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
googlemeet setupis all green, and includeschrome-node-connectedwhen Chrome-node is the default transport or a node is pinned.nodes statusshows the selected node connected, advertising bothgooglemeet.chromeandbrowser.proxy.- The Meet tab joins, and
test-speechreturns Chrome health withinCall: true. googlemeet setupincludes greentwilio-voice-call-plugin,twilio-voice-call-credentials, andtwilio-voice-call-webhookchecks.voicecallis available in the CLI after Gateway reload.- The returned session has
transport: "twilio"and atwilio.voiceCallId. openclaw logs --followshows DTMF TwiML served before realtime TwiML, then a realtime bridge with the initial greeting queued.googlemeet leave <sessionId>hangs up the delegated voice call.
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."
openclaw googlemeet setup
openclaw nodes status --connected
openclaw nodes invoke \
--node parallels-macos \
--command googlemeet.chrome \
--params '{"action":"setup"}'
openclaw googlemeet setup
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--transport twilio \
--dial-in-number +15551234567 \
--pin 123456
트러블슈팅
이 섹션의 세부 항목은 공식 문서 트러블슈팅를 참고하세요.
Agent cannot see the Google Meet tool
Confirm the plugin is enabled and reload the Gateway; the running agent only sees plugin tools registered by the current Gateway process:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
openclaw plugins list | grep google-meet
openclaw googlemeet setup
No connected Google Meet-capable node
The node must be connected and list googlemeet.chrome plus browser.proxy; the Gateway config must allow both:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
openclaw plugins install npm:@openclaw/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
openclaw devices list
openclaw devices approve <requestId>
openclaw nodes status
{
gateway: {
nodes: {
commands: { allow: ["browser.proxy", "googlemeet.chrome"] },
},
},
}
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node install \
--host <gateway-lan-ip> \
--port 18789 \
--display-name parallels-macos \
--force
Browser opens but agent cannot join
Run googlemeet test-listen for observe-only joins or googlemeet test-speech for realtime joins, then inspect the returned Chrome health. If either reports manualActionRequired: true, show manualActionMessage to the operator and stop retrying until the browser action is complete.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
Meeting creation fails
googlemeet create uses the Meet API spaces.create when OAuth is configured, otherwise the pinned Chrome node browser. Confirm:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
- API creation:
oauth.clientIdandoauth.refreshToken(or matchingOPENCLAW_GOOGLE_MEET_*env vars) are present, and the refresh token was minted after create support was added; older tokens may lackmeetings.space.created, so rerunopenclaw googlemeet auth login --json. - Browser fallback:
defaultTransport: "chrome-node"andchromeNode.nodepoint at a connected node withbrowser.proxyandgooglemeet.chrome; the OpenClaw Chrome profile on that node is signed in and can openhttps://meet.google.com/new. - Browser fallback retries: reuse an existing
.../newor Google account prompt tab before opening a new one; retry the tool call rather than manually opening another tab. - Manual action: if the tool returns
manualActionRequired: true, usebrowser.nodeId,browser.targetId,browserUrl, andmanualActionMessageto guide the operator; do not retry in a loop. - Audio-choice interstitial: if Meet shows "Do you want people to hear you in the meeting?", leave the tab open. OpenClaw should click Use microphone or (create-only) Continue without microphone and keep waiting for the generated URL; if it cannot, the error should mention
meet-audio-choice-required, notgoogle-login-required.
Agent joins but does not talk
Use mode: "agent" for the STT -> OpenClaw agent -> TTS path, mode: "bidi" for the direct realtime voice fallback. mode: "transcribe" intentionally starts no talk-back bridge. For observe-only debugging, run openclaw googlemeet status --json after participants speak and check captioning, transcriptLines, lastCaptionText. If inCall is true but transcriptLines stays 0, Meet captions may be disabled, no one has spoken since the observer was installed, the Meet UI changed, or live captions are unavailable for the meeting language/account.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
openclaw googlemeet setup
openclaw googlemeet doctor
openclaw googlemeet recover-tab
openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij
Twilio setup checks fail
twilio-voice-call-plugin fails when voice-call is not allowed or not enabled: add it to plugins.allow, enable plugins.entries.voice-call, reload the Gateway.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
plugins: {
entries: {
"voice-call": {
enabled: true,
config: {
provider: "twilio",
fromNumber: "+15550001234",
publicUrl: "https://voice.example.com/voice/webhook",
},
},
},
},
}
{
plugins: {
entries: {
"voice-call": {
config: {
tunnel: { provider: "ngrok" },
// or
tailscale: { mode: "funnel", path: "/voice/webhook" },
},
},
},
},
}
openclaw googlemeet setup --transport twilio
openclaw voicecall setup
openclaw voicecall smoke
Twilio call starts but never enters the meeting
Confirm the Meet event exposes phone dial-in details, and pass the exact dial-in number plus PIN or a custom DTMF sequence:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
openclaw googlemeet doctor <session-id>: confirm the delegated Twilio call ID, whether DTMF was queued, and whether the intro greeting was requested.openclaw voicecall status --call-id <id>: confirm the call is still active.openclaw voicecall tail: confirm Twilio webhooks are arriving at the Gateway.openclaw logs --follow: look for the Twilio Meet sequence: Google Meet delegates the join, Voice Call stores and serves pre-connect DTMF TwiML, Voice Call serves realtime TwiML for the Twilio call, then Google Meet requests intro speech withvoicecall.speak.- Re-run
openclaw googlemeet setup --transport twilio; a green setup check is required but does not prove the meeting PIN sequence is correct. - Confirm the dial-in number belongs to the same Meet invitation and region as the PIN.
- Increase
voiceCall.dtmfDelayMsfrom the 12-second default if Meet answers slowly or the call transcript still shows the PIN prompt after pre-connect DTMF was sent. - If the participant joins but you do not hear the greeting, check
openclaw logs --followfor the post-DTMFvoicecall.speakrequest and either media-stream TTS playback or the Twilio<Say>fallback. If the transcript still shows "enter the meeting PIN", the phone leg has not joined the Meet room yet, so participants will not hear speech.
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--transport twilio \
--dial-in-number +15551234567 \
--dtmf-sequence ww123456#
참고
Google Meet's official media API is receive-oriented, so speaking into a 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.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
chrome.audioInputCommandpluschrome.audioOutputCommand: OpenClaw owns the bridge and pipes audio inchrome.audioFormatbetween those commands and the selected provider.agentmode uses realtime transcription plus regular TTS;bidimode uses the realtime voice provider. The default path is 24 kHz PCM16 withchrome.audioBufferBytes: 4096; 8 kHz G.711 mu-law remains available for legacy command pairs.chrome.audioBridgeCommand: an external bridge command owns the whole local audio path and must exit after starting or validating its daemon. Valid only forbidi, becauseagentmode needs direct command-pair access for TTS.
관련 문서
주요 항목:
- Meeting plugins overview
- Voice call plugin
- Talk mode
- Building plugins
실습 체크리스트
- 공식 문서와 로컬 버전을 대조합니다:
https://docs.openclaw.ai/plugins/google-meet - 관련 CLI는
openclaw --help및 하위 명령--help로 옵션을 확인합니다. - 설정 변경 시
openclaw config/openclaw doctor로 유효성을 검사합니다. - Gateway·채널·플러그인 변경 후에는 필요 시 Gateway를 재시작합니다.
자주 쓰는 명령·설정 예시
openclaw plugins install npm:@openclaw/google-meet
brew install blackhole-2ch sox
# only needed when realtime.voiceProvider is "google" for bidi mode
sudo reboot
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox
{
plugins: {
entries: {
"google-meet": {
config: {},
},
},
},
}
openclaw googlemeet setup
openclaw googlemeet join https://meet.google.com/abc-defg-hij
openclaw googlemeet setup --transport chrome-node --mode transcribe
관련 링크
- 공식 원문: plugins/google-meet
- OpenClaw 문서 홈
이 가이드는 공식 문서를 한국어 학습용으로 재구성한 것입니다. 옵션 기본값·플래그 이름은 설치 버전에 따라 달라질 수 있습니다.