From 0a37c5b27c5ea1a8b0cba3837e566001420cc96b Mon Sep 17 00:00:00 2001 From: Vasilisa Parshikova Date: Wed, 11 Mar 2026 20:34:29 +0400 Subject: [PATCH] (sap) fix after bot review --- litellm/llms/sap/chat/models.py | 17 +++++++++++++++++ litellm/llms/sap/chat/transformation.py | 2 +- litellm/llms/sap/embed/transformation.py | 2 +- .../llms/sap/chat/test_sap_transformation.py | 1 - 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/litellm/llms/sap/chat/models.py b/litellm/llms/sap/chat/models.py index 7c7ad448686..07883fef036 100644 --- a/litellm/llms/sap/chat/models.py +++ b/litellm/llms/sap/chat/models.py @@ -1,5 +1,6 @@ from typing import Union, Literal, Optional from enum import Enum +import warnings from pydantic import BaseModel, Field, field_validator, model_validator @@ -369,6 +370,14 @@ class MaskingModuleConfig(BaseModel): "DEPRECATED: parameter 'masking_providers' will be removed Sept 15, 2026. Use 'providers' instead." ) + if has_masking_providers: + warnings.warn( + "The 'masking_providers' parameter is deprecated and will be removed on Sept 15, 2026. " + "Use 'providers' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self @@ -654,6 +663,14 @@ class TranslationModuleConfig(BaseModel): input: Optional[SAPDocumentTranslationInput] = None output: Optional[SAPDocumentTranslationOutput] = None + @model_validator(mode="after") + def enforce_min_properties(self) -> "TranslationModuleConfig": + if self.input is None and self.output is None: + raise ValueError( + "TranslationModuleConfig requires at least one of 'input' or 'output'." + ) + return self + class ModuleConfig(BaseModel): prompt_templating: PromptTemplatingModuleConfig diff --git a/litellm/llms/sap/chat/transformation.py b/litellm/llms/sap/chat/transformation.py index 95c59b00083..05f52aca534 100755 --- a/litellm/llms/sap/chat/transformation.py +++ b/litellm/llms/sap/chat/transformation.py @@ -303,7 +303,7 @@ class GenAIHubOrchestrationConfig(OpenAIGPTConfig): request_body = { "config": { "modules": modules_payload, - "stream": stream_config, + **({"stream": stream_config} if stream_config else {}) }, **placeholder_values, } diff --git a/litellm/llms/sap/embed/transformation.py b/litellm/llms/sap/embed/transformation.py index 018e8282203..7202d4bcbf2 100644 --- a/litellm/llms/sap/embed/transformation.py +++ b/litellm/llms/sap/embed/transformation.py @@ -160,7 +160,7 @@ class GenAIHubEmbeddingConfig(BaseEmbeddingConfig): model_dict["name"] = model model_dict["version"] = optional_params.get("version", "latest") model_dict["params"] = optional_params.get("parameters", {}) - if optional_params.get("timeout", None): + if optional_params.get("timeout", None) is not None: model_dict["timeout"] = optional_params.get("timeout") if optional_params.get("max_retries", None) is not None: model_dict["max_retries"] = optional_params.get("max_retries") diff --git a/tests/test_litellm/llms/sap/chat/test_sap_transformation.py b/tests/test_litellm/llms/sap/chat/test_sap_transformation.py index 3a58be640ad..127d9c2f922 100644 --- a/tests/test_litellm/llms/sap/chat/test_sap_transformation.py +++ b/tests/test_litellm/llms/sap/chat/test_sap_transformation.py @@ -118,7 +118,6 @@ class TestSAPTransformationIntegration: 'model': {'name': 'gpt-4o', 'params': {}, 'version': 'latest'} } }, - 'stream': {} } } config = mock_config.transform_request(