Calls and meetings

Slice 1 uses existing org-private live-assistant sessions. In a project, an enabled organization gets a Calls and meetings link above its ticket list. The /o/:orgSlug/p/:projectSlug/calls page supports microphone capture and an audio file up to 25 MB/two hours. The browser must support Web Audio decoding for the selected file format. Captured audio is converted into independent mono PCM WAV windows; arbitrary compressed-container fragments are not sent to the transcription API.

The operator must confirm participant consent before capture or uploading a recording. Audio windows go to the org's configured OpenRouter integration for transcription. This browser flow retains the transcript and meeting summary, not an original audio archive. The existing desktop capture/recording hook remains available. Saved sessions can be reopened using the ?session=<id> URL. Sessions remain private to their signed-in author and require current org/project access.

Call transcripts cannot be published through attachment links or forwarded as links or copies, even after confirming a private-file share. Existing transcript grants also enforce the recorder's current reader permissions; public transcript links are refused. Ordinary attachment sharing remains available under its existing rules.

Transcripts appear as each five-second microphone window or ten-second file window completes. This is near-live HTTP transcription, not a streaming provider connection. A slow provider stops microphone capture when eight windows are waiting; already saved words remain available. Stopping capture flushes the final partial window before summary generation. Upload errors and failed approvals are visible and retryable.

After finishing, analysis produces a summary, explicit decisions and proposed actions. Each action can become a task ticket after one approval. The human chooses an optional assignee and due date; AI does not assign or schedule people. Proposed bug tickets also require approval. Exact approval bodies get a stable session-bound operation ID, so retrying a lost response does not create another ticket. CRM contact suggestions are checked against the current org and transcript. Approving one creates an idempotent meeting timeline link to that contact; analysis itself never links contacts. Ticket and CRM endpoints independently enforce their existing permissions.

Provider and spend policy

The meeting assistant and call intelligence are available by default for existing and new organizations. Only a stored literal organizations.entitlementOverrides['liveAssistant.enabled'] === false disables them; a saved admin opt-out remains off. Reading this default does not write organization settings, acquire audio, configure a provider or bypass consent. Existing transcripts remain readable and can be finished after disabling.

Migration 12300_live_assistant_default_availability adds true only where an object policy lacks this key; it preserves every existing value and selected provider. Settings > Meetings provides the Live assistant switch and existing summary-provider choice. Participant consent remains separate and required for every session.

The meeting page reports local provider configuration before capture and links to existing Integrations or Meetings settings for recovery. “Configured” does not certify current vendor availability or budget: the existing admission checks still run when processing starts. A temporary rate limit does not require replacing an otherwise configured key. Failed processing keeps saved words and shows recovery links; it never substitutes a fake summary.

A local synthetic sample can be played without capturing a participant. Processing it requires an explicit click, consent confirmation and configured transcription/summary providers. It follows the existing audio-file transcription and summary path and uses the existing AI budget; no platform OpenRouter service is enabled.

An admin with org:manage_settings may PATCH /v1/orgs/:orgId/live-assistant with:

{
  "enabled": true,
  "speechModel": "openai/whisper-large-v3-turbo",
  "summaryProvider": "openrouter"
}

Allowed speech models are Whisper turbo and Deepgram Nova 3. The default is Whisper turbo. Nova supports the documented diarization options; Whisper results may not identify speakers. OpenRouter speech requires the organization's existing sealed BYOK integration; this feature does not arm GoodQA's operator OpenRouter service. Summary provider is explicitly openrouter (existing org resolver) or vertex (existing platform Vertex configuration). The Vertex client already applies the repository's supported thinking level and spend envelope.

Catalog prices checked 2026-10-10:

Speech modelUSD/secondUSD/minuteTwo-minute speech estimate
openai/whisper-large-v3-turbo0.000003330.00019980.0003996
openai/whisper-large-v30.00000750.000450.0009
deepgram/nova-30.00007166666666670.00430.0086

