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)
- Agents are org members with a handset mapped
- Customers are who they call
- A call is placed with click-to-call — the agent's phone rings first
- Audio is forked to
nextneural_assist, transcribed, and matched against the knowledge base - Suggestions stream to the rep over a WebSocket
Base paths
| Surface | Base | Credential |
|---|---|---|
| Console API | /api | Session token, or a scoped API key |
| Auth | /api/auth | — |
| Provider webhooks | /api/webhooks/{provider} | None |
| Live streams | /ws | Token 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
| For | Requires |
|---|---|
| Live transcription | SARVAM_API_KEY, AGENT_ASSIST_LIVE_TRANSCRIPTION |
| Suggestions and search | AWS_* / BEDROCK_* for embeddings |
| Placing calls | A connected telephony provider |
| Stored provider credentials | SETTINGS_ENCRYPTION_KEY |
| Exotel audio | EXOTEL_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-…