Server Config Schema

View as Markdown

This reference lists every YAML server-configuration key that NeMo Labs Voice Agent reads, including its type, default, and consumer. The content is derived from examples/generic_voice_agent/server/server_configs/default.yaml, nemo_voice_agent/utils/config_manager.py, nemo_voice_agent/pipecat/services/nemo/builders.py, and the three service factories: get_stt_service_from_config, get_llm_service_from_config, and get_tts_service_from_config.

For task-oriented editing instructions, refer to Server Configuration.

This reference is hand-maintained. The configuration uses plain OmegaConf dictionaries that each call site reads with .get(), so no schema class is available to generate the tables. Treat the named source files as authoritative, and open an issue if you find drift.

How a Config Resolves

The server resolves a configuration in the following order before any service builders consume it.

  1. ConfigManager loads the top-level YAML (SERVER_CONFIG_PATH, else server_configs/default.yaml) and resolves all OmegaConf interpolation such as ${llm.temperature}.
  2. For each of stt, llm, tts it picks a sub-config: the basename of that block’s model_config key, else the yaml_id from model_registry.yaml when server.use_model_registry is true. Only the basename is used — the file is always loaded from <server_base_path>/server_configs/{stt,llm,tts}_configs/.
  3. The sub-config overwrites the top-level block, key by key. Setting a key in default.yaml that the sub-config also sets has no effect. Overrides are logged at INFO.
  4. The server logs the fully resolved configuration at startup as Server config: .... Use that entry to confirm which values took effect.

“Required” below means the code reads the key without a fallback, so the server raises if it is missing.

server

The server block controls model-registry lookup and evaluation-server logging and startup behavior.

KeyTypeDefaultConsumed by
use_model_registrybooltrueConfigManager — gates loading model_registry.yaml
log_filestring"bot_server.log"resolve_log_file_path in builders.py; evaluation/bot_server.py
log_levelstring"DEBUG"same
create_new_logboolfalsesame — roll the previous log aside on startup
overwrite_existing_logboolfalseoverwrite_existing_log in builders.py — delete (true) vs. rename (false)
talk_firstbooltrueevaluation/bot_server.py — queue the first LLM turn on client-ready

The example server examples/generic_voice_agent/server/server.py calls setup_logging() with no arguments and passes talk_first=True literally. The five logging and talk_first keys above therefore take effect only in evaluation/bot_server.py or in your own bot script that wires them through the builders.

transport

The transport block controls WebSocket audio framing, sample rates, and optional audio recording.

KeyTypeDefaultConsumed by
audio_out_10ms_chunksintrequired (shipped: 8)build_ws_transport — larger values reduce TTS glitches
audio_in_sample_rateint16000build_ws_transport, build_vad_analyzer
audio_out_sample_rateint or nullnullbuild_ws_transport
audio_in_frame_len_secsfloat0.016ConfigManager — websocket frame length feeding STT buffering
record_audio_databoolfalsebuild_audio_logger — returns None when false
audio_log_dirstring"./audio_logs"build_audio_logger

Refer to Audio Logging for the on-disk layout.

vad

The code reads all four voice activity detection (VAD) keys without a fallback and passes them to Pipecat’s VADParams. VAD is not optional: build_vad_analyzer always returns a SileroVADAnalyzer.

KeyTypeShipped valueMeaning
confidencefloat0.6speech-vs-nonspeech threshold
start_secsfloat0.1minimum speech before user-start
stop_secsfloat1.2minimum silence before user-stop
min_volumefloat0.4microphone volume gate

vad.type appears in the shipped configs but is not read by any code — Silero is always used.

stt

The stt block selects and configures the local or hosted speech-to-text (STT) backend.

KeyTypeDefaultConsumed by
typenemo | nvidiarequiredget_stt_service_from_config (asserted)
modelstringrequiredboth backends
model_configpathnoneConfigManager — basename selects the file under stt_configs/
devicestringrequired for nemoNemoSTTService
sample_rateint16000both backends
att_context_sizelist[70, 1]NeMoSTTInputParams — left/right streaming context
frame_len_in_secsfloat0.08NeMoSTTInputParams
audio_chunk_size_in_secsfloat0.08derives buffer_size when it is unset
buffer_sizeintaudio_chunk_size_in_secs // transport.audio_in_frame_len_secsNeMoSTTInputParams
ignore_eou_eobboolfalseNemoSTTService — ignore end-of-utterance/barge-in tokens
ttfs_p99_latencyfloat or nullnullNemoSTTService
serverstring"grpc.nvcf.nvidia.com:443"nvidia backend only
function_idstringvalue in default_nvidia.yamlnvidia backend — paired with model; change both together
languagestring"en-US"nvidia backend
api_keystring"None", overridden by NVIDIA_API_KEYnvidia backend

For more detail, refer to ASR.

diar

The diar block enables speaker diarization and sets its model and detection parameters.

KeyTypeDefaultConsumed by
enabledboolrequiredConfigManager, build_diar — returns None when false
modelstringrequired when enabledNemoDiarService
thresholdfloatrequired when enabled (shipped: 0.5)NeMoDiarInputParams — lower is more sensitive
frame_len_in_secsfloatrequired when enabled (shipped: 0.08)NeMoDiarInputParams

diar.type and diar.device are present in the shipped configs but not read: build_diar reuses stt.device for the diarizer. For more detail, refer to Diarization.

turn_taking

The turn_taking block controls backchannel handling and interruption timing.

