fix: correct per-model video API field names and remove non-existent models

Each video model uses a different image input field:
- kling-o1-pro/std: first_frame (not image)
- kling-elements-pro/std: images (array)
- minimax-hailuo: image, duration fixed at "6"

Also:
- kling-elements requires slug aspect ratios (square_1_1, etc.)
- Remove wan-2.5 and runway-gen4 which return 404

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-10 18:15:59 +02:00
parent 209a4840db
commit 0de3f7d6bc
3 changed files with 55 additions and 14 deletions
+28 -6
View File
@@ -27,8 +27,6 @@ class VideoModel(str, Enum):
KLING_ELEMENTS_PRO = "kling-elements-pro"
KLING_ELEMENTS_STD = "kling-elements-std"
MINIMAX_HAILUO = "minimax-hailuo"
WAN_2_5 = "wan-2.5"
RUNWAY_GEN4 = "runway-gen4"
class UpscaleMode(str, Enum):
@@ -90,8 +88,6 @@ VIDEO_POST_ENDPOINTS: dict[VideoModel, str] = {
VideoModel.KLING_ELEMENTS_PRO: "/v1/ai/image-to-video/kling-elements-pro",
VideoModel.KLING_ELEMENTS_STD: "/v1/ai/image-to-video/kling-elements-std",
VideoModel.MINIMAX_HAILUO: "/v1/ai/image-to-video/minimax-hailuo-02-1080p",
VideoModel.WAN_2_5: "/v1/ai/image-to-video/wan-2-5",
VideoModel.RUNWAY_GEN4: "/v1/ai/image-to-video/runway-gen4",
}
VIDEO_STATUS_ENDPOINTS: dict[VideoModel, str] = {
@@ -100,10 +96,36 @@ VIDEO_STATUS_ENDPOINTS: dict[VideoModel, str] = {
VideoModel.KLING_ELEMENTS_PRO: "/v1/ai/image-to-video/kling-elements-pro/{task_id}",
VideoModel.KLING_ELEMENTS_STD: "/v1/ai/image-to-video/kling-elements-std/{task_id}",
VideoModel.MINIMAX_HAILUO: "/v1/ai/image-to-video/minimax-hailuo-02-1080p/{task_id}",
VideoModel.WAN_2_5: "/v1/ai/image-to-video/wan-2-5/{task_id}",
VideoModel.RUNWAY_GEN4: "/v1/ai/image-to-video/runway-gen4/{task_id}",
}
# Per-model image input field name
VIDEO_IMAGE_FIELDS: dict[VideoModel, str] = {
VideoModel.KLING_O1_PRO: "first_frame",
VideoModel.KLING_O1_STD: "first_frame",
VideoModel.KLING_ELEMENTS_PRO: "images", # expects an array
VideoModel.KLING_ELEMENTS_STD: "images", # expects an array
VideoModel.MINIMAX_HAILUO: "image",
}
# Kling Elements requires named aspect ratio slugs
VIDEO_SLUG_ASPECT_RATIO_MODELS: set[VideoModel] = {
VideoModel.KLING_ELEMENTS_PRO,
VideoModel.KLING_ELEMENTS_STD,
}
_VIDEO_RATIO_TO_SLUG: dict[str, str] = {
"1:1": "square_1_1",
"16:9": "widescreen_16_9",
"9:16": "social_story_9_16",
}
def normalize_aspect_ratio_video(ratio: str, model: VideoModel) -> str:
"""Convert a user-facing aspect ratio to the format required by the video model."""
if model not in VIDEO_SLUG_ASPECT_RATIO_MODELS:
return ratio
return _VIDEO_RATIO_TO_SLUG.get(ratio, ratio)
UPSCALE_POST_ENDPOINTS: dict[UpscaleMode, str] = {
UpscaleMode.CREATIVE: "/v1/ai/image-upscaler",
UpscaleMode.PRECISION: "/v1/ai/image-upscaler-precision",