Your LLM, your prompt, your tools, your data — running in your own backend. You expose one authenticated WebSocket route, like any webhook, and we connect to your brain per session. From that point, you're in control. We run the voice plane; nothing runs in our cloud that you didn't put there.
from voqalcloud import Brain, serve_direct
class SupportBrain(Brain):
async def on_interaction(self, i):
ctx = your_db.context(i.session.id) # your data, local
async with i.inference() as inf:
async for chunk in your_llm.stream(i.transcript, ctx):
await inf.speak(chunk)
i.action("open_invoice", {"id": ctx.last}) # drive the UI
serve_direct(SupportBrain, host="0.0.0.0", port=8787) # we dial this route per call on_interaction(i) → i.transcripti.inference() → await inf.speak(text)i.action(name, args, callback=…)on_inference_finalized(inf) → inf.heard / .interruptedon_app_event(session, event)on_interaction coroutine is cancelledTwo official SDKs speak the same protocol: the Python SDK (pipecat-based) and a native Go SDK (pipecat-free, talks the wire directly). The Go SDK runs the live /travel demo today.
STT and TTS are open-source models we run ourselves — your audio goes to us, not a third-party voice vendor. They sit behind Deepgram-Flux– and Cartesia–compatible APIs, cover 22 Indian languages alongside English and 40+ more, and can deploy inside your own VPC — so nothing but the session WebSocket to your brain crosses the wall.
Read about speech →One callback. One authenticated WebSocket route. Any language or framework.