feat(image_gen): add FAL Nano Banana 2 model

This commit is contained in:
michaelsam94 2026-06-24 11:46:29 +03:00 committed by Teknium
parent ef9d5f8c06
commit 2b16a6b03c
4 changed files with 62 additions and 2 deletions

View File

@ -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",

View File

@ -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:

View File

@ -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."""

View File

@ -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",