Malik SohaibEmail me
← All work

Zoom meeting agent

Configurable voice agents that join Zoom calls and answer only when asked.

Role
Full-stack and AI engineer
When
2026
Status
Shipped

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

  1. 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.
  2. 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.
  3. 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.