Skip to main content

What Is a Speech Pipe?

A Speech Pipe in Unpod ties together a voice profile (STT + TTS), telephony (phone numbers), and a pointer to your agent brain into a single deployable unit. When a call arrives on a number attached to the pipe, the orchestrator dispatches it to your AgentRunner process.
Animated Speech Pipe flow showing a phone number routing into a Speech Pipe, the voice profile connecting to the STT/TTS stack, and dispatch to AgentRunner and CallContext.

Creating a Pipe

create() parameters


Listing Pipes

Pipe fields


Getting a Single Pipe


Updating a Pipe


Deleting a Pipe

Deleting a pipe does not automatically detach phone numbers. Detach all numbers before deleting to avoid orphaned routing.

How the Pipe Reaches Your Brain

The pipe 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). There are two ways the pipe finds that runner:
  1. By agent_id (preferred). Run an AgentRunner with the same agent_id as the pipe. 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.
  2. By agent_endpoint (legacy serve transport only). Set the pipe’s agent_endpoint to a fixed wss://... bridge URL that your runner serves. This applies only to transport="serve", which is deprecated - under the default dial_out transport nothing listens on that URL. It is a WebSocket URL, not an HTTP endpoint.
agent_endpoint is not an HTTP webhook - the orchestrator does not POST to it. It is the WebSocket bridge URL your AgentRunner serves on.

Bridging a Remote HTTP Brain

Already have a chatbot or API in any language? Run an AgentRunner whose dialog brain is an HTTPAdapter. It POSTs each user turn to your endpoint from inside the runner - text in, text out, not OpenAI-compatible. Your endpoint keeps all LLM logic.
Streaming, assist(), and error surfaces: Adapters.
The recommended pattern for production is a dedicated AgentRunner process:
The agent_id in AgentRunner must match the pipe’s agent_id in the platform. The orchestrator uses it to route dispatches to the correct runner worker.

Next Steps

AgentRunner & Sessions

Configure the AgentRunner for production and act on live calls - say, transfer, end, record.