From c37cbb7fdeef21e9c056cdf69fbff32b07cda610 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 | 19 +++++ .../test_get_optional_params_embeddings.py | 79 +++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/litellm/utils.py b/litellm/utils.py index 5e9e115ed54..94577745e23 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3430,7 +3430,15 @@ def get_optional_params_embeddings( special_params: Final = passed_params.pop("kwargs") drop_params = passed_params.pop("drop_params", None) + if drop_params is None: + drop_params = special_params.pop("drop_params", None) + if drop_params is None: + drop_params = litellm.drop_params or False + additional_drop_params = passed_params.pop("additional_drop_params", None) + if additional_drop_params is None: + additional_drop_params = special_params.pop("additional_drop_params", None) + allowed_openai_params = passed_params.pop("allowed_openai_params", None) or [] # Remove function objects from passed_params to avoid JSON serialization errors passed_params.pop("get_supported_openai_params", None) @@ -3761,6 +3769,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 b5bf48331c066500b891a07b5cd828faec3402a7 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 6b2a5e7deba87294e70d189d2b8291892f4b6849 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 --- litellm/utils.py | 4 - tests/llm_translation/test_optional_params.py | 32 +++++++ .../test_get_optional_params_embeddings.py | 94 ------------------- 3 files changed, 32 insertions(+), 98 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 94577745e23..7327816cd89 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3430,14 +3430,10 @@ def get_optional_params_embeddings( special_params: Final = passed_params.pop("kwargs") drop_params = passed_params.pop("drop_params", None) - if drop_params is None: - drop_params = special_params.pop("drop_params", None) if drop_params is None: drop_params = litellm.drop_params or False additional_drop_params = passed_params.pop("additional_drop_params", None) - if additional_drop_params is None: - additional_drop_params = special_params.pop("additional_drop_params", None) allowed_openai_params = passed_params.pop("allowed_openai_params", None) or [] # Remove function objects from passed_params to avoid JSON serialization errors diff --git a/tests/llm_translation/test_optional_params.py b/tests/llm_translation/test_optional_params.py index 997f5b3b73f..017857f0f77 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 32fe2cb73cc53cd64010b287da032d9ccbba9bd9 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/test_litellm/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 017857f0f77..997f5b3b73f 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/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 6524353aa48..aaccf28110b 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -733,6 +733,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 76e15655c2f12f5728c0f298579dfe91a19ea989 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/test_litellm/test_utils.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 7327816cd89..891a2e350ba 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3766,15 +3766,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/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index aaccf28110b..438c0e39908 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -761,6 +761,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 09fcacbaf9005fea50ea324af0cd44437f0be823 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 | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 891a2e350ba..4bc3d9e2a9b 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3430,8 +3430,7 @@ def get_optional_params_embeddings( special_params: Final = passed_params.pop("kwargs") drop_params = passed_params.pop("drop_params", None) - if drop_params is None: - drop_params = litellm.drop_params or False + drop_params = litellm.drop_params or False if drop_params is None else drop_params additional_drop_params = passed_params.pop("additional_drop_params", None) @@ -3766,11 +3765,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 17cdd165cbfb144ebe20374af3f6e38bb2bc7f0c 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/test_litellm/test_utils.py | 48 ----------------- 2 files changed, 51 insertions(+), 48 deletions(-) create mode 100644 tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py diff --git a/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py b/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py new file mode 100644 index 00000000000..6a044a5680a --- /dev/null +++ b/tests/test_litellm/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/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 438c0e39908..6524353aa48 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -733,54 +733,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 ec0fdf35ddffd80f985a25d42cfaf0db1dfecf5d 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 4bc3d9e2a9b..ec8ee0b0e86 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3764,13 +3764,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 01132a7c706bbcc141d05c442ad02dc1b4ee86d0 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 | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index ec8ee0b0e86..082bb3d3a2d 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3430,7 +3430,7 @@ def get_optional_params_embeddings( special_params: Final = passed_params.pop("kwargs") drop_params = passed_params.pop("drop_params", None) - drop_params = litellm.drop_params or False if drop_params is None else drop_params + resolved_drop_params = litellm.drop_params or False if drop_params is None else drop_params additional_drop_params = passed_params.pop("additional_drop_params", None) @@ -3478,7 +3478,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 @@ -3765,9 +3765,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 3fab69dd316aff675b1cda08cf98a85c1f371f09 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 082bb3d3a2d..89a9de3d1ed 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3752,6 +3752,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, @@ -3764,14 +3772,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/test_litellm/litellm_core_utils/test_embedding_optional_params.py b/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py index 6a044a5680a..a5381f67c71 100644 --- a/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py +++ b/tests/test_litellm/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 8cf4b9f142fde49117eb3dca47e006921eb9e099 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/test_litellm/litellm_core_utils/test_embedding_optional_params.py b/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py index a5381f67c71..100d72baa74 100644 --- a/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py +++ b/tests/test_litellm/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 ce3c4559e0c516ff8026f3162b45c08515997bac 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/test_litellm/litellm_core_utils/test_embedding_optional_params.py b/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py index 100d72baa74..376467685be 100644 --- a/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py +++ b/tests/test_litellm/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 2dca7fe37a2540aa92430b8fc73b25fb72ca90bd 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 89a9de3d1ed..1cb65816d4f 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3757,7 +3757,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)