◢VoiceLayer
Dashboard

Build / 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.

Tunnel
private
Run the one-container 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.
Direct
public
Point at a public OpenAI-compatible URL stored as a connection. No daemon — we call it directly over HTTPS, with an SSRF guard. Your key stays in the vault and is sent only from VoiceLayer's servers. An agent published from now on keeps the connection's URL as it was at publish: change the URL, then publish the agent again to use it. Disabling this brain stops calls of the agents bound to it.

How it works

Four steps, mostly clicks.

  1. 1

    Create a connector

    On the Brain connectors page, add a connector. Tunnel mode returns a vl_conn_ token — shown once.

  2. 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. 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. 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:

terminal
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-brain

Use 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
# litellm.config.yaml — map the model we ask for to YOUR provider.
model_list:
  - model_name: brain
    litellm_params:
      model: anthropic/claude-sonnet-5-5
      api_key: os.environ/ANTHROPIC_API_KEY

It’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.