From 4a030566320b2581c14b536a751eda3d5748e022 Mon Sep 17 00:00:00 2001 From: Alexander Piskun <13381981+bigcat88@users.noreply.github.com> Date: Tue, 23 Jun 2026 19:49:16 +0300 Subject: [PATCH] [Partner Nodes] revert last 3 PRs: #14597 #14588 #14581 (#14602) --- comfy_api_nodes/apis/bytedance.py | 22 +---- comfy_api_nodes/nodes_bytedance.py | 50 ++++------ comfy_api_nodes/nodes_grok.py | 15 ++- comfy_api_nodes/nodes_wan.py | 142 +---------------------------- 4 files changed, 33 insertions(+), 196 deletions(-) diff --git a/comfy_api_nodes/apis/bytedance.py b/comfy_api_nodes/apis/bytedance.py index 999b51d39..47f24586c 100644 --- a/comfy_api_nodes/apis/bytedance.py +++ b/comfy_api_nodes/apis/bytedance.py @@ -163,27 +163,15 @@ class SeedanceVirtualLibraryCreateAssetRequest(BaseModel): asset_type: str | None = Field(None, description="BytePlus asset type. Defaults to Image server-side when omitted.") -# Dollars per 1K tokens, keyed by (model_id, has_video_input, resolution). +# Dollars per 1K tokens, keyed by (model_id, has_video_input). SEEDANCE2_PRICE_PER_1K_TOKENS = { - ("dreamina-seedance-2-0-260128", False, "480p"): 0.007, - ("dreamina-seedance-2-0-260128", True, "480p"): 0.0043, - ("dreamina-seedance-2-0-260128", False, "720p"): 0.007, - ("dreamina-seedance-2-0-260128", True, "720p"): 0.0043, - ("dreamina-seedance-2-0-260128", False, "1080p"): 0.0077, - ("dreamina-seedance-2-0-260128", True, "1080p"): 0.0047, - ("dreamina-seedance-2-0-260128", False, "4k"): 0.004, - ("dreamina-seedance-2-0-260128", True, "4k"): 0.0024, - ("dreamina-seedance-2-0-fast-260128", False, "480p"): 0.0056, - ("dreamina-seedance-2-0-fast-260128", True, "480p"): 0.0033, - ("dreamina-seedance-2-0-fast-260128", False, "720p"): 0.0056, - ("dreamina-seedance-2-0-fast-260128", True, "720p"): 0.0033, + ("dreamina-seedance-2-0-260128", False): 0.007, + ("dreamina-seedance-2-0-260128", True): 0.0043, + ("dreamina-seedance-2-0-fast-260128", False): 0.0056, + ("dreamina-seedance-2-0-fast-260128", True): 0.0033, } -def seedance2_price_per_1k_tokens(model_id: str, has_video_input: bool, resolution: str) -> float | None: - return SEEDANCE2_PRICE_PER_1K_TOKENS.get((model_id, has_video_input, resolution)) - - RECOMMENDED_PRESETS = [ ("1024x1024 (1:1)", 1024, 1024), ("864x1152 (3:4)", 864, 1152), diff --git a/comfy_api_nodes/nodes_bytedance.py b/comfy_api_nodes/nodes_bytedance.py index 6192b35bf..c30ddc446 100644 --- a/comfy_api_nodes/nodes_bytedance.py +++ b/comfy_api_nodes/nodes_bytedance.py @@ -15,6 +15,7 @@ from comfy_api_nodes.apis.bytedance import ( RECOMMENDED_PRESETS_SEEDREAM_4_0, RECOMMENDED_PRESETS_SEEDREAM_4_5, RECOMMENDED_PRESETS_SEEDREAM_5_LITE, + SEEDANCE2_PRICE_PER_1K_TOKENS, SEEDANCE2_REF_VIDEO_PIXEL_LIMITS, VIDEO_TASKS_EXECUTION_TIME, GetAssetResponse, @@ -39,7 +40,6 @@ from comfy_api_nodes.apis.bytedance import ( TaskVideoContentUrl, Text2ImageTaskCreationRequest, Text2VideoTaskCreationRequest, - seedance2_price_per_1k_tokens, ) from comfy_api_nodes.util import ( ApiEndpoint, @@ -141,7 +141,7 @@ SEEDANCE2_RATIO_WH = { "9:16": (9, 16), "21:9": (21, 9), } -SEEDANCE2_RES_SHORT_SIDE = {"480p": 480, "720p": 720, "1080p": 1080, "4k": 2160} +SEEDANCE2_RES_SHORT_SIDE = {"480p": 480, "720p": 720, "1080p": 1080} def _seedance2_target_dims(resolution: str, ratio: str, image: torch.Tensor) -> tuple[int, int]: @@ -377,9 +377,9 @@ async def _seedance_virtual_library_upload_video_asset( return f"asset://{create_resp.asset_id}" -def _seedance2_price_extractor(model_id: str, has_video_input: bool, resolution: str): +def _seedance2_price_extractor(model_id: str, has_video_input: bool): """Returns a price_extractor closure for Seedance 2.0 poll_op.""" - rate = seedance2_price_per_1k_tokens(model_id, has_video_input, resolution) + rate = SEEDANCE2_PRICE_PER_1K_TOKENS.get((model_id, has_video_input)) if rate is None: return None @@ -1621,7 +1621,7 @@ class ByteDance2TextToVideoNode(IO.ComfyNode): IO.DynamicCombo.Input( "model", options=[ - IO.DynamicCombo.Option("Seedance 2.0", _seedance2_text_inputs(["480p", "720p", "1080p", "4k"])), + IO.DynamicCombo.Option("Seedance 2.0", _seedance2_text_inputs(["480p", "720p", "1080p"])), IO.DynamicCombo.Option("Seedance 2.0 Fast", _seedance2_text_inputs(["480p", "720p"])), ], tooltip="Seedance 2.0 for maximum quality; Seedance 2.0 Fast for speed optimization.", @@ -1660,15 +1660,11 @@ class ByteDance2TextToVideoNode(IO.ComfyNode): $rate480 := 10044; $rate720 := 21600; $rate1080 := 48800; - $rate4k := 195200; $m := widgets.model; + $pricePer1K := $contains($m, "fast") ? 0.008008 : 0.01001; $res := $lookup(widgets, "model.resolution"); $dur := $lookup(widgets, "model.duration"); - $pricePer1K := $res = "4k" ? 0.00572 : - $res = "1080p" ? 0.011011 : - $contains($m, "fast") ? 0.008008 : 0.01001; - $rate := $res = "4k" ? $rate4k : - $res = "1080p" ? $rate1080 : + $rate := $res = "1080p" ? $rate1080 : $res = "720p" ? $rate720 : $rate480; $cost := $dur * $rate * $pricePer1K / 1000; @@ -1707,7 +1703,7 @@ class ByteDance2TextToVideoNode(IO.ComfyNode): ApiEndpoint(path=f"{BYTEPLUS_SEEDANCE2_TASK_STATUS_ENDPOINT}/{initial_response.id}"), response_model=TaskStatusResponse, status_extractor=lambda r: r.status, - price_extractor=_seedance2_price_extractor(model_id, has_video_input=False, resolution=model["resolution"]), + price_extractor=_seedance2_price_extractor(model_id, has_video_input=False), poll_interval=9, ) return IO.NodeOutput(await download_url_to_video_output(response.content.video_url)) @@ -1728,7 +1724,7 @@ class ByteDance2FirstLastFrameNode(IO.ComfyNode): options=[ IO.DynamicCombo.Option( "Seedance 2.0", - _seedance2_text_inputs(["480p", "720p", "1080p", "4k"], default_ratio="adaptive"), + _seedance2_text_inputs(["480p", "720p", "1080p"], default_ratio="adaptive"), ), IO.DynamicCombo.Option( "Seedance 2.0 Fast", @@ -1795,15 +1791,11 @@ class ByteDance2FirstLastFrameNode(IO.ComfyNode): $rate480 := 10044; $rate720 := 21600; $rate1080 := 48800; - $rate4k := 195200; $m := widgets.model; + $pricePer1K := $contains($m, "fast") ? 0.008008 : 0.01001; $res := $lookup(widgets, "model.resolution"); $dur := $lookup(widgets, "model.duration"); - $pricePer1K := $res = "4k" ? 0.00572 : - $res = "1080p" ? 0.011011 : - $contains($m, "fast") ? 0.008008 : 0.01001; - $rate := $res = "4k" ? $rate4k : - $res = "1080p" ? $rate1080 : + $rate := $res = "1080p" ? $rate1080 : $res = "720p" ? $rate720 : $rate480; $cost := $dur * $rate * $pricePer1K / 1000; @@ -1921,7 +1913,7 @@ class ByteDance2FirstLastFrameNode(IO.ComfyNode): ApiEndpoint(path=f"{BYTEPLUS_SEEDANCE2_TASK_STATUS_ENDPOINT}/{initial_response.id}"), response_model=TaskStatusResponse, status_extractor=lambda r: r.status, - price_extractor=_seedance2_price_extractor(model_id, has_video_input=False, resolution=model["resolution"]), + price_extractor=_seedance2_price_extractor(model_id, has_video_input=False), poll_interval=9, ) return IO.NodeOutput(await download_url_to_video_output(response.content.video_url)) @@ -2018,7 +2010,7 @@ class ByteDance2ReferenceNode(IO.ComfyNode): options=[ IO.DynamicCombo.Option( "Seedance 2.0", - _seedance2_reference_inputs(["480p", "720p", "1080p", "4k"], default_ratio="adaptive"), + _seedance2_reference_inputs(["480p", "720p", "1080p"], default_ratio="adaptive"), ), IO.DynamicCombo.Option( "Seedance 2.0 Fast", @@ -2064,19 +2056,13 @@ class ByteDance2ReferenceNode(IO.ComfyNode): $rate480 := 10044; $rate720 := 21600; $rate1080 := 48800; - $rate4k := 195200; $m := widgets.model; $hasVideo := $lookup(inputGroups, "model.reference_videos") > 0; + $noVideoPricePer1K := $contains($m, "fast") ? 0.008008 : 0.01001; + $videoPricePer1K := $contains($m, "fast") ? 0.004719 : 0.006149; $res := $lookup(widgets, "model.resolution"); $dur := $lookup(widgets, "model.duration"); - $noVideoPricePer1K := $res = "4k" ? 0.00572 : - $res = "1080p" ? 0.011011 : - $contains($m, "fast") ? 0.008008 : 0.01001; - $videoPricePer1K := $res = "4k" ? 0.003432 : - $res = "1080p" ? 0.006721 : - $contains($m, "fast") ? 0.004719 : 0.006149; - $rate := $res = "4k" ? $rate4k : - $res = "1080p" ? $rate1080 : + $rate := $res = "1080p" ? $rate1080 : $res = "720p" ? $rate720 : $rate480; $noVideoCost := $dur * $rate * $noVideoPricePer1K / 1000; @@ -2272,9 +2258,7 @@ class ByteDance2ReferenceNode(IO.ComfyNode): ApiEndpoint(path=f"{BYTEPLUS_SEEDANCE2_TASK_STATUS_ENDPOINT}/{initial_response.id}"), response_model=TaskStatusResponse, status_extractor=lambda r: r.status, - price_extractor=_seedance2_price_extractor( - model_id, has_video_input=has_video_input, resolution=model["resolution"] - ), + price_extractor=_seedance2_price_extractor(model_id, has_video_input=has_video_input), poll_interval=9, ) return IO.NodeOutput(await download_url_to_video_output(response.content.video_url)) diff --git a/comfy_api_nodes/nodes_grok.py b/comfy_api_nodes/nodes_grok.py index dc484536e..2ae529813 100644 --- a/comfy_api_nodes/nodes_grok.py +++ b/comfy_api_nodes/nodes_grok.py @@ -30,7 +30,7 @@ from comfy_api_nodes.util import ( _GROK_VIDEO_MODEL_API_IDS = { - "grok-imagine-video-1.5": "grok-imagine-video-1.5", + "grok-imagine-video-1.5": "grok-imagine-video-1.5-preview", } @@ -521,8 +521,8 @@ class GrokVideoNode(IO.ComfyNode): ), IO.Combo.Input( "resolution", - options=["480p", "720p", "1080p"], - tooltip="The resolution of the output video. 1080p is only available for grok-imagine-video-1.5.", + options=["480p", "720p"], + tooltip="The resolution of the output video.", ), IO.Combo.Input( "aspect_ratio", @@ -570,12 +570,11 @@ class GrokVideoNode(IO.ComfyNode): ( $is15 := $contains(widgets.model, "1.5"); $rate := $is15 - ? (widgets.resolution = "1080p" ? 0.25 : (widgets.resolution = "720p" ? 0.14 : 0.08)) + ? (widgets.resolution = "720p" ? 0.2002 : 0.1144) : (widgets.resolution = "720p" ? 0.07 : 0.05); - $imgCost := $is15 ? 0.01 : 0.002; + $imgCost := $is15 ? 0.0143 : 0.002; $base := $rate * widgets.duration; - $total := inputs.image.connected ? $base + $imgCost : $base; - {"type":"usd","usd": $is15 ? $total * 1.43 : $total} + {"type":"usd","usd": inputs.image.connected ? $base + $imgCost : $base} ) """, ), @@ -594,8 +593,6 @@ class GrokVideoNode(IO.ComfyNode): ) -> IO.NodeOutput: if image is None and model == "grok-imagine-video-1.5": raise ValueError(f"The '{model}' model requires an input image; connect one to the 'image' input.") - if resolution == "1080p" and model != "grok-imagine-video-1.5": - raise ValueError(f"1080p resolution is only available for grok-imagine-video-1.5, not '{model}'.") image_url = None if image is not None: if get_number_of_images(image) != 1: diff --git a/comfy_api_nodes/nodes_wan.py b/comfy_api_nodes/nodes_wan.py index 1782739fd..b7b97d70f 100644 --- a/comfy_api_nodes/nodes_wan.py +++ b/comfy_api_nodes/nodes_wan.py @@ -48,13 +48,10 @@ from comfy_api_nodes.util import ( upload_image_to_comfyapi, upload_video_to_comfyapi, validate_audio_duration, - validate_image_aspect_ratio, - validate_image_dimensions, validate_string, validate_video_duration, ) - RES_IN_PARENS = re.compile(r"\((\d+)\s*[x×]\s*(\d+)\)") @@ -1660,44 +1657,6 @@ class HappyHorseTextToVideoApi(IO.ComfyNode): IO.DynamicCombo.Input( "model", options=[ - IO.DynamicCombo.Option( - "happyhorse-1.1-t2v", - [ - IO.String.Input( - "prompt", - multiline=True, - default="", - tooltip="Prompt describing the elements and visual features. " - "Supports English and Chinese.", - ), - IO.Combo.Input( - "resolution", - options=["720P", "1080P"], - ), - IO.Combo.Input( - "ratio", - options=[ - "16:9", - "9:16", - "1:1", - "4:3", - "3:4", - "21:9", - "9:21", - "5:4", - "4:5", - ], - ), - IO.Int.Input( - "duration", - default=5, - min=3, - max=15, - step=1, - display_mode=IO.NumberDisplay.number, - ), - ], - ), IO.DynamicCombo.Option( "happyhorse-1.0-t2v", [ @@ -1760,9 +1719,7 @@ class HappyHorseTextToVideoApi(IO.ComfyNode): ( $res := $lookup(widgets, "model.resolution"); $dur := $lookup(widgets, "model.duration"); - $ppsTable := $contains(widgets.model, "1.1") - ? { "720p": 0.2002, "1080p": 0.2574 } - : { "720p": 0.14, "1080p": 0.24 }; + $ppsTable := { "720p": 0.14, "1080p": 0.24 }; $pps := $lookup($ppsTable, $res); { "type": "usd", "usd": $pps * $dur } ) @@ -1824,30 +1781,6 @@ class HappyHorseImageToVideoApi(IO.ComfyNode): IO.DynamicCombo.Input( "model", options=[ - IO.DynamicCombo.Option( - "happyhorse-1.1-i2v", - [ - IO.String.Input( - "prompt", - multiline=True, - default="", - tooltip="Prompt describing the elements and visual features. " - "Supports English and Chinese.", - ), - IO.Combo.Input( - "resolution", - options=["720P", "1080P"], - ), - IO.Int.Input( - "duration", - default=5, - min=3, - max=15, - step=1, - display_mode=IO.NumberDisplay.number, - ), - ], - ), IO.DynamicCombo.Option( "happyhorse-1.0-i2v", [ @@ -1910,9 +1843,7 @@ class HappyHorseImageToVideoApi(IO.ComfyNode): ( $res := $lookup(widgets, "model.resolution"); $dur := $lookup(widgets, "model.duration"); - $ppsTable := $contains(widgets.model, "1.1") - ? { "720p": 0.2002, "1080p": 0.2574 } - : { "720p": 0.14, "1080p": 0.24 }; + $ppsTable := { "720p": 0.14, "1080p": 0.24 }; $pps := $lookup($ppsTable, $res); { "type": "usd", "usd": $pps * $dur } ) @@ -1928,8 +1859,6 @@ class HappyHorseImageToVideoApi(IO.ComfyNode): seed: int, watermark: bool, ): - validate_image_dimensions(first_frame, min_width=300, min_height=300) - validate_image_aspect_ratio(first_frame, (1, 2.5), (2.5, 1), strict=False) media = [ Wan27MediaItem( type="first_frame", @@ -2124,62 +2053,6 @@ class HappyHorseReferenceVideoApi(IO.ComfyNode): IO.DynamicCombo.Input( "model", options=[ - IO.DynamicCombo.Option( - "happyhorse-1.1-r2v", - [ - IO.String.Input( - "prompt", - multiline=True, - default="", - tooltip="Prompt describing the video. Use identifiers such as 'character1' and " - "'character2' to refer to the reference characters.", - ), - IO.Combo.Input( - "resolution", - options=["720P", "1080P"], - ), - IO.Combo.Input( - "ratio", - options=[ - "16:9", - "9:16", - "1:1", - "4:3", - "3:4", - "21:9", - "9:21", - "5:4", - "4:5", - ], - ), - IO.Int.Input( - "duration", - default=5, - min=3, - max=15, - step=1, - display_mode=IO.NumberDisplay.number, - ), - IO.Autogrow.Input( - "reference_images", - template=IO.Autogrow.TemplateNames( - IO.Image.Input("reference_image"), - names=[ - "image1", - "image2", - "image3", - "image4", - "image5", - "image6", - "image7", - "image8", - "image9", - ], - min=1, - ), - ), - ], - ), IO.DynamicCombo.Option( "happyhorse-1.0-r2v", [ @@ -2260,9 +2133,7 @@ class HappyHorseReferenceVideoApi(IO.ComfyNode): ( $res := $lookup(widgets, "model.resolution"); $dur := $lookup(widgets, "model.duration"); - $ppsTable := $contains(widgets.model, "1.1") - ? { "720p": 0.2002, "1080p": 0.2574 } - : { "720p": 0.14, "1080p": 0.24 }; + $ppsTable := { "720p": 0.14, "1080p": 0.24 }; $pps := $lookup($ppsTable, $res); { "type": "usd", "usd": $pps * $dur } ) @@ -2278,11 +2149,8 @@ class HappyHorseReferenceVideoApi(IO.ComfyNode): watermark: bool, ): validate_string(model["prompt"], strip_whitespace=False, min_length=1) - reference_images = model.get("reference_images", {}) - for key in reference_images: - validate_image_dimensions(reference_images[key], min_width=400, min_height=400) - validate_image_aspect_ratio(reference_images[key], (1, 2.5), (2.5, 1), strict=False) media = [] + reference_images = model.get("reference_images", {}) for key in reference_images: media.append( Wan27MediaItem( @@ -2291,7 +2159,7 @@ class HappyHorseReferenceVideoApi(IO.ComfyNode): ) ) if not media: - raise ValueError("At least one reference image must be provided.") + raise ValueError("At least one reference reference image must be provided.") initial_response = await sync_op( cls,