ai-native-callcenter is a free, open source messaging & event streaming project written in Go and released under Apache-2.0. It has 517 GitHub stars, 96 forks and 61 open issues, and was last pushed 19 hours ago. On this registry it ranks #16 of 18 tracked projects in Messaging & Event Streaming, with 5 head-to-head comparisons available. It gained 2 stars over the last 2 tracked days.

What is ai-native-callcenter?

AI Native Call Center is a self-hosted, API-first call center written in Go in which an AI voice agent answers every inbound call by default and hands the caller to a human agent in a real queue without dropping the line, built for teams that run their own FreeSWITCH and SIP trunk and want the whole conversation to land in one record they own.

What it is

The project is a single Go binary that contains the REST API, the event stream and the entire web interface, deployed alongside PostgreSQL and FreeSWITCH. Calls arrive at FreeSWITCH and are answered by a voice model over a speech-to-speech connection that the application terminates itself: the AI leg is a SIP endpoint inside the application, and FreeSWITCH bridges the caller to it. The model owns the dialogue while a flow engine owns the phase, carrying instructions and a list of tools the model may use, with transitions firing on tool results. When a person is needed, the caller is transferred into a mod_callcenter queue where human agents are waiting, their SIP leg held by a companion Chrome extension.

The concrete thing it replaces is the menu. Instead of a DTMF IVR tree that callers navigate by keypress, the AI is the default answer and the flow steers the conversation rather than scripting it line by line. It also replaces the fragmented record-keeping typical of bolted-on AI: a call that a bot answered, handed to a queue and an agent finished is one CDR with one transcript and one recording, not three separate fragments. The call id is minted before any leg exists and survives the transfer, so the bot-phase transcript is already on the agent's screen when the phone rings.

Key capabilities

  • A speech-to-speech AI leg implemented as a SIP UAS inside the binary, with G.711 passed through byte for byte where the provider accepts it, so nothing decodes or resamples on the way.
  • A flow engine of phases, each carrying instructions and a permitted tool list, where transitions fire on tool results and a phase may carry a line the bot is meant to say as written rather than paraphrase.
  • Built-in tools that may refuse — "the queue is closed" is treated as something to talk about rather than an error.
  • Transfers into mod_callcenter queues, announced by a PARTY_RINGING event over SSE that names the caller and carries the call's userData.
  • An agent desktop in the browser covering presence, call control and callbacks, with audio delegated to the separate web-sip-phone Chrome extension that holds the agent's SIP registration using credentials the application issues at sign-in; answering, holding and hanging up are REST calls carried to the phone over ESL uuid_phone_event.
  • One CDR per conversation with one transcript and one recording, with recordings written to a filesystem or to any S3-compatible store.
  • A provider chosen at startup — qwen, doubao, openai, grok, or gateway for a Realtime gateway of your own — with English and Chinese throughout both the interface and the bot, plus a live wallboard, queue view and roster for supervisors.

Who uses it and how

  • Contact centers that need a provider choice dictated by geography: qwen or doubao inside mainland China, openai or grok elsewhere, or gateway pointing at a Realtime gateway the operator runs.
  • Teams already operating FreeSWITCH with their own SIP trunk, since FreeSWITCH reads its directory and its mod_callcenter configuration from the deployment.
  • Blended human and AI teams: agents work in the browser with the web-sip-phone extension, while supervisors watch the live wallboard, queue view and roster.
  • Bilingual operations, where both the interface and the bot are available in English and Chinese.
  • Operators with data-residency requirements, who keep recordings on their own filesystem or in an S3-compatible store they control.

Getting started

Install with the one-line installer — curl -fsSL https://github.com/rasonyang/ai-native-callcenter/releases/latest/download/install.sh | sudo sh on Linux, or the same command without sudo on macOS — with further detail in deploy/one-line-installer.md and deploy/README.md.

How it compares

No paid products or directly comparable call-center tools are named in the facts, so this project stands alone in this registry. The repositories it references — web-sip-phone for agent audio and cascade-realtime-gateway for a self-run Realtime gateway — are companion components it integrates with rather than alternatives to it.

When to use it — and when not to

A self-hoster must operate FreeSWITCH, PostgreSQL and a SIP trunk, and must hold an account with a realtime model provider, so this is not a drop-in hosted service. One provider answers every call in a deployment and is fixed at startup, and a call's language never selects it, which will not suit operators who need to mix providers per call. Agent audio depends on a separate Chrome extension maintained in another repository, and the project carries 61 open issues, so teams wanting a single-vendor, browser-only agent client should look elsewhere.

project readme (upstream, from github) — read inline

AI Native Call Center

An open-source call center where the AI is the default answer, not an add-on.

Calls arrive at FreeSWITCH and are answered by a voice model over a speech-to-speech connection the application terminates itself. The model talks; a flow steers the conversation and decides when a person is needed. When one is, the caller is transferred into a real queue where real agents are waiting, their SIP leg held by a companion Chrome extension. Everything the two halves do lands in one call record.

It is one Go binary — REST API, event stream and the whole web interface inside it — plus PostgreSQL and FreeSWITCH.

