Manage your agents' instructions, serve them when a call starts, and check every call against them.
Instructions are what your platform may call the prompt or system prompt.
Quickstart · Walkthrough · Connect your agent · Docs · API
Most teams run several voice agents that share most of their instructions: one per restaurant, customer or task. sopops splits those instructions into blocks. Change a block once and every agent that uses it changes on its next call, with no redeploy.
Then every call comes back to sopops and is checked against the procedures it should have followed. Misses are grouped into patterns. Your team reviews each pattern, sopops drafts the fix, and Insights shows whether the next release helped.
flowchart LR
E["✏️ Edit<br/>blocks and agents"] --> P["🚀 Publish<br/>a release"]
P --> C["📞 Calls<br/>agents fetch it at call start"]
C --> K["✅ Check<br/>every step, with quotes"]
K --> R["🔍 Review<br/>patterns of misses"]
R --> F["🛠️ Fix<br/>a suggested edit"]
F -- "drafts" --> P
- Edit shared instructions, procedures and agents in the browser, or keep them in git. Every save is a draft.
- Publish a release. Agents fetch it when a call starts, or sopops pushes it to the platform. Rolling back is one click.
- Check each call, step by step, against the release it ran on, with the quotes that show it.
- Review the patterns: a real mistake, acceptable, the procedure is wrong, or sopops is wrong.
- Fix with a suggested edit, compiled and shown as a diff of each agent's instructions. Apply it as a draft or a GitHub pull request.
sopops is built on sop, and compiles with the sop binary, so its output matches the CLI byte for byte.
cp .env.example .env # optional: model keys, sign-in, email
docker compose up --build # sopops and Postgres on http://127.0.0.1:8484Open http://127.0.0.1:8484 and follow the setup steps. To check calls, set a model (Models).
Without Docker, with sop v0.1.0 or later:
uv sync && pnpm -C web install && pnpm -C web build
SOP_BIN=/path/to/sop uv run sopops # SQLite in ./sopops.dbTo see the whole loop first, the walkthrough sends 300 synthetic calls with planted failures through it. just examples/walkthrough/all runs it in about a minute with fake models, no keys needed.
| Block | What it is |
|---|---|
| Shared instruction | Text several agents get: identity, voice, policy. |
| Procedure | An SOP: when it applies, its steps and tools, never rules, warning signs. |
| Group | A named list of blocks an agent can use as one. |
| Agent | One per voice agent: its own text, its blocks in order, its variables. |
| Release | A snapshot of every agent's full instructions. Agents run the live one. |
Before you publish, Changes shows exactly how each agent's instructions will change.
Already running agents? On the Import page, sopops gives you one command to run in your agents' repo with Claude Code or Codex:
claude mcp add sopops --env SOPOPS_URL=http://127.0.0.1:8484 --env SOPOPS_TOKEN=sopops_onb_... \
-- uvx --from 'sopops[mcp] @ git+https://github.com/sopops-dev/sopops@main#subdirectory=sdks/python' sopops-mcp \
&& claude "Onboard this project's agents into sopops: call the sopops get_kickoff tool and follow it."Your coding agent finds the instructions wherever they live, splits them into blocks and sends a proposal. Every agent is compared with its original sentence by sentence, so nothing is dropped silently. You review it step by step and apply it as drafts. You can also paste instructions, upload them, read them from ElevenLabs or Vapi, or import a sop project. More on importing.
Recording calls takes no code on LiveKit, ElevenLabs and Vapi. Serving instructions from sopops takes no code on ElevenLabs and Vapi; on LiveKit it takes attach().
| Platform | Instructions | Calls back to sopops |
|---|---|---|
| LiveKit | attach() in the Python or TypeScript SDK |
attach(), with tool calls. Or no code: a LiveKit Cloud webhook. |
| ElevenLabs | Pushed on publish, or the call-start webhook | The post-call webhook, no code |
| Vapi | Pushed on publish, or the assistant-request webhook | The end-of-call report, no code |
| Anything else | GET /v1/workspaces/{ws}/agents/{agent} |
POST /v1/workspaces/{ws}/sessions |
On LiveKit, one call fetches the instructions, records the release and sends the call back, with tool calls, when it ends. Install the SDK:
pip install "sopops[livekit]" # Python
npm install sopops # TypeScriptfrom sopops.livekit import attach
async def entrypoint(ctx: JobContext):
await ctx.connect()
session = AgentSession(...)
ins = await attach(ctx, session, fallback=FALLBACK, stream=True)
await session.start(room=ctx.room, agent=Agent(instructions=ins.text, tools=TOOLS))If sopops is down, attach uses the last good copy, then fallback, so it never blocks a call. stream=True sends each turn while the call runs. Set SOPOPS_URL to the workspace's URL and SOPOPS_TOKEN to a token from Settings → Access.
Webhooks, the TypeScript SDK and the no-code setup for each platform are in docs/connect.md. A complete agent is in examples/livekit-restaurant.
A session is one call or chat. The Sessions page lists them live, each with its transcript, tool calls and result per procedure. Insights tracks the miss rate over time, compares two releases rule by rule, and runs A/B tests across models, voices and prompts. How checks, patterns and suggestions work.
Every guide is also at docs.sopops.dev, with search.
| Import | Coding agents, sop projects, paste and platform import |
| Connect | SDKs, webhooks, no-code capture, backfilling the last 7 days, tokens |
| A/B tests | Compare versions of an agent: models, voices, prompts |
| Sessions and review | The check pipeline, patterns, verdicts, suggestions, models and spend |
| Configuration | Every environment variable |
| Sign in | Passwords, teams and join links, GitHub, Google, email |
| Git | Keeping instructions in a repo, and two-way GitHub sync |
| API reference | Every endpoint, by area. The OpenAPI spec is at /openapi.json. |
sopops is v0. Without sign-in, anyone who can reach it can change everything except what tokens guard, so run it on a private network or set SOPOPS_AUTH_REQUIRED=true (Sign in).
Coming next: runtime enforcement (checking steps during a call and nudging the agent), Retell, an OpenTelemetry receiver, SAML SSO.
FastAPI, SQLModel and Alembic in src/sopops_server. Vite, React, TanStack and shadcn/ui in web/. In production, one process serves both. Setup, layout and conventions are in CONTRIBUTING.md.
Apache-2.0