KeyTypeDefaultConsumed by
enabledbooltrueConfigManager, build_turn_taking — returns None when false
backchannel_phrases_pathpath, list, or nullrequired when enabledNeMoTurnTakingService; a relative path is tried against the CWD then the server base dir, and a missing file raises
max_buffer_sizeintrequired when enabled (shipped: 2)word count above which a non-backchannel utterance interrupts immediately
bot_stop_delayfloatrequired when enabled (shipped: 0.5)seconds of server and client audio slack before bot-stop is honored

Disabling turn-taking also changes turn detection ownership: build_context_and_aggregators falls back to VAD-driven strategies in the user aggregator. For more detail, refer to Turn Taking.

llm

The llm block selects and configures the large language model (LLM) backend. The following keys apply to all backends:

KeyTypeDefaultConsumed by
typeauto | hf | vllm | nvidiarequiredget_llm_service_from_config; auto probes vLLM and falls back to HF
modelstringrequiredConfigManager, all backends
model_configpathnoneConfigManager — basename selects the file under llm_configs/; setting it short-circuits registry lookup
dtypestringrequired for hf and vllmHF service; prefixed onto vllm_server_params as --dtype when absent there
devicestringrequired for hfHF service
system_promptstring or pathbuilt-in fallbackConfigManager — read as a file if the value is an existing path, else used literally
system_rolestring"system"ConfigManager — use "user" for models without a system role
system_prompt_suffixstringnoneConfigManager — appended to the prompt on a new line
enable_reasoningboolfalseConfigManager — swaps to the sibling *_think.yaml only for registry-resolved models whose entry sets reasoning_supported: true
enable_tool_callingboolfalseserver.py — gates register_direct_tools_to_llm
function_call_timeout_secsfloat or null10.0all backends; null restores Pipecat’s unbounded wait
inject_dummy_user_messageboolfalsebuild_context_and_aggregators
dummy_user_messagestring"Hello."build_context_and_aggregators, only when the above is true

Hugging Face backend:

KeyTypeDefault
generation_kwargsdict{} — passed to model.generate()
apply_chat_template_kwargsdictnone — passed to tokenizer.apply_chat_template(); tokenize is forced off
reasoning_budgetint0

vLLM backend, described in vLLM:

KeyTypeDefault
api_keystring"None"
base_urlstring"http://localhost:8000/v1"
organizationstring"None"
projectstring"None"
default_headersdictnone
start_vllm_on_initboolfalse
vllm_server_paramsstringnone — appended to vllm serve <model>
vllm_generation_paramsdictPipecat defaults — cast to OpenAILLMService.Settings; put model-specific fields under its extra sub-key

NVIDIA hosted backend, described in NVIDIA NIM:

KeyTypeDefault
base_urlstring"https://integrate.api.nvidia.com/v1"
api_keystring"None"; NVIDIA_API_KEY wins, or NVIDIA_INFERENCE_API_KEY when base_url is https://inference-api.nvidia.com/v1. Both endpoints raise if the key is unset
default_headersdictnone
nvidia_generation_paramsdictPipecat defaults — same Settings cast and extra sub-key as vLLM

Omni and multimodal keys, read by server.py to insert a UserAudioBuffer and described in Multimodal:

KeyTypeDefault
is_omni_modelboolfalse — the switch that inserts the buffer
pre_cache_duration_secsfloat0.3
use_stt_transcriptboolfalse
keep_only_last_audio_turnboolfalse
text_prompt_for_audiostringnone
text_prompt_for_transcriptstringnone — used only when use_stt_transcript is true

tts

The tts block selects the text-to-speech (TTS) backend and configures its model, voice, and retry behavior.

KeyTypeDefaultConsumed by
typenemo | nvidia | nemotronrequiredget_tts_service_from_config (asserted); only nvidia selects the hosted service, the others dispatch on model
modelstringrequiredlocal types must be fastpitch-hifigan, magpie, or kokoro — the value selects the service class; for nvidia it is the NVCF model name
model_configpathnoneConfigManager — basename selects the file under tts_configs/
devicestring"cuda"local services
main_model_idstringper sub-configprimary checkpoint (FastPitch, Magpie, or Kokoro repository ID)
sub_model_idstring or nullper sub-configHiFi-GAN checkpoint, or the Kokoro voice
speedfloat1.0Kokoro only (shipped Kokoro config: 1.25)
languagestring"en"Magpie local; "en-US" for the nvidia service
speakerstring"Sofia"Magpie local
apply_TNboolfalseMagpie local — text normalization
think_tokenslist or nullnullskip synthesis between the tokens, such as the <think> span
ignore_stringslist or nullnullcharacters stripped before synthesis (shipped: * and <unk>)
serverstring"grpc.nvcf.nvidia.com:443"nvidia service
function_idstringvalue in default_nvidia.yamlnvidia service — paired with model
voice_idstring"Magpie-Multilingual.EN-US.Aria"nvidia service
api_keystring"None", overridden by NVIDIA_API_KEYnvidia service
max_retriesint2nvidia service — retry a stream that failed before emitting audio; 0 for single-shot
retry_backoff_secsfloat0.25nvidia service

Text segmentation keys, read by build_text_aggregator for the LLMTextProcessor placed upstream of TTS. Only extra_separator appears in the shipped YAML files — every tts_configs/*.yaml sets it to [',', '\n', '.', '?', '!', ';'], which the merged TTS config hands to build_text_aggregator. The other three are absent, so their defaults apply unless you add them:

KeyTypeDefault
use_text_aggregatorbooltrue — false drops the processor from the pipeline entirely
extra_separatorlist or nullnull in code, but every shipped tts_configs/*.yaml sets [',', '\n', '.', '?', '!', ';'] — extra punctuation to split on for lower first-audio latency
min_sentence_lengthint5
use_legacy_eos_detectionboolfalse

Use these pages for task-oriented configuration guidance and related runtime references.