← All work
Zoom meeting agent
Configurable voice agents that join Zoom calls and answer only when asked.
Operators configure an agent in a React app: name, wake word, prompt, model, speech-to-text and text-to-speech, and an avatar. A bridge page joins the Zoom call and carries its audio both ways.
A second path launches the same agent into a LiveKit room, and a third streams it as a HeyGen avatar, all from the same configuration.
Decisions
01
A wake word
- Chose
- The agent commits to a reply only after its wake phrase.
- Instead of
- Answering any voice activity.
- Why
- In real meetings people talk over each other; without a gate the agent interrupts constantly.
02
Sessions start on the server
- Chose
- Node creates the realtime session; the browser owns the WebRTC link to OpenAI.
- Instead of
- Keys or session setup in the browser.
- Why
- Credentials stay on the server, and audio takes the shortest path.
03
A tiny dispatch contract
- Chose
- A small Python dispatcher drops the bot into a LiveKit room with one payload.
- Instead of
- A second agent definition for LiveKit.
- Why
- Every surface runs the same saved personality.
What shipped
- One configuration drives the Zoom bridge, the LiveKit bot and the avatar stream.
- Multi-person calls became usable once the wake word was in.
Built with
React, Node, OpenAI Realtime, WebRTC, Groq, LiveKit, Python, HeyGen
Some details are kept general on purpose.





