Unified abstraction for real-time collaboration platforms
OmniMeet enables AI agents to participate in meetings as first-class participants alongside humans, abstracting over LiveKit, Daily, Zoom, Google Meet, Microsoft Teams, and other real-time collaboration platforms.
- 🔌 Provider Agnostic - Write code once, deploy on any supported platform
- 🤖 Agent-First Design - Built for AI agents, not retrofitted
- 🎙️ Voice Integration - Seamless STT/TTS with OmniVoice
- 🛠️ OmniAgent Skills - Ready-to-use tools for meeting management
- ⚡ Real-time Events - Participant joins, track publications, active speakers
go get github.com/plexusone/omnimeet-corepackage main
import (
"context"
"log"
"github.com/plexusone/omnimeet-core/meeting"
"github.com/plexusone/omni-livekit/omnimeet"
)
func main() {
ctx := context.Background()
// Create LiveKit provider
provider, _ := omnimeet.NewProvider(omnimeet.Config{
APIKey: "your-api-key",
APISecret: "your-api-secret",
ServerURL: "wss://your-livekit-server",
})
// Create a meeting
m, _ := provider.CreateMeeting(ctx, meeting.CreateRequest{
Name: "Team Standup",
})
log.Printf("Meeting created: %s", m.ID)
}| Package | Description |
|---|---|
meeting |
Meeting state and lifecycle |
participant |
Participant info and roles |
track |
Audio/video track types |
event |
Real-time meeting events |
token |
Authentication tokens |
provider |
Provider interface and client |
agent |
Agent skill interfaces |
skill |
Meeting skill for OmniAgent |
voice |
Voice agent types |
recording |
Recording state |
transcript |
Transcription types |
attendee |
Sessions for attending meetings hosted by others |
dialin |
Join meetings by phone: dial-in numbers, keypad sequences, and the dial-in joiner |
dialin/dialintest |
Simulated meetings for testing dial-in |
invite |
Parse meeting invitations and .ics files |
Agents can also attend meetings hosted by others on Zoom, Google Meet, and Microsoft Teams. Phone dial-in works with any meeting that lists a dial-in number: parse the invite, and the dial-in joiner calls the meeting, enters the meeting ID and passcode as keypad tones, and hands the agent the meeting's audio.
jt, err := invite.Parse(invitationText) // or invite.ParseICS for .ics files
if err != nil {
return err
}
// gw is an omnivoice-core voice gateway in audio mode, for example from
// omni-twilio or omni-telnyx with Mode: gateway.PipelineModeAudio.
joiner := dialin.NewJoiner(gw, dialin.WithCountry("US"))
sess, err := joiner.Join(ctx, jt)
if err != nil {
return err // dialin.ErrNoDialIn when the meeting has no phone option
}
audio := sess.(attendee.AudioReceiver).ReceiveAudio() // mixed meeting audio
speaker := sess.(attendee.AudioSender).SendAudio() // played into the meeting
defer sess.Leave(ctx)The session reports its state through Events(): joining, connected, admitted, and left or ended. Phone dial-in cannot see whether the meeting admitted the caller, so the session reports admitted once the keypad sequence has had time to finish.
For tests, dialin/dialintest simulates meetings with Zoom, Google Meet, and Teams phone menus, so code can join, listen, speak, and leave without a real meeting. examples/dialin runs the whole flow against a simulated meeting. See ADR-009 for the connector plan.
| Provider | Package | Status |
|---|---|---|
| LiveKit | omni-livekit | Available |
| Daily | omni-daily | Planned |
| Zoom | omni-zoom | Planned |
OmniMeet is part of the PlexusOne OmniAgent ecosystem:
OmniAgent (orchestration)
|
+-- OmniLLM (reasoning)
+-- OmniChat (async messaging)
+-- OmniVoice (speech: TTS/STT)
+-- OmniMemory (conversation memory)
+-- OmniMeet (real-time collaboration) <-- This library
|
+-- omni-livekit
+-- omni-daily
+-- omni-zoom
- Go 1.26 or later
Apache 2.0 - see LICENSE for details.