Skip to content

What CallAgent is ​

CallAgent runs voice conversations between your customers and a language model, over the telephone network or a web page, and keeps everything that happened: the audio, the transcript, the timing of every stage, the tools that were called and what each of them cost. It is three products that share one database — a voice AI platform, a SIP PBX and a contact centre — because an AI call that cannot be escalated to a person is a demo, not a phone system.

The two planes ​

Browser / phone / SIP trunk
        │
        ▼
  Voice Gateway (TypeScript)            Control plane (Laravel + Filament)
  · media transport                     · assistants, tools, knowledge, squads
  · STT → LLM → TTS pipeline            · numbers, trunks, queues, operators
  · barge-in and endpointing            · calls, artifacts, billing ledger
  · tool and MCP execution              · REST API, webhooks, dashboard
        │                                        ▲
        └────────── NATS JetStream ──────────────┘

The control plane owns configuration and history: it is where an assistant is edited, published and versioned, and where a finished call is stored. The gateway owns the milliseconds: once a call is live, no request to the control plane sits in the audio path.

They meet at @callagent/contracts, a zod-first package both planes import, so a shape cannot drift between them. Several of its enumerations are mirrored in PHP with a test that reads the PHP source and fails on disagreement — call states, event types and the redaction key list are all held together this way.

The primitives ​

PrimitiveWhat it isPage
AssistantA prompt, a transcriber, a model, a voice, and the plans that govern when it speaks and what it records. Versioned; a call pins the version it started with.Assistants
ToolA function the model may call mid-conversation — an HTTP request, a transfer, a handoff, a DTMF burst, a knowledge query. 25 types, one definition shape; five of them never reach a call.Tools
MCP serverAn external tool server, attached whole, with per-tool risk tiers.MCP
Knowledge baseDocuments chunked, embedded into pgvector and retrieved at conversation time.Knowledge bases
SquadSeveral assistants sharing one call, with explicit handoffs.Squads
Phone number / SIP trunkWhere calls arrive from and leave through.Telephony · SIP
CallOne conversation, and everything it produced.Calls & artifacts
Queue / operatorThe human half: where a call goes when the assistant hands over.Contact centre
CampaignOutbound at volume, with pacing and compliance controls.Campaigns

Three ways to drive it ​

bash
# 305 endpoints under /api/v1, generated docs at /reference/api/

curl -X POST "$CALLAGENT_API_URL/calls" \
  -H "Authorization: Bearer $CALLAGENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"assistant_id": "01JQ…", "to": "+40712345678", "phone_number_id": "01JQ…"}'
bash
# Assistants, tools, squads and knowledge bases as YAML in git

callagent validate
callagent plan          # a field-level diff against the live organization
callagent apply
text
The Filament console at /{organization}/… covers every resource the API does,
plus the pieces that only make sense visually: the provider workbench, the
live-calls view, the wallboard, the IVR node editor and the call timeline.
It is also the only place an API key can be created.

Two vocabularies, and they are not interchangeable

The REST API is mostly snake_case (first_message_mode) — except the telephony endpoints, which are camelCase (destinationType). @callagent/contracts and the CLI are camelCase with hyphenated enum values (assistant-speaks-first), and the control plane converts between them.

Where a page shows a request body, it shows the spelling that endpoint actually accepts. Where it shows YAML, that is the CLI's vocabulary.

Documented against the code. Anything not yet implemented is labelled, never described as working.