from typing import Any, Dict, List from unittest.mock import MagicMock, patch import pytest import litellm from litellm.images.utils import ImageEditRequestUtils from litellm.llms.base_llm.image_edit.transformation import BaseImageEditConfig from litellm.types.images.main import ImageEditOptionalRequestParams class MockImageEditConfig(BaseImageEditConfig): def get_supported_openai_params(self, model: str) -> List[str]: return ["size", "quality"] def map_openai_params( self, image_edit_optional_params: ImageEditOptionalRequestParams, model: str, drop_params: bool, ) -> Dict[str, Any]: return dict(image_edit_optional_params) def get_complete_url( self, model: str, api_base: str, litellm_params: dict ) -> str: return "https://example.com/api" def validate_environment( self, headers: dict, model: str, api_key: str = None ) -> dict: return headers def transform_image_edit_request(self, *args, **kwargs): return {}, [] def transform_image_edit_response(self, *args, **kwargs): return MagicMock() class TestImageEditRequestUtilsDropParams: def setup_method(self): self.config = MockImageEditConfig() self.model = "test-model" self._original_drop_params = getattr(litellm, "drop_params", None) def teardown_method(self): if self._original_drop_params is None: if hasattr(litellm, "drop_params"): delattr(litellm, "drop_params") else: litellm.drop_params = self._original_drop_params def test_unsupported_params_raises_without_drop(self): litellm.drop_params = False optional_params: ImageEditOptionalRequestParams = { "size": "1024x1024", "unsupported_param": "value", } with pytest.raises(litellm.UnsupportedParamsError) as exc_info: ImageEditRequestUtils.get_optional_params_image_edit( model=self.model, image_edit_provider_config=self.config, image_edit_optional_params=optional_params, ) assert "unsupported_param" in str(exc_info.value) def test_drop_params_global_setting(self): litellm.drop_params = True optional_params: ImageEditOptionalRequestParams = { "size": "1024x1024", "unsupported_param": "value", } result = ImageEditRequestUtils.get_optional_params_image_edit( model=self.model, image_edit_provider_config=self.config, image_edit_optional_params=optional_params, ) assert "size" in result assert "unsupported_param" not in result def test_drop_params_explicit_parameter(self): litellm.drop_params = False optional_params: ImageEditOptionalRequestParams = { "size": "1024x1024", "unsupported_param": "value", } result = ImageEditRequestUtils.get_optional_params_image_edit( model=self.model, image_edit_provider_config=self.config, image_edit_optional_params=optional_params, drop_params=True, ) assert "size" in result assert "unsupported_param" not in result def test_additional_drop_params(self): litellm.drop_params = False optional_params: ImageEditOptionalRequestParams = { "size": "1024x1024", "quality": "high", } result = ImageEditRequestUtils.get_optional_params_image_edit( model=self.model, image_edit_provider_config=self.config, image_edit_optional_params=optional_params, additional_drop_params=["quality"], ) assert "size" in result assert "quality" not in result def test_drop_params_false_with_global_true(self): litellm.drop_params = True optional_params: ImageEditOptionalRequestParams = { "size": "1024x1024", "unsupported_param": "value", } result = ImageEditRequestUtils.get_optional_params_image_edit( model=self.model, image_edit_provider_config=self.config, image_edit_optional_params=optional_params, drop_params=False, ) assert "size" in result assert "unsupported_param" not in result def test_supported_params_pass_through(self): litellm.drop_params = False optional_params: ImageEditOptionalRequestParams = { "size": "1024x1024", "quality": "high", } result = ImageEditRequestUtils.get_optional_params_image_edit( model=self.model, image_edit_provider_config=self.config, image_edit_optional_params=optional_params, ) assert result["size"] == "1024x1024" assert result["quality"] == "high" def test_additional_drop_params_with_unsupported_and_drop_true(self): litellm.drop_params = True optional_params: ImageEditOptionalRequestParams = { "size": "1024x1024", "quality": "high", "unsupported_param": "value", } result = ImageEditRequestUtils.get_optional_params_image_edit( model=self.model, image_edit_provider_config=self.config, image_edit_optional_params=optional_params, additional_drop_params=["quality"], ) assert "size" in result assert "quality" not in result assert "unsupported_param" not in result