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 and a native Go SDK — both dependency-light, both talking the wire protocol directly. Every live demo runs on the Python SDK 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 →STT and TTS are open-source models we run ourselves — so your audio goes to us, not a third-party voice vendor. They sit behind Deepgram-Flux– and Cartesia–compatible APIs, so speech client code you already have just works.
One callback. One authenticated WebSocket route. Any language or framework.