Files
MervinPraisonandCursor e15b3c0718 merge: resolve conflicts with main (Part B + voice-agent merged)
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]>
2026-09-08 10:34:47 +01:00
..

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_ID to 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.update on 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.

  1. Set PUBLIC_API_BASE_URL (HTTPS tunnel).
  2. Run Recall MCP start_calendar_integration_setup with production_redirect_uri={PUBLIC_API_BASE_URL}/api/recall/calendar/callback.
  3. Bootstrap the app: POST /api/recall/calendar/setup/bootstrap with setup_id and regional_callback_uri from MCP.
  4. 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