Skip to content

Release Notes - v0.21.0

Release Date: 2026-10-28

v0.21.0 lets OmniAgent attend meetings by phone. Give omniagent meeting join a meeting invitation and it dials in to the Zoom, Google Meet, or Microsoft Teams meeting through Twilio or Telnyx, announces itself, prints the transcript as the meeting goes, and writes meeting notes with a summary, decisions, and action items when the meeting ends. Phone dial-in works with any meeting that lists a dial-in number and needs no app registration with the meeting platform.

Highlights

  • Meetings by Phone - omniagent meeting join --invite meeting.ics reads the dial-in number, meeting ID, and passcode from the invitation, calls in, enters them on the keypad, and attends.
  • Meeting Notes - A Markdown file with the summary, decisions, action items, and timestamped transcript, plus the full record as JSON on request.
  • Reusable Attendant - The new meeting package attends any OmniMeet session, so code that joins a meeting another way can use the same announcing, transcribing, and summarizing.

What's New

Attending a Meeting

Save the invitation as text or download the calendar event as an .ics file, then:

export TWILIO_ACCOUNT_SID=AC...
export TWILIO_AUTH_TOKEN=...
export TWILIO_PHONE_NUMBER=+14155550199
export NGROK_AUTHTOKEN=...
export DEEPGRAM_API_KEY=...
export ELEVENLABS_API_KEY=...
export ANTHROPIC_API_KEY=...

omniagent meeting join --invite meeting.ics --ngrok
Joining zoom meeting https://us02web.zoom.us/j/85012345678 by phone...
[00:00:12] Okay, let's get started with the launch review.
[00:00:19] Dana, where are we on the roadmap?

Press Ctrl+C to leave early. When the meeting ends or the agent leaves, OmniAgent prints the summary and writes the notes to meeting-<time>.md, or to --out. --json also writes the full record.

The agent announces that it is an AI assistant transcribing the meeting when it joins; --name and --on-behalf-of set what it says. Speech-to-text defaults to Deepgram, the announcement to ElevenLabs, and the summary to whichever LLM has an API key set. Use --provider telnyx with TELNYX_API_KEY, TELNYX_CONNECTION_ID, and TELNYX_PHONE_NUMBER to call through Telnyx. See the Attending Meetings by Phone guide and the CLI reference.

Using the Library

The command is a thin layer over reusable packages:

  • meeting.Attendant attends an OmniMeet attendee.Session: it announces the agent once the meeting admits it, streams the meeting audio to a streaming speech-to-text provider, collects the final transcript, leaves when its context ends, and summarizes.
  • meeting.LLMSummarizer turns a transcript into a summary, decisions, and action items with any omnillm-core chat client.
  • meeting.Record.Markdown renders the meeting notes.
  • voice.NewAudioGateway builds a Twilio or Telnyx gateway in audio mode, which can send keypad digits on an outbound call.
target, err := invite.ParseICS(icsFile)
if err != nil {
    return err
}
sess, err := dialin.NewJoiner(gw, dialin.WithCountry("US")).Join(ctx, target)
if err != nil {
    return err
}
record, err := meeting.New(meeting.Config{
    Name:        "OmniAgent",
    Transcriber: deepgram, // an omnivoice-core stt.StreamingProvider
    Speaker:     elevenlabs,
    Summarizer:  meeting.LLMSummarizer{Client: llm, Model: "claude-sonnet-5"},
}).Attend(ctx, sess)

OmniMeet's dialin/dialintest package simulates a meeting's phone menu, so code built on the attendant can be tested without a call.

Limitations

  • No speaker names. Phone dial-in delivers one mixed audio stream.
  • Admission is estimated. The phone line does not report when the meeting admits the caller, so the agent announces itself once the keypad sequence has had time to finish. A waiting room is not detected.
  • Dial-in must be available. Some meeting plans and regions have no phone dial-in; OmniAgent reports when an invitation lists none.
  • Phone menu prompts on Telnyx. Telnyx streams audio from when the call is answered, so the meeting's phone menu prompts can appear at the start of the transcript.

Upgrading

Nothing changes for existing configurations or commands.

Dependencies

  • omnimeet-core v0.2.0, omnivoice-core v0.18.1, omniskill v0.12.1, and golang.org/x/net v0.62.0.
  • omni-twilio v0.12.0 and omni-telnyx v0.7.0 are now direct dependencies, for audio-mode calls with keypad digits and hangup.
  • The log15/v3 replace directive is gone: log15/v3 v3.2.1 provides what ngrok needs. The go-rod/fetchup replace stays, because go-rod/rod v0.116.2 does not build with newer fetchup releases.

Documentation

Full Changelog

See CHANGELOG.md for the complete list of changes.