Join a Google Meet call, transcribe it, and send follow-ups

When the user asks the agent to sit in on a Google Meet meeting, this recipe joins the call, transcribes the live captions into a transcript, optionally speaks in realtime, and then summarizes and sends follow-ups.

Hermes Intermediate Copied: 0
1 resource

Requirements

  • Realtime speaking mode costs real money (OpenAI Realtime is pay-per-audio-minute) and requires a virtual audio device set up on the machine running the bot.

How to use

By default the gateway machine runs the Playwright bot locally. For a remote node, the bot runs on a different machine that has a signed-in Chrome and, for realtime, a configured audio bridge — useful when the gateway is a headless Linux box but the user's signed-in Chrome lives on their Mac.

Run hermes meet setup to preflight local prerequisites.

All tools accept node?: pass a registered node name (or "auto" for the sole node) to operate a remote bot instead of a local one; omit it for local operation.

Windows is not supported.

On a remote node, the transcript lives on the node host's disk; use meet_transcript(node=...) to read it over RPC.

Only https://meet.google.com/... URLs pass the URL regex.

There is no calendar scanning and no auto-dial.

Remote nodes use bearer-token auth: tokens are generated on the node (32 hex chars, persisted in $HERMES_HOME/workspace/meetings/node_token.json) and must be copied to the gateway via hermes meet node approve.

Speech via meet_say is rate-limited by the OpenAI Realtime session; spam protection is the bot's job, but still don't queue hundreds of lines.

Pick realtime mode only when the user actually wants the agent to speak.

Prerequisites are a one-time setup the user must handle; the easiest path is to run the built-in installer.

The built-in installer handles pip dependencies and Chromium for transcribe mode, and the realtime extras for speaking mode, plus optional auth and preflight checks.

hermes plugins enable google_meet
hermes meet install                 # pip deps + Chromium (transcribe only)
hermes meet install --realtime      # + pulseaudio-utils / brew blackhole+ffmpeg
hermes meet auth                    # optional; skips guest-lobby wait
hermes meet setup                   # preflight checks

hermes meet install --realtime prompts before running sudo apt-get (Linux) or brew install (macOS); pass --yes to skip the prompt. It will not touch your macOS default-input setting — you have to select BlackHole 2ch in System Settings yourself before starting a realtime meeting.

Alternatively, set everything up manually.

pip install playwright websockets && python -m playwright install chromium

# For realtime mode, additionally:
#   Linux:  sudo apt install pulseaudio-utils
#   macOS:  brew install blackhole-2ch ffmpeg
#           → System Settings → Sound → Input → BlackHole 2ch
#   Then set OPENAI_API_KEY or HERMES_MEET_REALTIME_KEY in ~/.hermes/.env

For a remote node, install the dependencies and enable the plugin on the machine with the signed-in Chrome, run the node server there, then approve the node from the gateway and confirm it is reachable.

# on the user's Mac (where Chrome is signed in):
pip install playwright websockets && python -m playwright install chromium
hermes plugins enable google_meet
hermes meet node run --display-name my-mac    # persistent server
# copy the printed token

# on the gateway:
hermes meet node approve my-mac ws://<mac-ip>:18789 <token>
hermes meet node ping my-mac                   # confirm reachable

In realtime meetings, meet_say(text="...") queues text for TTS; the speech lags by about 2 seconds, so don't spam it.

Captions are only as good as Google Meet's live captions, which are English-biased and lossy on overlapping speakers.

In guest mode the bot sits in the lobby until a host admits it; warn the user, since hermes meet auth avoids this.

If the host doesn't admit the bot within 5 minutes (configurable via the HERMES_MEET_LOBBY_TIMEOUT env), the bot leaves and meet_status reports leaveReason: "lobby_timeout".

Only one active meeting is allowed per install per location; a second meet_join leaves the first.

Realtime mode needs a virtual audio device; if the audio bridge setup fails, the bot falls back to transcribe mode and flags it in meet_status().error.

meet_say requires mode='realtime' on the originating meet_join; calling it against a transcribe-mode meeting returns a clear error.

Barge-in is best-effort: when a caption attributed to a real participant arrives while the bot is generating audio, the bot sends response.cancel to OpenAI Realtime, but captions take about 500ms to show up, so the bot will talk over the first second or so of a human interruption.

The meeting transcript is written to a per-meeting file under the workspace meetings directory.

$HERMES_HOME/workspace/meetings/<meeting-id>/transcript.txt

Source: nousresearch/hermes-agent and its contributors. License: MIT.

Copyright (c) 2025 Nous Research

Translation and editorial adaptation by ClawCases.

>Resources

>Related Use Cases

>More at this level: Intermediate