From 2b16a6b03cbe40219c56182ba2c01aff60bd11ff Mon Sep 17 00:00:00 2001 From: michaelsam94 Date: Wed, 24 Jun 2026 11:46:29 +0300 Subject: [PATCH] feat(image_gen): add FAL Nano Banana 2 model --- plugins/image_gen/fal/__init__.py | 2 +- plugins/image_gen/fal/plugin.yaml | 2 +- tests/tools/test_image_generation.py | 26 +++++++++++++++++++++ tools/image_generation_tool.py | 34 ++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/plugins/image_gen/fal/__init__.py b/plugins/image_gen/fal/__init__.py index 3e7777c714956..f59ceebb49728 100644 --- a/plugins/image_gen/fal/__init__.py +++ b/plugins/image_gen/fal/__init__.py @@ -87,7 +87,7 @@ class FalImageGenProvider(ImageGenProvider): return { "name": "FAL.ai", "badge": "paid", - "tag": "Pick from flux-2-klein, flux-2-pro, gpt-image, nano-banana, etc. — text-to-image & image editing", + "tag": "Pick from flux-2-klein, flux-2-pro, gpt-image, nano-banana-2, nano-banana-pro, etc. — text-to-image & image editing", "env_vars": [ { "key": "FAL_KEY", diff --git a/plugins/image_gen/fal/plugin.yaml b/plugins/image_gen/fal/plugin.yaml index 775b76c906d26..a478bbc20cdef 100644 --- a/plugins/image_gen/fal/plugin.yaml +++ b/plugins/image_gen/fal/plugin.yaml @@ -1,6 +1,6 @@ name: fal version: 1.0.0 -description: "FAL.ai image generation backend (flux-2-klein, flux-2-pro, nano-banana, gpt-image-1.5, recraft-v3, etc.)." +description: "FAL.ai image generation backend (flux-2-klein, flux-2-pro, nano-banana-2, nano-banana-pro, gpt-image-1.5, recraft-v3, etc.)." author: NousResearch kind: backend requires_env: diff --git a/tests/tools/test_image_generation.py b/tests/tools/test_image_generation.py index c03ecfacadb3c..94e664edf1eff 100644 --- a/tests/tools/test_image_generation.py +++ b/tests/tools/test_image_generation.py @@ -37,6 +37,14 @@ class TestFalCatalog: assert image_tool.DEFAULT_MODEL == "fal-ai/flux-2/klein/9b" + def test_nano_banana_2_in_catalog(self, image_tool): + meta = image_tool.FAL_MODELS["fal-ai/nano-banana-2"] + + assert meta["display"] == "Nano Banana 2 (Gemini 3.1 Flash Image)" + assert meta["size_style"] == "aspect_ratio" + assert meta["edit_endpoint"] == "fal-ai/nano-banana-2/edit" + assert meta["max_reference_images"] == 14 + def test_all_entries_have_required_keys(self, image_tool): required = { "display", "speed", "strengths", "price", @@ -91,6 +99,24 @@ class TestAspectRatioFamily: p = image_tool._build_fal_payload("fal-ai/nano-banana-pro", "hello", "portrait") assert p["aspect_ratio"] == "9:16" + def test_nano_banana_2_uses_aspect_ratio_and_flash_defaults(self, image_tool): + p = image_tool._build_fal_payload("fal-ai/nano-banana-2", "hello", "landscape") + + assert p["aspect_ratio"] == "16:9" + assert p["resolution"] == "1K" + assert p["limit_generations"] is True + assert "image_size" not in p + + def test_nano_banana_2_allows_thinking_level(self, image_tool): + p = image_tool._build_fal_payload( + "fal-ai/nano-banana-2", + "hello", + "square", + overrides={"thinking_level": "minimal"}, + ) + + assert p["thinking_level"] == "minimal" + class TestGptLiteralFamily: """GPT-Image 1.5 uses literal size strings.""" diff --git a/tools/image_generation_tool.py b/tools/image_generation_tool.py index 05a6e966ca95f..664a5c5f7e85e 100644 --- a/tools/image_generation_tool.py +++ b/tools/image_generation_tool.py @@ -220,6 +220,40 @@ FAL_MODELS: Dict[str, Dict[str, Any]] = { }, "max_reference_images": 2, }, + "fal-ai/nano-banana-2": { + "display": "Nano Banana 2 (Gemini 3.1 Flash Image)", + "speed": "~3s", + "strengths": "Fast reasoning, multilingual text, infographics", + "price": "Lower-cost Flash tier", + "size_style": "aspect_ratio", + "sizes": { + "landscape": "16:9", + "square": "1:1", + "portrait": "9:16", + }, + "defaults": { + "num_images": 1, + "output_format": "png", + "safety_tolerance": "4", + "resolution": "1K", + "limit_generations": True, + }, + "supports": { + "prompt", "aspect_ratio", "num_images", "output_format", + "safety_tolerance", "seed", "sync_mode", "system_prompt", + "resolution", "enable_web_search", "limit_generations", + "thinking_level", + }, + "upscale": False, + "edit_endpoint": "fal-ai/nano-banana-2/edit", + "edit_supports": { + "prompt", "image_urls", "aspect_ratio", "num_images", + "output_format", "safety_tolerance", "seed", "sync_mode", + "system_prompt", "resolution", "enable_web_search", + "limit_generations", "thinking_level", + }, + "max_reference_images": 14, + }, "fal-ai/gpt-image-1.5": { "display": "GPT Image 1.5", "speed": "~15s",