Features / Brain connectors
Bring your own LLM
Keep your existing text agent — an OpenAI-compatible endpoint, a LangChain app, a self-hosted model — and answer a phone number on top of it. VoiceLayer runs the voice pipeline (speech-to-text, text-to-speech, turn-taking, telephony); your endpoint is the brain.
vl-brain daemon. It dials out to us — no inbound ports — and forwards each turn to your local endpoint. LiteLLM is baked in to normalize any provider.How it works
Four steps, mostly clicks.
- 1
Create a connector
On the Brain connectors page, add a connector. Tunnel mode returns a vl_conn_ token — shown once.
- 2
Run it (or point at your URL)
Tunnel: run the one-container vl-brain daemon with your token. Direct: register a connection holding your public URL + key.
- 3
It’s a voice agent
Your connector shows up in the Agents list. It works like any agent — swap STT/TTS, add tools — but the LLM is your brain.
- 4
Try it
Talk to the agent in the Playground — no phone number needed. Attach a number later to take real calls.
Run the connector tunnel
One container, one command. If your endpoint already speaks OpenAI, set VL_NORMALIZE=off and skip LiteLLM entirely:
docker run --rm \
-e VL_CONNECTOR_TOKEN=vl_conn_… \
-e VL_BRAIN_URL=https://your-brain.example.com/v1 \
-e VL_BRAIN_API_KEY=sk-… \
-e VL_BRAIN_MODEL=your-model \
-e VL_NORMALIZE=off \
ghcr.io/paradox1612/vl-brainUse any provider
Not OpenAI-shaped? Mount a LiteLLM config — Anthropic, Bedrock, Vertex, Ollama, or a LangChain app — and the embedded proxy normalizes it. Point the connector's default model at the model_name:
# litellm.config.yaml — map the model we ask for to YOUR provider.
model_list:
- model_name: brain
litellm_params:
model: anthropic/claude-sonnet-4
api_key: os.environ/ANTHROPIC_API_KEYIt’s a voice agent
Your connector appears in the Agents list and behaves like any agent — swap STT/TTS, add tools, set handoff — with one difference: the LLM is your brain, so the model picker is locked. Test it in the Playground; attach a number when you're ready.
The token is shown once.Copy it on creation — it isn't retrievable later. If it leaks, rotate it from the connector's row; the old token stops working immediately.