From 983a1653f380c3bcb88f4ad6d754bf3cb3fa832f Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Wed, 30 Apr 2025 13:42:20 -0700 Subject: [PATCH] Add Pixverse and updated Kling types (#75) --- comfy_api_nodes/apis/__init__.py | 657 ++++++++++--------------------- comfy_api_nodes/nodes_kling.py | 10 +- 2 files changed, 207 insertions(+), 460 deletions(-) diff --git a/comfy_api_nodes/apis/__init__.py b/comfy_api_nodes/apis/__init__.py index f6da69112..77e6d34e4 100644 --- a/comfy_api_nodes/apis/__init__.py +++ b/comfy_api_nodes/apis/__init__.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: filtered-openapi.yaml -# timestamp: 2025-04-29T23:44:54+00:00 +# timestamp: 2025-04-30T19:05:50+00:00 from __future__ import annotations @@ -150,43 +150,6 @@ class IdeogramGenerateResponse(BaseModel): ) -class Duration(str, Enum): - field_5 = '5' - field_10 = '10' - - -class Mode(str, Enum): - std = 'std' - pro = 'pro' - - -class ModelName(str, Enum): - kling_v1 = 'kling-v1' - kling_v1_5 = 'kling-v1-5' - kling_v1_6 = 'kling-v1-6' - - -class KlingDualCharacterEffectInput(BaseModel): - duration: Duration = Field( - ..., - description='Video Length in seconds. Both 5 and 10-second videos are supported.', - ) - images: List[str] = Field( - ..., - description='Reference Image Group. Must contain exactly 2 images. First image will be positioned on left side, second on right side of the composite. Each image follows the same requirements as single image effects.', - max_length=2, - min_length=2, - ) - mode: Optional[Mode] = Field( - 'std', - description='Video generation mode. std (Standard Mode) is cost-effective, pro (Professional Mode) generates videos with longer duration and higher quality.', - ) - model_name: Optional[ModelName] = Field( - 'kling-v1', - description='Model Name. Can be kling-v1, kling-v1-5, or kling-v1-6.', - ) - - class KlingErrorResponse(BaseModel): code: int = Field( ..., @@ -259,6 +222,11 @@ class CameraControl(BaseModel): ) +class Duration(str, Enum): + field_5 = '5' + field_10 = '10' + + class Trajectory(BaseModel): x: Optional[int] = Field( None, @@ -278,6 +246,18 @@ class DynamicMask(BaseModel): trajectories: Optional[List[Trajectory]] = None +class Mode(str, Enum): + std = 'std' + pro = 'pro' + + +class ModelName(str, Enum): + kling_v1 = 'kling-v1' + kling_v1_5 = 'kling-v1-5' + kling_v1_6 = 'kling-v1-6' + kling_v2_master = 'kling-v2-master' + + class KlingImage2VideoRequest(BaseModel): aspect_ratio: Optional[AspectRatio] = '16:9' callback_url: Optional[AnyUrl] = Field( @@ -362,247 +342,6 @@ class KlingImage2VideoResponse(BaseModel): request_id: Optional[str] = Field(None, description='Request ID') -class AspectRatio1(str, Enum): - field_16_9 = '16:9' - field_9_16 = '9:16' - field_1_1 = '1:1' - field_4_3 = '4:3' - field_3_4 = '3:4' - field_3_2 = '3:2' - field_2_3 = '2:3' - field_21_9 = '21:9' - - -class ImageReference(str, Enum): - subject = 'subject' - face = 'face' - - -class ModelName2(str, Enum): - kling_v1 = 'kling-v1' - kling_v1_5 = 'kling-v1-5' - - -class KlingImageGenerationsRequest(BaseModel): - aspect_ratio: Optional[AspectRatio1] = Field( - '16:9', description='Aspect ratio of the generated images' - ) - callback_url: Optional[AnyUrl] = Field( - None, description='The callback notification address' - ) - human_fidelity: Optional[float] = Field( - 0.45, description='Subject reference similarity', ge=0.0, le=1.0 - ) - image: Optional[str] = Field( - None, description='Reference Image - Base64 encoded string or image URL' - ) - image_fidelity: Optional[float] = Field( - 0.5, description='Reference intensity for user-uploaded images', ge=0.0, le=1.0 - ) - image_reference: Optional[ImageReference] = Field( - None, description='Image reference type' - ) - model_name: Optional[ModelName2] = Field('kling-v1', description='Model Name') - n: Optional[int] = Field(1, description='Number of generated images', ge=1, le=9) - negative_prompt: Optional[str] = Field( - None, description='Negative text prompt', max_length=200 - ) - prompt: str = Field(..., description='Positive text prompt', max_length=500) - - -class Image(BaseModel): - index: Optional[int] = Field(None, description='Image Number (0-9)') - url: Optional[AnyUrl] = Field(None, description='URL for generated image') - - -class TaskResult1(BaseModel): - images: Optional[List[Image]] = None - - -class Data1(BaseModel): - created_at: Optional[int] = Field(None, description='Task creation time') - task_id: Optional[str] = Field(None, description='Task ID') - task_result: Optional[TaskResult1] = None - task_status: Optional[TaskStatus] = None - task_status_msg: Optional[str] = Field(None, description='Task status information') - updated_at: Optional[int] = Field(None, description='Task update time') - - -class KlingImageGenerationsResponse(BaseModel): - code: Optional[int] = Field(None, description='Error code') - data: Optional[Data1] = None - message: Optional[str] = Field(None, description='Error message') - request_id: Optional[str] = Field(None, description='Request ID') - - -class AudioType(str, Enum): - file = 'file' - url = 'url' - - -class Mode2(str, Enum): - text2video = 'text2video' - audio2video = 'audio2video' - - -class VoiceLanguage(str, Enum): - zh = 'zh' - en = 'en' - - -class Input(BaseModel): - audio_file: Optional[str] = Field( - None, - description='Local Path of Audio File. Supported formats: .mp3/.wav/.m4a/.aac, maximum file size of 5MB. Base64 code.', - ) - audio_type: Optional[AudioType] = Field( - None, - description='Method of Transmitting Audio Files for Lip-Sync. Required when mode is audio2video.', - ) - audio_url: Optional[AnyUrl] = Field( - None, - description='Audio File Download URL. Supported formats: .mp3/.wav/.m4a/.aac, maximum file size of 5MB.', - ) - mode: Mode2 = Field( - ..., - description='Video Generation Mode. text2video: Text-to-video generation mode; audio2video: Audio-to-video generation mode', - ) - text: Optional[str] = Field( - None, - description='Text Content for Lip-Sync Video Generation. Required when mode is text2video. Maximum length is 120 characters.', - ) - video_id: Optional[str] = Field( - None, - description='The ID of the video generated by Kling AI. Only supports 5-second and 10-second videos generated within the last 30 days.', - ) - video_url: Optional[AnyUrl] = Field( - None, - description='Get link for uploaded video. Video files support .mp4/.mov, file size does not exceed 100MB, video length between 2-10s.', - ) - voice_id: Optional[str] = Field( - None, - description='Voice ID. Required when mode is text2video. The system offers a variety of voice options to choose from.', - ) - voice_language: Optional[VoiceLanguage] = Field( - 'zh', description='The voice language corresponds to the Voice ID.' - ) - voice_speed: Optional[float] = Field( - 1, - description='Speech Rate. Valid range: 0.8~2.0, accurate to one decimal place.', - ge=0.8, - le=2.0, - ) - - -class KlingLipSyncRequest(BaseModel): - callback_url: Optional[AnyUrl] = Field( - None, - description='The callback notification address. Server will notify when the task status changes.', - ) - input: Input - - -class TaskResult2(BaseModel): - videos: Optional[List[Video]] = None - - -class Data2(BaseModel): - created_at: Optional[int] = Field(None, description='Task creation time') - task_id: Optional[str] = Field(None, description='Task ID') - task_info: Optional[TaskInfo] = None - task_result: Optional[TaskResult2] = None - task_status: Optional[TaskStatus] = None - updated_at: Optional[int] = Field(None, description='Task update time') - - -class KlingLipSyncResponse(BaseModel): - code: Optional[int] = Field(None, description='Error code') - data: Optional[Data2] = None - message: Optional[str] = Field(None, description='Error message') - request_id: Optional[str] = Field(None, description='Request ID') - - -class ResourcePackType(str, Enum): - decreasing_total = 'decreasing_total' - constant_period = 'constant_period' - - -class Status(str, Enum): - toBeOnline = 'toBeOnline' - online = 'online' - expired = 'expired' - runOut = 'runOut' - - -class ResourcePackSubscribeInfo(BaseModel): - effective_time: Optional[int] = Field( - None, description='Effective time, Unix timestamp in ms' - ) - invalid_time: Optional[int] = Field( - None, description='Expiration time, Unix timestamp in ms' - ) - purchase_time: Optional[int] = Field( - None, description='Purchase time, Unix timestamp in ms' - ) - remaining_quantity: Optional[float] = Field( - None, description='Remaining quantity (updated with a 12-hour delay)' - ) - resource_pack_id: Optional[str] = Field(None, description='Resource package ID') - resource_pack_name: Optional[str] = Field(None, description='Resource package name') - resource_pack_type: Optional[ResourcePackType] = Field( - None, - description='Resource package type (decreasing_total=decreasing total, constant_period=constant periodicity)', - ) - status: Optional[Status] = Field(None, description='Resource Package Status') - total_quantity: Optional[float] = Field(None, description='Total quantity') - - -class Data3(BaseModel): - code: Optional[int] = Field(None, description='Error code; 0 indicates success') - msg: Optional[str] = Field(None, description='Error information') - resource_pack_subscribe_infos: Optional[List[ResourcePackSubscribeInfo]] = Field( - None, description='Resource package list' - ) - - -class KlingResourcePackageResponse(BaseModel): - code: Optional[int] = Field(None, description='Error code; 0 indicates success') - data: Optional[Data3] = None - message: Optional[str] = Field(None, description='Error information') - request_id: Optional[str] = Field( - None, - description='Request ID, generated by the system, used to track requests and troubleshoot problems', - ) - - -class Duration2(str, Enum): - field_5 = '5' - - -class ModelName3(str, Enum): - kling_v1_6 = 'kling-v1-6' - - -class KlingSingleImageEffectInput(BaseModel): - duration: Duration2 = Field( - ..., description='Video Length in seconds. Only 5-second videos are supported.' - ) - image: str = Field( - ..., - description='Reference Image. URL or Base64 encoded string (without data:image prefix). File size cannot exceed 10MB, resolution not less than 300*300px, aspect ratio between 1:2.5 ~ 2.5:1.', - ) - model_name: ModelName3 = Field( - ..., - description='Model Name. Only kling-v1-6 is supported for single image effects.', - ) - - -class AspectRatio2(str, Enum): - field_16_9 = '16:9' - field_9_16 = '9:16' - field_1_1 = '1:1' - - class Config1(BaseModel): horizontal: Optional[float] = Field(None, ge=-10.0, le=10.0) pan: Optional[float] = Field(None, ge=-10.0, le=10.0) @@ -617,23 +356,14 @@ class CameraControl1(BaseModel): type: Optional[Type] = Field(None, description='Predefined camera movements type') -class Duration3(str, Enum): - field_5 = '5' - field_10 = '10' - - -class Mode3(str, Enum): - std = 'std' - pro = 'pro' - - -class ModelName4(str, Enum): +class ModelName1(str, Enum): kling_v1 = 'kling-v1' kling_v1_6 = 'kling-v1-6' + kling_v2_master = 'kling-v2-master' class KlingText2VideoRequest(BaseModel): - aspect_ratio: Optional[AspectRatio2] = '16:9' + aspect_ratio: Optional[AspectRatio] = '16:9' callback_url: Optional[AnyUrl] = Field( None, description='The callback notification address' ) @@ -641,10 +371,10 @@ class KlingText2VideoRequest(BaseModel): cfg_scale: Optional[float] = Field( 0.5, description='Flexibility in video generation', ge=0.0, le=1.0 ) - duration: Optional[Duration3] = '5' + duration: Optional[Duration] = '5' external_task_id: Optional[str] = Field(None, description='Customized Task ID') - mode: Optional[Mode3] = Field('std', description='Video generation mode') - model_name: Optional[ModelName4] = Field('kling-v1', description='Model Name') + mode: Optional[Mode] = Field('std', description='Video generation mode') + model_name: Optional[ModelName1] = Field('kling-v1', description='Model Name') negative_prompt: Optional[str] = Field( None, description='Negative text prompt', max_length=2500 ) @@ -653,168 +383,22 @@ class KlingText2VideoRequest(BaseModel): ) -class TaskResult3(BaseModel): +class TaskResult1(BaseModel): videos: Optional[List[Video]] = None -class Data4(BaseModel): +class Data1(BaseModel): created_at: Optional[int] = Field(None, description='Task creation time') task_id: Optional[str] = Field(None, description='Task ID') task_info: Optional[TaskInfo] = None - task_result: Optional[TaskResult3] = None + task_result: Optional[TaskResult1] = None task_status: Optional[TaskStatus] = None updated_at: Optional[int] = Field(None, description='Task update time') class KlingText2VideoResponse(BaseModel): code: Optional[int] = Field(None, description='Error code') - data: Optional[Data4] = None - message: Optional[str] = Field(None, description='Error message') - request_id: Optional[str] = Field(None, description='Request ID') - - -class KlingVideoEffectsInput( - RootModel[Union[KlingSingleImageEffectInput, KlingDualCharacterEffectInput]] -): - root: Union[KlingSingleImageEffectInput, KlingDualCharacterEffectInput] - - -class EffectScene(str, Enum): - bloombloom = 'bloombloom' - dizzydizzy = 'dizzydizzy' - fuzzyfuzzy = 'fuzzyfuzzy' - squish = 'squish' - expansion = 'expansion' - hug = 'hug' - kiss = 'kiss' - heart_gesture = 'heart_gesture' - - -class KlingVideoEffectsRequest(BaseModel): - callback_url: Optional[AnyUrl] = Field( - None, - description='The callback notification address for the result of this task.', - ) - effect_scene: EffectScene = Field( - ..., - description='Scene Name. Single Image Effects (bloombloom, dizzydizzy, fuzzyfuzzy, squish, expansion) or Dual-character Effects (hug, kiss, heart_gesture).', - ) - external_task_id: Optional[str] = Field( - None, - description='Customized Task ID. Must be unique within a single user account.', - ) - input: Optional[KlingVideoEffectsInput] = None - - -class TaskResult4(BaseModel): - videos: Optional[List[Video]] = None - - -class Data5(BaseModel): - created_at: Optional[int] = Field(None, description='Task creation time') - task_id: Optional[str] = Field(None, description='Task ID') - task_info: Optional[TaskInfo] = None - task_result: Optional[TaskResult4] = None - task_status: Optional[TaskStatus] = None - updated_at: Optional[int] = Field(None, description='Task update time') - - -class KlingVideoEffectsResponse(BaseModel): - code: Optional[int] = Field(None, description='Error code') - data: Optional[Data5] = None - message: Optional[str] = Field(None, description='Error message') - request_id: Optional[str] = Field(None, description='Request ID') - - -class KlingVideoExtendRequest(BaseModel): - callback_url: Optional[AnyUrl] = Field( - None, - description='The callback notification address. Server will notify when the task status changes.', - ) - cfg_scale: Optional[float] = Field( - 0.5, - description="Flexibility in video generation. The higher the value, the lower the model's flexibility and the stronger the relevance to the user's prompt.", - ge=0.0, - le=1.0, - ) - negative_prompt: Optional[str] = Field( - None, - description='Negative text prompt for elements to avoid in the extended video', - max_length=2500, - ) - prompt: Optional[str] = Field( - None, - description='Positive text prompt for guiding the video extension', - max_length=2500, - ) - video_id: Optional[str] = Field( - None, - description='The ID of the video to be extended. Supports videos generated by text-to-video, image-to-video, and previous video extension operations. Cannot exceed 3 minutes total duration after extension.', - ) - - -class TaskResult5(BaseModel): - videos: Optional[List[Video]] = None - - -class Data6(BaseModel): - created_at: Optional[int] = Field(None, description='Task creation time') - task_id: Optional[str] = Field(None, description='Task ID') - task_info: Optional[TaskInfo] = None - task_result: Optional[TaskResult5] = None - task_status: Optional[TaskStatus] = None - updated_at: Optional[int] = Field(None, description='Task update time') - - -class KlingVideoExtendResponse(BaseModel): - code: Optional[int] = Field(None, description='Error code') - data: Optional[Data6] = None - message: Optional[str] = Field(None, description='Error message') - request_id: Optional[str] = Field(None, description='Request ID') - - -class ModelName5(str, Enum): - kolors_virtual_try_on_v1 = 'kolors-virtual-try-on-v1' - kolors_virtual_try_on_v1_5 = 'kolors-virtual-try-on-v1-5' - - -class KlingVirtualTryOnRequest(BaseModel): - callback_url: Optional[AnyUrl] = Field( - None, description='The callback notification address' - ) - cloth_image: Optional[str] = Field( - None, - description='Reference clothing image - Base64 encoded string or image URL', - ) - human_image: str = Field( - ..., description='Reference human image - Base64 encoded string or image URL' - ) - model_name: Optional[ModelName5] = Field( - 'kolors-virtual-try-on-v1', description='Model Name' - ) - - -class Image1(BaseModel): - index: Optional[int] = Field(None, description='Image Number') - url: Optional[AnyUrl] = Field(None, description='URL for generated image') - - -class TaskResult6(BaseModel): - images: Optional[List[Image1]] = None - - -class Data7(BaseModel): - created_at: Optional[int] = Field(None, description='Task creation time') - task_id: Optional[str] = Field(None, description='Task ID') - task_result: Optional[TaskResult6] = None - task_status: Optional[TaskStatus] = None - task_status_msg: Optional[str] = Field(None, description='Task status information') - updated_at: Optional[int] = Field(None, description='Task update time') - - -class KlingVirtualTryOnResponse(BaseModel): - code: Optional[int] = Field(None, description='Error code') - data: Optional[Data7] = None + data: Optional[Data1] = None message: Optional[str] = Field(None, description='Error message') request_id: Optional[str] = Field(None, description='Request ID') @@ -938,7 +522,8 @@ class GenerationType3(str, Enum): class LumaVideoModel(str, Enum): ray_2 = 'ray-2' - ray_2_flash = 'ray-2-flash' + ray_flash_2 = 'ray-flash-2' + ray_1_6 = 'ray-1-6' class LumaVideoModelOutputDuration1(str, Enum): @@ -993,7 +578,7 @@ class MinimaxFileRetrieveResponse(BaseModel): file: File -class Status1(str, Enum): +class Status(str, Enum): Queueing = 'Queueing' Preparing = 'Preparing' Processing = 'Processing' @@ -1007,7 +592,7 @@ class MinimaxTaskResultResponse(BaseModel): None, description='After the task status changes to Success, this field returns the file ID corresponding to the generated video.', ) - status: Status1 = Field( + status: Status = Field( ..., description="Task status: 'Queueing' (in queue), 'Preparing' (task is preparing), 'Processing' (generating), 'Success' (task completed successfully), or 'Fail' (task failed).", ) @@ -1209,7 +794,7 @@ class OpenAIImageGenerationResponse(BaseModel): usage: Optional[Usage] = None -class AspectRatio3(RootModel[float]): +class AspectRatio2(RootModel[float]): root: float = Field( ..., description='Aspect ratio (width / height)', @@ -1226,7 +811,7 @@ class IngredientsMode(str, Enum): bytes_aliased = bytes class PikaBodyGenerate22C2vGenerate22PikascenesPost(BaseModel): - aspectRatio: Optional[AspectRatio3] = Field( + aspectRatio: Optional[AspectRatio2] = Field( None, description='Aspect ratio (width / height)', title='Aspectratio' ) duration: Optional[int] = Field(5, title='Duration') @@ -1261,7 +846,7 @@ class PikaBodyGenerate22KeyframeGenerate22PikaframesPost(BaseModel): class PikaBodyGenerate22T2vGenerate22T2vPost(BaseModel): - aspectRatio: Optional[AspectRatio3] = Field( + aspectRatio: Optional[AspectRatio2] = Field( None, description='Aspect ratio (width / height)', title='Aspectratio' ) duration: Optional[int] = Field(5, title='Duration') @@ -1288,7 +873,169 @@ class PikaVideoResponse(BaseModel): url: str = Field(..., title='Url') +class Resp(BaseModel): + img_id: Optional[int] = None + + +class PixverseImageUploadResponse(BaseModel): + ErrCode: Optional[int] = None + ErrMsg: Optional[str] = None + Resp_1: Optional[Resp] = Field(None, alias='Resp') + + +class Duration2(int, Enum): + integer_5 = 5 + integer_8 = 8 + + +class Model1(str, Enum): + v3_5 = 'v3.5' + + +class MotionMode(str, Enum): + normal = 'normal' + fast = 'fast' + + +class Quality1(str, Enum): + field_360p = '360p' + field_540p = '540p' + field_720p = '720p' + field_1080p = '1080p' + + +class Style1(str, Enum): + anime = 'anime' + field_3d_animation = '3d_animation' + clay = 'clay' + comic = 'comic' + cyberpunk = 'cyberpunk' + + +class PixverseImageVideoRequest(BaseModel): + duration: Duration2 + img_id: int + model: Model1 + motion_mode: Optional[MotionMode] = None + prompt: str + quality: Quality1 + seed: Optional[int] = None + style: Optional[Style1] = None + template_id: Optional[int] = None + water_mark: Optional[bool] = None + + +class AspectRatio4(str, Enum): + field_16_9 = '16:9' + field_4_3 = '4:3' + field_1_1 = '1:1' + field_3_4 = '3:4' + field_9_16 = '9:16' + + +class PixverseTextVideoRequest(BaseModel): + aspect_ratio: AspectRatio4 + duration: Duration2 + model: Model1 + motion_mode: Optional[MotionMode] = None + negative_prompt: Optional[str] = None + prompt: str + quality: Quality1 + seed: Optional[int] = None + style: Optional[Style1] = None + template_id: Optional[int] = None + water_mark: Optional[bool] = None + + +class PixverseTransitionVideoRequest(BaseModel): + duration: Duration2 + first_frame_img: int + last_frame_img: int + model: Model1 + motion_mode: MotionMode + prompt: str + quality: Quality1 + seed: int + style: Optional[Style1] = None + template_id: Optional[int] = None + water_mark: Optional[bool] = None + + +class Resp1(BaseModel): + video_id: Optional[int] = None + + +class PixverseVideoResponse(BaseModel): + ErrCode: Optional[int] = None + ErrMsg: Optional[str] = None + Resp: Optional[Resp1] = None + + +class Status1(int, Enum): + integer_1 = 1 + integer_5 = 5 + integer_6 = 6 + integer_7 = 7 + integer_8 = 8 + + +class Resp2(BaseModel): + create_time: Optional[str] = None + id: Optional[int] = None + modify_time: Optional[str] = None + negative_prompt: Optional[str] = None + outputHeight: Optional[int] = None + outputWidth: Optional[int] = None + prompt: Optional[str] = None + resolution_ratio: Optional[int] = None + seed: Optional[int] = None + size: Optional[int] = None + status: Optional[Status1] = Field( + None, + description='Video generation status codes:\n* 1 - Generation successful\n* 5 - Generating\n* 6 - Deleted\n* 7 - Contents moderation failed\n* 8 - Generation failed\n', + ) + style: Optional[str] = None + url: Optional[str] = None + + +class PixverseVideoResultResponse(BaseModel): + ErrCode: Optional[int] = None + ErrMsg: Optional[str] = None + Resp: Optional[Resp2] = None + + +class RGBColorItem(RootModel[int]): + root: int = Field(..., ge=0, le=255) + + +class RGBColor(RootModel[List[RGBColorItem]]): + root: List[RGBColorItem] = Field( + ..., + description='RGB color values', + examples=[[255, 0, 0]], + max_length=3, + min_length=3, + ) + + +class Controls(BaseModel): + artistic_level: Optional[int] = Field( + None, + description='Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.', + ge=0, + le=5, + ) + background_color: Optional[RGBColor] = None + colors: Optional[List[RGBColor]] = Field( + None, description='An array of preferable colors' + ) + no_text: Optional[bool] = Field(None, description='Do not embed text layouts') + + class RecraftImageGenerationRequest(BaseModel): + controls: Optional[Controls] = Field( + None, description='The controls for the generated image' + ) model: str = Field( ..., description='The model to use for generation (e.g., "recraftv3")' ) @@ -1400,7 +1147,7 @@ class Error(BaseModel): message: Optional[str] = Field(None, description='Error message') -class Video5(BaseModel): +class Video2(BaseModel): bytesBase64Encoded: Optional[str] = Field( None, description='Base64-encoded video content' ) @@ -1422,7 +1169,7 @@ class Response(BaseModel): raiMediaFilteredReasons: Optional[List[str]] = Field( None, description='Reasons why media was filtered by responsible AI policies' ) - videos: Optional[List[Video5]] = None + videos: Optional[List[Video2]] = None class Veo2GenVidPollResponse(BaseModel): @@ -1436,20 +1183,20 @@ class Veo2GenVidPollResponse(BaseModel): ) -class Image2(BaseModel): +class Image(BaseModel): bytesBase64Encoded: str gcsUri: Optional[str] = None mimeType: Optional[str] = None -class Image3(BaseModel): +class Image1(BaseModel): bytesBase64Encoded: Optional[str] = None gcsUri: str mimeType: Optional[str] = None class Instance(BaseModel): - image: Optional[Union[Image2, Image3]] = Field( + image: Optional[Union[Image, Image1]] = Field( None, description='Optional image to guide video generation' ) prompt: str = Field(..., description='Text description of the video') diff --git a/comfy_api_nodes/nodes_kling.py b/comfy_api_nodes/nodes_kling.py index 035c4f382..ac2fa6e28 100644 --- a/comfy_api_nodes/nodes_kling.py +++ b/comfy_api_nodes/nodes_kling.py @@ -1,4 +1,3 @@ -from inspect import cleandoc from typing import Union, Optional import math import logging @@ -128,7 +127,7 @@ def _get_camera_control_inputs() -> dict[str, tuple[IO, InputTypeOptions]]: } -class KlingNodeABC(ComfyNodeABC): +class KlingNodeBase(ComfyNodeABC): """Base class for Kling nodes.""" @classmethod @@ -162,13 +161,12 @@ class KlingNodeABC(ComfyNodeABC): return "Invalid camera control configs" return True - DESCRIPTION = cleandoc(__doc__ or "") FUNCTION = "api_call" CATEGORY = "api node/video/Kling" API_NODE = True -class KlingTextToVideoNode(KlingNodeABC): +class KlingTextToVideoNode(KlingNodeBase): """ Kling Text to Video Node. """ @@ -227,6 +225,7 @@ class KlingTextToVideoNode(KlingNodeABC): } RETURN_TYPES = ("VIDEO",) + DESCRIPTION = "Kling Text to Video Node" def api_call( self, @@ -301,7 +300,7 @@ class KlingTextToVideoNode(KlingNodeABC): return download_url_to_video_output(video_url) -class KlingImage2VideoNode(KlingNodeABC): +class KlingImage2VideoNode(KlingNodeBase): """ Kling Image to Video Node. """ @@ -372,6 +371,7 @@ class KlingImage2VideoNode(KlingNodeABC): } RETURN_TYPES = ("VIDEO",) + DESCRIPTION = "Kling Image to Video Node" def api_call( self,