Providers
Introduction
The speech and language providers behind an assistant, how to change their settings for a single call, and what happens when a value falls outside its range.
Every assistant runs on three providers: one to hear the caller, one to think, and one to speak. You pick them by ID from the voice, model, and transcriber catalogues, and each entry carries the provider settings that shape how it behaves on a call.
This section documents those settings per model. That is not a formatting choice: two models from the same provider often accept entirely different keys, and setting one model's key on another is not an error, it simply does nothing.
Find your model#
Start from the model your assistant actually uses. Each page lists every setting it accepts, the allowed values, the default, what happens when a value is wrong, and a ready-to-send override body.
Text-To-Speech (TTS)#
- ElevenLabs: 4 pages.
- Cartesia: 3 pages.
- Inworld: 3 pages.
- Fish Audio: 1 page.
- xAI: 1 page.
- Rime: 1 page.
Speech-To-Text (STT)#
- Deepgram: 2 pages.
- AssemblyAI: 2 pages.
- Cartesia: 2 pages.
- xAI: 1 page.
- Google: 1 page.
- ElevenLabs: 1 page.
- Speechmatics: 2 pages.
Models (LLM)#
Where settings live#
| Provider role | Catalogue | Settings carried in |
|---|---|---|
| Speech-to-text | GET /transcribers | body on the transcriber |
| Text-to-speech | GET /voices | body on the voice |
| Language model | GET /models | temperature and maxTokens on the model, and nothing else |
Keys on a transcriber or a voice are camelCase. Language-model settings are passed to the provider exactly as written instead, so those keep the provider's own spelling: max_completion_tokens, not maxCompletionTokens. Each model page shows the spelling to send. A model carries no settings body of its own, so every language-model setting beyond those two reaches the provider as a per-call override and no other way. The one exception is a realtime model: GPT-Live 1 stores its settings on the model's catalogue entry itself, platform managed, its override keys are camelCase, and its page states its own rules. A key you leave out is simply not sent, so the provider's own default applies. Setting a key to the value you believe is the default is not the same as omitting it: it pins that value, so a later change to the provider's default will not reach you.
Changing settings for one call#
Everything above is stored configuration, shared by every call the assistant takes. To change a setting for a single call instead, return an overrides object from your assistant-request webhook. Nothing stored is modified, and the next call starts from the saved configuration again.
Each of the three channels takes the same two levers, and they compose:
{
"data": {
"overrides": {
"transcriber": {
"id": "0195f1e2-0000-0000-0000-000000000000",
"settings": {
"endpointing": 300,
"smartFormat": true
}
},
"voice": {
"id": "0195f1e2-0000-0000-0000-000000000000",
"settings": {
"speed": 1.0,
"stability": 0.5
}
},
"model": {
"id": "0195f1e2-0000-0000-0000-000000000000",
"settings": {
"temperature": 0.7,
"maxTokens": 250
}
}
}
}
}idswaps the whole row for another entry from that catalogue. Use it to run one call on a different voice, model, or transcriber.settingsmerges over whatever that channel resolved to, whether that is the row you just swapped in or the assistant's saved one. Only the keys you send change; the rest keep their stored values.
Send whichever channels you need, and only the keys you want to change. An empty or absent overrides object leaves the call exactly as configured. An id that does not match a row in your catalogue is ignored rather than reported, and the call continues on the saved configuration, so check the ID if an override appears to do nothing.
The keys inside settings are the ones documented on each model page, so check the page for the model that will handle the call. A key that model does not accept is not an error: depending on the provider it is forwarded and ignored there, or it prevents the session from opening, which is what the next section is about.
Settings and IDs compose
Swapping a model with id and sending settings in the same request applies your settings to the model you swapped in, not to the assistant's saved one. That is what makes a single override able to say "use the multilingual transcriber for this call, and slow it down a little".
How a provider is reached#
Two routes, and the difference decides which settings can take effect at all.
- Through the LiveKit Inference gateway, which accepts a documented set of options per provider and validates them before opening a session. Most models work this way.
- Through the vendor's own client, which takes a fixed set of arguments. Settings outside that set cannot be carried.
Every model page states its route, because it decides whether a setting is honoured or ignored.
What happens when a value is wrong#
This is the part worth reading before you tune anything. Providers do not agree on how to handle a setting they dislike, and only one of these is loud. Each model's table names the behaviour per setting, in the If invalid column, and says so plainly where nobody has tested it.
| Behaviour | What you observe |
|---|---|
| Refused, call fails | The session does not start. The call fails within a few seconds of connecting. |
| Refused, failover answers | A language model rejects the value, and nothing surfaces as an error. Automatic failover answers that turn from another model, on its own settings, and the reply reads perfectly normally. |
| Refused, transcriber falls back | The value is caught before the session opens. The call continues on the default transcriber rather than the one you chose. |
| Ignored, default applies | The key is dropped and the default applies. The call runs normally, and nothing indicates your setting had no effect. |
| Used as sent | The call runs with your value. If it is outside the sensible range, turn-taking or delivery degrades with no error anywhere. |
| Lowered to the ceiling | The platform caps the value below the range the provider publishes, because the top of that range does not work. Anything higher is lowered rather than sent, so you get the ceiling and no error. |
| Not measured | Nobody has sent this model a value outside the range, so there is no answer to give you. Stay inside the Allowed column and treat it as advice rather than as a bound the provider was seen to enforce. |
An out-of-range value can end the call
On some models a number outside its documented range is not clamped or ignored, it is refused, and the session never opens, so the caller is dropped seconds into the call. Stay inside the ranges on these pages, and change one setting at a time on a test assistant before applying it to a live one.
The practical consequence: a setting that does nothing and a setting that ends every call look identical from the outside until you place a call.
Changing settings safely#
- Open the page for the exact model your assistant uses, not just the provider.
- Change one setting, ideally as a per-call override on a test assistant, keeping the stored value untouched.
- Place a real call. A refused value shows up immediately: the call ends within seconds of connecting.
- Listen for the effect you intended before applying it more widely. A value inside its range but wrong for your callers degrades the conversation without failing.
Next steps#
- Choosing a voice, model, and transcriber: pick the IDs you configure an assistant with.
- Multi-language calls: how language interacts with each provider.
- Creating and configuring an assistant: where voice settings are set.