Voice agents
Calls that know your business: knowledge, voicemail and quiet lines for voice agents
A voice agent that answers from your price list, hangs up on voicemail, speaks up when the line goes quiet and files what it learns in the CRM. What we built, what we measured, and what it costs to run.

A sales bot that sounds good but guesses the price is worse than no bot. This month we put Pocket's voice agents through real calls between three phones in the office, an enquiry-callback script, Hindi and English, and the usual run of nobody-answers, voicemail-answers and someone-answers-then-goes-quiet. This post is what shipped from that, with the numbers we measured along the way.
Knowledge the agent answers from
Under Account → Voice → Knowledge for calls you give the agent what it may state as fact: paste text, add a web page (fetched and stripped to text, with a *Fetch again* for price pages that change), or upload a PDF, Word or text file. Each source is shared with every agent on the team or assigned to named bots, so the collections agent and the receptionist do not read each other's notes. The approved entries of the team playbook are searched too.
On the line the agent gets one tool, search_knowledge, and a rule: answer facts only from what it returns, and say you will check when it returns nothing. Search runs two ways and merges them: word matching (BM25, any script, no network) and embeddings on the team's own model key when they have one. A passage the words found gets the embedding boost at any similarity; one found by meaning alone has to score clearly, or an unrelated question would always find *something*.
- a knowledge lookup during a call (warm)
- 0.4 s
- files indexed in the end-to-end test (a text file and a PDF)
- 2 of 2
- "kya booking amount wapas milta hai" found the refund line in an English PDF
- Hinglish
- what "do you sell cars" found, which is the right answer
- nothing
Voicemail, quiet lines and the longest call
A campaign that leaves fifty cheerful messages on fifty answering machines is not working the list. The engine now recognises a mailbox or a phone-company recording from what it hears (English, Hindi and Hinglish phrases, plus a long unbroken greeting early in the call), stops talking to it, and either hangs up or waits for the beep and leaves the message you set. The call counts as *voicemail* or *ivr*, so the dialer retries it later and the CRM does not count a conversation.
If the person goes quiet, the agent asks if they are still there, as many times as you set, then says goodbye and hangs up. If a call runs past the longest length you allow (one to sixty minutes), the agent says it is out of time and ends it. All of it is under Account → Voice → When the line is quiet or a mailbox answers, and the nudges never fire while the agent is looking something up or still owes the caller an answer, which was the first bug a real call found.
A rooted phone can also *be* the voicemail box: calls nobody takes are answered after the ring time, the caller hears your greeting and a beep, and the message arrives on your phone as a notification with its words. In our test the calling agent heard the greeting word for word, recognised it, left its message and hung up; the box saved the text. Both phones hung up on their own.
What each agent may do on a call
Every bot now has an On calls card: look up knowledge, read the CRM record, write to the CRM, send WhatsApp, send email, schedule a follow-up, transfer to a person, recognise a voicemail. Switch off what that agent should never do. The CRM facts about the person (stage, score, past calls, notes) are in the agent's brief before it says hello, and it can file a note or a stage change while they are still talking.
Under Integrations on calls you can describe your own HTTP endpoints (a name, what it does, the arguments as a JSON schema, a URL, encrypted headers) and the agent calls them mid-conversation: an order lookup, a booking system, a stock check. The project's remote MCP servers can ride on calls too, per bot. Every tool call goes through the control plane, which checks the bot's allowlist first, so nothing said on the line can reach a tool the agent was not given.
How fast, and how many at once
We measured the time from the caller's last word to the agent's first sound with real speech providers both ways. The model makes the difference: Gemini 2.5 Flash took 2.6 s; an open-weights model served by the fastest host took 0.93 s. Calls now default to that, and the control plane prepares a call's configuration while the phone is still ringing, so the greeting starts at the answer.
- caller stops → agent speaks (gpt-oss-120b, fastest host)
- 0.93 s
- the same on Gemini 2.5 Flash, the old default
- 2.6 s
- live calls one engine core carries comfortably
- 4 / vCPU
- a month for an engine that carries 8 calls at once
- ~$137
Speech, the model and the phone line are billed to your own provider accounts; the engine is a fixed cost that scales with calls at once, not minutes. The Voice screen shows what the engine as deployed carries, and your agent answers "we have ten reps calling together, what do we need and what will it cost" from the same numbers.
What is still ahead
- Scheduled re-fetching of web pages, and a view of when each source was last updated.
- MCP servers that run as a command stay sandbox-only; on calls, remote servers only.
- Per-language voices and automated agent tests, which the hosted voice platforms have and we do not yet.
Everything above runs on your own speech and model keys and your own phones or Twilio number. If you would rather read the design than the write-up, the architecture note is in the docs.