From 70838b378c6b35c731c2edeef4db902f7bf2e63e Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Wed, 8 Jul 2026 14:22:38 +0500 Subject: [PATCH 01/13] fix(utils.py): support drop_params for dimensions on Azure and OpenAI compatible embedding calls Signed-off-by: Hasnaat Hussain --- litellm/utils.py | 11 +++ .../test_get_optional_params_embeddings.py | 79 +++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/litellm/utils.py b/litellm/utils.py index 05d5986885c..05cf8dcb265 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4077,6 +4077,17 @@ def get_optional_params_embeddings( if "extra_body" in final_params and len(final_params["extra_body"]) == 0: final_params.pop("extra_body", None) + # High-performance check optimized to avoid allocations in hot paths + if (litellm.drop_params is True or drop_params is True) and ( + custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers + ): + if ( + model is not None + and "text-embedding-3" not in model + and "dimensions" not in (allowed_openai_params or []) + ): + final_params.pop("dimensions", None) + return final_params diff --git a/tests/local_testing/test_get_optional_params_embeddings.py b/tests/local_testing/test_get_optional_params_embeddings.py index 60ccfbfaebe..60b71c9b849 100644 --- a/tests/local_testing/test_get_optional_params_embeddings.py +++ b/tests/local_testing/test_get_optional_params_embeddings.py @@ -160,3 +160,82 @@ def test_openai_non_text_embedding_3_drop_params_global(): assert "dimensions" not in optional_params finally: litellm.drop_params = prev_drop_params + + +def test_azure_and_openai_compatible_drop_params(): + """ + Verify that dimensions parameter is correctly dropped on Azure and OpenAI compatible calls + when drop_params is True (either per-call or globally), and raises UnsupportedParamsError + otherwise. + """ + from litellm.exceptions import UnsupportedParamsError + + prev_drop_params = litellm.drop_params + + # 1. Test Azure drop_params=True (per-call) + litellm.drop_params = False + model, custom_llm_provider, _, _ = get_llm_provider( + model="azure/dummy-model" + ) + optional_params = get_optional_params_embeddings( + model=model, + dimensions=512, + custom_llm_provider=custom_llm_provider, + drop_params=True, + ) + assert "dimensions" not in optional_params + + # 2. Test Azure drop_params=True (global) + litellm.drop_params = True + optional_params = get_optional_params_embeddings( + model=model, + dimensions=512, + custom_llm_provider=custom_llm_provider, + ) + assert "dimensions" not in optional_params + + # 3. Test Azure drop_params=False (preserves dimensions parameter) + litellm.drop_params = False + optional_params = get_optional_params_embeddings( + model=model, + dimensions=512, + custom_llm_provider=custom_llm_provider, + ) + assert "dimensions" in optional_params + assert optional_params["dimensions"] == 512 + + # 4. Test OpenAI compatible (Together AI) drop_params=True (per-call) + model, custom_llm_provider, _, _ = get_llm_provider( + model="together_ai/dummy-model" + ) + optional_params = get_optional_params_embeddings( + model=model, + dimensions=512, + custom_llm_provider=custom_llm_provider, + drop_params=True, + ) + assert "dimensions" not in optional_params + + # 5. Test OpenAI compatible (Together AI) drop_params=True (global) + litellm.drop_params = True + optional_params = get_optional_params_embeddings( + model=model, + dimensions=512, + custom_llm_provider=custom_llm_provider, + ) + assert "dimensions" not in optional_params + + # 6. Test OpenAI compatible (Together AI) drop_params=False (preserves dimensions parameter) + litellm.drop_params = False + optional_params = get_optional_params_embeddings( + model=model, + dimensions=512, + custom_llm_provider=custom_llm_provider, + ) + assert "dimensions" in optional_params + assert optional_params["dimensions"] == 512 + + # Restore state + litellm.drop_params = prev_drop_params + + From a23eeecf22cf5af5357ad73433ed3112082e719d Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Wed, 12 Aug 2026 23:12:04 +0500 Subject: [PATCH 02/13] test(utils): cover provider-specific dimension dropping Signed-off-by: Hasnaat Hussain --- .../test_get_optional_params_embeddings.py | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tests/local_testing/test_get_optional_params_embeddings.py b/tests/local_testing/test_get_optional_params_embeddings.py index 60b71c9b849..83fbfe73125 100644 --- a/tests/local_testing/test_get_optional_params_embeddings.py +++ b/tests/local_testing/test_get_optional_params_embeddings.py @@ -165,11 +165,8 @@ def test_openai_non_text_embedding_3_drop_params_global(): def test_azure_and_openai_compatible_drop_params(): """ Verify that dimensions parameter is correctly dropped on Azure and OpenAI compatible calls - when drop_params is True (either per-call or globally), and raises UnsupportedParamsError - otherwise. + when drop_params is True (either per-call or globally), while preserving it otherwise. """ - from litellm.exceptions import UnsupportedParamsError - prev_drop_params = litellm.drop_params # 1. Test Azure drop_params=True (per-call) @@ -239,3 +236,21 @@ def test_azure_and_openai_compatible_drop_params(): litellm.drop_params = prev_drop_params +@pytest.mark.parametrize("provider", ["nvidia_nim", "lm_studio", "fireworks_ai"]) +def test_dedicated_openai_compatible_providers_drop_dimensions(provider): + """Keep dedicated provider mappings reachable when dimensions is dropped.""" + prev_drop_params = litellm.drop_params + litellm.drop_params = False + try: + model, custom_llm_provider, _, _ = get_llm_provider( + model=f"{provider}/dummy-model" + ) + optional_params = get_optional_params_embeddings( + model=model, + dimensions=512, + custom_llm_provider=custom_llm_provider, + drop_params=True, + ) + assert "dimensions" not in optional_params + finally: + litellm.drop_params = prev_drop_params From 6f8999ee715162913e73eceb59dfdadd2be9c3c5 Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Wed, 12 Aug 2026 23:43:31 +0500 Subject: [PATCH 03/13] test(utils): cover embedding drop params in CI Signed-off-by: Hasnaat Hussain --- tests/llm_translation/test_optional_params.py | 32 +++++++ .../test_get_optional_params_embeddings.py | 94 ------------------- 2 files changed, 32 insertions(+), 94 deletions(-) diff --git a/tests/llm_translation/test_optional_params.py b/tests/llm_translation/test_optional_params.py index 58446014bdf..2df48d98a9f 100644 --- a/tests/llm_translation/test_optional_params.py +++ b/tests/llm_translation/test_optional_params.py @@ -1120,6 +1120,38 @@ def test_lm_studio_embedding_params(): assert len(optional_params) == 0 +@pytest.mark.parametrize("provider", ["azure", "together_ai"]) +def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provider): + previous_drop_params = litellm.drop_params + try: + litellm.drop_params = False + dropped = get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + drop_params=True, + ) + assert "dimensions" not in dropped + + litellm.drop_params = True + dropped_globally = get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + ) + assert "dimensions" not in dropped_globally + + litellm.drop_params = False + preserved = get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + ) + assert preserved["dimensions"] == 512 + finally: + litellm.drop_params = previous_drop_params + + def test_ollama_pydantic_obj(): from pydantic import BaseModel diff --git a/tests/local_testing/test_get_optional_params_embeddings.py b/tests/local_testing/test_get_optional_params_embeddings.py index 83fbfe73125..60ccfbfaebe 100644 --- a/tests/local_testing/test_get_optional_params_embeddings.py +++ b/tests/local_testing/test_get_optional_params_embeddings.py @@ -160,97 +160,3 @@ def test_openai_non_text_embedding_3_drop_params_global(): assert "dimensions" not in optional_params finally: litellm.drop_params = prev_drop_params - - -def test_azure_and_openai_compatible_drop_params(): - """ - Verify that dimensions parameter is correctly dropped on Azure and OpenAI compatible calls - when drop_params is True (either per-call or globally), while preserving it otherwise. - """ - prev_drop_params = litellm.drop_params - - # 1. Test Azure drop_params=True (per-call) - litellm.drop_params = False - model, custom_llm_provider, _, _ = get_llm_provider( - model="azure/dummy-model" - ) - optional_params = get_optional_params_embeddings( - model=model, - dimensions=512, - custom_llm_provider=custom_llm_provider, - drop_params=True, - ) - assert "dimensions" not in optional_params - - # 2. Test Azure drop_params=True (global) - litellm.drop_params = True - optional_params = get_optional_params_embeddings( - model=model, - dimensions=512, - custom_llm_provider=custom_llm_provider, - ) - assert "dimensions" not in optional_params - - # 3. Test Azure drop_params=False (preserves dimensions parameter) - litellm.drop_params = False - optional_params = get_optional_params_embeddings( - model=model, - dimensions=512, - custom_llm_provider=custom_llm_provider, - ) - assert "dimensions" in optional_params - assert optional_params["dimensions"] == 512 - - # 4. Test OpenAI compatible (Together AI) drop_params=True (per-call) - model, custom_llm_provider, _, _ = get_llm_provider( - model="together_ai/dummy-model" - ) - optional_params = get_optional_params_embeddings( - model=model, - dimensions=512, - custom_llm_provider=custom_llm_provider, - drop_params=True, - ) - assert "dimensions" not in optional_params - - # 5. Test OpenAI compatible (Together AI) drop_params=True (global) - litellm.drop_params = True - optional_params = get_optional_params_embeddings( - model=model, - dimensions=512, - custom_llm_provider=custom_llm_provider, - ) - assert "dimensions" not in optional_params - - # 6. Test OpenAI compatible (Together AI) drop_params=False (preserves dimensions parameter) - litellm.drop_params = False - optional_params = get_optional_params_embeddings( - model=model, - dimensions=512, - custom_llm_provider=custom_llm_provider, - ) - assert "dimensions" in optional_params - assert optional_params["dimensions"] == 512 - - # Restore state - litellm.drop_params = prev_drop_params - - -@pytest.mark.parametrize("provider", ["nvidia_nim", "lm_studio", "fireworks_ai"]) -def test_dedicated_openai_compatible_providers_drop_dimensions(provider): - """Keep dedicated provider mappings reachable when dimensions is dropped.""" - prev_drop_params = litellm.drop_params - litellm.drop_params = False - try: - model, custom_llm_provider, _, _ = get_llm_provider( - model=f"{provider}/dummy-model" - ) - optional_params = get_optional_params_embeddings( - model=model, - dimensions=512, - custom_llm_provider=custom_llm_provider, - drop_params=True, - ) - assert "dimensions" not in optional_params - finally: - litellm.drop_params = prev_drop_params From 27282b2d2bb95f5cce747c34a15d8189cbde40f2 Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Wed, 12 Aug 2026 23:58:52 +0500 Subject: [PATCH 04/13] test(utils): exercise embedding drop params in CI Signed-off-by: Hasnaat Hussain --- tests/llm_translation/test_optional_params.py | 32 ------------------- tests/unit/test_utils.py | 32 +++++++++++++++++++ 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/tests/llm_translation/test_optional_params.py b/tests/llm_translation/test_optional_params.py index 2df48d98a9f..58446014bdf 100644 --- a/tests/llm_translation/test_optional_params.py +++ b/tests/llm_translation/test_optional_params.py @@ -1120,38 +1120,6 @@ def test_lm_studio_embedding_params(): assert len(optional_params) == 0 -@pytest.mark.parametrize("provider", ["azure", "together_ai"]) -def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provider): - previous_drop_params = litellm.drop_params - try: - litellm.drop_params = False - dropped = get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - drop_params=True, - ) - assert "dimensions" not in dropped - - litellm.drop_params = True - dropped_globally = get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - ) - assert "dimensions" not in dropped_globally - - litellm.drop_params = False - preserved = get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - ) - assert preserved["dimensions"] == 512 - finally: - litellm.drop_params = previous_drop_params - - def test_ollama_pydantic_obj(): from pydantic import BaseModel diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 4c36f99d2c8..074bd2906ee 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -617,6 +617,38 @@ def test_cohere_embedding_optional_params(): assert optional_params is not None +@pytest.mark.parametrize("provider", ["azure", "together_ai"]) +def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provider): + previous_drop_params = litellm.drop_params + try: + litellm.drop_params = False + dropped = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + drop_params=True, + ) + assert "dimensions" not in dropped + + litellm.drop_params = True + dropped_globally = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + ) + assert "dimensions" not in dropped_globally + + litellm.drop_params = False + preserved = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + ) + assert preserved["dimensions"] == 512 + finally: + litellm.drop_params = previous_drop_params + + def validate_model_cost_values(model_data, exceptions=None): """ Validates that cost values in model data do not exceed 1. From 4f7ba33fc339eb8b840565c816b87ebcc8520b79 Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Thu, 13 Aug 2026 00:40:26 +0500 Subject: [PATCH 05/13] test(utils): cover embedding dimension guard branches Signed-off-by: Hasnaat Hussain --- litellm/utils.py | 14 +++++--------- tests/unit/test_utils.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 05cf8dcb265..4b7eb0ff86f 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4078,15 +4078,11 @@ def get_optional_params_embeddings( final_params.pop("extra_body", None) # High-performance check optimized to avoid allocations in hot paths - if (litellm.drop_params is True or drop_params is True) and ( - custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers - ): - if ( - model is not None - and "text-embedding-3" not in model - and "dimensions" not in (allowed_openai_params or []) - ): - final_params.pop("dimensions", None) + if litellm.drop_params is True or drop_params is True: + if custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers: + is_legacy_model = model is not None and "text-embedding-3" not in model + if is_legacy_model and "dimensions" not in (allowed_openai_params or []): + final_params.pop("dimensions", None) return final_params diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 074bd2906ee..d509effcc5a 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -645,6 +645,22 @@ def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provide dimensions=512, ) assert preserved["dimensions"] == 512 + + litellm.drop_params = True + model_supported = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/text-embedding-3-small", + custom_llm_provider=provider, + dimensions=512, + ) + assert model_supported["dimensions"] == 512 + + explicitly_allowed = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/legacy-model", + custom_llm_provider=provider, + dimensions=512, + allowed_openai_params=["dimensions"], + ) + assert explicitly_allowed["dimensions"] == 512 finally: litellm.drop_params = previous_drop_params From 8f0df20d92ac90f7ed817237cb911f5639c1226a Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Thu, 13 Aug 2026 00:52:27 +0500 Subject: [PATCH 06/13] test(utils): simplify dimension guard coverage Signed-off-by: Hasnaat Hussain --- litellm/utils.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 4b7eb0ff86f..d68054dbb49 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4078,11 +4078,14 @@ def get_optional_params_embeddings( final_params.pop("extra_body", None) # High-performance check optimized to avoid allocations in hot paths - if litellm.drop_params is True or drop_params is True: - if custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers: - is_legacy_model = model is not None and "text-embedding-3" not in model - if is_legacy_model and "dimensions" not in (allowed_openai_params or []): - final_params.pop("dimensions", None) + if ( + (litellm.drop_params is True or drop_params is True) + and (custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers) + and model is not None + and "text-embedding-3" not in model + and "dimensions" not in (allowed_openai_params or []) + ): + final_params.pop("dimensions", None) return final_params From 009f19dc78319f5848d1472ed8d76953d4bbbc20 Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Thu, 13 Aug 2026 01:17:50 +0500 Subject: [PATCH 07/13] test(utils): cover embedding dimensions in core-utils shard Signed-off-by: Hasnaat Hussain --- .../test_embedding_optional_params.py | 51 +++++++++++++++++++ tests/unit/test_utils.py | 48 ----------------- 2 files changed, 51 insertions(+), 48 deletions(-) create mode 100644 tests/unit/litellm_core_utils/test_embedding_optional_params.py diff --git a/tests/unit/litellm_core_utils/test_embedding_optional_params.py b/tests/unit/litellm_core_utils/test_embedding_optional_params.py new file mode 100644 index 00000000000..6a044a5680a --- /dev/null +++ b/tests/unit/litellm_core_utils/test_embedding_optional_params.py @@ -0,0 +1,51 @@ +import pytest + +import litellm + + +@pytest.mark.parametrize("provider", ["azure", "together_ai"]) +def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provider): + previous_drop_params = litellm.drop_params + try: + litellm.drop_params = False + dropped = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + drop_params=True, + ) + assert "dimensions" not in dropped + + litellm.drop_params = True + dropped_globally = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + ) + assert "dimensions" not in dropped_globally + + litellm.drop_params = False + preserved = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + ) + assert preserved["dimensions"] == 512 + + litellm.drop_params = True + model_supported = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/text-embedding-3-small", + custom_llm_provider=provider, + dimensions=512, + ) + assert model_supported["dimensions"] == 512 + + explicitly_allowed = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/legacy-model", + custom_llm_provider=provider, + dimensions=512, + allowed_openai_params=["dimensions"], + ) + assert explicitly_allowed["dimensions"] == 512 + finally: + litellm.drop_params = previous_drop_params diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index d509effcc5a..4c36f99d2c8 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -617,54 +617,6 @@ def test_cohere_embedding_optional_params(): assert optional_params is not None -@pytest.mark.parametrize("provider", ["azure", "together_ai"]) -def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provider): - previous_drop_params = litellm.drop_params - try: - litellm.drop_params = False - dropped = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - drop_params=True, - ) - assert "dimensions" not in dropped - - litellm.drop_params = True - dropped_globally = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - ) - assert "dimensions" not in dropped_globally - - litellm.drop_params = False - preserved = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - ) - assert preserved["dimensions"] == 512 - - litellm.drop_params = True - model_supported = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/text-embedding-3-small", - custom_llm_provider=provider, - dimensions=512, - ) - assert model_supported["dimensions"] == 512 - - explicitly_allowed = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/legacy-model", - custom_llm_provider=provider, - dimensions=512, - allowed_openai_params=["dimensions"], - ) - assert explicitly_allowed["dimensions"] == 512 - finally: - litellm.drop_params = previous_drop_params - - def validate_model_cost_values(model_data, exceptions=None): """ Validates that cost values in model data do not exceed 1. From 5778bc8a1604e56d4c2e90877b0b6f0330490d01 Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Thu, 13 Aug 2026 01:28:29 +0500 Subject: [PATCH 08/13] fix(utils): avoid mutable fallback in dimension guard Signed-off-by: Hasnaat Hussain --- litellm/utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index d68054dbb49..bcb2142557e 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4077,13 +4077,12 @@ def get_optional_params_embeddings( if "extra_body" in final_params and len(final_params["extra_body"]) == 0: final_params.pop("extra_body", None) - # High-performance check optimized to avoid allocations in hot paths if ( (litellm.drop_params is True or drop_params is True) and (custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers) and model is not None and "text-embedding-3" not in model - and "dimensions" not in (allowed_openai_params or []) + and "dimensions" not in (allowed_openai_params or ()) ): final_params.pop("dimensions", None) From 8d3aea04ec1fac7b7eb3aee7962b1ff64a2a5b4b Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Thu, 13 Aug 2026 01:45:25 +0500 Subject: [PATCH 09/13] fix(utils): preserve optional drop params type Signed-off-by: Hasnaat Hussain --- litellm/utils.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index bcb2142557e..783cae45657 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3745,6 +3745,9 @@ def get_optional_params_embeddings( passed_params.pop("drop_params", None) drop_params = normalize_drop_params(drop_params) + resolved_drop_params = drop_params + if resolved_drop_params is None: + resolved_drop_params = normalize_drop_params(litellm.drop_params) passed_params.pop("additional_drop_params", None) passed_params.pop("allowed_openai_params", None) allowed_openai_params = allowed_openai_params or [] @@ -3791,7 +3794,7 @@ def get_optional_params_embeddings( non_default_params=non_default_params, optional_params={}, model=model, - drop_params=drop_params if drop_params is not None else False, + drop_params=resolved_drop_params, ) # Provider-only params (e.g. Cohere input_type) are not in # OPENAI_EMBEDDING_PARAMS, so embedding_pre_process drops them from @@ -4078,9 +4081,8 @@ def get_optional_params_embeddings( final_params.pop("extra_body", None) if ( - (litellm.drop_params is True or drop_params is True) + (litellm.drop_params is True or resolved_drop_params is True) and (custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers) - and model is not None and "text-embedding-3" not in model and "dimensions" not in (allowed_openai_params or ()) ): From c7368f6f583512a0717433818f7f35944f0e9688 Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Sun, 30 Aug 2026 19:00:11 +0500 Subject: [PATCH 10/13] fix: preserve mapped embedding dimensions Signed-off-by: Hasnaat Hussain --- litellm/utils.py | 16 ++++++------- .../test_embedding_optional_params.py | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 783cae45657..5f814bc57a2 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4068,6 +4068,14 @@ def get_optional_params_embeddings( optional_params = non_default_params else: optional_params = non_default_params + if ( + (litellm.drop_params is True or resolved_drop_params is True) + and (custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers) + and "text-embedding-3" not in model + and "dimensions" in optional_params + and "dimensions" not in allowed_openai_params + ): + optional_params.pop("dimensions", None) final_params = add_provider_specific_params_to_optional_params( optional_params=optional_params, @@ -4080,14 +4088,6 @@ def get_optional_params_embeddings( if "extra_body" in final_params and len(final_params["extra_body"]) == 0: final_params.pop("extra_body", None) - if ( - (litellm.drop_params is True or resolved_drop_params is True) - and (custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers) - and "text-embedding-3" not in model - and "dimensions" not in (allowed_openai_params or ()) - ): - final_params.pop("dimensions", None) - return final_params diff --git a/tests/unit/litellm_core_utils/test_embedding_optional_params.py b/tests/unit/litellm_core_utils/test_embedding_optional_params.py index 6a044a5680a..a5381f67c71 100644 --- a/tests/unit/litellm_core_utils/test_embedding_optional_params.py +++ b/tests/unit/litellm_core_utils/test_embedding_optional_params.py @@ -49,3 +49,27 @@ def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provide assert explicitly_allowed["dimensions"] == 512 finally: litellm.drop_params = previous_drop_params + + +@pytest.mark.parametrize( + ("provider", "model"), + [ + ("nvidia_nim", "nvidia_nim/nv-embedqa-e5-v5"), + ("fireworks_ai", "fireworks_ai/nomic-ai/nomic-embed-text-v1.5"), + ("dashscope", "dashscope/text-embedding-v3"), + ("hosted_vllm", "hosted_vllm/Qwen/Qwen3-Embedding-0.6B"), + ], +) +def test_embedding_dimensions_preserved_for_provider_mappings(provider, model): + previous_drop_params = litellm.drop_params + try: + litellm.drop_params = True + optional_params = litellm.utils.get_optional_params_embeddings( + model=model, + custom_llm_provider=provider, + dimensions=128, + ) + finally: + litellm.drop_params = previous_drop_params + + assert optional_params["dimensions"] == 128 From b80f63c8b93ca08e30e24456d2532a7618d8b2f3 Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Sun, 30 Aug 2026 19:04:27 +0500 Subject: [PATCH 11/13] test: avoid global embedding setting mutation Signed-off-by: Hasnaat Hussain --- .../test_embedding_optional_params.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/tests/unit/litellm_core_utils/test_embedding_optional_params.py b/tests/unit/litellm_core_utils/test_embedding_optional_params.py index a5381f67c71..100d72baa74 100644 --- a/tests/unit/litellm_core_utils/test_embedding_optional_params.py +++ b/tests/unit/litellm_core_utils/test_embedding_optional_params.py @@ -61,15 +61,11 @@ def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provide ], ) def test_embedding_dimensions_preserved_for_provider_mappings(provider, model): - previous_drop_params = litellm.drop_params - try: - litellm.drop_params = True - optional_params = litellm.utils.get_optional_params_embeddings( - model=model, - custom_llm_provider=provider, - dimensions=128, - ) - finally: - litellm.drop_params = previous_drop_params + optional_params = litellm.utils.get_optional_params_embeddings( + model=model, + custom_llm_provider=provider, + dimensions=128, + drop_params=True, + ) assert optional_params["dimensions"] == 128 From 9071e58a205a67e62aa28a2740bdad99bea329ae Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Sun, 30 Aug 2026 19:31:51 +0500 Subject: [PATCH 12/13] test: isolate embedding drop params setting Signed-off-by: Hasnaat Hussain --- .../test_embedding_optional_params.py | 78 +++++++++---------- 1 file changed, 37 insertions(+), 41 deletions(-) diff --git a/tests/unit/litellm_core_utils/test_embedding_optional_params.py b/tests/unit/litellm_core_utils/test_embedding_optional_params.py index 100d72baa74..376467685be 100644 --- a/tests/unit/litellm_core_utils/test_embedding_optional_params.py +++ b/tests/unit/litellm_core_utils/test_embedding_optional_params.py @@ -4,51 +4,47 @@ import litellm @pytest.mark.parametrize("provider", ["azure", "together_ai"]) -def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provider): - previous_drop_params = litellm.drop_params - try: - litellm.drop_params = False - dropped = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - drop_params=True, - ) - assert "dimensions" not in dropped +def test_embedding_dimensions_drop_params_for_openai_compatible_provider(provider, monkeypatch): + monkeypatch.setattr(litellm, "drop_params", False) + dropped = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + drop_params=True, + ) + assert "dimensions" not in dropped - litellm.drop_params = True - dropped_globally = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - ) - assert "dimensions" not in dropped_globally + monkeypatch.setattr(litellm, "drop_params", True) + dropped_globally = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + ) + assert "dimensions" not in dropped_globally - litellm.drop_params = False - preserved = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/dummy-model", - custom_llm_provider=provider, - dimensions=512, - ) - assert preserved["dimensions"] == 512 + monkeypatch.setattr(litellm, "drop_params", False) + preserved = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/dummy-model", + custom_llm_provider=provider, + dimensions=512, + ) + assert preserved["dimensions"] == 512 - litellm.drop_params = True - model_supported = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/text-embedding-3-small", - custom_llm_provider=provider, - dimensions=512, - ) - assert model_supported["dimensions"] == 512 + monkeypatch.setattr(litellm, "drop_params", True) + model_supported = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/text-embedding-3-small", + custom_llm_provider=provider, + dimensions=512, + ) + assert model_supported["dimensions"] == 512 - explicitly_allowed = litellm.utils.get_optional_params_embeddings( - model=f"{provider}/legacy-model", - custom_llm_provider=provider, - dimensions=512, - allowed_openai_params=["dimensions"], - ) - assert explicitly_allowed["dimensions"] == 512 - finally: - litellm.drop_params = previous_drop_params + explicitly_allowed = litellm.utils.get_optional_params_embeddings( + model=f"{provider}/legacy-model", + custom_llm_provider=provider, + dimensions=512, + allowed_openai_params=["dimensions"], + ) + assert explicitly_allowed["dimensions"] == 512 @pytest.mark.parametrize( From 601f9d32032d6657dacd7ce896921f6069d8135f Mon Sep 17 00:00:00 2001 From: Hasnaat Hussain Date: Sun, 30 Aug 2026 19:46:33 +0500 Subject: [PATCH 13/13] fix: handle optional embedding parameter allowlist Signed-off-by: Hasnaat Hussain --- litellm/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index 5f814bc57a2..0ca4f945414 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4073,7 +4073,7 @@ def get_optional_params_embeddings( and (custom_llm_provider == "azure" or custom_llm_provider in litellm.openai_compatible_providers) and "text-embedding-3" not in model and "dimensions" in optional_params - and "dimensions" not in allowed_openai_params + and "dimensions" not in (allowed_openai_params or ()) ): optional_params.pop("dimensions", None)