Products
Vox · Orchestration Lens · Observability Dojo · Evals & Testing Pulse · Campaign Intel Dino CLI · Terminal
Resources
Docs Blog Book a Demo
the first speech-to-speech harness

Ship a voice agent from the CLI,
the way you ship everything else

Dino CLI builds AI voice agents that make real phone calls. Design the call, test it on a real phone, then run it across thousands of customers.

akshay@dino  ·  ~/work/agents
protocol v1
The whole lifecycle
$
Real commands, real output. The prompt is live, so try one. command history
01 / DETERMINISM

Dino CLI runs the call, the model runs the conversation

You lay out the steps of the call once. Dino CLI holds that structure for the whole call, which frees the model to do what it is genuinely brilliant at.

02 / SHIP-SAFE

Nothing reaches a phone unchecked

dino agent validate runs the same checks our engine runs before it will accept your agent for a live call. If it passes on your machine, it will load in production.

03 / SCALE

One call and a million calls

The same published agent takes one preview call, holds an inbound line, and works a hundred-thousand-row campaign. You swap the campaign type and rewrite nothing.

Determinism

Dino CLI holds the call together so the model can just talk

Most voice agents stuff the whole call flow into the prompt and hope it survives twenty minutes of conversation. Dino CLI runs it as real logic instead, which is what lets the model spend its attention on the person rather than on remembering the plan.

"collect_id": { "instruction": "Confirm the caller's registered mobile number.", "outcomes": { "success": { "type": "route", "target": "triage" }, "failure": { "type": "end", "next_instructions": "Politely close." } } }
dino agent render
support-triage-en-in
5 steps · 1 post step · caller speaks first
start step
triage
step 2
upi_info
step 3
login_info
step 4
recharge_info
step 5
fare_info
every branch converges on wrap_up, which posts the outcome.
Ship-safe

Validate agent and test before it reaches production

dino agent validate checks three things: that every step can actually be reached, that every outcome points at a step that exists, and that every path has a way to end the call.

Miss one and the agent walks a caller into a dead end mid-call. It goes quiet, or loops the same question, while a real customer waits on the line. Validate catches it on your machine in about a second.

$ dino agent validate --agent-dir ./agents/support-triage-en-in ✗ FLOW_INVALID stage 'confirm' is unreachable from the start stage exit 2 $ dino agent validate --agent-dir ./agents/support-triage-en-in { "ok": true, "operation": "agent.validate", "data": { "valid": true } }
dino agent validate
Preview

Make calls directly from the CLI

dino agent preview-call places a real, guarded call to your approved number with your real placeholder values. No infrastructure to provision, no telephony account to wire up first.

A transcript tells you the agent said the right words. Hearing it tells you whether anyone would stay on the line.

$ dino agent preview-call --agent-id <uuid> \ --placeholders ./test-customer.json $ dino agent preview-status --preview-call-id <uuid>
dino agent preview-call
+91 98••• ••210
idle
0:00
Scale

Three campaign types, one agent

Point the same agent at a batch for outbound campaigns, a drip for a queue your systems feed live, or an inbound line customers call themselves. Import from CSV, then start, pause, resume, and retry from the terminal.

The agent you previewed is the exact agent that runs at volume: same file, same validation, same engine. Nothing gets rebuilt or reconfigured on the way to production.

$ dino campaign create-batch --agent-id <uuid> --name q3-renewals $ dino campaign import-csv --campaign-id <uuid> --csv ./contacts.csv \ --mapping ./mapping.json $ dino campaign set-phase --campaign-id <uuid> --phase running
dino campaign · q3-renewals
The harness

We take care of the hard part of the speech to speech models

These models are extraordinary at conversation. Holding that quality across a million real calls takes a layer on top: turn-taking, timing, confirmations, recovery.

We built that layer and ran more than a million production calls through it. Everything we learned went back in, which is why your first live agent takes two or three days instead of two or three weeks.

agents/renewals-en-in

The things engineers ask first

Today you can run on Grok, Gemini, or GPT, using the live speech-to-speech model from each. You pick the model in agent.toml and change it with one line, without touching your call flow. We add models as they ship.

Request access and we approve a batch of teams every week. There is no waitlist you sit on indefinitely. If you are building something real, tell us what it is and you will usually hear back within the week.

From the terminal: scaffold a call flow, validate it, ring your own phone to hear it, then run it across a contact list. Every command returns JSON, and the Skills we publish teach Claude Code or any coding agent to write, check, and ship those agents alongside you.

No. Install it, build an agent, and ring your own phone the same afternoon. We provide the telephony for test calls, so there is nothing to provision. You only need your own number when you want customers calling you.

Install it and hear your first call today

Scaffold an agent, validate it, and ring your own phone before your coffee gets cold.