Ori Documentation
Platform docs for building, running, and operating Ori voice agents.
Ori is a real-time voice-AI platform. It answers and places phone calls, holds a live speech-to-speech conversation against a bot you configure, and hands back a fully recorded, transcribed, and dispositioned call record — at fleet scale.
These docs are split into two tracks. Pick the one that matches what you came here to do.
Engineering
Architecture, local setup, running the stack, CI/CD, deployment, and DevOps runbooks for the Backend, Voice fleet, and Dialler.
Operations
Build bots, launch campaigns, review calls and reports, and manage telephony, users, and CRM integrations from the Console.
What Ori does
Every call — inbound or outbound — runs the same loop inside a single worker: speech-to-text → language model → text-to-speech, with voice-activity and turn detection deciding who's speaking. When the call ends, the worker uploads the recording and returns a complete record: transcript, analysis, quality-control findings, and a disposition.
The design rule underneath everything is a clean split between two planes.
The control plane — Console, Backend, and the data layer — owns everything durable: bots, campaigns, and every call record. The runtime plane — Dialler and Voice fleet — does the heavy real-time work but keeps no long-lived state; it re-fetches config at the start of every call. That one property is what lets the fleet scale out and makes a crashed worker cost you exactly one call.
The four services
Console
The operator dashboard — bot builder, campaign builder, call logs, reports, and settings. A React single-page app.
Backend API
The control plane and source of truth — auth, bots, campaigns, per-call config, durable records, and CRM push. Python · FastAPI.
Voice fleet
The runtime workers that run the live conversation and the speech pipeline — one call per worker. Python · FastAPI · Pipecat.
Dialler
Outbound campaign execution — predictive pacing, retries, answering-machine screening, and attaching answered calls to the fleet. Python · asyncio.
The life of a call
A call begins
The Dialler places a paced outbound campaign call, or a customer dials in to a configured number. Both arrive at the telephony plane.
A worker picks it up
The call lands on exactly one free fleet worker, which immediately asks the Backend for that bot's runtime config — prompts, voice settings, tools, and CRM data.
The conversation runs
Inside the worker, the speech pipeline runs the loop — STT → LLM (with tools) → TTS — while the audio is recorded.
The call is finalised
The worker uploads the recording and hands back a complete result: transcript, analysis, QC findings, and a disposition. The Backend stores it and can push it to your CRM.
Where to go next
System architecture
The full picture — the four services, the data layer, the telephony plane, and the journey of a single call from dial to disposition.
Run it locally
Prerequisites, cloning the repos, and running the whole stack on your own machine.
Create your first bot
Build a voice agent step by step — identity, prompt, voice pipeline, tools, and a test call.
Launch a campaign
Choose a bot, upload contacts, set pacing and retries, and start outbound calling.
Console tour
A guided walk through every section of the operator dashboard.
Glossary
Plain-language definitions for the terms used across the platform.