From 3183b2e28cd45d6bd77a9edd15b1e61a2dc5755f Mon Sep 17 00:00:00 2001 From: alt-glitch Date: Fri, 29 May 2026 18:56:41 +0530 Subject: [PATCH] fix(video_gen): veo3.1 duration format and 4k resolution FAL veo3.1 API expects duration as "4s"/"6s"/"8s" (with unit suffix), not bare "4"/"6"/"8" like other families. Add per-family duration_suffix field and apply it in _build_payload. Also add "4k" to veo3.1 resolutions per FAL API docs. Note: the managed gateway currently rejects the "4s" format (expects integer duration). Gateway-side fix needed for veo3.1 to work through the Nous subscription path. --- plugins/video_gen/fal/__init__.py | 7 +++++-- tests/plugins/video_gen/test_fal_plugin.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/video_gen/fal/__init__.py b/plugins/video_gen/fal/__init__.py index 6c4361447..6ad310427 100644 --- a/plugins/video_gen/fal/__init__.py +++ b/plugins/video_gen/fal/__init__.py @@ -106,8 +106,9 @@ FAL_FAMILIES: Dict[str, Dict[str, Any]] = { "text_endpoint": "fal-ai/veo3.1", "image_endpoint": "fal-ai/veo3.1/image-to-video", "aspect_ratios": ("16:9", "9:16"), - "resolutions": ("720p", "1080p"), + "resolutions": ("720p", "1080p", "4k"), "durations": (4, 6, 8), + "duration_suffix": "s", # FAL veo3.1 wants "4s" not "4" "audio": True, "negative": True, }, @@ -272,7 +273,9 @@ def _build_payload( clamped = _clamp_duration(family, duration) if clamped is not None and family.get("durations"): # FAL exposes duration as a string in the queue API ("8" not 8). - payload["duration"] = str(clamped) + # Some families (e.g. veo3.1) require a unit suffix ("4s" not "4"). + suffix = family.get("duration_suffix", "") + payload["duration"] = f"{clamped}{suffix}" if family.get("audio") and audio is not None: payload["generate_audio"] = bool(audio) diff --git a/tests/plugins/video_gen/test_fal_plugin.py b/tests/plugins/video_gen/test_fal_plugin.py index 346df6c8a..7af1bd409 100644 --- a/tests/plugins/video_gen/test_fal_plugin.py +++ b/tests/plugins/video_gen/test_fal_plugin.py @@ -257,7 +257,7 @@ class TestPayloadBuilder: seed=42, ) assert p["prompt"] == "x" - assert p["duration"] == "8" # FAL queue API uses strings + assert p["duration"] == "8s" # veo3.1 uses "Ns" format per FAL API assert p["aspect_ratio"] == "16:9" assert p["resolution"] == "720p" assert p["generate_audio"] is True