Phone routing control panel for LiveKit voice agents

By General Input

See every phone number, the route it takes and the voice agent that answers, then change routing safely with a real test call and a full change log.

Integrations

  • LiveKit
  • Slack Bot
  • General Input Database

Type

App

Categories

  • Operations
  • Engineering

Build me a phone routing control panel for LiveKit telephony so the person who owns our phone numbers can see and change call routing without hand writing API calls. The audience is whoever owns telephony config for a team running LiveKit SIP voice agents.

The main screen is one table, the number map. One row per phone number, with columns for the number, the inbound trunk it lands on, the dispatch rule that matches it, the room naming pattern that rule creates, and the agent name it hands off to. Build the table in a handler that calls List SIP Inbound Trunks, List SIP Outbound Trunks and List SIP Dispatch Rules and joins them: numbers come from each inbound trunk's number list, a rule attaches to a row when its trunk ids include that trunk or when it names the number explicitly, and a rule with no trunk ids is a catch-all that applies to every trunk. Show the room prefix or pattern and the agent name from the rule's room configuration. Flag rows inline when no rule matches the number, when the only match is a catch-all rather than a number scoped rule, and when a rule points at a trunk id that is not in the trunk list.

A second tab lists outbound trunks and their carrier details from List SIP Outbound Trunks, showing the trunk name, carrier address, associated numbers, auth username and transport. Clicking a row opens the full record via Get SIP Outbound Trunk, and inbound rows on the first tab do the same through Get SIP Inbound Trunk.

From the same screen I can manage config. Create, edit and delete routing rules with Create SIP Dispatch Rule, Update SIP Dispatch Rule and Delete SIP Dispatch Rule. Add or edit trunks with Create SIP Inbound Trunk, Update SIP Inbound Trunk, Create SIP Outbound Trunk and Update SIP Outbound Trunk, and remove either kind with Delete SIP Trunk. Every create, edit and delete opens a form with the current values prefilled and a required reason note that cannot be skipped, and deletes ask for confirmation naming exactly what will be removed and which numbers it affects.

A "Test this route" button on each row places a real outbound call to a number I type in, using Create SIP Participant through the outbound trunk I pick, then attaches the agent to that same room with Create Agent Dispatch, so I can confirm the route rings and the agent answers before I trust it. Show the resulting room name and participant identity in the app, and keep the last few test results per row with the time, the number dialed and whether the call and the agent dispatch both succeeded.

An "Audit my routing" button runs a background agent that reads every trunk and rule with List SIP Inbound Trunks, List SIP Outbound Trunks and List SIP Dispatch Rules and writes its findings back into the app, rendered as a findings panel beside the table. It looks for three things specifically: phone numbers on a trunk with no rule matching them, rules pointing at trunk ids that no longer exist, and catch-all rules that silently shadow a number scoped rule. That last one is a known LiveKit trap: a dispatch rule scoped to specific phone numbers on a shared inbound trunk can silently fail to match, while the same rule written as a trunk wide catch-all fires instantly, so routing breaks with no error surfaced anywhere. See https://github.com/livekit/agents/issues/5847 and https://github.com/livekit/sip/issues/213, with reference docs at https://docs.livekit.io/sip/dispatch-rule/ and https://docs.livekit.io/telephony/start/sip-trunk-setup/. Each finding should name the affected number or rule, say why it matters and give the concrete fix, and findings persist so I can compare one audit against the last.

Every config change is written to the General Input Database as a change log entry with who made it, the timestamp, the object changed, the previous values, the new values and the required reason note. The app has a change log view I can filter by number, rule or person. The same entry is posted to a Slack channel I configure using Slack Bot Send a Message, formatted as a short readable summary naming the person, the object, what changed from what to what, and the reason. LiveKit keeps no history of who changed routing, so this app is the record.

SIP operations need a token carrying the sip.admin grant. When a call comes back permission denied, surface a clear message saying the LiveKit key is not allowed to manage telephony settings and what needs to change, rather than a raw Twirp error code. Do the same for any rejected create or update: keep the form open with the values I typed and show in plain language what the API refused.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentA brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasonChat quality review board for LiveChat support leadsCompetitor LinkedIn ad watchlist with a permanent archiveLiveChat coverage board for planning next week's shiftsA searchable RFP answer library your bid team drafts from