Reconcile meeting-agent Phase A with main after #266/#267: keep meeting_integrations/ package rename, merge Part B live-transcript and Calendar V2 routes, and preserve Part A fixes (atomic webhook idempotency, background task refs, workspace ID placeholders, py3.10 compiler compat). Update part_b tests to meeting_integrations paths. Co-authored-by: Cursor <[email protected]>
4.6 KiB
Meeting Agent (Phase 1 upload + Phase 2 Recall.ai live bots)
A PraisonAIUI example that wires the dashboard to PraisonAI-Tools meeting tools for upload → transcribe → summarize → index → search, plus Recall.ai Meeting Bots for live Zoom / Meet / Teams capture.
What this example includes
| Page | Built from |
|---|---|
| Upload | POST /api/meetings/upload (audio → Phase 1 pipeline) |
| Live bot | POST /api/recall/bots — send a Recall bot to a meeting URL |
| Meetings | dashboard table backed by list_meetings |
| Meeting detail | transcript / summary / action items + live status |
| Calendar | Calendar V2 setup instructions + status API |
| Chat | meeting agent with search_meetings + optional schedule_recall_bot tool |
Recall.ai workspace
This integration targets your Recall workspace in EU (Frankfurt) by default:
- Workspace ID: set
RECALL_WORKSPACE_IDto your own (optional — the API key already scopes requests to a workspace) - API region:
eu-central-1
Follow the Recall onboarding guide via Recall MCP (recall://guides/onboarding) for credential and webhook setup.
Run
cp .env.example .env # set OPENAI_API_KEY + Recall vars (server-side only)
pip install praisonai-tools[meeting] httpx
aiui run app.py
# or
python app.py # honours MEETING_AGENT_PORT
python app.py --smoke # non-binding Recall boundary smoke
Schedule a live bot
curl -X POST http://127.0.0.1:8000/api/recall/bots \
-H "Content-Type: application/json" \
-d '{"meeting_url":"https://zoom.us/j/123456789","title":"Standup"}'
Flow: Create Bot → webhooks (bot.*, recording.done, transcript.done) →
async Recall transcription → Phase 1 summarize + index → dashboard ready.
Webhooks (required)
Set PUBLIC_API_BASE_URL to a stable HTTPS backend URL (reserved ngrok
domain in dev — not localhost). Register in Recall:
- URL:
{PUBLIC_API_BASE_URL}/webhooks/recall - Events:
bot.joining_call,bot.in_call_recording,bot.done,bot.fatal,recording.done,transcript.done,transcript.failed,transcript.data - Calendar (Part B):
calendar.sync_events,calendar.updateon the same URL
Use Recall MCP create_webhook_endpoint or the dashboard. Verify with
send_test_webhook_endpoint.
Google Calendar V2
Default CALENDAR_AUTO_RECORD=true schedules bots for eligible future events with video links once Calendar V2 is connected.
- Set
PUBLIC_API_BASE_URL(HTTPS tunnel). - Run Recall MCP
start_calendar_integration_setupwithproduction_redirect_uri={PUBLIC_API_BASE_URL}/api/recall/calendar/callback. - Bootstrap the app:
POST /api/recall/calendar/setup/bootstrapwithsetup_idandregional_callback_urifrom MCP. - Complete Google OAuth per
recall://guides/calendar-v2-setup-google.
Recording opt-in: calendar sync ≠ automatic recording for every meeting;
this app uses CALENDAR_AUTO_RECORD (default on). Set false to disable
auto-schedule while keeping calendar connected.
Environment
See .env.example:
| Variable | Purpose |
|---|---|
OPENAI_API_KEY |
Summaries, embeddings, chat |
RECALL_REGION |
eu-central-1 |
RECALL_API_KEY |
Recall REST API (backend only) |
RECALL_WEBHOOK_VERIFICATION_SECRET |
Webhook signature verification |
PUBLIC_API_BASE_URL |
Public HTTPS origin for webhooks + calendar callback |
CALENDAR_AUTO_RECORD |
Auto-schedule bots from calendar (default true) |
Never commit real secrets. Reuse the existing REST key (Mervin Praison) when
its purpose is clear; otherwise create a purpose-named key via Recall MCP.
Phase 2 Part B — live transcript + calendar auto-schedule
| Feature | API |
|---|---|
| Live transcript (SSE) | GET /api/meetings/{id}/live-transcript (Accept: text/event-stream) |
| Live transcript (poll) | Same URL, default JSON |
| Upcoming calendar events | GET /api/recall/calendar/upcoming?hours=24 |
| Manual calendar sync | POST /api/recall/calendar/sync {"calendar_id":"..."} |
| Agent tool | get_upcoming_meetings(hours=24) in chat when Recall is configured |
Every new bot schedule automatically attaches recording_config.realtime_endpoints
pointing at {PUBLIC_API_BASE_URL}/webhooks/recall with transcript.data — no Recall
dashboard toggle for live transcript. Requires PUBLIC_API_BASE_URL in .env.
Tests
From repo root:
pytest tests/unit/test_meeting_agent_example.py tests/unit/test_meeting_agent_pipeline.py tests/unit/test_meeting_agent_recall.py tests/unit/test_meeting_agent_part_b.py -v