diff --git a/litellm/llms/vertex_ai/multimodal_embeddings/transformation.py b/litellm/llms/vertex_ai/multimodal_embeddings/transformation.py index d82c2bebb7f..d5cfca96812 100644 --- a/litellm/llms/vertex_ai/multimodal_embeddings/transformation.py +++ b/litellm/llms/vertex_ai/multimodal_embeddings/transformation.py @@ -201,6 +201,11 @@ class VertexAIMultimodalEmbeddingConfig(BaseEmbeddingConfig): request_data["instances"] = [vertex_request_instance] + if "outputDimensionality" in optional_params: + request_data["parameters"] = { + "outputDimensionality": optional_params["outputDimensionality"] + } + return cast(dict, request_data) def transform_embedding_response( diff --git a/litellm/types/llms/vertex_ai.py b/litellm/types/llms/vertex_ai.py index c49fc96a65b..e5442e692b9 100644 --- a/litellm/types/llms/vertex_ai.py +++ b/litellm/types/llms/vertex_ai.py @@ -514,8 +514,9 @@ class Instance(TypedDict, total=False): video: InstanceVideo -class VertexMultimodalEmbeddingRequest(TypedDict): - instances: List[Instance] +class VertexMultimodalEmbeddingRequest(TypedDict, total=False): + instances: Required[List[Instance]] + parameters: dict class VideoEmbedding(TypedDict): diff --git a/tests/test_litellm/llms/vertex_ai/multimodal_embeddings/test_vertex_ai_multimodal_embedding_transformation.py b/tests/test_litellm/llms/vertex_ai/multimodal_embeddings/test_vertex_ai_multimodal_embedding_transformation.py index 63677c0f5f1..e060e2a7e1a 100644 --- a/tests/test_litellm/llms/vertex_ai/multimodal_embeddings/test_vertex_ai_multimodal_embedding_transformation.py +++ b/tests/test_litellm/llms/vertex_ai/multimodal_embeddings/test_vertex_ai_multimodal_embedding_transformation.py @@ -135,3 +135,35 @@ class TestVertexMultimodalEmbedding: ] result = self.config.process_openai_embedding_input(input_data) assert result == expected_output, f"Expected {expected_output}, but got {result}" + + def test_dimensions_parameter_forwarded_as_output_dimensionality(self): + """Test that the dimensions parameter is forwarded as outputDimensionality + in the request body parameters field. + + Fixes: https://github.com/BerriAI/litellm/issues/24392 + """ + optional_params = {} + optional_params = self.config.map_openai_params( + non_default_params={"dimensions": 128}, + optional_params=optional_params, + model="multimodalembedding", + drop_params=False, + ) + request = self.config.transform_embedding_request( + model="multimodalembedding", + input="Hello world", + optional_params=optional_params, + headers={}, + ) + assert "parameters" in request, "Request should contain 'parameters' field" + assert request["parameters"]["outputDimensionality"] == 128 + + def test_no_parameters_field_when_dimensions_not_set(self): + """Test that no parameters field is added when dimensions is not set.""" + request = self.config.transform_embedding_request( + model="multimodalembedding", + input="Hello world", + optional_params={}, + headers={}, + ) + assert "parameters" not in request