简体中文 · Deploying · Design

Agent desktop: an inbound call is answered, the live transcript fills in, then after-call work

Try it

Linux:

curl -fsSL https://github.com/rasonyang/ai-native-callcenter/releases/latest/download/install.sh | sudo sh

macOS:

curl -fsSL https://github.com/rasonyang/ai-native-callcenter/releases/latest/download/install.sh | sh

Details: deploy/one-line-installer.md.

What it does

Answers with a model, not a menu. The AI leg is a SIP endpoint inside the application: FreeSWITCH bridges the caller to it and audio goes straight to the provider — G.711 passed through byte for byte where the provider accepts it, so nothing decodes or resamples on the way.

Steers without scripting the conversation. The model owns the dialogue; the flow owns the phase. A phase carries instructions and a list of tools the model may use; transitions fire on tool results. A phase may also carry a line of its own — a greeting, a hand-over script, a goodbye — which the bot is meant to say as written rather than paraphrase: doubao is handed the words to speak, the other four providers are instructed to repeat them word for word. The built-in tools may refuse — "the queue is closed" is something to talk about, not an error — and the persona, the rules and the bot's voice are published and versioned together.

Hands over to people properly. Transfers go into mod_callcenter queues, and the agent's screen has popped by the time the phone rings: a PARTY_RINGING event over SSE says who is calling and carries the call's userData, and the bot-phase transcript is already there to read, because the call id is minted before any leg exists and survives the transfer. Agents work in the browser: presence, call control, callbacks — but not the audio, which belongs to the web-sip-phone Chrome extension, a separate repository. It holds the agent's SIP registration with credentials this application issues at sign-in, and it has no dialpad of its own: answering, holding and hanging up are REST calls here, carried to the phone over ESL uuid_phone_event. Supervisors get a live wallboard, the queue view and the roster.

Keeps one record per conversation. A call that a bot answered, handed to a queue and an agent finished is one CDR with one transcript and one recording — not three fragments. Recordings go to a filesystem or to any S3-compatible store.

Speaks two languages, and admits which provider it runs. English and Chinese throughout, interface and bot. One provider answers every call in a deployment, chosen at startup: qwen or doubao inside mainland China, openai or grok elsewhere, or gateway for a Realtime gateway of your own (such as cascade-realtime-gateway). A call's language never selects it. Four of those are profiles of one protocol; doubao speaks a different one and has a client of its own (how a provider is added).

How it fits together

                    ┌──────────── one Go binary ────────────┐
  caller ──▶ FreeSWITCH ──▶ SIP UAS ──▶ provider (Realtime, speech-to-speech)
                 │            │
                 │            └─ flow engine: phases, tools, transfers
                 │
                 ├─ mod_callcenter queues ──▶ agents (browser + web-sip-phone)
                 │
                 └─ ESL ──▶ call registry ──▶ REST + SSE ──▶ web interface
                                                    │
                                              PostgreSQL

FreeSWITCH reads its directory and its mod_callcenter queues from the database, through Lua. The dialplan is static XML, but its rules decide nothing by themselves: each one hands the call to a Lua script that looks the answer up. Adding an extension, a queue or a number is a database change; the switch's own files change only when the routing itself does.

Two design notes worth knowing before reading the code:

  • The domain model is Genesys-lineage. A call aggregates parties; leg events are PARTY_*, call-scoped ones are CALL_*.
  • Every live call is an actor — one goroutine as its sole mutator, snapshots by mailbox. Nothing in internal/telephony locks call state, because there is no shared call state; the AI leg is the exception, holding mutexes over the playback and recording state its own goroutines share.

The full design is in docs/design/, starting with the overview.

Building

make dev-up            # PostgreSQL in Docker
cd web && npm install && npm run build && cd ..
make build             # bin/aicc, with the interface embedded
./bin/aicc useradd -username admin -password '…' -role ADMIN
./bin/aicc

For frontend work, make web-dev runs Vite on 5173 against the API on 8080.

go test -race ./...    # always -race; it has caught real bugs here
make lint              # go vet, gofmt, oxlint
make api-check         # the API contract gate

The HTTP API is spec-first: docs/openapi.json is the single source of truth, and the Go server and the TypeScript client are generated from it. Edit the contract, run make api-generate, then implement. Never the other way round.

Extending it

Status

The human path, the AI path, the product surface and the packaging are built and verified against live FreeSWITCH and live providers.

What is deliberately not here, and will not be: any cascaded ASR + LLM + TTS pipeline inside this process. That composition belongs in a separate service speaking the same protocol, such as cascade-realtime-gateway.

License

Apache-2.0. See LICENSE.

Frequently asked questions

Is ai-native-callcenter free to use?

ai-native-callcenter is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does ai-native-callcenter do?

Self-hosted API-first AI call center: AI talks, code controls the call. AI agents answer every call; humans take over without dropping it. Runs on FreeSWITCH wi

What is ai-native-callcenter written in?

ai-native-callcenter is primarily written in Go. Its source is publicly available at https://github.com/rasonyang/ai-native-callcenter, and it has 517 GitHub stars.