Why It Changed
A Speech Pipe bundled five concerns into one row: a voice, anagent_id, a
recording flag, a duration cap, and a fallback URL. The agent model separates
them:
That last row also changed a signature:
client.numbers.attach() no longer
takes pipe_id - it takes agent_id. Supervoice stopped storing the pipe pin
and resolves the pipe from the agent instead.
Migration
client.sessions.create_token(pipe_id=...) is unchanged - browser sessions
still mint a token against a pipe id. See
Browser & WebSocket.Reference (existing code)
Kept for code that has not migrated yet.create / get / list / update /
delete all still work and all warn.
Pipe fields
How a Call Reaches Your Brain
Unchanged by the rename, and it applies to aRunner() brain today. The
platform never calls your brain over HTTP. On every call the orchestrator
dispatches the session to a worker, and the worker connects to your
AgentRunner over a WebSocket bridge (text in / text out).
Under the default dial_out transport the runner never listens - it registers,
then dials out to a per-call bridge when a call is assigned. The
orchestrator picks a registered, least-loaded runner per call, and you never
expose a URL, a tunnel, or a webhook. See
AgentRunner.
The legacy serve transport - where the runner serves a fixed wss:// URL set
as the pipe’s agent_endpoint - is deprecated. It is a WebSocket URL, not
an HTTP webhook: the orchestrator does not POST to it.
Bridging a Remote HTTP Brain
Two ways, depending on who initiates: Unpod calls you - theEndpoint brain, no process of yours to run:
HTTPAdapter, if your API is not
OpenAI-shaped:
assist(), and error surfaces:
Adapters.
Next Steps
Agents
The surface that replaces this one - brain union, voices, numbers.
AgentRunner & Sessions
Run the worker a
Runner() brain points at.