From d698b41a3f28b503486c16163286e3ce85981496 Mon Sep 17 00:00:00 2001 From: Gabrielle Gauthier-Melancon Date: Wed, 29 Apr 2026 23:34:25 -0400 Subject: [PATCH] Classify Ultravox as AUDIO_LLM in get_pipeline_type Ultravox is wired through the s2s code path (UltravoxRealtimeLLMService) because that's the right plumbing, but semantically it's an audio-LLM (audio in, text out + bundled audio synthesis), not an end-to-end S2S model. Mirror the existing ElevenLabs special case so metrics route through the AUDIO_LLM postprocessor branch (audit_log assistant trace, pipecat tts_text/llm_response, speakability) instead of the S2S branch. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/eva/models/config.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/eva/models/config.py b/src/eva/models/config.py index ee3836a6..338d4097 100644 --- a/src/eva/models/config.py +++ b/src/eva/models/config.py @@ -349,10 +349,13 @@ def get_pipeline_type(model_data: dict | Any) -> PipelineType: """ mode = _model_config_discriminator(model_data) if mode == "s2s": - # ElevenLabs uses s2s_params for configuration but is a cascade pipeline internally s2s_value = model_data.get("s2s") + # ElevenLabs uses s2s_params for configuration but is a cascade pipeline internally if s2s_value == "elevenlabs": return PipelineType.CASCADE + # Ultravox uses s2s_params for plumbing but is an audio-LLM (audio in, text out, separate TTS) + if s2s_value == "ultravox": + return PipelineType.AUDIO_LLM return PipelineType.S2S if mode == "audio_llm": return PipelineType.AUDIO_LLM