> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Real-time agent-assist whisper coaching in the softphone

> While a call is live, the softphone whispers a suggested reply, the next best action, and a one-tap mood score on the same pane — and a supervisor flagged by a sliding caller sees a recommended whisper-or-barge rescue.

# 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](/guides/supervisor-live-monitoring-voice) 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`

```bash theme={null}
curl -N "https://orbit.devotel.io/api/v1/voice/calls/call_abc123/agent-assist/stream" \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Accept: text/event-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.

## Related

* [Supervisor live monitoring for voice calls](/guides/supervisor-live-monitoring-voice) — listen, whisper, barge, conference-join
* [Supervisor live transcript over SSE](/api-reference/voice) — agent-assist and supervisor-assist SSE wire formats
* [Call QA scorecards](/voice/call-qa-scorecards) — post-call grading on the same calls
