Repository navigation
OpenRing 0.1.6: call limits, voicemail detection, recordings, squads, knowledge bases, SIP, Plivo and Vonage
LatestAdded
-
The phone line in a call's cost (
costBreakdown.line, included intotal): Twilio's list prices for US and Canadian
numbers, rounded up to the minute. Other carriers and countries are named inunpriceduntil you add a rate in
~/.openring/prices.json("line"). -
The Calls page exports to CSV, with formula cells made safe for spreadsheets, and a call's page copies its transcript
(thanks to Vaibhav R Valakunde, vaibhavrvalakunde2006-gif). -
Provider logos on the Providers page.
-
OmniRoute takes an API key on the Providers page (
OMNIROUTE_API_KEY), for when its API key protection is on;
it is checked against OmniRoute's model list before it's saved. -
OAuth sign-in (
/oauth/*) for xAI, Anthropic and OpenAI with the server owner's own OAuth client
(<PROVIDER>_CLIENT_ID). OpenRing never signs in as another vendor's app. OpenRouter keeps its own sign-in. -
Calls in and out through Plivo and Vonage, and out through Telnyx (beta): signed webhooks, campaigns, and
transferCallon Plivo and Vonage. Connect them on the Providers page. The import brings Telnyx and Vonage numbers. -
openring --version(thanks to Vaibhav R Valakunde, vaibhavrvalakunde2006-gif) andopenring --host, which wins over
HOSTand warns in its help that anything but localhost exposes the dashboard (thanks to Arin Aeruva, arin30). -
Vapi's
createdAtGt,createdAtLt,createdAtGeandcreatedAtLeonGET /call,/assistant,/tooland
/phone-number, filtered in SQL, in any ISO 8601 offset, with a 400 for a date that isn't one (thanks to
k_s_neeraj, Neeraj111010). Importing from another OpenRing with more than 100 items now gets every page. -
Disconnect on the Providers page asks for a second click, labeled Confirm disconnect, before it removes a key
(thanks to Arin Aeruva, arin30). -
Prices for Rime's Coda and Smallest.ai's Lightning voices, and
"*"in~/.openring/prices.jsonnow covers every
model of a provider, including the ones with a price of their own (thanks to Mohit Anand, coughlmao). -
Squads (beta), in Vapi's format: several assistants on one call, each with its own prompt, tools, model and voice.
/squad, thehandofftool andassistantDestinations,squadIdon numbers, calls andassistant-request,
contextEngineeringPlan,firstMessageModeandtools:append; the call'shandoffslists each change. The import
brings squads. -
Knowledge bases (beta), in Vapi's format:
POST /file, thequerytool,/knowledge-baseand
model.knowledgeBaseId. The search runs on your server with SQLite's full-text index, matching words, or asks your
own withcustom-knowledge-base. PDFs are read with pypdf, a new dependency, in a process of their own with a time
limit. -
SIP trunks (beta), in Vapi's format:
byo-sip-trunkcredentials in/credentialandbyo-phone-numbernumbers, in and
out, with login, registration and transfers, over UDP with G.711. Only your trunks' gateways get an answer.
customer.sipUriworks, and Twilio and Telnyx SIP calls find their number. -
Words the transcriber should get right, in Vapi's
transcriber.keyterm,keytermsPromptandkeywords, or
Words to recognize in the assistant editor. Each goes to the field its transcriber and model take, since Deepgram
refuses a connection given the wrong one. -
Call recording, in Vapi's
artifactPlan.recordingEnabled: a stereo WAV per call on your server, played on the
call's page, withartifact.recordingUrlon the call and in theend-of-call-report.
GET /call/{id}/recordingneeds the API key or a dashboard session, andDELETEremoves the file. It's off by
default, unlike on Vapi: many places require telling people they are being recorded. Recordings are deleted after
365 days; change it under Settings > Recordings or withPATCH /settings/recordings(0 keeps them for good). -
Call limits, in Vapi's fields: a call ends by itself after
maxDurationSecondsor aftersilenceTimeoutSeconds
without activity (the clock waits while someone talks, the model thinks or a tool runs), with Vapi'sendedReason
(exceeded-max-duration,silence-timed-out),
sayingendCallMessagefirst. When the caller goes quiet after the assistant spoke,
messagePlan.idleMessagesare said ("Are you still there?"), afteridleTimeoutSeconds, up to
idleMessageMaxSpokenCounttimes. The assistant editor has the length, the silence and the idle message.
These limits apply to assistants you already have: givemaxDurationSecondsa higher value if their calls can run
past 10 minutes.endCallMessageis also said when anendCalltool has no message of its own, as on Vapi. -
Voicemail detection on outgoing calls (beta), in Vapi's fields: with
voicemailDetectionor avoicemailMessage,
Twilio's answering machine detection checks who picked up and waits for the beep. A voicemail gets the message, in
the assistant's voice (or a recording, from the URL of a .wav or .mp3), and the call ends withendedReason: "voicemail", which campaigns count incallsCounterEndedVoicemail; without a message it just hangs up. It stays
off unless asked for. The assistant editor has the switch and the message. -
The
apiRequesttool, in Vapi's format: the model fills in thebodyand OpenRing sends it to your URL, such as
an n8n, Make or Zapier webhook, with no server of your own. The URL,headersandparametersstay yours and
can use{{variables}}; the model can only send the fieldsbodydeclares. Only a 2xx answer counts; nothing is
retried or redirected, a caller's interruption doesn't
cancel a request already sent, and cloud metadata addresses are refused. Vapi'scredentialIdisn't available. -
Tools:
request-response-delayedmessages are said when a tool runs late, and arequest-failedmessage with
"role": "system"now goes to the model instead of being read out to the caller.
Changed
- Calls now have Vapi's default limits: 10 minutes at most, and 30 seconds of silence from the caller. Before,
a call with nobody on the line kept running (and billing the providers) until the phone company dropped it.
Fixed
-
Only OpenAI is sent the
developermessage role now. Pipecat adds such messages during a call (a tool's late answer, a
caller's empty turn), and a provider that refuses the role ended the call. Mistral, DeepSeek and Perplexity go through
Pipecat's own services for them, which follow their rules for messages. -
A caller speaking during a transfer no longer cancels it, and a transfer that fails now gets an answer: the model tells
the caller, or the tool'srequest-failedmessage does, instead of leaving them in silence. -
When a provider stopped working during a call (a rejected key, no credit left, an outage) and no fallback could
take over, the caller heard silence until they hung up, and the call was recorded ascustomer-ended-call,
a success. The call now ends right away withpipeline-error: the voice (11labs ...) stopped working: ...,
naming the layer, the provider and its error. -
A Vonage webhook token that carries a payload hash now vouches for that body only. Before, a captured token also
passed with no body at all, so it could stand in for any GET to/vonage/eventor/vonage/voicefor five minutes.
An outgoing Vonage call that was answered but never connected its websocket now ends with
vonage-failed-to-connect-callinstead of stayingqueued. -
OAuth's
redirect_urihas to be on the same origin asPUBLIC_URL(or on localhost). It was a prefix match, so
https://your-host.evil.examplepassed.