diff --git a/litellm/utils.py b/litellm/utils.py index 8ef55758ef1..c0aef30bebd 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3523,6 +3523,9 @@ def get_optional_params_embeddings( special_params: Final = passed_params.pop("kwargs") drop_params = normalize_drop_params(passed_params.pop("drop_params", None)) + resolved_drop_params = drop_params + if resolved_drop_params is None: + resolved_drop_params = normalize_drop_params(litellm.drop_params) additional_drop_params = passed_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 @@ -3568,7 +3571,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 if resolved_drop_params is not None else False, ) # Provider-only params (e.g. Cohere input_type) are not in # OPENAI_EMBEDDING_PARAMS, so embedding_pre_process drops them from @@ -3842,6 +3845,14 @@ def get_optional_params_embeddings( optional_params = non_default_params else: optional_params = non_default_params + if ( + 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 or ()) + ): + optional_params.pop("dimensions", None) final_params = add_provider_specific_params_to_optional_params( optional_params=optional_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 new file mode 100644 index 00000000000..376467685be --- /dev/null +++ b/tests/test_litellm/litellm_core_utils/test_embedding_optional_params.py @@ -0,0 +1,67 @@ +import pytest + +import litellm + + +@pytest.mark.parametrize("provider", ["azure", "together_ai"]) +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 + + 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 + + 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 + + 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 + + +@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): + optional_params = litellm.utils.get_optional_params_embeddings( + model=model, + custom_llm_provider=provider, + dimensions=128, + drop_params=True, + ) + + assert optional_params["dimensions"] == 128