language to multi, but the base config ships en. A freshly created STT config therefore disagrees with itself until the user explicitly picks a provider and language. If a config "looks fine" but transcribes the wrong language, suspect this default-vs-base drift before anything else.
STT provider live
What it is. Which STT vendor transcribes the call: Deepgram (cloud default), Freya STT (self-hosted), OpenAI (Whisper), or a custom OpenAI-compatible endpoint. This single choice decides which branch of the factory runs and which downstream settings (language, temperature, prompt, base url) even apply.
Runtime. create_stt_service() at base_service.py:598 branches on the provider string: Freya base_service.py:637, Deepgram base_service.py:668, OpenAI base_service.py:696, custom base_service.py:712.
- When to change: cloud demos use Deepgram; any on-prem or TR-regulated deployment must use Freya STT (on-prem mode forces it for you).
Symptom it fixes: calls transcribe in the wrong language, or hit a cloud vendor on an air-gapped box, because the provider was left on Deepgram/OpenAI when the deployment is on-prem.
STT model live
What it is. The model identifier within the chosen provider, e.g. nova-3 for Deepgram or freya-stt for Freya. The factory hands this string straight to the provider SDK constructor.
Runtime. Passed as model= into the provider SDK constructor at base_service.py:653,671,699. The dashboard seeds the default additionalSettings object at defaults.ts:160.
- When to change: stick with the workspace default unless A/B testing a new model build.
Symptom it fixes: SDK constructor errors or unexpectedly poor accuracy from a model id the selected provider does not serve.
sttConfig.additionalSettings object (defaults.ts:160)
The dashboard seeds STT config with { keyterms: 'Freya', aicEnabled: false, deepFilterEnabled: false, webrtcApmEnabled: false, punctuate: true, diarize: false } — the three filters are false, punctuate is true, diarize is false, and keyterms seeds the single term 'Freya'. The filter and keyterm settings are covered in Part 6 (audio filters) and Part 8 (keyterms); they appear here only so you know what a fresh STT config starts with.
STT language on-prem forced
What it is. The language the recognizer expects. Deepgram and OpenAI accept a code or multi. Freya STT is single-language only, and on-prem mode forces Language.TR regardless of dashboard config.
Runtime. Read at base_service.py:602. The Freya / on-prem branch sets language=Language.TR at base_service.py:645 and again at base_service.py:655, regardless of dashboard config. The dashboard UI hides the language selector and disallows multi-language for Freya STT at stt-config-panel.tsx:415-417 and stt-config-panel.tsx:655.
- When to change: TR calls on Freya are fixed; multi-language only works on Deepgram/OpenAI cloud.
Symptom it fixes: "it transcribes my Turkish as garbled English" on a multilingual provider — on Freya it can't happen, because lines 645 and 655 pin it to Language.TR.
Language.TR regardless of what the dashboard shows. The dashboard UI itself hides the language selector and disallows multi-language for Freya STT (stt-config-panel.tsx:415-417,655), and the agent enforces the same at runtime (base_service.py:645,655). Do not waste time changing provider or language in the dashboard for an on-prem call; the override wins.
Temperature live
What it is. Sampling temperature for the STT decoder (OpenAI/Whisper-style). Lower is more deterministic; higher lets the decoder gamble on alternative transcriptions.
Runtime. Passed as temperature= on the OpenAI path at base_service.py:701. Deepgram and Freya STT ignore it.
- When to change: leave at default; only relevant for OpenAI-compatible STT, where 0 is the safe choice.
Symptom it fixes: transcripts that vary run-to-run on the same audio, because temperature was raised above 0.
Transcription prompt live
What it is. A style/continuation prompt that biases how the STT model formats and interprets audio — expected domain vocabulary (IBANs, card numbers, Turkish names), punctuation style. It does not run the model differently; it nudges formatting and lexical choices toward the context you describe.
Runtime. Passed as prompt= into the STT service at base_service.py:614,654,702,759,796 across the provider branches.
- When to change: prime the recognizer for a domain ("This is a banking call. Expect IBANs, card numbers, Turkish names."). The prompt should match the audio language.
Symptom it fixes: "it keeps mishearing domain terms" — a transcription prompt plus keyterms (Part 8) is the combined fix.
Custom base URL & API key live
What it is. For provider = custom, the OpenAI-compatible STT endpoint and key pointing at a self-hosted Whisper or a third-party STT not natively integrated.
Runtime. Used in the custom branch at base_service.py:712 (URL wiring 713-718), with the API key applied at base_service.py:780 (715,780-798).
- When to change: bring-your-own STT (rare) — self-hosted Whisper or a third-party service.
Symptom it fixes: custom STT returns 401 / connection errors because base url or api key was left blank or pointed at the wrong host.
Try it — STT resolution explainer
Try it — Transcription-prompt effect (illustrative)
Language.TR in create_stt_service (base_service.py:645,655) and confirm the dashboard hides the language selector for Freya STT at stt-config-panel.tsx:415-417."prompt= is threaded into each provider branch of base_service.py (lines 614, 654, 702, 759, 796) and tell me which providers actually forward it to the SDK."