Developer SDK for Unpod voice infrastructure — management, connectivity, and adapters for building voice agents that talk over real phone calls, browsers, and WebRTC.
Single architectural commitment: the wire between Unpod infrastructure and your code carries text, not audio. You bring the brain; Unpod brings the voice.
pip install unpod
# With superdialog integration (recommended)
pip install "unpod[dialog]"
# With LangChain adapter
pip install "unpod[langchain]"
# With MCP adapter
pip install "unpod[mcp]"Or with uv: uv add unpod (extras: uv add "unpod[dialog]").
To install the latest unreleased code from source:
pip install "unpod @ git+https://github.com/unpod-ai/unpod-python-sdk"unpod
├── Management SDK (REST) numbers, voice profiles, speech pipes, calls,
│ sessions, trunks, recordings, transcripts, api keys
├── Connectivity SDK (WSS) AgentRunner, Session, CallContext, hooks
└── Adapters superdialog, LangChain, OpenAI, Anthropic, HTTP, MCP
- Management SDK — CRUD against the Unpod Control Plane: purchase numbers, browse voice profiles, bind Speech Pipes, trigger and inspect calls.
- Connectivity SDK — runtime for live calls: a long-lived
AgentRunnerreceives plain-text turns over WSS and dispatches them to your agent, regardless of transport (phone, browser, WebRTC). - Adapters — plug any brain into a call:
superdialogdialog machines, LangChain runnables, your own HTTP endpoint, or an MCP server.
from unpod import AsyncClient, AgentRunner, CallContext
client = AsyncClient() # direct → supervoice; reads UNPOD_API_KEY from env
# Or go through the unpod backend-core proxy (platform JWT + org), same calls:
# from unpod import JWTAuth
# client = AsyncClient(base_url="https://app.unpod.ai/api/v2/platform/speech",
# auth=JWTAuth(token="<jwt>", org_handle="acme"))
# Management: pick a voice, bind a Speech Pipe to your agent
profiles = await client.voice_profiles.list(language="en")
pipe = await client.pipes.create(
name="support-line",
voice_profile=profiles[0].id,
agent_id="my-voice-agent",
)
# Connectivity: handle every live call with your own logic
async def entrypoint(ctx: CallContext) -> None:
await ctx.session.say("Hi! How can I help you today?")
await ctx.session.run()
AgentRunner(entrypoint=entrypoint, agent_id="my-voice-agent").start()| Guide | What it covers |
|---|---|
| Overview | What Unpod owns vs what you own, the three layers |
| Architecture | Package structure, data flow, protocol details |
| Management SDK | REST client API reference |
| Connectivity SDK | AgentRunner, Session, hooks, controls |
| Adapters | DialogAdapter protocol and bundled adapters |
| Quickstart | 10 steps to your first phone call |
| Browser Quickstart | Test in Chrome, no phone number needed |
Full platform documentation: docs.unpod.ai
git clone https://github.com/unpod-ai/unpod-python-sdk
cd unpod-python-sdk
uv sync --extra dev
uv run pytest