feat(image_gen): add FAL Nano Banana 2 model
This commit is contained in:
parent
ef9d5f8c06
commit
2b16a6b03c
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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."""
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in New Issue