Skip to main content

Overview

nextneural_assist coaches a human salesperson while they are on the phone. It forks the live call audio, transcribes each leg separately, and pushes suggestions to the rep's screen as the conversation happens.

No AI speaks on the call. The customer is talking to a person throughout — which is the difference from nextneural_converse, and the reason the knowledge base matters here: the suggestion has to be right and fast enough for a person to use mid-sentence.

How the pieces fit​

Agent (a teammate) ──► Click-to-call ──► Live call
│
┌─────────────────┴─────────────────┐
│ │
forked audio ──► transcription knowledge base
│ │
└──────► suggestions ◄──────────────┘
│
agent's screen (WebSocket)
  1. Agents are org members with a handset mapped
  2. Customers are who they call
  3. A call is placed with click-to-call — the agent's phone rings first
  4. Audio is forked to nextneural_assist, transcribed, and matched against the knowledge base
  5. Suggestions stream to the rep over a WebSocket

Base paths​

SurfaceBaseCredential
Console API/apiSession token, or a scoped API key
Auth/api/auth—
Provider webhooks/api/webhooks/{provider}None
Live streams/wsToken in query string

nextneural_assist has no separate /v1 surface. API keys authenticate against the same console routes, with RequireScope constraining them — a no-op for signed-in users, so the web app is unaffected.

Why the agent's phone rings first​

Click-to-call dials the agent, not the customer. That ordering is deliberate: the customer's phone does not ring until a person is already on the line, so nobody answers to silence while the system waits for a rep to pick up.

It also means an agent who does not answer produces an agent_no_answer outcome and the customer is never disturbed at all.

Knowledge base scoping is explicit​

When starting a call you name which documents the suggestions may draw on:

{ "agent_id": 12, "kb_document_ids": [3, 7] }

An empty list means no suggestions for this call — not "search everything". That was the old behaviour, and it made forgetting to choose indistinguishable from choosing all, which is how an insurance call ended up surfacing a property listing that merely matched some words.

Requirements​

ForRequires
Live transcriptionSARVAM_API_KEY, AGENT_ASSIST_LIVE_TRANSCRIPTION
Suggestions and searchAWS_* / BEDROCK_* for embeddings
Placing callsA connected telephony provider
Stored provider credentialsSETTINGS_ENCRYPTION_KEY
Exotel audioEXOTEL_SAMPLE_RATE matching the stream URL

Identifiers​

Customers, agents, and knowledge base documents are addressed by integer id; calls by UUID.

GET /api/customers/87
GET /api/calls/7f3a1b2c-…