The current transcription catalog does list both Whisper models; the inventory's claim that Whisper Large V3 was absent is superseded by the live catalog. Turbo is the inexpensive established multilingual default; no benchmark claim about accuracy is made. Compare a synthetic QA conversation after release before expanding access. Summary pricing for the existing defaults, checked on the same date: OpenRouter anthropic/claude-sonnet-4.5 standard endpoints list $3 input/$15 output per million tokens; Vertex gemini-3.1-pro-preview global standard requests up to 200k input tokens list $2 input/$12 output per million. Vertex reasoning is charged as output. For an illustrative 1,000 input + 1,000 output tokens, that is $0.018 or $0.014 respectively, plus speech. Actual model overrides, long-context tiers, routing and usage change this; these are component estimates, not a per-call quote.

Every speech request reserves through the existing AI runtime before network dispatch. Duration is read from validated PCM, rounded up, with a conservative rate ceiling; provider-reported usage settles actual cost when present. Missing usage retains conservative accounting rather than assuming zero. Speech responses include the chosen model, audio duration and any returned usage. HTTP refusals, provider ambiguity and budget pauses follow the existing breaker semantics. Response bodies and redirects are bounded/controlled to avoid exposing provider errors or forwarding credentials.

Release and QA proof

Queue the additive availability change through the normal GoodQA release train. Apply the idempotent policy-only migration before promotion. Availability defaults ON for absent keys under R24, preserving explicit opt-outs. This lane does not deploy or arm platform OpenRouter.

After shipment, use Eric's existing QA org and QA project only. Verify its org ID and current policy through the signed-in settings API, retain the prior policy receipt, then read back default availability or explicitly enable only that QA org if it opted out, using its saved speech model and configured summary provider. Do not arm operator OpenRouter or alter spend ceilings. If the required integration/configuration is unavailable, record that concrete prerequisite instead of asking which pilot credential to use.

Record/upload a two-minute synthetic conversation that mentions a synthetic QA CRM contact, makes an explicit decision, and contains two concrete actions. Confirm incremental transcript, final summary and decisions, then approve two tickets (one with a human-selected assignee and due date) and one CRM entry. Retain sanitized API response receipts for policy, session begin, each window, finish, analysis, two issue creates and CRM approval; include model/duration/usage and created IDs. Reopen the saved session and retry one approval to verify deduplication. Check the caller cannot read a foreign org/session. Restore reversible policy settings unless Eric chooses to retain QA enablement. Clean only the generated QA data under the standing test authority.

Production proof is release dependent. Isolated database/API tests and browser network-boundary tests are not production receipts. The lane evidence explicitly tracks that distinction.

Grounding

GROUNDED: https://openrouter.ai/blog/tutorials/transcription-on-openrouter/ - documented transcription request shape, verbose timestamps, model filtering and provider options; generic chat routing flags are not honored by transcription. GROUNDED: https://openrouter.ai/api/v1/models?output_modalities=transcription - live availability and per-second catalog prices for the three models above. GROUNDED: https://openrouter.ai/openai/whisper-large-v3-turbo - verified supported transcription model page. GROUNDED: https://openrouter.ai/deepgram/nova-3 - verified alternative transcription model page. GROUNDED: https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/decodeAudioData - decoding requires complete file data; sample data is resampled to context rate. GROUNDED: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia - microphone permission and secure-context requirements. GROUNDED: https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletNode - browser audio processing node and message port. GROUNDED: https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder/dataavailable_event - timeslice timing is not exact; sample-count timing is used here. GROUNDED: https://nextjs.org/docs/app/api-reference/directives/use-client - browser APIs and interactive components require the client boundary; installed Next guidance was read before editing. GROUNDED: https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/thinking - supported Gemini thinking configuration; existing Vertex factory reused.

GROUNDED: https://openrouter.ai/anthropic/claude-sonnet-4.5 - current standard-endpoint token rates for the existing OpenRouter summary default. GROUNDED: https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing - global standard Gemini3.1 Pro rates, context tiers and response/reasoning output accounting.

Existing integration references

The existing ticket and CRM approval APIs are described in the API reference. Meeting capture routes use signed-in sessions; this design adds no phone APIs. Existing agent tools are in the MCP tool reference.

We use essential cookies to keep you signed in. See our Privacy Policy for details.