Skip to main content

Real-time agent-assist whisper coaching in the softphone

The browser softphone is where most agents actually take a call, so coaching had to live there too — not on a separate call-detail page. While a call is in progress, an AI copilot reads the live transcript and whispers suggestions into the softphone’s active-call panel: a suggested reply, the next best action, up to three knowledge-base articles pulled from your workspace’s real KB, and a rolling sentiment read on the caller. A persistent Agent assist toggle turns the panel on once; it remembers the choice across calls. Softphone in this context means the dashboard’s own call panel and its web component siblings — the same stream is consumable over Server-Sent Events, so a custom phone-bar widget can render the identical cards. Base path: /api/v1/voice Base surface: dashboard softphone pop-up or any SSE client; the card wire format is identical for both.

The assist panel during a call

Open the softphone’s active-call view and toggle Agent assist. From then on every call streams a sequence of suggestion cards; each card carries:
  • suggested_response — one short paragraph the agent could say next, written to be spoken aloud (no greetings or sign-offs; the call is in progress).
  • kb_articles — up to three articles retrieved from your tenant’s own knowledge base. The model only distils the caller’s current informational need into a search query; the surfaced titles and snippets always come from real documents, each with document_id (and source_url where the source carries one) so the agent can open the article, never a hallucinated citation.
  • next_best_action — a single imperative next step (“offer a $20 credit”, “escalate to billing tier 2”).
  • suggested_action — where the next best step maps to a whitelisted one-click action (today: escalating to a ticket), the card includes a structured action object so the UI can render an execute button instead of plain text.
  • sentiment_score — a rolling [-1, +1] estimate of the caller’s current tone in the most recent turns (-1 strongly negative … +1 strongly positive).
Cards arrive roughly once per new three-utterance turn block, at most once every eight seconds — the debounce keeps the guidance current without regenerating on every phrase. Only the trailing ~6,000 characters of the live transcript feed the model, so a long call costs a bounded amount per tick.

Sentiment emergency lane (supervisor whisper / barge)

When the rolling sentiment score drops to −0.5 or below — the same threshold the post-call sentiment alerting uses — the platform lights two rescue paths at once:
  • The supervisor wallboard gets a voice.sentiment.negative event with a recommended action: whisper (coach the agent silently) for a score of −0.7 or higher, barge (join audibly) below −0.7. See the supervisor live monitoring guide for those actions and their audit ledger.
  • The agent’s own overlay gets an automated sentiment nudge — a calming, actionable prompt — instead of relying on the manual distress button.
Each call emits at most one such alert per minute, so a persistent angry stretch lights the wallboard once rather than spamming it per tick.

Consuming the stream over SSE

The softphone panel is the transported-over-SSE view of a single endpoint: GET /api/v1/voice/calls/{callId}/agent-assist/stream
The stream opens with an event: connected handshake, forwards each card as an event: assist frame whose data is the card JSON (plus a server-issued id, generated_at, and model), keeps the line alive with : ping comments, and closes with event: end when the call completes. Custom softphone widgets and embedded phone bars can render the same cards from the same frames. Access: the same voice-read scope as the call itself; agents only see cards for calls they can already open. All coaching is fail-closed soft — if the underlying model call fails, the call and its transcript stream are untouched and the panel simply skips a tick.

Outbound dialer parity

The same coaching runs on predictive / power-dialer campaign calls, with an outbound-aware prompt: objection-handling rephrases, required disclosure prompting, and a do-not-request gate that overrides the pitch the moment the called party signals stop/remove/do-not-call. The coaching is transcript-in / suggestion-out — it never originates or alters the call itself.