From 9f24699e4c1e4cee507b5a5d6bd8b704962fc586 Mon Sep 17 00:00:00 2001 From: kerry Date: Sun, 20 Sep 2026 05:44:56 +0000 Subject: [PATCH] fix(fal_ai): reject empty image lists in image edit requests Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/llms/fal_ai/image_edit/transformation.py | 6 +++--- .../image_edit/test_fal_ai_image_edit_transformation.py | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/litellm/llms/fal_ai/image_edit/transformation.py b/litellm/llms/fal_ai/image_edit/transformation.py index 794d058bbd4..70b5d0612f2 100644 --- a/litellm/llms/fal_ai/image_edit/transformation.py +++ b/litellm/llms/fal_ai/image_edit/transformation.py @@ -138,9 +138,9 @@ class FalAIImageEditConfig(BaseImageEditConfig): litellm_params: GenericLiteLLMParams, headers: dict, ) -> tuple[dict, RequestFiles]: - if image is None: + images: Final = tuple(img for img in (image if isinstance(image, list) else (image,)) if img is not None) + if not images: raise ValueError("Fal AI image edit requires at least one input image") - images: Final = tuple(image) if isinstance(image, list) else (image,) mask: Final = _first(image_edit_optional_request_params.get("mask")) mask_field: Final[Mapping[str, str]] = ( MappingProxyType({"mask_url": _to_data_url(mask)}) if mask is not None else MappingProxyType({}) @@ -152,7 +152,7 @@ class FalAIImageEditConfig(BaseImageEditConfig): ) request_body: Final[dict[str, object]] = { # mutable-ok: base class contract returns a dict "prompt": prompt, - "image_urls": tuple(_to_data_url(img) for img in images if img is not None), + "image_urls": tuple(_to_data_url(img) for img in images), **mask_field, **provider_params, } diff --git a/tests/test_litellm/llms/fal_ai/image_edit/test_fal_ai_image_edit_transformation.py b/tests/test_litellm/llms/fal_ai/image_edit/test_fal_ai_image_edit_transformation.py index 9f4637308e1..65b04e1f1b8 100644 --- a/tests/test_litellm/llms/fal_ai/image_edit/test_fal_ai_image_edit_transformation.py +++ b/tests/test_litellm/llms/fal_ai/image_edit/test_fal_ai_image_edit_transformation.py @@ -128,12 +128,13 @@ def test_transform_response_maps_fal_images(): assert [image.url for image in response.data] == ["https://fal.media/out.png"] -def test_transform_request_requires_an_image(): +@pytest.mark.parametrize("image", [None, []]) +def test_transform_request_requires_an_image(image): with pytest.raises(ValueError, match="input image"): FalAIImageEditConfig().transform_image_edit_request( model="openai/gpt-image-2.5/flare/edit", prompt="make it blue", - image=None, + image=image, image_edit_optional_request_params={}, litellm_params=GenericLiteLLMParams(), headers={},