feat(google-meet): create meeting spaces

This commit is contained in:
Peter Steinberger
2026-04-24 22:11:07 +01:00
parent 86f8c826e2
commit b20208fa4c
6 changed files with 281 additions and 2 deletions

View File

@@ -2,6 +2,7 @@
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 want an OpenClaw agent to create a new Google Meet call
- You are configuring Chrome, Chrome node, or Twilio as a Google Meet transport
title: "Google Meet plugin"
---
@@ -9,6 +10,8 @@ title: "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.
- It can create a new Meet space through the Google Meet API, then join the
returned URL.
- `realtime` voice is the default mode.
- Realtime voice can call back into the full OpenClaw agent when deeper
reasoning or tools are needed.
@@ -94,6 +97,33 @@ Or let an agent join through the `google_meet` tool:
}
```
Create a new meeting, then join it:
```bash
openclaw googlemeet create
openclaw googlemeet join https://meet.google.com/new-abcd-xyz --transport chrome-node
```
Or tell an agent: "Create a Google Meet, join it with realtime voice, and send
me the link." The agent should call `google_meet` with `action: "create"`, copy
the returned `meetingUri`, then call `google_meet` with `action: "join"` and
that URL.
```json
{
"action": "create"
}
```
```json
{
"action": "join",
"url": "https://meet.google.com/new-abcd-xyz",
"transport": "chrome-node",
"mode": "realtime"
}
```
For an observe-only/browser-control join, set `"mode": "transcribe"`. That does
not start the duplex realtime model bridge, so it will not talk back into the
meeting.
@@ -381,6 +411,11 @@ 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`.
The OAuth consent includes Meet space creation, Meet space read access, and
Meet conference media read access. If you authenticated before meeting creation
support existed, rerun `openclaw googlemeet auth login --json` so the refresh
token has the `meetings.space.created` scope.
These environment variables are accepted as fallbacks:
- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` or `GOOGLE_MEET_CLIENT_ID`
@@ -404,6 +439,22 @@ Run preflight before media work:
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
```
Create a fresh Meet space with the same OAuth config:
```bash
openclaw googlemeet create
```
The command prints the new `meeting uri` and `space`. Agents can use the
`google_meet` tool with `action: "create"` to create a meeting, then call
`action: "join"` with the returned `meetingUri`.
Creating a Meet space only creates the meeting URL. The Chrome or Chrome-node
transport still needs a signed-in Google Chrome profile to join through the
browser. If the profile is signed out, OpenClaw reports
`manualActionRequired: true` and asks the operator to finish Google login before
retrying the join.
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.
@@ -687,6 +738,18 @@ Common manual actions:
- Grant Chrome microphone/camera permissions.
- Close or repair a stuck Meet permission dialog.
### Meeting creation fails
`googlemeet create` uses the Google Meet API `spaces.create` endpoint. Confirm:
- `oauth.clientId` and `oauth.refreshToken` are configured, or matching
`OPENCLAW_GOOGLE_MEET_*` environment variables are present.
- The refresh token was minted after create support was added. Older tokens may
be missing the `meetings.space.created` scope; rerun
`openclaw googlemeet auth login --json` and update plugin config.
- The Google Cloud project and OAuth principal are allowed to use the required
Google Meet API scopes.
### Agent joins but does not talk
Check the realtime path: