Meeting Proxy
V2 only — invite-only edition. This is part of AI Partner V2 and is not in the open-source V1 you self-host from the Quick Start. V2 is available now, by invite. See V1 vs V2.
How meeting attendance works
When you give AI Partner a meeting URL, it:
- Boots a containerized Linux desktop (Xvfb + PulseAudio virtual audio)
- Opens Chromium, navigates to the URL, and joins the meeting
- Verifies the join was successful by probing platform-specific UI selectors
- Starts
MeetingAudioLoop— captures participants' audio in real time - Filters silence using voice activity detection (RMS energy threshold)
- Transcribes speech with Whisper STT
- Generates contextual responses using your goals, USER.md, and SOUL.md
- Speaks via your configured voice clone provider
- After the meeting ends: saves transcript + summary, extracts action items, asks for approval
The container has full access to all 160+ AI Partner tools via an internal bridge — so in a meeting, the agent can search the web, query your knowledge base, look up a contact in HubSpot, or check a Sentry issue in real time before responding.
Prerequisites
- Docker Desktop running
- T3 container tier enabled (it's on by default)
- A live meeting URL
- At least one LLM provider configured
Recommended for the full experience:
USER.mdwith your name, role, and contextGOALS.mdwith the objective you want the agent to advance- A voice clone configured in
USER.md
Joining a meeting
Method 1: Paste URL in chat
Paste any supported meeting URL directly into the chat input:
https://meet.google.com/abc-defg-hij
AI Partner detects the URL and starts the meeting pipeline automatically. To add context:
https://meet.google.com/abc-defg-hij
Join as "Alex Chen". This is a client call with Acme Inc.
Goal: get their sign-off on the Q2 timeline.
If they raise the budget concern, reference the ROI numbers in our proposal.
Method 2: Use the Meetings panel
Go to sidebar → Meetings → + New Meeting:
- Paste the meeting URL
- Set a display name (what participants will see)
- Set the meeting objective (overrides GOALS.md for this session)
- Click Join
Configuring your voice
The agent speaks using a Text-to-Speech voice. Set it in workspace/USER.md:
voice_profile: elevenlabs:your-voice-id
Supported TTS providers:
| Provider | Config | Quality |
|---|---|---|
| ElevenLabs | elevenlabs:<voice_id> | Best — realistic voice cloning |
| MiniMax | minimax:<voice_id> | Good — fast, cost-effective |
| OpenAI TTS | openai:<voice_name> (e.g., openai:nova) | Good — no clone, preset voices |
| Browser fallback | browser | Basic — uses system TTS, no cloning |
To get a voice ID from ElevenLabs:
- Sign up at elevenlabs.io
- Create a voice clone from a ~1-minute audio sample of your voice
- Go to Voices → click your voice → copy the Voice ID
- Add to
.env:ELEVENLABS_API_KEY=your_key
AI disclosure
On the first response in any meeting, the agent prepends:
"Just to be transparent — I'm an AI assistant joining on [Your Name]'s behalf. [Your Name] will review this conversation. Please continue as you normally would."
This is standard behavior. You can configure it in AUTHORITY.md:
## Auto
- action: skip_ai_disclosure + counterparty: colleague # don't disclose with colleagues
Or disable it entirely in Settings → Meeting Proxy → AI Disclosure.
How the agent decides what to say
In each speaking turn, the agent reasons using:
| Input | How it's used |
|---|---|
| Live transcript (last 10 turns) | Immediate conversation context |
USER.md | Your name, role, company, background context |
GOALS.md | What you're trying to achieve in this meeting |
SOUL.md | Your communication style (direct/diplomatic, formal/casual) |
| Counterparty records | Who these participants are, relationship class, past interactions |
| Tool calls | Web search, knowledge base, CRM lookup — in real time if needed |
Example: if the client raises a concern about integration timeline, and your GOALS.md says "get timeline sign-off by end of meeting", the agent recognizes this as an obstacle to the goal and constructs a response that addresses the concern while pushing toward commitment.
Real-time controls
While a meeting is active, the Meeting Status panel shows live status and provides controls:
| Control | What it does |
|---|---|
| Leave meeting | Gracefully exits; triggers post-meeting pipeline |
| Mute | Stops speaking but continues listening and transcribing |
| Force respond | Triggers an immediate response from the agent |
| Add instruction | Send a real-time instruction to the agent: "Don't mention pricing" |
| View transcript | Scrollable live transcript panel |
Post-meeting pipeline
When the meeting ends (via Leave button or silence detection after ~60s of silence):
- Transcript saved —
workspace/meetings/<sessionId>/transcript.md - Summary generated — LLM creates
workspace/meetings/<sessionId>/summary.mdwith:- Key decisions made
- Open questions
- Progress against your meeting objective
- Action items with assigned parties
- Action items extracted — each item gets an AuthorityPolicy evaluation:
reply_emailto follow up? → draft_and_ask via Telegramschedule_eventfor follow-up call? → auto or draft_and_ask per your rules
- Telegram notifications — approval requests for each action item
- Files panel — transcript and summary available for download
Supported platforms
| Platform | Browser join | Audio | Notes |
|---|---|---|---|
| Google Meet | ✅ | ✅ | Most reliable; Meet allows browser guests cleanly |
| Microsoft Teams | ✅ | ✅ | teams.live.com (browser) — use the Meet Now link |
| Zoom | ✅ | ✅ | zoom.us/j/ — web client, no app install |
| Webex | ⚠️ | ✅ | May show CAPTCHA on first join per IP |
The agent joins as a browser participant. Participants will see a browser join (no native app indicator). In Teams, it shows as a Guest. In Meet, it shows as the display name you configured. In Zoom, it shows as the name set in the join flow.
Limitations
Known limitations:
- If the platform requires download of a native app (some Zoom configurations), the browser join fails. Use a "Meet Now" or "Join from browser" link.
- Breakout rooms are not supported — the agent can only participate in the main room.
- Very long meetings (3+ hours) may hit the container's resource limits — the agent exits gracefully and saves the transcript up to that point.
- Background noise in the recorded audio affects Whisper transcription quality. Meetings with clean audio (headsets, quiet rooms) transcribe better.
Testing without a real meeting
Use Google Meet's "instant meeting" feature:
- Go to meet.google.com → New meeting → Start an instant meeting
- Copy the meeting URL
- Paste it into AI Partner chat
- Speak something in the meeting → watch it appear in the transcript panel
- Click Leave meeting → receive the post-meeting summary