diff --git a/litellm/utils.py b/litellm/utils.py index 211f58f3104..d9aeaa53a6b 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4033,6 +4033,9 @@ def _get_non_default_params(passed_params: dict, default_params: dict, additiona return non_default_params +_OPENAI_SDK_ONLY_TRANSCRIPTION_PARAMS: Final = frozenset(("languages", "keywords", "stream")) + + def get_optional_params_transcription( model: str, custom_llm_provider: str, @@ -4060,16 +4063,13 @@ def get_optional_params_transcription( for k, v in special_params.items(): passed_params[k] = v - default_params: Final = { - "language": None, - "languages": None, - "keywords": None, - "prompt": None, - "response_format": None, - "temperature": None, # openai defaults this to 0 - "timestamp_granularities": None, - "stream": None, - } + sends_through_openai_sdk: Final = custom_llm_provider in ("openai", "azure") + transcription_params: Final = ( + OPENAI_TRANSCRIPTION_PARAMS + if sends_through_openai_sdk + else [param for param in OPENAI_TRANSCRIPTION_PARAMS if param not in _OPENAI_SDK_ONLY_TRANSCRIPTION_PARAMS] + ) + default_params: Final = {param: None for param in (*transcription_params, "prompt", "temperature")} non_default_params = {k: v for k, v in passed_params.items() if (k in default_params and v != default_params[k])} optional_params = {} @@ -4122,7 +4122,7 @@ def get_optional_params_transcription( optional_params=optional_params, passed_params=passed_params, custom_llm_provider=custom_llm_provider, - openai_params=OPENAI_TRANSCRIPTION_PARAMS, + openai_params=transcription_params, additional_drop_params=kwargs.get("additional_drop_params", None), ) extra_body: Final = optional_params.get("extra_body") diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index b0d2546774e..8a34e00966e 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -103,6 +103,7 @@ from litellm.utils import ( client, get_non_default_completion_params, get_optional_params_image_gen, + get_optional_params_transcription, get_prompt_cache_min_tokens, get_supported_openai_params, get_token_count, @@ -10498,6 +10499,25 @@ def test_get_provider_audio_transcription_config_resolves_for_every_provider() - assert isinstance(configs[LlmProviders.OPENAI], litellm.OpenAIWhisperAudioTranscriptionConfig) + +@pytest.mark.parametrize( + ("custom_llm_provider", "model"), + [ + ("groq", "whisper-large-v3"), + ("deepgram", "nova-3"), + ("mistral", "voxtral-mini-latest"), + ("elevenlabs", "scribe_v1"), + ("fireworks_ai", "whisper-v3"), + ], +) +def test_openai_sdk_transcription_params_pass_through_to_other_providers(custom_llm_provider: str, model: str) -> None: + hints: Final = {"stream": True, "languages": ["en"], "keywords": ["LiteLLM"]} + + params: Final = get_optional_params_transcription(model=model, custom_llm_provider=custom_llm_provider, **hints) + + forwarded: Final = {**params.get("extra_body", {}), **params} + assert {key: forwarded.get(key) for key in hints} == hints + @pytest.mark.parametrize( ("model", "optional_params", "expected_response_format"), [