Self-improving voice agents
sopops checks every call your voice agent makes, catches its mistakes, and drafts the fix to its instructions.
sop·ops is short for SOP operations: running your agents' standard operating procedures.
Try it yourself locally Paste this in a terminal
claude "Set up github.com/amanmibra/sopops on my machine with me, using its sopops-local-setup skill"- 01Your voice agent makes a mistakeTony's Pizza · phone ordercall endedCaller
Hi, can I get a large pepperoni for pickup?
AgentSure thing. Anything else with that?
CallerGarlic knots. That's it.
AgentGreat, it'll be ready in 20 minutes. Bye!
Hung up without reading the order back - 02sopops catches it, checking the call against your stepsTake-out order · steps to follow3 of 4 followedAsk pickup or deliveryfollowedTake each item and its sizefollowedRead the order back before closingmissedGive a pickup timefollowedNever quote a delivery fee before the addressdidn't apply
- 03It finds the same mistake on 36 other callsSame mistake · needs a look37 calls
Closes the call without reading the order back
"Great, it'll be ready in 20 minutes. Bye!"
"Perfect, see you soon."
1Real mistake2Acceptable3SOP is wrong4Checker is wrong - 04It drafts the fix. You approve it.Take-out order · instructionssuggested fix
## Before you close+ Read the full order back and ask "Is that right?" Give the pickup time.Happens on 18% of callsApprove fix
Customers find bad calls first
"They never confirmed my order and got it wrong."
Review · 3 days after the callYou find out from a complaint
sopops checks every call as soon as it ends, so you see the mistake before the review.
You change the prompt and hope
sopops numbers every version of your instructions and shows the mistake rate for each.
60 calls checked · 7 mistakes · 2 kinds
Nobody can listen to every call
sopops checks all of them and groups the mistakes, so you read 2 groups, not 60 calls.
Your prompt lives in a text box
sopops keeps your instructions in versions you can review, roll back, and sync to GitHub.
How it works
Import your agents.
> Onboard this project's agents into sopops
Found 3 agents in agents/: pickup, delivery, catering
Sent their prompts to sopops for review
Claude Code imports them from your repo, or you paste each prompt in. sopops turns them into steps, and you review everything before it's saved.
Connect them, so sopops serves the instructions and every call comes back.
from sopops.livekit import attach
ins = await attach(ctx, session)
await session.start(agent=Agent(instructions=ins.text))Calls come back with no code on any platform: a webhook on ElevenLabs or Vapi, a project key and a webhook on LiveKit. On LiveKit, attach() also serves the instructions and records tool calls.
sopops checks every call against its steps.
If the caller hangs up early, the steps they skipped don't count against your agent.
Approve the fix, then see whether it worked.
## Before you close+ Read the full order back and ask "Is that right?" Give the pickup time.Version 15 added the read-back step. Calls without it fell from 18% to 4%.
Real mistake? Fix it.
sopops drafts a fix to your agent's instructions and tracks the mistake until it stops.
When sopops finds the same mistake on many calls, someone on your team says what it is, with one key. Try it: press 1 to 4.
Closes the call without reading the order back
Catch it before the caller hangs up
During the call, sopops follows each step. When your agent is about to skip one, sopops nudges it, and the caller never notices.
Coming soon to hosted sopops.
- 0:31Caller
Garlic knots. That's it.
- 0:39Nudge
Read the order back before closing.
- 0:41Agent
So that's a large pepperoni and garlic knots. Is that right?
- 0:45Caller
Yep, perfect.
Platforms
sopops works with LiveKit , ElevenLabs and Vapi . Checking calls takes no code on any of them. To serve instructions from sopops, LiveKit needs one call, attach().
| Platform | Instructions | Checking calls after they end | Checking calls live |
|---|---|---|---|
| LiveKit | One line of codeAdd attach() where the agent starts a call. | No codeAdd a project key and a webhook. | No codesopops joins each call to listen. |
| ElevenLabs | No codesopops updates the agent when you publish. | No codeAdd a post-call webhook. | No codeLive phone calls on an Enterprise plan. |
| Vapi | No codesopops updates the assistant when you publish. | No codePoint the Server URL at sopops. | No codeTurn on live updates in Vapi. |
Another platform? Send calls through the API, or bring past calls in with sopops import.
Open source
For teams that run their own servers and model keys.
- Instructions and procedures, in versions
- Two-way sync with a GitHub repo
- Every call checked, with your own model keys
- Mistakes grouped, with suggested fixes
- Mistake rates by version, procedure and agent
- Team sign-in with email or GitHub
$0
Apache-2.0Hosted
For teams that want sopops run for them.
- Everything in open source, run by us
- Runtime enforcement during callsComing soon
- Fine-tuned models for SOP capture, tracking and iteration, for higher accuracy and lower costs
- An MCP server for your QA data
- SSO, SCIM and audit export
- Data retention controls
- Model keys managed for you
Talk to us
Book a callStart with
your prompt
Paste in the prompt your agent uses today, or let Claude Code import it from your repo. Your first calls are checked the same day.
Start sopops
git clone https://github.com/amanmibra/sopops
cd sopops && docker compose up --buildRuns on your own machine. Open it in your browser and setup walks you through the rest.
Read the quickstart