From 8f53c215b2787c5f73f47afc3a52d838a0caeeba Mon Sep 17 00:00:00 2001 From: "async () = process.env.GIT_USERNAME || (await ghUser()).email && (await ghUser()).name || DIE(\"Missing env.GIT_USERNAME\")" Date: Wed, 22 Oct 2025 18:25:38 +0000 Subject: [PATCH 01/19] chore(publish): Add Github Action for Publishing to Comfy Registry --- .github/workflows/publish.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..1112c320 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,28 @@ +name: Publish to Comfy registry +on: + workflow_dispatch: + push: + branches: + - main + - master + paths: + - "pyproject.toml" + +permissions: + issues: write + +jobs: + publish-node: + name: Publish Custom Node to registry + runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'aimfordeb' }} + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + submodules: true + - name: Publish Custom Node + uses: Comfy-Org/publish-node-action@v1 + with: + ## Add your own personal access token to your Github Repository secrets and reference it here. + personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} From ec40f8c2b69f8c29b4e7c58cf99b0ffa14f70a14 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 00:19:01 +0200 Subject: [PATCH 02/19] Added StoryMem keyframe extraction by @railep --- funpack.py | 521 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 381 insertions(+), 140 deletions(-) diff --git a/funpack.py b/funpack.py index fd67b651..237ff495 100644 --- a/funpack.py +++ b/funpack.py @@ -10,6 +10,22 @@ import folder_paths import nodes import tempfile import gc # Import garbage collector +import torch.nn as nn +import torch.nn.functional as F +import numpy as np +from PIL import Image +import folder_paths +from comfy.utils import ProgressBar +import comfy.clip_vision +import math + +# Constants from StoryMem +IMAGE_FACTOR = 28 +VIDEO_MIN_PIXELS = 48 * IMAGE_FACTOR * IMAGE_FACTOR # 37,632 +MIN_FRAME_SIMILARITY = 0.9 +MAX_KEYFRAME_NUM = 3 +ADAPTIVE_ALPHA = 0.01 +HPSV3_QUALITY_THRESHOLD = 3.0 class FunPackImg2LatentInterpolation: @classmethod @@ -57,143 +73,6 @@ class FunPackImg2LatentInterpolation: return (output, preview) -# Removed the problematic list_clip_files() helper function - -class FunPackCLIPLoader: - class _CLIPAdapter: - def __init__(self, clip_l_model, llama_te_model, optional_secondary_clip=None, optional_merge_mode="None"): - self.clip_l_model = clip_l_model - self.llama_te_model = llama_te_model - self.optional_secondary_clip = optional_secondary_clip - self.optional_merge_mode = optional_merge_mode - - print(f"[_CLIPAdapter] Initialized with CLIP-L and LLaMA text encoder.") - if self.optional_secondary_clip: - print(f"[_CLIPAdapter] Optional secondary CLIP also loaded. Merge mode: {self.optional_merge_mode}") - else: - print("[_CLIPAdapter] No optional secondary CLIP provided.") - - def tokenize(self, prompt): - # Use the CLIP-L model's tokenizer - return self.clip_l_model.tokenize(prompt) - - def encode_from_tokens(self, tokens, return_pooled=True): - # 1. Get embeddings from the primary CLIP-L model - clip_l_cond, clip_l_pooled = self.clip_l_model.encode_from_tokens(tokens, return_pooled=True) - - # 2. Get embeddings from the LLaMA text encoder - llama_cond, llama_pooled = self.llama_te_model.encode_from_tokens(tokens, return_pooled=True) - - # 3. Handle optional secondary CLIP merge specifically with CLIP-L's output - final_clip_l_cond = clip_l_cond - final_clip_l_pooled = clip_l_pooled - - if self.optional_secondary_clip and self.optional_merge_mode != "None": - print(f"[_CLIPAdapter] Merging optional secondary CLIP embeddings (Mode: {self.optional_merge_mode}).") - secondary_cond, secondary_pooled = self.optional_secondary_clip.encode_from_tokens(tokens, return_pooled=True) - - if self.optional_merge_mode == "Concatenate Pooled with CLIP-L": - final_clip_l_pooled = torch.cat([clip_l_pooled, secondary_pooled], dim=-1) - print(f"[_CLIPAdapter] Optional CLIP pooled embeddings concatenated with CLIP-L pooled. New CLIP-L pooled dim: {final_clip_l_pooled.shape[-1]}") - elif self.optional_merge_mode == "Concatenate Unpooled with CLIP-L": - if clip_l_cond.shape[1] != secondary_cond.shape[1]: - print("[_CLIPAdapter] WARNING: Unpooled embeddings have different sequence lengths for CLIP-L and optional secondary CLIP. Skipping unpooled concatenation.") - else: - final_clip_l_cond = torch.cat([clip_l_cond, secondary_cond], dim=-1) - print(f"[_CLIPAdapter] Optional CLIP unpooled embeddings concatenated with CLIP-L unpooled. New CLIP-L unpooled dim: {final_clip_l_cond.shape[-1]}") - - # 4. Final combination: Concatenate the (potentially merged) CLIP-L output with LLaMA output - final_cond = torch.cat([final_clip_l_cond, llama_cond], dim=-1) - final_pooled = torch.cat([final_clip_l_pooled, llama_pooled], dim=-1) - - if return_pooled: - return final_cond, final_pooled - else: - return final_cond - - def encode_token_weights(self, tokens): - return self.clip_l_model.encode_token_weights(tokens) - - @classmethod - def INPUT_TYPES(s): - return { - "required": { - "clip_l_model_name": (s.get_filename_list(), {"default": "clip_l.safetensors"}), - "llama_text_encoder_name": (s.get_filename_list(), {"default": "clip_g.safetensors"}), - "clip_type": (["HUNYUAN_VIDEO"], {"default": "HUNYUAN_VIDEO"}), - }, - "optional": { - "optional_secondary_clip_model_name": (s.get_filename_list(), {"default": "None"}), - "optional_secondary_clip_type": (["CLIP_G", "CLIP_L", "T5_XXL"], {"default": "CLIP_G"}), - "optional_merge_mode": (["None", "Concatenate Pooled with CLIP-L", "Concatenate Unpooled with CLIP-L"], {"default": "None"}) - } - } - - RETURN_TYPES = ("CLIP",) - RETURN_NAMES = ("clip",) - FUNCTION = "load" - CATEGORY = "FunPack" - - @classmethod - def get_filename_list(s): - return folder_paths.get_filename_list("clip") - - def load(self, clip_l_model_name, llama_text_encoder_name, clip_type, - optional_secondary_clip_model_name="None", optional_secondary_clip_type="CLIP_G", optional_merge_mode="None"): - - # Load CLIP-L model with HUNYUAN_VIDEO type - clip_l_path = folder_paths.get_full_path('clip', clip_l_model_name) - loaded_clip_l = sd.load_clip( - ckpt_paths=[clip_l_path], - clip_type=sd.CLIPType.HUNYUAN_VIDEO, - embedding_directory=None, - model_options={"ignore_mismatched_sizes": True} - ) - print(f"[FunPackCLIPLoader] Loaded CLIP-L model: {clip_l_model_name}") - - # Load LLaMA text encoder (using CLIP_G as it's part of the Hunyuan architecture) - llama_te_path = folder_paths.get_full_path('clip', llama_text_encoder_name) - loaded_llama_te = sd.load_clip( - ckpt_paths=[llama_te_path], - clip_type=sd.CLIPType.HUNYUAN_VIDEO, - embedding_directory=None, - model_options={"ignore_mismatched_sizes": True} - ) - print(f"[FunPackCLIPLoader] Loaded LLaMA text encoder: {llama_text_encoder_name}") - - # Load optional secondary CLIP - loaded_optional_secondary_clip = None - if optional_secondary_clip_model_name != "None": - optional_secondary_clip_path = folder_paths.get_full_path('clip', optional_secondary_clip_model_name) - - # Map the input type to CLIPType enum - clip_type_mapping = { - "CLIP_G": sd.CLIPType.STABLE_CASCADE, - "CLIP_L": sd.CLIPType.STABLE_DIFFUSION, - "T5_XXL": sd.CLIPType.SD3 - } - secondary_clip_type = clip_type_mapping.get(optional_secondary_clip_type, sd.CLIPType.STABLE_DIFFUSION) - - loaded_optional_secondary_clip = sd.load_clip( - ckpt_paths=[optional_secondary_clip_path], - clip_type=secondary_clip_type, - embedding_directory=None, - model_options={"ignore_mismatched_sizes": True} - ) - print(f"[FunPackCLIPLoader] Loaded optional secondary CLIP model: {optional_secondary_clip_model_name}") - else: - print("[FunPackCLIPLoader] No optional secondary CLIP model specified.") - - # Create the adapter - clip_adapter = FunPackCLIPLoader._CLIPAdapter( - clip_l_model=loaded_clip_l, - llama_te_model=loaded_llama_te, - optional_secondary_clip=loaded_optional_secondary_clip, - optional_merge_mode=optional_merge_mode - ) - - return (clip_adapter,) - # The standalone FunPackPromptEnhancer remains completely unchanged as requested class FunPackPromptEnhancer: @classmethod @@ -374,10 +253,370 @@ class FunPackContinueVideo: raise ValueError(f"Cannot extract {frame_count} frames from video with only {total_frames} frames.") continued = images[-frame_count:] - return (continued,) + return (continued,) + +class FunPackStoryMemKeyframeExtractor: + """ + Extracts keyframes from video frames using: + 1. HPSv3 for quality assessment (optional) + 2. CLIP Vision for frame similarity + 3. Adaptive threshold to limit keyframe count + """ + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "frames": ("IMAGE",), # ComfyUI IMAGE format [B, H, W, C] + "clip_vision": (folder_paths.get_filename_list("clip_vision"),), + "max_keyframes": ("INT", { + "default": 3, + "min": 1, + "max": 20, + "step": 1, + "tooltip": "Maximum number of keyframes to extract" + }), + "similarity_threshold": ("FLOAT", { + "default": 0.9, + "min": 0.0, + "max": 1.0, + "step": 0.01, + "tooltip": "CLIP similarity threshold (lower = more keyframes)" + }), + "use_quality_filter": ("BOOLEAN", { + "default": False, + "tooltip": "Use HPSv3 to filter low-quality frames (requires hpsv3 package)" + }), + "quality_threshold": ("FLOAT", { + "default": 3.0, + "min": 0.0, + "max": 10.0, + "step": 0.1, + "tooltip": "HPSv3 quality threshold (higher = stricter)" + }), + }, + "optional": { + "memory_frames": ("IMAGE", { + "tooltip": "Previous keyframes to compare against (avoid duplicates)" + }), + } + } + + RETURN_TYPES = ("IMAGE", "INT",) + RETURN_NAMES = ("keyframes", "keyframe_count",) + FUNCTION = "extract_keyframes" + CATEGORY = "FunPack" + DESCRIPTION = "Extract keyframes using CLIP similarity + HPSv3 quality (StoryMem algorithm)" + + def __init__(self): + self.quality_model = None + + def load_clip_model(self, clip_vision_name): + """Load CLIP Vision model from ComfyUI models/clip_vision folder""" + clip_path = folder_paths.get_full_path("clip_vision", clip_vision_name) + clip_vision = comfy.clip_vision.load(clip_path) + return clip_vision + + def load_quality_model(self): + """Load HPSv3 quality assessment model""" + if self.quality_model is not None: + return + + try: + from hpsv3 import HPSv3RewardInferencer + device = "cuda" if torch.cuda.is_available() else "cpu" + self.quality_model = HPSv3RewardInferencer(device=device) + except ImportError: + print("WARNING: HPSv3 not installed. Install with: pip install hpsv3") + print("Quality filtering will be disabled.") + self.quality_model = None + + def smart_resize(self, height: int, width: int) -> tuple: + """Resize frame to efficient size for processing""" + factor = IMAGE_FACTOR + min_pixels = VIDEO_MIN_PIXELS + max_pixels = 256 * IMAGE_FACTOR * IMAGE_FACTOR + + h_bar = max(factor, round(height / factor) * factor) + w_bar = max(factor, round(width / factor) * factor) + + if h_bar * w_bar > max_pixels: + beta = math.sqrt((height * width) / max_pixels) + h_bar = math.floor(height / beta / factor) * factor + w_bar = math.floor(width / beta / factor) * factor + elif h_bar * w_bar < min_pixels: + beta = math.sqrt(min_pixels / (height * width)) + h_bar = math.ceil(height * beta / factor) * factor + w_bar = math.ceil(width * beta / factor) * factor + + return max(h_bar, factor), max(w_bar, factor) + + def clip_preprocess(self, frame_chw: torch.Tensor, clip_vision) -> torch.Tensor: + """Preprocess frame for CLIP Vision model""" + # ComfyUI CLIP Vision expects [B, H, W, C] format in range [0, 1] + # Convert from [C, H, W] to [1, H, W, C] + frame = frame_chw.permute(1, 2, 0).unsqueeze(0) + + # Ensure [0, 1] range + if not torch.is_floating_point(frame): + frame = frame.float() + if frame.max() > 1.5: + frame = frame / 255.0 + frame = frame.clamp(0.0, 1.0) + + return frame + + @torch.no_grad() + def get_clip_similarity(self, frame1: torch.Tensor, frame2: torch.Tensor, clip_vision) -> float: + """Calculate CLIP embedding cosine similarity between two frames using ComfyUI CLIP Vision""" + + # Preprocess frames to [1, H, W, C] format + x1 = self.clip_preprocess(frame1, clip_vision) + x2 = self.clip_preprocess(frame2, clip_vision) + + # Get CLIP Vision embeddings using ComfyUI's encode_image + # encode_image expects [B, H, W, C] and returns embeddings + z1 = clip_vision.encode_image(x1) + z2 = clip_vision.encode_image(x2) + + # Normalize and compute cosine similarity + z1 = F.normalize(z1, dim=-1) + z2 = F.normalize(z2, dim=-1) + similarity = (z1 * z2).sum(dim=-1).item() + + return similarity + + def is_low_quality(self, frame: torch.Tensor, threshold: float) -> bool: + """Check if frame quality is below threshold using HPSv3""" + if self.quality_model is None: + return False # Skip quality check if model not available + + # Convert to PIL Image + frame_np = frame.permute(1, 2, 0).cpu().numpy() + frame_np = (frame_np * 255).astype(np.uint8).clip(0, 255) + pil_image = Image.fromarray(frame_np) + + # Get quality score + try: + rewards = self.quality_model.reward(image_paths=[pil_image], prompts=[""]) + score = rewards[0][0].item() + return score < threshold + except Exception as e: + print(f"Quality check failed: {e}") + return False + + def extract_keyframe_indices(self, frames: torch.Tensor, threshold: float, + quality_threshold: float, use_quality: bool, clip_vision) -> list: + """ + Extract keyframe indices using CLIP similarity and quality filtering + + Args: + frames: [N, C, H, W] tensor + threshold: CLIP similarity threshold + quality_threshold: HPSv3 quality threshold + use_quality: Whether to use quality filtering + clip_vision: ComfyUI CLIP Vision model + + Returns: + List of keyframe indices + """ + num_frames, _, height, width = frames.shape + + # Resize frames for efficient processing + resized_h, resized_w = self.smart_resize(height, width) + resized_frames = F.interpolate( + frames, + size=(resized_h, resized_w), + mode="bilinear", + align_corners=False + ).float() + + # Load quality model if needed + if use_quality: + self.load_quality_model() + + # Find first high-quality frame + first_idx = 0 + if use_quality and self.quality_model is not None: + while first_idx < num_frames: + if not self.is_low_quality(resized_frames[first_idx], quality_threshold): + break + first_idx += 1 + + if first_idx >= num_frames: + return [] # No high-quality frames found + + # Initialize keyframes + keyframe_indices = [first_idx] + last_keyframe = resized_frames[first_idx] + + # Iterate through remaining frames + pbar = ProgressBar(num_frames - first_idx - 1) + for i in range(first_idx + 1, num_frames): + current_frame = resized_frames[i] + + # Calculate similarity with last keyframe + similarity = self.get_clip_similarity(last_keyframe, current_frame, clip_vision) + + # Check if frame is different enough and high quality + is_different = similarity < threshold + is_quality = True + if use_quality and self.quality_model is not None: + is_quality = not self.is_low_quality(current_frame, quality_threshold) + + if is_different and is_quality: + keyframe_indices.append(i) + last_keyframe = current_frame + + pbar.update(1) + + return keyframe_indices + + def check_memory_duplicates(self, keyframes: torch.Tensor, + memory_frames: torch.Tensor, + clip_vision, + threshold: float = 0.9) -> list: + """ + Filter out keyframes that are too similar to memory frames + + Returns: + List of boolean flags (True = keep, False = duplicate) + """ + keep_flags = [] + + for keyframe in keyframes: + is_duplicate = False + for memory_frame in memory_frames: + similarity = self.get_clip_similarity(keyframe, memory_frame, clip_vision) + if similarity > threshold: + is_duplicate = True + break + keep_flags.append(not is_duplicate) + + return keep_flags + + def extract_keyframes(self, frames, clip_vision, max_keyframes, similarity_threshold, + use_quality_filter, quality_threshold, memory_frames=None): + """ + Main extraction function + + Args: + frames: ComfyUI IMAGE format [B, H, W, C] in range [0, 1] + clip_vision: CLIP Vision model name from dropdown + max_keyframes: Maximum number of keyframes + similarity_threshold: Initial CLIP similarity threshold + use_quality_filter: Whether to use HPSv3 filtering + quality_threshold: HPSv3 threshold + memory_frames: Optional previous keyframes to avoid duplicates + + Returns: + (keyframes, keyframe_count) + """ + # Load CLIP Vision model from ComfyUI models folder + clip_vision_model = self.load_clip_model(clip_vision) + + # Convert ComfyUI format [B, H, W, C] to PyTorch [B, C, H, W] + frames_tensor = frames.permute(0, 3, 1, 2).contiguous() + + # Adaptive threshold loop + threshold = similarity_threshold + while True: + keyframe_indices = self.extract_keyframe_indices( + frames_tensor, + threshold, + quality_threshold, + use_quality_filter, + clip_vision_model + ) + + # Check if we have too many keyframes + if len(keyframe_indices) <= max_keyframes: + break + + # Increase threshold to get fewer keyframes + threshold -= ADAPTIVE_ALPHA + + # Safety check + if threshold < 0.5: + # Take first N keyframes + keyframe_indices = keyframe_indices[:max_keyframes] + break + + print(f"Extracted {len(keyframe_indices)} keyframes at threshold {threshold:.3f}") + + # Extract keyframes + if len(keyframe_indices) == 0: + # Return first frame as fallback + keyframes_out = frames[:1] + return (keyframes_out, 1) + + keyframes_tensor = frames_tensor[keyframe_indices] + + # Check against memory frames to avoid duplicates + if memory_frames is not None: + memory_tensor = memory_frames.permute(0, 3, 1, 2).contiguous() + keep_flags = self.check_memory_duplicates( + keyframes_tensor, + memory_tensor, + clip_vision_model, + threshold=MIN_FRAME_SIMILARITY + ) + + # Filter keyframes + kept_indices = [i for i, keep in enumerate(keep_flags) if keep] + if len(kept_indices) > 0: + keyframes_tensor = keyframes_tensor[kept_indices] + else: + # Keep at least one keyframe + keyframes_tensor = keyframes_tensor[:1] + + # Convert back to ComfyUI format [B, H, W, C] + keyframes_out = keyframes_tensor.permute(0, 2, 3, 1).contiguous() + + return (keyframes_out, keyframes_out.shape[0]) + + +class FunPackStoryMemLastFrameExtractor: + """Extract last frame and last N frames for MI2V/MM2V continuity""" + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "frames": ("IMAGE",), + "n_frames": ("INT", { + "default": 5, + "min": 1, + "max": 20, + "step": 1, + "tooltip": "Number of frames to extract from end (for MM2V)" + }), + } + } + + RETURN_TYPES = ("IMAGE", "IMAGE",) + RETURN_NAMES = ("last_frame", "motion_frames",) + FUNCTION = "extract" + CATEGORY = "FunPack" + DESCRIPTION = "Extract last frame and last N frames for shot continuity (MI2V/MM2V)" + + def extract(self, frames, n_frames): + """ + Extract last frame and last N frames + + Returns: + (last_frame [1, H, W, C], motion_frames [N, H, W, C]) + """ + last_frame = frames[-1:] + motion_frames = frames[-n_frames:] + + return (last_frame, motion_frames) + # Update NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS -NODE_CLASS_MAPPINGS = { +NODE_CLASS_MAPPINGS = { + "FunPackStoryMemKeyframeExtractor": FunPackStoryMemKeyframeExtractor, + "FunPackStoryMemLastFrameExtractor": FunPackStoryMemLastFrameExtractor, "FunPackImg2LatentInterpolation": FunPackImg2LatentInterpolation, "FunPackCLIPLoader": FunPackCLIPLoader, "FunPackPromptEnhancer": FunPackPromptEnhancer, @@ -385,7 +624,9 @@ NODE_CLASS_MAPPINGS = { "FunPackContinueVideo": FunPackContinueVideo, } -NODE_DISPLAY_NAME_MAPPINGS = { +NODE_DISPLAY_NAME_MAPPINGS = { + "FunPackStoryMemKeyframeExtractor": "FunPack StoryMem Keyframe Extractor", + "FunPackStoryMemLastFrameExtractor": "FunPack StoryMem Last Frame Extractor", "FunPackImg2LatentInterpolation": "FunPack Img2Latent Interpolation", "FunPackCLIPLoader": "FunPack CLIP Loader", "FunPackPromptEnhancer": "FunPack Prompt Enhancer (Standalone)", From c3b2ff2c88fc02aeabb13d09b439f1a5342cb410 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 00:21:06 +0200 Subject: [PATCH 03/19] Fixed loading of deleted node --- funpack.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/funpack.py b/funpack.py index 237ff495..705e95e4 100644 --- a/funpack.py +++ b/funpack.py @@ -17,9 +17,9 @@ from PIL import Image import folder_paths from comfy.utils import ProgressBar import comfy.clip_vision -import math - -# Constants from StoryMem +import math + +# Constants from StoryMem IMAGE_FACTOR = 28 VIDEO_MIN_PIXELS = 48 * IMAGE_FACTOR * IMAGE_FACTOR # 37,632 MIN_FRAME_SIMILARITY = 0.9 @@ -253,8 +253,8 @@ class FunPackContinueVideo: raise ValueError(f"Cannot extract {frame_count} frames from video with only {total_frames} frames.") continued = images[-frame_count:] - return (continued,) - + return (continued,) + class FunPackStoryMemKeyframeExtractor: """ Extracts keyframes from video frames using: @@ -610,26 +610,25 @@ class FunPackStoryMemLastFrameExtractor: last_frame = frames[-1:] motion_frames = frames[-n_frames:] - return (last_frame, motion_frames) + return (last_frame, motion_frames) # Update NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS -NODE_CLASS_MAPPINGS = { - "FunPackStoryMemKeyframeExtractor": FunPackStoryMemKeyframeExtractor, +NODE_CLASS_MAPPINGS = { + "FunPackStoryMemKeyframeExtractor": FunPackStoryMemKeyframeExtractor, "FunPackStoryMemLastFrameExtractor": FunPackStoryMemLastFrameExtractor, "FunPackImg2LatentInterpolation": FunPackImg2LatentInterpolation, - "FunPackCLIPLoader": FunPackCLIPLoader, "FunPackPromptEnhancer": FunPackPromptEnhancer, "FunPackVideoStitch": FunPackVideoStitch, "FunPackContinueVideo": FunPackContinueVideo, } -NODE_DISPLAY_NAME_MAPPINGS = { - "FunPackStoryMemKeyframeExtractor": "FunPack StoryMem Keyframe Extractor", +NODE_DISPLAY_NAME_MAPPINGS = { + "FunPackStoryMemKeyframeExtractor": "FunPack StoryMem Keyframe Extractor", "FunPackStoryMemLastFrameExtractor": "FunPack StoryMem Last Frame Extractor", "FunPackImg2LatentInterpolation": "FunPack Img2Latent Interpolation", - "FunPackCLIPLoader": "FunPack CLIP Loader", "FunPackPromptEnhancer": "FunPack Prompt Enhancer (Standalone)", "FunPackVideoStitch": "FunPack Video Stitch", "FunPackContinueVideo": "FunPack Continue Video" -} \ No newline at end of file + +} From cd2cbaac81149c68f6575b70c39123b13c69b47d Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 00:31:12 +0200 Subject: [PATCH 04/19] Quick fix for broken clip vision --- funpack.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/funpack.py b/funpack.py index 705e95e4..aac27784 100644 --- a/funpack.py +++ b/funpack.py @@ -368,22 +368,26 @@ class FunPackStoryMemKeyframeExtractor: @torch.no_grad() def get_clip_similarity(self, frame1: torch.Tensor, frame2: torch.Tensor, clip_vision) -> float: - """Calculate CLIP embedding cosine similarity between two frames using ComfyUI CLIP Vision""" - + """Calculate CLIP embedding cosine similarity between two frames using ComfyUI CLIP Vision""" + # Preprocess frames to [1, H, W, C] format x1 = self.clip_preprocess(frame1, clip_vision) x2 = self.clip_preprocess(frame2, clip_vision) - + # Get CLIP Vision embeddings using ComfyUI's encode_image # encode_image expects [B, H, W, C] and returns embeddings z1 = clip_vision.encode_image(x1) z2 = clip_vision.encode_image(x2) - + + # Extract the actual tensor from the CLIP vision output + z1 = z1['clip_vision_output'] if isinstance(z1, dict) else z1[0] # Handle dict or tuple + z2 = z2['clip_vision_output'] if isinstance(z2, dict) else z2[0] # Handle dict or tuple + # Normalize and compute cosine similarity z1 = F.normalize(z1, dim=-1) z2 = F.normalize(z2, dim=-1) similarity = (z1 * z2).sum(dim=-1).item() - + return similarity def is_low_quality(self, frame: torch.Tensor, threshold: float) -> bool: @@ -632,3 +636,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { "FunPackContinueVideo": "FunPack Continue Video" } + From 3a79ea958831a809c68845fd93620f2562059a38 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 00:33:30 +0200 Subject: [PATCH 05/19] Update funpack.py --- funpack.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/funpack.py b/funpack.py index aac27784..56e23832 100644 --- a/funpack.py +++ b/funpack.py @@ -368,8 +368,6 @@ class FunPackStoryMemKeyframeExtractor: @torch.no_grad() def get_clip_similarity(self, frame1: torch.Tensor, frame2: torch.Tensor, clip_vision) -> float: - """Calculate CLIP embedding cosine similarity between two frames using ComfyUI CLIP Vision""" - # Preprocess frames to [1, H, W, C] format x1 = self.clip_preprocess(frame1, clip_vision) x2 = self.clip_preprocess(frame2, clip_vision) @@ -637,3 +635,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { } + From 1ab1499016f5a7831e009a7b432e79caa911cce0 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 00:40:39 +0200 Subject: [PATCH 06/19] another goddamn fix, hope this works --- funpack.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/funpack.py b/funpack.py index 56e23832..1076a627 100644 --- a/funpack.py +++ b/funpack.py @@ -368,18 +368,31 @@ class FunPackStoryMemKeyframeExtractor: @torch.no_grad() def get_clip_similarity(self, frame1: torch.Tensor, frame2: torch.Tensor, clip_vision) -> float: + # Preprocess frames to [1, H, W, C] format x1 = self.clip_preprocess(frame1, clip_vision) x2 = self.clip_preprocess(frame2, clip_vision) - # Get CLIP Vision embeddings using ComfyUI's encode_image - # encode_image expects [B, H, W, C] and returns embeddings + # Get CLIP Vision embeddings z1 = clip_vision.encode_image(x1) z2 = clip_vision.encode_image(x2) - # Extract the actual tensor from the CLIP vision output - z1 = z1['clip_vision_output'] if isinstance(z1, dict) else z1[0] # Handle dict or tuple - z2 = z2['clip_vision_output'] if isinstance(z2, dict) else z2[0] # Handle dict or tuple + # Extract tensor if wrapped in ComfyUI's CLIP_VISION_OUTPUT (single-element tuple) + if isinstance(z1, (tuple, list)): + if len(z1) == 1: + z1 = z1[0] + else: + raise ValueError(f"Unexpected CLIP vision output structure: tuple/list of length {len(z1)}") + if isinstance(z2, (tuple, list)): + if len(z2) == 1: + z2 = z2[0] + else: + raise ValueError(f"Unexpected CLIP vision output structure: tuple/list of length {len(z2)}") + + # Ensure we have actual tensors + if not isinstance(z1, torch.Tensor) or not isinstance(z2, torch.Tensor): + raise TypeError("CLIP vision encoding did not return a tensor. " + "Ensure 'clip_vision' input is connected to CLIP Vision Loader (not Encode node).") # Normalize and compute cosine similarity z1 = F.normalize(z1, dim=-1) @@ -636,3 +649,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { } + From fc563cfb749b74f6f5e9e3b04c63b9b9bf41a541 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 00:48:11 +0200 Subject: [PATCH 07/19] f my life bro why coding is so hard --- funpack.py | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/funpack.py b/funpack.py index 1076a627..d9c08630 100644 --- a/funpack.py +++ b/funpack.py @@ -374,25 +374,42 @@ class FunPackStoryMemKeyframeExtractor: x2 = self.clip_preprocess(frame2, clip_vision) # Get CLIP Vision embeddings - z1 = clip_vision.encode_image(x1) - z2 = clip_vision.encode_image(x2) + z1_raw = clip_vision.encode_image(x1) + z2_raw = clip_vision.encode_image(x2) - # Extract tensor if wrapped in ComfyUI's CLIP_VISION_OUTPUT (single-element tuple) - if isinstance(z1, (tuple, list)): - if len(z1) == 1: - z1 = z1[0] - else: - raise ValueError(f"Unexpected CLIP vision output structure: tuple/list of length {len(z1)}") - if isinstance(z2, (tuple, list)): - if len(z2) == 1: - z2 = z2[0] - else: - raise ValueError(f"Unexpected CLIP vision output structure: tuple/list of length {len(z2)}") + # Extract the actual embedding tensor from various possible return formats + def extract_embedding(output): + # Case 1: Direct tensor (older models) + if isinstance(output, torch.Tensor): + return output + + # Case 2: Dictionary with common keys (most modern projection models) + if isinstance(output, dict): + if 'image_embeds' in output: + return output['image_embeds'] + if 'pooled_output' in output: + return output['pooled_output'] + if 'last_hidden_state' in output: + # Some models return full sequence — use pooled or mean + return output['last_hidden_state'][:, 0] # CLS token equivalent + # Fallback: return first tensor value + for v in output.values(): + if isinstance(v, torch.Tensor) and v.ndim >= 2: + return v if v.shape[1] == 1 else v.mean(dim=1) # pool if needed + raise ValueError(f"No embedding tensor found in dict: {list(output.keys())}") + + # Case 3: Tuple wrapper (shouldn't happen here, but safe) + if isinstance(output, (tuple, list)) and len(output) == 1: + return extract_embedding(output[0]) + + raise TypeError(f"Unexpected output from encode_image: {type(output)}") + + z1 = extract_embedding(z1_raw) + z2 = extract_embedding(z2_raw) - # Ensure we have actual tensors - if not isinstance(z1, torch.Tensor) or not isinstance(z2, torch.Tensor): - raise TypeError("CLIP vision encoding did not return a tensor. " - "Ensure 'clip_vision' input is connected to CLIP Vision Loader (not Encode node).") + # Final sanity check + if not (isinstance(z1, torch.Tensor) and isinstance(z2, torch.Tensor)): + raise RuntimeError(f"Failed to extract valid embeddings: {type(z1)}, {type(z2)}") # Normalize and compute cosine similarity z1 = F.normalize(z1, dim=-1) @@ -650,3 +667,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From ec48c6594d2fd2dc3f4b9edcc8f2f5f87fbeb450 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 00:53:42 +0200 Subject: [PATCH 08/19] hooray vibecoding --- funpack.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/funpack.py b/funpack.py index d9c08630..a9e32d42 100644 --- a/funpack.py +++ b/funpack.py @@ -379,37 +379,48 @@ class FunPackStoryMemKeyframeExtractor: # Extract the actual embedding tensor from various possible return formats def extract_embedding(output): - # Case 1: Direct tensor (older models) + # Case 1: Direct tensor (older/basic models) if isinstance(output, torch.Tensor): return output - # Case 2: Dictionary with common keys (most modern projection models) + # Case 2: ComfyUI's custom Output wrapper (common with projection models) + if isinstance(output, comfy.clip_vision.Output): # Import at top if needed: import comfy.clip_vision + if hasattr(output, 'image_embeds'): + return output.image_embeds + elif hasattr(output, 'pooled_output'): + return output.pooled_output + # Fallback: treat like dict + try: + return output['image_embeds'] + except: + pass + + # Case 3: Dictionary (some models) if isinstance(output, dict): if 'image_embeds' in output: return output['image_embeds'] if 'pooled_output' in output: return output['pooled_output'] if 'last_hidden_state' in output: - # Some models return full sequence — use pooled or mean - return output['last_hidden_state'][:, 0] # CLS token equivalent - # Fallback: return first tensor value + return output['last_hidden_state'][:, 0] # CLS token if sequence + # Fallback: first tensor value for v in output.values(): if isinstance(v, torch.Tensor) and v.ndim >= 2: - return v if v.shape[1] == 1 else v.mean(dim=1) # pool if needed - raise ValueError(f"No embedding tensor found in dict: {list(output.keys())}") + return v - # Case 3: Tuple wrapper (shouldn't happen here, but safe) + # Case 4: Tuple (rare here, but safe) if isinstance(output, (tuple, list)) and len(output) == 1: return extract_embedding(output[0]) - raise TypeError(f"Unexpected output from encode_image: {type(output)}") + raise TypeError(f"Unexpected output from encode_image: {type(output)}. " + "Supported: tensor, dict, or comfy.clip_vision.Output with 'image_embeds'.") z1 = extract_embedding(z1_raw) z2 = extract_embedding(z2_raw) - # Final sanity check + # Final check if not (isinstance(z1, torch.Tensor) and isinstance(z2, torch.Tensor)): - raise RuntimeError(f"Failed to extract valid embeddings: {type(z1)}, {type(z2)}") + raise RuntimeError(f"Failed to extract tensor embeddings: {type(z1)}, {type(z2)}") # Normalize and compute cosine similarity z1 = F.normalize(z1, dim=-1) @@ -668,3 +679,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From 9b835690e00baee1d79193e22133a92f5b2ad6c2 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 02:23:48 +0200 Subject: [PATCH 09/19] Experimental prompt to JSON converter for StoryMem --- funpack.py | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/funpack.py b/funpack.py index a9e32d42..3c7943ad 100644 --- a/funpack.py +++ b/funpack.py @@ -19,6 +19,7 @@ from comfy.utils import ProgressBar import comfy.clip_vision import math + # Constants from StoryMem IMAGE_FACTOR = 28 VIDEO_MIN_PIXELS = 48 * IMAGE_FACTOR * IMAGE_FACTOR # 37,632 @@ -27,6 +28,107 @@ MAX_KEYFRAME_NUM = 3 ADAPTIVE_ALPHA = 0.01 HPSV3_QUALITY_THRESHOLD = 3.0 +class FunPackStoryMemJSONConverter: + """ + FunPack StoryMem LoRA JSON Converter for WAN2.2 + Manually input all story elements and get 3 separate JSON outputs (one per sampler) + """ + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "story_name": ("STRING", {"default": "My Story Title"}), + "story_overview": ("STRING", {"multiline": True, "default": "Brief description of the overall story..."}), + + # Scene 1 (Sampler 1) + "scene1_video_prompts": ("STRING", {"multiline": True, "default": "prompt 1\nprompt 2\nprompt 3"}), + "scene1_first_frames": ("STRING", {"multiline": True, "default": "first frame 1\nfirst frame 2\nfirst frame 3"}), + "scene1_cuts": ("STRING", {"default": "true, false, true", "tooltip": "comma-separated: true,false,true,... (one less than number of prompts)"}), + + # Scene 2 (Sampler 2) + "scene2_video_prompts": ("STRING", {"multiline": True, "default": ""}), + "scene2_first_frames": ("STRING", {"multiline": True, "default": ""}), + "scene2_cuts": ("STRING", {"default": "", "tooltip": "comma-separated boolean values"}), + + # Scene 3 (Sampler 3) + "scene3_video_prompts": ("STRING", {"multiline": True, "default": ""}), + "scene3_first_frames": ("STRING", {"multiline": True, "default": ""}), + "scene3_cuts": ("STRING", {"default": "", "tooltip": "comma-separated boolean values"}), + } + } + + RETURN_TYPES = ("STRING", "STRING", "STRING") + RETURN_NAMES = ("json_sampler_1", "json_sampler_2", "json_sampler_3") + OUTPUT_NODE = True + FUNCTION = "format_json" + CATEGORY = "FunPack" + + def format_json(self, + story_name, + story_overview, + + scene1_video_prompts, scene1_first_frames, scene1_cuts, + scene2_video_prompts, scene2_first_frames, scene2_cuts, + scene3_video_prompts, scene3_first_frames, scene3_cuts): + + scenes_input = [ + (scene1_video_prompts, scene1_first_frames, scene1_cuts, 1), + (scene2_video_prompts, scene2_first_frames, scene2_cuts, 2), + (scene3_video_prompts, scene3_first_frames, scene3_cuts, 3), + ] + + outputs = ["", "", ""] + + for i, (video_text, first_text, cuts_text, scene_num) in enumerate(scenes_input): + if not video_text.strip(): + outputs[i] = "" # empty → skip / no output for this sampler + continue + + # Split by newlines + video_prompts = [p.strip() for p in video_text.split("\n") if p.strip()] + first_prompts = [f.strip() for f in first_text.split("\n") if f.strip()] + + if len(video_prompts) != len(first_prompts): + raise ValueError(f"Scene {scene_num}: Number of video prompts and first frame prompts must match!") + + # Parse cuts + if cuts_text.strip(): + cuts_str = [c.strip().lower() for c in cuts_text.split(",") if c.strip()] + cuts = [] + for c in cuts_str: + if c in ("true", "t", "1", "yes"): + cuts.append(True) + elif c in ("false", "f", "0", "no", ""): + cuts.append(False) + else: + raise ValueError(f"Invalid cut value in scene {scene_num}: '{c}' (use true/false)") + else: + # Default: no cut after first prompt, cut before each subsequent one + cuts = [False] + [True] * (len(video_prompts) - 1) + + if len(cuts) != len(video_prompts) - 1: + raise ValueError( + f"Scene {scene_num}: Number of cut values ({len(cuts)}) should be " + f"one less than number of prompts ({len(video_prompts)})" + ) + + scene = { + "scene_num": scene_num, + "video_prompts": video_prompts, + "first_frame_prompt": first_prompts, + "cut": cuts + } + + full_json = { + "story_name": story_name.strip(), + "story_overview": story_overview.strip(), + "scenes": [scene] # single scene per sampler + } + + outputs[i] = json.dumps(full_json, indent=2, ensure_ascii=False) + + return tuple(outputs) + class FunPackImg2LatentInterpolation: @classmethod def INPUT_TYPES(cls): @@ -658,6 +760,7 @@ class FunPackStoryMemLastFrameExtractor: # Update NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS NODE_CLASS_MAPPINGS = { + "FunPackStoryMemJSONConverter": FunPackStoryMemJSONConverter, "FunPackStoryMemKeyframeExtractor": FunPackStoryMemKeyframeExtractor, "FunPackStoryMemLastFrameExtractor": FunPackStoryMemLastFrameExtractor, "FunPackImg2LatentInterpolation": FunPackImg2LatentInterpolation, @@ -667,6 +770,7 @@ NODE_CLASS_MAPPINGS = { } NODE_DISPLAY_NAME_MAPPINGS = { + "FunPackStoryMemJSONConverter": "FunPack StoryMem JSON Converter", "FunPackStoryMemKeyframeExtractor": "FunPack StoryMem Keyframe Extractor", "FunPackStoryMemLastFrameExtractor": "FunPack StoryMem Last Frame Extractor", "FunPackImg2LatentInterpolation": "FunPack Img2Latent Interpolation", @@ -680,3 +784,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From 890c31f65b841b4b2f1de4675d9cb0f89b0ed10a Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 02:40:53 +0200 Subject: [PATCH 10/19] Fixing the json converter --- funpack.py | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/funpack.py b/funpack.py index 3c7943ad..7fc037a2 100644 --- a/funpack.py +++ b/funpack.py @@ -18,7 +18,7 @@ import folder_paths from comfy.utils import ProgressBar import comfy.clip_vision import math - +import json # Constants from StoryMem IMAGE_FACTOR = 28 @@ -31,7 +31,8 @@ HPSV3_QUALITY_THRESHOLD = 3.0 class FunPackStoryMemJSONConverter: """ FunPack StoryMem LoRA JSON Converter for WAN2.2 - Manually input all story elements and get 3 separate JSON outputs (one per sampler) + Strict matching: video_prompts count == first_frame_prompt count == cut count + (as per official examples) """ @classmethod def INPUT_TYPES(cls): @@ -43,7 +44,7 @@ class FunPackStoryMemJSONConverter: # Scene 1 (Sampler 1) "scene1_video_prompts": ("STRING", {"multiline": True, "default": "prompt 1\nprompt 2\nprompt 3"}), "scene1_first_frames": ("STRING", {"multiline": True, "default": "first frame 1\nfirst frame 2\nfirst frame 3"}), - "scene1_cuts": ("STRING", {"default": "true, false, true", "tooltip": "comma-separated: true,false,true,... (one less than number of prompts)"}), + "scene1_cuts": ("STRING", {"default": "true, false, false", "tooltip": "comma-separated booleans — must match # of prompts"}), # Scene 2 (Sampler 2) "scene2_video_prompts": ("STRING", {"multiline": True, "default": ""}), @@ -81,15 +82,24 @@ class FunPackStoryMemJSONConverter: for i, (video_text, first_text, cuts_text, scene_num) in enumerate(scenes_input): if not video_text.strip(): - outputs[i] = "" # empty → skip / no output for this sampler + outputs[i] = "" continue - # Split by newlines + # Split prompts (skip empty lines) video_prompts = [p.strip() for p in video_text.split("\n") if p.strip()] first_prompts = [f.strip() for f in first_text.split("\n") if f.strip()] - if len(video_prompts) != len(first_prompts): - raise ValueError(f"Scene {scene_num}: Number of video prompts and first frame prompts must match!") + num_prompts = len(video_prompts) + if num_prompts == 0: + outputs[i] = "" + continue + + # Enforce matching lengths for prompts and first-frames (per examples) + if len(first_prompts) != num_prompts: + raise ValueError( + f"Scene {scene_num}: Number of video prompts ({num_prompts}) " + f"must match number of first frame prompts ({len(first_prompts)})" + ) # Parse cuts if cuts_text.strip(): @@ -103,13 +113,14 @@ class FunPackStoryMemJSONConverter: else: raise ValueError(f"Invalid cut value in scene {scene_num}: '{c}' (use true/false)") else: - # Default: no cut after first prompt, cut before each subsequent one - cuts = [False] + [True] * (len(video_prompts) - 1) + # Default: all False (no cuts), matching common safe starting point + cuts = [False] * num_prompts - if len(cuts) != len(video_prompts) - 1: + # Enforce: cuts must match number of prompts exactly (per examples) + if len(cuts) != num_prompts: raise ValueError( - f"Scene {scene_num}: Number of cut values ({len(cuts)}) should be " - f"one less than number of prompts ({len(video_prompts)})" + f"Scene {scene_num}: Number of cut values ({len(cuts)}) " + f"must match number of prompts ({num_prompts})" ) scene = { @@ -122,7 +133,7 @@ class FunPackStoryMemJSONConverter: full_json = { "story_name": story_name.strip(), "story_overview": story_overview.strip(), - "scenes": [scene] # single scene per sampler + "scenes": [scene] } outputs[i] = json.dumps(full_json, indent=2, ensure_ascii=False) @@ -785,3 +796,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From 33381e6d2f7c0af63f599794260c3638560fb352 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 25 Dec 2025 02:53:31 +0200 Subject: [PATCH 11/19] Example workflow for StoryMem --- WanVideo PRO (StoryMem ver.).json | 10967 ++++++++++++++++++++++++++++ 1 file changed, 10967 insertions(+) create mode 100644 WanVideo PRO (StoryMem ver.).json diff --git a/WanVideo PRO (StoryMem ver.).json b/WanVideo PRO (StoryMem ver.).json new file mode 100644 index 00000000..78b0e60f --- /dev/null +++ b/WanVideo PRO (StoryMem ver.).json @@ -0,0 +1,10967 @@ +{ + "id": "121e4a5b-3482-4256-9b5d-ceb54c3f14e1", + "revision": 0, + "last_node_id": 78, + "last_link_id": 508, + "nodes": [ + { + "id": 48, + "type": "RepeatImageBatch", + "pos": [ + 1939.3772827605799, + 446.57172905235933 + ], + "size": [ + 270, + 58 + ], + "flags": { + "collapsed": true + }, + "order": 0, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.68", + "Node name for S&R": "RepeatImageBatch", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {}, + "version": "7.4.1" + } + }, + "widgets_values": [ + 81 + ] + }, + { + "id": 33, + "type": "FunPackVideoStitch", + "pos": [ + 4413.284611539381, + 296.06847283224937 + ], + "size": [ + 270, + 198 + ], + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "video1", + "shape": 7, + "type": "IMAGE", + "link": 72 + }, + { + "name": "video2", + "shape": 7, + "type": "IMAGE", + "link": 73 + }, + { + "name": "video3", + "shape": 7, + "type": "IMAGE", + "link": 417 + }, + { + "name": "video4", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video5", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video6", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video7", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video8", + "shape": 7, + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "STITCHED", + "type": "IMAGE", + "links": [ + 75 + ] + } + ], + "properties": { + "aux_id": "olivv-cs/ComfyUI-FunPack", + "ver": "cb018fd4511d6b4b8340b1484a6015abbdb14ba3", + "Node name for S&R": "FunPackVideoStitch", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {}, + "version": "7.4.1" + } + }, + "widgets_values": [ + 1 + ] + }, + { + "id": 64, + "type": "FunPackVideoStitch", + "pos": [ + 4415.265527579787, + 540.8335092203581 + ], + "size": [ + 270, + 198 + ], + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "video1", + "shape": 7, + "type": "IMAGE", + "link": 444 + }, + { + "name": "video2", + "shape": 7, + "type": "IMAGE", + "link": 445 + }, + { + "name": "video3", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video4", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video5", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video6", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video7", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "video8", + "shape": 7, + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "STITCHED", + "type": "IMAGE", + "links": [ + 448 + ] + } + ], + "properties": { + "aux_id": "olivv-cs/ComfyUI-FunPack", + "ver": "cb018fd4511d6b4b8340b1484a6015abbdb14ba3", + "Node name for S&R": "FunPackVideoStitch", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {}, + "version": "7.4.1" + } + }, + "widgets_values": [ + 1 + ] + }, + { + "id": 34, + "type": "VHS_VideoCombine", + "pos": [ + 4709.26413933938, + 293.4755517322494 + ], + "size": [ + 228.36666870117188, + 617.015627861023 + ], + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 75 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "8923bd836bdab8b7bbdf4ed104b7d045e70c66e2", + "Node name for S&R": "VHS_VideoCombine", + "aux_id": "Kosinkadink/ComfyUI-VideoHelperSuite", + "ue_properties": { + "widget_ue_connectable": { + "frame_rate": true, + "loop_count": true, + "filename_prefix": true, + "format": true, + "pingpong": true, + "save_output": true, + "pix_fmt": true, + "crf": true, + "save_metadata": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": { + "frame_rate": 16, + "loop_count": 0, + "filename_prefix": "result4", + "format": "video/h265-mp4", + "pix_fmt": "yuv420p", + "crf": 17, + "save_metadata": true, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "result4_00001.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h265-mp4", + "frame_rate": 16, + "workflow": "result4_00001.png", + "fullpath": "/workspace/ComfyUI/temp/result4_00001.mp4" + } + } + } + }, + { + "id": 65, + "type": "VHS_VideoCombine", + "pos": [ + 4952.048510579785, + 291.0434082203582 + ], + "size": [ + 228.36666870117188, + 617.015627861023 + ], + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 448 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "8923bd836bdab8b7bbdf4ed104b7d045e70c66e2", + "Node name for S&R": "VHS_VideoCombine", + "aux_id": "Kosinkadink/ComfyUI-VideoHelperSuite", + "ue_properties": { + "widget_ue_connectable": { + "frame_rate": true, + "loop_count": true, + "filename_prefix": true, + "format": true, + "pingpong": true, + "save_output": true, + "pix_fmt": true, + "crf": true, + "save_metadata": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": { + "frame_rate": 16, + "loop_count": 0, + "filename_prefix": "result_23_4", + "format": "video/h265-mp4", + "pix_fmt": "yuv420p", + "crf": 17, + "save_metadata": true, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "result_23_4_00001.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h265-mp4", + "frame_rate": 16, + "workflow": "result_23_4_00001.png", + "fullpath": "/workspace/ComfyUI/temp/result_23_4_00001.mp4" + } + } + } + }, + { + "id": 22, + "type": "VHS_VideoCombine", + "pos": [ + 3329.423597818514, + 290.442478350992 + ], + "size": [ + 228.36666870117188, + 617.015627861023 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 22 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "8923bd836bdab8b7bbdf4ed104b7d045e70c66e2", + "Node name for S&R": "VHS_VideoCombine", + "aux_id": "Kosinkadink/ComfyUI-VideoHelperSuite", + "ue_properties": { + "widget_ue_connectable": { + "frame_rate": true, + "loop_count": true, + "filename_prefix": true, + "format": true, + "pingpong": true, + "save_output": true, + "pix_fmt": true, + "crf": true, + "save_metadata": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": { + "frame_rate": 16, + "loop_count": 0, + "filename_prefix": "second_sampler3", + "format": "video/h265-mp4", + "pix_fmt": "yuv420p", + "crf": 14, + "save_metadata": true, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "second_sampler3_00001.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h265-mp4", + "frame_rate": 16, + "workflow": "second_sampler3_00001.png", + "fullpath": "/workspace/ComfyUI/temp/second_sampler3_00001.mp4" + } + } + } + }, + { + "id": 18, + "type": "VHS_VideoCombine", + "pos": [ + 2484.9822206785175, + 291.26821959217034 + ], + "size": [ + 228.36666870117188, + 617.015627861023 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 18 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "8923bd836bdab8b7bbdf4ed104b7d045e70c66e2", + "Node name for S&R": "VHS_VideoCombine", + "aux_id": "Kosinkadink/ComfyUI-VideoHelperSuite", + "ue_properties": { + "widget_ue_connectable": { + "frame_rate": true, + "loop_count": true, + "filename_prefix": true, + "format": true, + "pingpong": true, + "save_output": true, + "pix_fmt": true, + "crf": true, + "save_metadata": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": { + "frame_rate": 16, + "loop_count": 0, + "filename_prefix": "first_sampler3", + "format": "video/h265-mp4", + "pix_fmt": "yuv420p", + "crf": 14, + "save_metadata": true, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "first_sampler3_00001.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h265-mp4", + "frame_rate": 16, + "workflow": "first_sampler3_00001.png", + "fullpath": "/workspace/ComfyUI/temp/first_sampler3_00001.mp4" + } + } + } + }, + { + "id": 6, + "type": "e23d5ebd-47a8-47df-8e3c-43f5d5f4dc6f", + "pos": [ + 1310.381987657945, + 446.31214318037786 + ], + "size": [ + 265.84000000000015, + 30.840000000000146 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "label": "text_encoder", + "name": "wan_t5_model", + "type": "WANTEXTENCODER", + "links": [ + 398, + 399, + 400 + ] + } + ], + "properties": { + "proxyWidgets": [], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 8, + "type": "2f75f8c8-81ce-4b21-813d-2d883c616125", + "pos": [ + 1312.5627548332386, + 371.4921431803779 + ], + "size": [ + 263.4200000000001, + 33.25999999999999 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "vae", + "type": "WANVAE", + "links": [ + 392, + 393, + 394, + 395, + 396, + 397 + ] + } + ], + "properties": { + "proxyWidgets": [], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 10, + "type": "fc8fe2eb-1dbb-48bc-a783-2e94b752c441", + "pos": [ + 1311.3527548332377, + 304.3403431803779 + ], + "size": [ + 263.4200000000001, + 26 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP_VISION", + "type": "CLIP_VISION", + "links": [ + 389, + 390, + 391 + ] + } + ], + "properties": { + "proxyWidgets": [], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 51, + "type": "WanVideoExperimentalArgs", + "pos": [ + 1608.939599471583, + 655.8868877260063 + ], + "size": [ + 255.53334045410156, + 374.73855732179663 + ], + "flags": {}, + "order": 4, + "mode": 4, + "inputs": [], + "outputs": [ + { + "name": "exp_args", + "type": "EXPERIMENTALARGS", + "links": [ + 418, + 419 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "d3f33a9f09e774e43500eed1abf7d975997dd1ee", + "Node name for S&R": "WanVideoExperimentalArgs", + "aux_id": "kijai/ComfyUI-WanVideoWrapper" + }, + "widgets_values": [ + "", + false, + false, + 0, + false, + 1, + 1.15, + 60, + false, + 1, + true, + false, + 0, + 0 + ] + }, + { + "id": 26, + "type": "VHS_VideoCombine", + "pos": [ + 4161.541439515632, + 286.3035664352763 + ], + "size": [ + 228.36666870117188, + 617.015627861023 + ], + "flags": { + "collapsed": false + }, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 35 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "8923bd836bdab8b7bbdf4ed104b7d045e70c66e2", + "Node name for S&R": "VHS_VideoCombine", + "aux_id": "Kosinkadink/ComfyUI-VideoHelperSuite", + "ue_properties": { + "widget_ue_connectable": { + "frame_rate": true, + "loop_count": true, + "filename_prefix": true, + "format": true, + "pingpong": true, + "save_output": true, + "pix_fmt": true, + "crf": true, + "save_metadata": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": { + "frame_rate": 16, + "loop_count": 0, + "filename_prefix": "third_sampler3", + "format": "video/h265-mp4", + "pix_fmt": "yuv420p", + "crf": 14, + "save_metadata": true, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "third_sampler3_00001.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h265-mp4", + "frame_rate": 16, + "workflow": "third_sampler3_00001.png", + "fullpath": "/workspace/ComfyUI/temp/third_sampler3_00001.mp4" + } + } + } + }, + { + "id": 24, + "type": "72c19279-7025-4a9a-bf8e-0e890c70044f", + "pos": [ + 3872.678278604839, + 293.38825552448054 + ], + "size": [ + 277.9499969482422, + 666.8307649381868 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "label": "text_embeds_3", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "link": 125 + }, + { + "label": "image_embeds_3", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 32 + }, + { + "label": "model_high_3", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 492 + }, + { + "label": "model_low_3", + "name": "model_1", + "type": "WANVIDEOMODEL", + "link": 493 + }, + { + "name": "vae", + "type": "WANVAE", + "link": 397 + }, + { + "name": "experimental_args", + "type": "EXPERIMENTALARGS", + "link": null + }, + { + "name": "experimental_args_1", + "type": "EXPERIMENTALARGS", + "link": null + }, + { + "name": "feta_args", + "type": "FETAARGS", + "link": null + }, + { + "name": "slg_args", + "type": "SLGARGS", + "link": null + } + ], + "outputs": [ + { + "label": "third_sampler_results", + "name": "images", + "type": "IMAGE", + "links": [ + 35, + 417, + 445 + ] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "steps" + ], + [ + "-1", + "cfg" + ], + [ + "-1", + "shift" + ], + [ + "-1", + "sigma" + ], + [ + "-1", + "vhslatentpreview" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": { + "steps": true, + "cfg": true, + "shift": true, + "sigma": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 5, + 1, + 5, + 0.9 + ] + }, + { + "id": 13, + "type": "3797c843-c451-413c-b3a4-2bf8a400ba28", + "pos": [ + 1892.8458258757269, + 308.9773041932841 + ], + "size": [ + 270.67999999999984, + 230 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 3 + }, + { + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 389 + }, + { + "name": "vae", + "type": "WANVAE", + "link": 392 + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 37, + 428 + ] + }, + { + "name": "height", + "type": "INT", + "links": [ + 38, + 429 + ] + }, + { + "label": "image_embeds_1", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 360 + ] + }, + { + "label": "reference_image", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 432, + 433 + ] + }, + { + "name": "samples", + "type": "LATENT", + "links": [ + 430, + 431, + 434 + ] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "width" + ], + [ + "-1", + "height" + ], + [ + "-1", + "num_frames" + ], + [ + "-1", + "crop_position" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": { + "width": true, + "height": true, + "num_frames": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 512, + 720, + 81, + "center" + ] + }, + { + "id": 17, + "type": "1f7cf909-f4b2-4a82-b3d5-8e1bde7a687e", + "pos": [ + 2187.017621798352, + 298.36623830880916 + ], + "size": [ + 274.46666717529297, + 681.931136246566 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "label": "text_embeds_1", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "link": 413 + }, + { + "label": "image_embeds_1", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 360 + }, + { + "label": "model_high_1", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 488 + }, + { + "label": "model_low_1", + "name": "model_1", + "type": "WANVIDEOMODEL", + "link": 489 + }, + { + "name": "vae", + "type": "WANVAE", + "link": 393 + }, + { + "name": "experimental_args", + "type": "EXPERIMENTALARGS", + "link": 418 + }, + { + "name": "experimental_args_1", + "type": "EXPERIMENTALARGS", + "link": 419 + }, + { + "name": "extra_latents", + "type": "LATENT", + "link": 434 + }, + { + "name": "feta_args", + "type": "FETAARGS", + "link": null + }, + { + "name": "slg_args", + "type": "SLGARGS", + "link": null + } + ], + "outputs": [ + { + "label": "first_sampler_results", + "name": "images", + "type": "IMAGE", + "links": [ + 18, + 72, + 446, + 486 + ] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "steps" + ], + [ + "-1", + "cfg" + ], + [ + "-1", + "shift" + ], + [ + "-1", + "sigma" + ], + [ + "-1", + "vhslatentpreview" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": { + "steps": true, + "cfg": true, + "shift": true, + "sigma": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 5, + 1, + 5, + 0.9 + ] + }, + { + "id": 21, + "type": "f8a1a675-ee93-411d-8a3c-9ea2a87d0a58", + "pos": [ + 3017.6903062431265, + 303.46164749238056 + ], + "size": [ + 294.16666412353516, + 689.6410220638736 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "label": "text_embeds_2", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "link": 100 + }, + { + "label": "image_embeds_2", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 24 + }, + { + "label": "model_high_2", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 490 + }, + { + "label": "model_low_2", + "name": "model_1", + "type": "WANVIDEOMODEL", + "link": 491 + }, + { + "name": "vae", + "type": "WANVAE", + "link": 394 + }, + { + "name": "experimental_args", + "type": "EXPERIMENTALARGS", + "link": null + }, + { + "name": "experimental_args_1", + "type": "EXPERIMENTALARGS", + "link": null + }, + { + "name": "feta_args", + "type": "FETAARGS", + "link": null + }, + { + "name": "slg_args", + "type": "SLGARGS", + "link": null + } + ], + "outputs": [ + { + "label": "second_sampler_results", + "name": "images", + "type": "IMAGE", + "links": [ + 22, + 73, + 444, + 447, + 487 + ] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "steps" + ], + [ + "-1", + "cfg" + ], + [ + "-1", + "shift" + ], + [ + "-1", + "sigma" + ], + [ + "-1", + "vhslatentpreview" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": { + "steps": true, + "cfg": true, + "shift": true, + "sigma": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 5, + 1, + 5, + 0.9 + ] + }, + { + "id": 2, + "type": "27ceba78-b0ec-46e1-977e-1a740f1d5d2b", + "pos": [ + 1308.6510029258905, + 520.2775531803773 + ], + "size": [ + 266.9284389999998, + 88.80999999999995 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "lora", + "type": "WANVIDLORA", + "link": 478 + }, + { + "name": "lora_1", + "type": "WANVIDLORA", + "link": 479 + } + ], + "outputs": [ + { + "label": "model_high", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 401, + 403, + 405 + ] + }, + { + "label": "model_low", + "name": "model_1", + "type": "WANVIDEOMODEL", + "links": [ + 402, + 404, + 406 + ] + } + ], + "properties": { + "proxyWidgets": [], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 4, + "type": "WanVideoLoraSelectMulti", + "pos": [ + 1310.0350548332394, + 652.9980431803774 + ], + "size": [ + 271.84999694824216, + 342 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": null + }, + { + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 410, + 411, + 412, + 479 + ] + } + ], + "title": "LoRAs Low (Global)", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoLoraSelectMulti", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": { + "lora_0": true, + "strength_0": true, + "lora_1": true, + "strength_1": true, + "lora_2": true, + "strength_2": true, + "lora_3": true, + "strength_3": true, + "lora_4": true, + "strength_4": true, + "low_mem_load": true, + "merge_loras": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "none", + 0.25, + "none", + 0.3, + "none", + 1, + "none", + 1, + "none", + 0.6, + false, + false + ] + }, + { + "id": 3, + "type": "WanVideoLoraSelectMulti", + "pos": [ + 1018.7396548332388, + 651.533943180378 + ], + "size": [ + 271.84999694824216, + 342 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": null + }, + { + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 407, + 408, + 409, + 478 + ] + } + ], + "title": "LoRAs High (Global)", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoLoraSelectMulti", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": { + "lora_0": true, + "strength_0": true, + "lora_1": true, + "strength_1": true, + "lora_2": true, + "strength_2": true, + "lora_3": true, + "strength_3": true, + "lora_4": true, + "strength_4": true, + "low_mem_load": true, + "merge_loras": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "none", + 0.25, + "none", + 0.3, + "none", + 1, + "none", + 1, + "none", + 0.6, + false, + false + ] + }, + { + "id": 11, + "type": "LoadImage", + "pos": [ + 1596.6235548332388, + 304.1308431803779 + ], + "size": [ + 274, + 314.00000000000006 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 3 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.68", + "Node name for S&R": "LoadImage", + "ue_properties": { + "widget_ue_connectable": { + "image": true, + "upload": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "G4cM5PaXIAEhmKJ.jpg", + "image" + ] + }, + { + "id": 19, + "type": "c498c212-f2a5-4b86-b79a-d5e4deb32166", + "pos": [ + 2731.628005327023, + 290.2668523469005 + ], + "size": [ + 270.67999999999984, + 226 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 446 + }, + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 37 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 38 + }, + { + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 391 + }, + { + "name": "vae", + "type": "WANVAE", + "link": 395 + }, + { + "name": "frame_count", + "type": "INT", + "link": null + }, + { + "label": "reference_image", + "name": "control_images", + "type": "IMAGE", + "link": 432 + }, + { + "name": "extra_latents", + "type": "LATENT", + "link": 430 + }, + { + "name": "memory_frames", + "type": "IMAGE", + "link": 486 + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [] + }, + { + "name": "height", + "type": "INT", + "links": [] + }, + { + "label": "image_embeds_2", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 24 + ] + }, + { + "name": "CONTINUED", + "type": "IMAGE", + "links": [] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "width" + ], + [ + "-1", + "height" + ], + [ + "-1", + "num_frames" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": { + "width": true, + "height": true, + "num_frames": true, + "frame_count": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 1.5, + 1.5, + 81 + ] + }, + { + "id": 23, + "type": "0d5ea664-7ebe-4da9-b561-a899d31bb5d8", + "pos": [ + 3568.3717486048386, + 296.5427255244805 + ], + "size": [ + 270.67999999999984, + 230 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 447 + }, + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 428 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 429 + }, + { + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 390 + }, + { + "name": "vae", + "type": "WANVAE", + "link": 396 + }, + { + "name": "frame_count", + "type": "INT", + "link": null + }, + { + "label": "reference_image", + "name": "control_images", + "type": "IMAGE", + "link": 433 + }, + { + "name": "extra_latents", + "type": "LATENT", + "link": 431 + }, + { + "name": "image_2", + "type": "IMAGE", + "link": 487 + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": null + }, + { + "name": "height", + "type": "INT", + "links": null + }, + { + "label": "image_embeds_3", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 32 + ] + }, + { + "name": "CONTINUED", + "type": "IMAGE", + "links": [] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "width" + ], + [ + "-1", + "height" + ], + [ + "-1", + "num_frames" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": { + "width": true, + "height": true, + "num_frames": true, + "frame_count": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 1.5, + 1.5, + 81 + ] + }, + { + "id": 74, + "type": "PreviewAny", + "pos": [ + 1629.0013768720955, + 1080.6304337066454 + ], + "size": [ + 210, + 166 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "source", + "type": "*", + "link": 503 + } + ], + "outputs": [], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.6.0", + "Node name for S&R": "PreviewAny" + }, + "widgets_values": [ + null, + null, + true + ] + }, + { + "id": 75, + "type": "PreviewAny", + "pos": [ + 1877.9834226535706, + 1075.7484328089695 + ], + "size": [ + 210, + 166 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "source", + "type": "*", + "link": 504 + } + ], + "outputs": [], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.6.0", + "Node name for S&R": "PreviewAny" + }, + "widgets_values": [ + null, + null, + true + ] + }, + { + "id": 76, + "type": "PreviewAny", + "pos": [ + 2123.7108011699274, + 1074.1210991764106 + ], + "size": [ + 210, + 166 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "source", + "type": "*", + "link": 505 + } + ], + "outputs": [], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.6.0", + "Node name for S&R": "PreviewAny" + }, + "widgets_values": [ + null, + null, + true + ] + }, + { + "id": 78, + "type": "FunPackStoryMemJSONConverter", + "pos": [ + 1151.4785240074166, + 1087.966184105397 + ], + "size": [ + 400, + 548.0000000000001 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "json_sampler_1", + "type": "STRING", + "links": [ + 503, + 506 + ] + }, + { + "name": "json_sampler_2", + "type": "STRING", + "links": [ + 504, + 507 + ] + }, + { + "name": "json_sampler_3", + "type": "STRING", + "links": [ + 505, + 508 + ] + } + ], + "properties": { + "aux_id": "olivv-cs/ComfyUI-FunPack", + "ver": "36b32ea54b767fb32cc08fc8208354f002d7a6bf", + "Node name for S&R": "FunPackStoryMemJSONConverter" + }, + "widgets_values": [ + "My Story Title", + "Brief description of the overall story...", + "prompt 1\nprompt 2\nprompt 3", + "first frame 1\nfirst frame 2\nfirst frame 3", + "true, false, false", + "", + "", + "", + "", + "", + "" + ] + }, + { + "id": 27, + "type": "11ced874-ea26-4f3b-9f38-b2832afbf879", + "pos": [ + 1884.11511221599, + 580.8828997223293 + ], + "size": [ + 289.4013811508821, + 188 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "label": "model_high", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 401 + }, + { + "label": "model_low", + "name": "model_1", + "type": "WANVIDEOMODEL", + "link": 402 + }, + { + "label": "text_encoder", + "name": "t5", + "type": "WANTEXTENCODER", + "link": 398 + }, + { + "label": "global_loras_h", + "name": "prev_lora", + "type": "WANVIDLORA", + "link": 407 + }, + { + "label": "global_loras_l", + "name": "prev_lora_1", + "type": "WANVIDLORA", + "link": 410 + }, + { + "name": "qwen", + "type": "QWENMODEL", + "link": null + }, + { + "name": "prompt", + "type": "STRING", + "widget": { + "name": "prompt" + }, + "link": 506 + } + ], + "outputs": [ + { + "label": "text_embeds_1", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "links": [ + 413 + ] + }, + { + "label": "model_high_1", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 488 + ] + }, + { + "label": "model_low_1", + "name": "model_1", + "type": "WANVIDEOMODEL", + "links": [ + 489 + ] + }, + { + "label": "text_embeds_h_1", + "name": "text_embeds_1", + "type": "WANVIDEOTEXTEMBEDS", + "links": [] + }, + { + "label": "qwen_history", + "name": "STRING", + "type": "STRING", + "links": [ + 466 + ] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "prompt" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": { + "positive_prompt": true + }, + "version": "7.4.1", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "" + ] + }, + { + "id": 39, + "type": "7c1d786b-9a8f-4ee0-8abf-2cd57b7d2882", + "pos": [ + 2730.4130862097595, + 562.9359828882817 + ], + "size": [ + 271.41848460874735, + 208 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "label": "text_encoder", + "name": "t5", + "type": "WANTEXTENCODER", + "link": 399 + }, + { + "label": "model_high", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 403 + }, + { + "label": "model_low", + "name": "model_1", + "type": "WANVIDEOMODEL", + "link": 404 + }, + { + "label": "global_loras_h", + "name": "prev_lora", + "type": "WANVIDLORA", + "link": 408 + }, + { + "label": "global_loras_l", + "name": "prev_lora_1", + "type": "WANVIDLORA", + "link": 411 + }, + { + "label": "qwen_history", + "name": "", + "type": "*", + "link": 466 + }, + { + "name": "qwen", + "type": "QWENMODEL", + "link": null + }, + { + "name": "prompt", + "type": "STRING", + "widget": { + "name": "prompt" + }, + "link": 507 + } + ], + "outputs": [ + { + "label": "text_embeds_2", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "links": [ + 100 + ] + }, + { + "label": "model_high_2", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 490 + ] + }, + { + "label": "model_low_2", + "name": "model_1", + "type": "WANVIDEOMODEL", + "links": [ + 491 + ] + }, + { + "label": "qwen_history", + "name": "STRING", + "type": "STRING", + "links": [ + 465 + ] + }, + { + "label": "next", + "name": "", + "type": "*", + "links": [] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "prompt" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {}, + "version": "7.4.1" + } + }, + "widgets_values": [ + "" + ] + }, + { + "id": 46, + "type": "4ac2bcc5-d41a-4215-9f81-c1806288f1de", + "pos": [ + 3576.8745459164475, + 569.8157218581448 + ], + "size": [ + 256.2617923259436, + 208 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "label": "text_encoder", + "name": "t5", + "type": "WANTEXTENCODER", + "link": 400 + }, + { + "label": "global_loras_h", + "name": "prev_lora", + "type": "WANVIDLORA", + "link": 409 + }, + { + "label": "global_loras_l", + "name": "prev_lora_1", + "type": "WANVIDLORA", + "link": 412 + }, + { + "label": "model_high", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 405 + }, + { + "label": "model_low", + "name": "model_1", + "type": "WANVIDEOMODEL", + "link": 406 + }, + { + "label": "qwen_history", + "name": "", + "type": "*", + "link": 465 + }, + { + "name": "qwen", + "type": "QWENMODEL", + "link": null + }, + { + "name": "prompt", + "type": "STRING", + "widget": { + "name": "prompt" + }, + "link": 508 + } + ], + "outputs": [ + { + "label": "text_embeds_3", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "links": [ + 125 + ] + }, + { + "label": "model_high_3", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 492 + ] + }, + { + "label": "model_low_3", + "name": "model_1", + "type": "WANVIDEOMODEL", + "links": [ + 493 + ] + } + ], + "properties": { + "proxyWidgets": [ + [ + "-1", + "prompt" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.3.68", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {}, + "version": "7.4.1" + } + }, + "widgets_values": [ + "" + ] + } + ], + "links": [ + [ + 3, + 11, + 0, + 13, + 0, + "IMAGE" + ], + [ + 18, + 17, + 0, + 18, + 0, + "IMAGE" + ], + [ + 22, + 21, + 0, + 22, + 0, + "IMAGE" + ], + [ + 24, + 19, + 2, + 21, + 1, + "WANVIDIMAGE_EMBEDS" + ], + [ + 32, + 23, + 2, + 24, + 1, + "WANVIDIMAGE_EMBEDS" + ], + [ + 35, + 24, + 0, + 26, + 0, + "IMAGE" + ], + [ + 37, + 13, + 0, + 19, + 1, + "INT" + ], + [ + 38, + 13, + 1, + 19, + 2, + "INT" + ], + [ + 72, + 17, + 0, + 33, + 0, + "IMAGE" + ], + [ + 73, + 21, + 0, + 33, + 1, + "IMAGE" + ], + [ + 75, + 33, + 0, + 34, + 0, + "IMAGE" + ], + [ + 100, + 39, + 0, + 21, + 0, + "WANVIDEOTEXTEMBEDS" + ], + [ + 125, + 46, + 0, + 24, + 0, + "WANVIDEOTEXTEMBEDS" + ], + [ + 360, + 13, + 2, + 17, + 1, + "WANVIDIMAGE_EMBEDS" + ], + [ + 389, + 10, + 0, + 13, + 1, + "CLIP_VISION" + ], + [ + 390, + 10, + 0, + 23, + 3, + "CLIP_VISION" + ], + [ + 391, + 10, + 0, + 19, + 3, + "CLIP_VISION" + ], + [ + 392, + 8, + 0, + 13, + 2, + "WANVAE" + ], + [ + 393, + 8, + 0, + 17, + 4, + "WANVAE" + ], + [ + 394, + 8, + 0, + 21, + 4, + "WANVAE" + ], + [ + 395, + 8, + 0, + 19, + 4, + "WANVAE" + ], + [ + 396, + 8, + 0, + 23, + 4, + "WANVAE" + ], + [ + 397, + 8, + 0, + 24, + 4, + "WANVAE" + ], + [ + 398, + 6, + 0, + 27, + 2, + "WANTEXTENCODER" + ], + [ + 399, + 6, + 0, + 39, + 0, + "WANTEXTENCODER" + ], + [ + 400, + 6, + 0, + 46, + 0, + "WANTEXTENCODER" + ], + [ + 401, + 2, + 0, + 27, + 0, + "WANVIDEOMODEL" + ], + [ + 402, + 2, + 1, + 27, + 1, + "WANVIDEOMODEL" + ], + [ + 403, + 2, + 0, + 39, + 1, + "WANVIDEOMODEL" + ], + [ + 404, + 2, + 1, + 39, + 2, + "WANVIDEOMODEL" + ], + [ + 405, + 2, + 0, + 46, + 3, + "WANVIDEOMODEL" + ], + [ + 406, + 2, + 1, + 46, + 4, + "WANVIDEOMODEL" + ], + [ + 407, + 3, + 0, + 27, + 3, + "WANVIDLORA" + ], + [ + 408, + 3, + 0, + 39, + 3, + "WANVIDLORA" + ], + [ + 409, + 3, + 0, + 46, + 1, + "WANVIDLORA" + ], + [ + 410, + 4, + 0, + 27, + 4, + "WANVIDLORA" + ], + [ + 411, + 4, + 0, + 39, + 4, + "WANVIDLORA" + ], + [ + 412, + 4, + 0, + 46, + 2, + "WANVIDLORA" + ], + [ + 413, + 27, + 0, + 17, + 0, + "WANVIDEOTEXTEMBEDS" + ], + [ + 417, + 24, + 0, + 33, + 2, + "IMAGE" + ], + [ + 418, + 51, + 0, + 17, + 5, + "EXPERIMENTALARGS" + ], + [ + 419, + 51, + 0, + 17, + 6, + "EXPERIMENTALARGS" + ], + [ + 428, + 13, + 0, + 23, + 1, + "INT" + ], + [ + 429, + 13, + 1, + 23, + 2, + "INT" + ], + [ + 430, + 13, + 4, + 19, + 7, + "LATENT" + ], + [ + 431, + 13, + 4, + 23, + 7, + "LATENT" + ], + [ + 432, + 13, + 3, + 19, + 6, + "IMAGE" + ], + [ + 433, + 13, + 3, + 23, + 6, + "IMAGE" + ], + [ + 434, + 13, + 4, + 17, + 7, + "LATENT" + ], + [ + 444, + 21, + 0, + 64, + 0, + "IMAGE" + ], + [ + 445, + 24, + 0, + 64, + 1, + "IMAGE" + ], + [ + 446, + 17, + 0, + 19, + 0, + "IMAGE" + ], + [ + 447, + 21, + 0, + 23, + 0, + "IMAGE" + ], + [ + 448, + 64, + 0, + 65, + 0, + "IMAGE" + ], + [ + 465, + 39, + 3, + 46, + 5, + "*" + ], + [ + 466, + 27, + 4, + 39, + 5, + "*" + ], + [ + 478, + 3, + 0, + 2, + 0, + "WANVIDLORA" + ], + [ + 479, + 4, + 0, + 2, + 1, + "WANVIDLORA" + ], + [ + 486, + 17, + 0, + 19, + 8, + "IMAGE" + ], + [ + 487, + 21, + 0, + 23, + 8, + "IMAGE" + ], + [ + 488, + 27, + 1, + 17, + 2, + "WANVIDEOMODEL" + ], + [ + 489, + 27, + 2, + 17, + 3, + "WANVIDEOMODEL" + ], + [ + 490, + 39, + 1, + 21, + 2, + "WANVIDEOMODEL" + ], + [ + 491, + 39, + 2, + 21, + 3, + "WANVIDEOMODEL" + ], + [ + 492, + 46, + 1, + 24, + 2, + "WANVIDEOMODEL" + ], + [ + 493, + 46, + 2, + 24, + 3, + "WANVIDEOMODEL" + ], + [ + 503, + 78, + 0, + 74, + 0, + "STRING" + ], + [ + 504, + 78, + 1, + 75, + 0, + "STRING" + ], + [ + 505, + 78, + 2, + 76, + 0, + "STRING" + ], + [ + 506, + 78, + 0, + 27, + 6, + "STRING" + ], + [ + 507, + 78, + 1, + 39, + 7, + "STRING" + ], + [ + 508, + 78, + 2, + 46, + 7, + "STRING" + ] + ], + "groups": [], + "definitions": { + "subgraphs": [ + { + "id": "27ceba78-b0ec-46e1-977e-1a740f1d5d2b", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 9, + "lastLinkId": 23, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Model Loader", + "inputNode": { + "id": -10, + "bounding": [ + 1071.3141048332388, + 501.93395318037807, + 120, + 79.99999999999994 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 2124.6141010185406, + 478.83395318037805, + 120, + 80.00000000000006 + ] + }, + "inputs": [ + { + "id": "908a19e7-04ba-4a91-8e6e-c98589cd1281", + "name": "lora", + "type": "WANVIDLORA", + "linkIds": [ + 22 + ], + "pos": [ + 1171.3141048332388, + 521.933953180378 + ] + }, + { + "id": "bbdd244c-5740-4305-a22e-47fb17a6abf6", + "name": "lora_1", + "type": "WANVIDLORA", + "linkIds": [ + 23 + ], + "pos": [ + 1171.3141048332388, + 541.933953180378 + ] + } + ], + "outputs": [ + { + "id": "99085ec7-5384-4b82-a94d-803e382e1186", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 21 + ], + "label": "model_high", + "pos": [ + 2144.6141010185406, + 498.83395318037805 + ] + }, + { + "id": "46a547f0-07b2-43e2-9eb5-082a92951355", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 20 + ], + "label": "model_low", + "pos": [ + 2144.6141010185406, + 518.8339531803781 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 3, + "type": "WanVideoBlockSwap", + "pos": [ + 1718.2976548332394, + 181.44854318037824 + ], + "size": [ + 281.33333587646484, + 202 + ], + "flags": {}, + "order": 0, + "mode": 4, + "inputs": [], + "outputs": [ + { + "localized_name": "block_swap_args", + "name": "block_swap_args", + "type": "BLOCKSWAPARGS", + "links": [ + 3, + 6 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoBlockSwap", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 10, + false, + false, + true, + 0, + 1, + false + ] + }, + { + "id": 2, + "type": "WanVideoTorchCompileSettings", + "pos": [ + 1339.144760762576, + 144.6865664983665 + ], + "size": [ + 342.6666717529297, + 250 + ], + "flags": {}, + "order": 1, + "mode": 4, + "inputs": [], + "outputs": [ + { + "localized_name": "torch_compile_args", + "name": "torch_compile_args", + "type": "WANCOMPILEARGS", + "links": [ + 2, + 5 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoTorchCompileSettings", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + "inductor", + false, + "max-autotune-no-cudagraphs", + true, + 256, + true, + 512, + true, + false + ] + }, + { + "id": 1, + "type": "WanVideoModelLoader", + "pos": [ + 1410.81410483324, + 436.233953180378 + ], + "size": [ + 270.99999618530273, + 318 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "compile_args", + "name": "compile_args", + "shape": 7, + "type": "WANCOMPILEARGS", + "link": 2 + }, + { + "localized_name": "block_swap_args", + "name": "block_swap_args", + "shape": 7, + "type": "BLOCKSWAPARGS", + "link": 3 + }, + { + "localized_name": "lora", + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 22 + }, + { + "localized_name": "vram_management_args", + "name": "vram_management_args", + "shape": 7, + "type": "VRAM_MANAGEMENTARGS", + "link": null + }, + { + "localized_name": "extra_model", + "name": "extra_model", + "shape": 7, + "type": "VACEPATH", + "link": null + }, + { + "localized_name": "fantasytalking_model", + "name": "fantasytalking_model", + "shape": 7, + "type": "FANTASYTALKINGMODEL", + "link": null + }, + { + "localized_name": "multitalk_model", + "name": "multitalk_model", + "shape": 7, + "type": "MULTITALKMODEL", + "link": null + }, + { + "localized_name": "fantasyportrait_model", + "name": "fantasyportrait_model", + "shape": 7, + "type": "FANTASYPORTRAITMODEL", + "link": null + } + ], + "outputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 21 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoModelLoader", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + "wanh.safetensors", + "fp16", + "disabled", + "main_device", + "comfy", + "default" + ] + }, + { + "id": 4, + "type": "WanVideoModelLoader", + "pos": [ + 1714.9976548332395, + 434.44854318037784 + ], + "size": [ + 270.99999618530273, + 318 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "compile_args", + "name": "compile_args", + "shape": 7, + "type": "WANCOMPILEARGS", + "link": 5 + }, + { + "localized_name": "block_swap_args", + "name": "block_swap_args", + "shape": 7, + "type": "BLOCKSWAPARGS", + "link": 6 + }, + { + "localized_name": "lora", + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 23 + }, + { + "localized_name": "vram_management_args", + "name": "vram_management_args", + "shape": 7, + "type": "VRAM_MANAGEMENTARGS", + "link": null + }, + { + "localized_name": "extra_model", + "name": "extra_model", + "shape": 7, + "type": "VACEPATH", + "link": null + }, + { + "localized_name": "fantasytalking_model", + "name": "fantasytalking_model", + "shape": 7, + "type": "FANTASYTALKINGMODEL", + "link": null + }, + { + "localized_name": "multitalk_model", + "name": "multitalk_model", + "shape": 7, + "type": "MULTITALKMODEL", + "link": null + }, + { + "localized_name": "fantasyportrait_model", + "name": "fantasyportrait_model", + "shape": 7, + "type": "FANTASYPORTRAITMODEL", + "link": null + } + ], + "outputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 20 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoModelLoader", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + "wanl.safetensors", + "fp16", + "disabled", + "main_device", + "comfy", + "default" + ] + } + ], + "groups": [], + "links": [ + { + "id": 2, + "origin_id": 2, + "origin_slot": 0, + "target_id": 1, + "target_slot": 0, + "type": "WANCOMPILEARGS" + }, + { + "id": 3, + "origin_id": 3, + "origin_slot": 0, + "target_id": 1, + "target_slot": 1, + "type": "BLOCKSWAPARGS" + }, + { + "id": 5, + "origin_id": 2, + "origin_slot": 0, + "target_id": 4, + "target_slot": 0, + "type": "WANCOMPILEARGS" + }, + { + "id": 6, + "origin_id": 3, + "origin_slot": 0, + "target_id": 4, + "target_slot": 1, + "type": "BLOCKSWAPARGS" + }, + { + "id": 20, + "origin_id": 4, + "origin_slot": 0, + "target_id": -20, + "target_slot": 1, + "type": "WANVIDEOMODEL" + }, + { + "id": 21, + "origin_id": 1, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 22, + "origin_id": -10, + "origin_slot": 0, + "target_id": 1, + "target_slot": 2, + "type": "WANVIDLORA" + }, + { + "id": 23, + "origin_id": -10, + "origin_slot": 1, + "target_id": 4, + "target_slot": 2, + "type": "WANVIDLORA" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "e23d5ebd-47a8-47df-8e3c-43f5d5f4dc6f", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 5, + "lastLinkId": 3, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Text Encoder Loader", + "inputNode": { + "id": -10, + "bounding": [ + 1414.4576548332386, + 549.9585431803778, + 120, + 40 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 1971.4243204826525, + 549.9585431803778, + 120, + 60 + ] + }, + "inputs": [], + "outputs": [ + { + "id": "2077e712-2b0f-4378-9dc5-c86aa1ecbcd6", + "name": "wan_t5_model", + "type": "WANTEXTENCODER", + "linkIds": [ + 3 + ], + "label": "text_encoder", + "pos": [ + 1991.4243204826525, + 569.9585431803778 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 5, + "type": "LoadWanVideoT5TextEncoder", + "pos": [ + 1594.4576548332386, + 519.9585431803778 + ], + "size": [ + 316.96666564941404, + 130 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "localized_name": "wan_t5_model", + "name": "wan_t5_model", + "type": "WANTEXTENCODER", + "links": [ + 3 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "LoadWanVideoT5TextEncoder", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + "umt5.safetensors", + "fp32", + "main_device", + "disabled" + ] + } + ], + "groups": [], + "links": [ + { + "id": 3, + "origin_id": 5, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "WANTEXTENCODER" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "2f75f8c8-81ce-4b21-813d-2d883c616125", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 7, + "lastLinkId": 3, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "VAE Loader", + "inputNode": { + "id": -10, + "bounding": [ + 1110.7476548332384, + 329.938543180378, + 120, + 40 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 1620.7476548332384, + 329.938543180378, + 120, + 60 + ] + }, + "inputs": [], + "outputs": [ + { + "id": "2c2e5040-f283-4878-884d-555cabb993ae", + "name": "vae", + "type": "WANVAE", + "linkIds": [ + 3 + ], + "pos": [ + 1640.7476548332384, + 349.938543180378 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 7, + "type": "WanVideoVAELoader", + "pos": [ + 1290.7476548332384, + 323.938543180378 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "compile_args", + "name": "compile_args", + "shape": 7, + "type": "WANCOMPILEARGS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "WANVAE", + "links": [ + 3 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoVAELoader", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + "wan2_1_vae.safetensors", + "fp32", + false + ] + } + ], + "groups": [], + "links": [ + { + "id": 3, + "origin_id": 7, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "WANVAE" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "fc8fe2eb-1dbb-48bc-a783-2e94b752c441", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 9, + "lastLinkId": 3, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "CLIP Vision Loader", + "inputNode": { + "id": -10, + "bounding": [ + 1114.3776548332385, + 265.9085431803781, + 120, + 40 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 1624.3776548332385, + 265.9085431803781, + 120, + 60 + ] + }, + "inputs": [], + "outputs": [ + { + "id": "cd37a807-316c-49dc-8635-ec6891df1312", + "name": "CLIP_VISION", + "type": "CLIP_VISION", + "linkIds": [ + 3 + ], + "pos": [ + 1644.3776548332385, + 285.9085431803781 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 9, + "type": "CLIPVisionLoader", + "pos": [ + 1294.3776548332385, + 271.9085431803781 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "localized_name": "CLIP_VISION", + "name": "CLIP_VISION", + "type": "CLIP_VISION", + "links": [ + 3 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.68", + "Node name for S&R": "CLIPVisionLoader", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + "nsfw_clip_vision.safetensors" + ] + } + ], + "groups": [], + "links": [ + { + "id": 3, + "origin_id": 9, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "CLIP_VISION" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "3797c843-c451-413c-b3a4-2bf8a400ba28", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 23, + "lastLinkId": 82, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Input Image Processing", + "inputNode": { + "id": -10, + "bounding": [ + 1422.9276548332389, + 822.7685431803775, + 120, + 180 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 2378.2076548332393, + 788.8885431803775, + 135.0500030517578, + 140 + ] + }, + "inputs": [ + { + "id": "39721886-ae3d-442a-8d83-c802583cb505", + "name": "image", + "type": "IMAGE", + "linkIds": [ + 6 + ], + "pos": [ + 1522.9276548332389, + 842.7685431803775 + ] + }, + { + "id": "2db4cd36-5a5d-4051-abb3-dc19d946b189", + "name": "width", + "type": "INT", + "linkIds": [ + 7, + 50 + ], + "pos": [ + 1522.9276548332389, + 862.7685431803775 + ] + }, + { + "id": "594508e6-933c-43d3-bff2-d21eade0613f", + "name": "height", + "type": "INT", + "linkIds": [ + 8, + 51 + ], + "pos": [ + 1522.9276548332389, + 882.7685431803775 + ] + }, + { + "id": "bf17138c-3670-44cc-ac66-41fbbc07d698", + "name": "clip_vision", + "type": "CLIP_VISION", + "linkIds": [ + 11 + ], + "pos": [ + 1522.9276548332389, + 902.7685431803775 + ] + }, + { + "id": "39ec8261-e16f-4914-868b-acb6fbd42cf1", + "name": "vae", + "type": "WANVAE", + "linkIds": [ + 12, + 25, + 47 + ], + "pos": [ + 1522.9276548332389, + 922.7685431803775 + ] + }, + { + "id": "63c948c7-852e-48d4-b258-5bdc4b23a8d7", + "name": "num_frames", + "type": "INT", + "linkIds": [ + 17, + 34, + 52 + ], + "pos": [ + 1522.9276548332389, + 942.7685431803775 + ] + }, + { + "id": "af9976a6-cb73-46ec-ad67-c766435f49f5", + "name": "crop_position", + "type": "COMBO", + "linkIds": [ + 81 + ], + "pos": [ + 1522.9276548332389, + 962.7685431803775 + ] + } + ], + "outputs": [ + { + "id": "b89d7bd6-4d16-4625-ad4c-90bd0890b635", + "name": "width", + "type": "INT", + "linkIds": [ + 4 + ], + "pos": [ + 2398.2076548332393, + 808.8885431803775 + ] + }, + { + "id": "0c5dd3c7-f558-45df-ae7d-edb412b19cd3", + "name": "height", + "type": "INT", + "linkIds": [ + 5 + ], + "pos": [ + 2398.2076548332393, + 828.8885431803775 + ] + }, + { + "id": "e4e7c866-c217-4370-92f4-3401cffa0757", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "linkIds": [ + 82 + ], + "label": "image_embeds_1", + "pos": [ + 2398.2076548332393, + 848.8885431803775 + ] + }, + { + "id": "f012d2a0-b9ef-4c59-bd5a-4bcf51c78236", + "name": "IMAGE", + "type": "IMAGE", + "linkIds": [ + 74 + ], + "label": "reference_image", + "pos": [ + 2398.2076548332393, + 868.8885431803775 + ] + }, + { + "id": "fc614828-2f7e-468a-a631-94ab412f2eb3", + "name": "samples", + "type": "LATENT", + "linkIds": [ + 23 + ], + "pos": [ + 2398.2076548332393, + 888.8885431803775 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 15, + "type": "WanVideoClipVisionEncode", + "pos": [ + 1944.1476548332394, + 402.5885431803783 + ], + "size": [ + 280.96666564941404, + 262 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_vision", + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 11 + }, + { + "localized_name": "image_1", + "name": "image_1", + "type": "IMAGE", + "link": 10 + }, + { + "localized_name": "image_2", + "name": "image_2", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "negative_image", + "name": "negative_image", + "shape": 7, + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_CLIPEMBEDS", + "links": [ + 48 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoClipVisionEncode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 1, + 1, + "disabled", + "average", + false, + 16, + 0.25 + ] + }, + { + "id": 17, + "type": "WanVideoEncode", + "pos": [ + 1962.8122999566372, + 1180.2532501959518 + ], + "size": [ + 270, + 242 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "WANVAE", + "link": 25 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 24 + }, + { + "localized_name": "mask", + "name": "mask", + "shape": 7, + "type": "MASK", + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 23 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "d3f33a9f09e774e43500eed1abf7d975997dd1ee", + "Node name for S&R": "WanVideoEncode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper" + }, + "widgets_values": [ + false, + 272, + 272, + 144, + 128, + 0, + 1 + ] + }, + { + "id": 12, + "type": "ImageResizeKJv2", + "pos": [ + 1602.9276548332389, + 714.7685431803775 + ], + "size": [ + 270, + 286 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 6 + }, + { + "localized_name": "mask", + "name": "mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 7 + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 8 + }, + { + "localized_name": "crop_position", + "name": "crop_position", + "type": "COMBO", + "widget": { + "name": "crop_position" + }, + "link": 81 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 3, + 10, + 18, + 24, + 74, + 78 + ] + }, + { + "localized_name": "width", + "name": "width", + "type": "INT", + "links": [ + 4, + 35 + ] + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "links": [ + 5, + 36 + ] + }, + { + "localized_name": "mask", + "name": "mask", + "type": "MASK", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "c661baadd9683c0033cd2a6ad90157c6d099a6c2", + "Node name for S&R": "ImageResizeKJv2", + "aux_id": "kijai/ComfyUI-KJNodes", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 512, + 720, + "lanczos", + "crop", + "0, 0, 0", + "center", + 16, + "cpu" + ] + }, + { + "id": 19, + "type": "WanVideoImageToVideoEncode", + "pos": [ + 1935.5472118252135, + 705.6014773163841 + ], + "size": [ + 308.5000061035156, + 434 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "shape": 7, + "type": "WANVAE", + "link": 47 + }, + { + "localized_name": "clip_embeds", + "name": "clip_embeds", + "shape": 7, + "type": "WANVIDIMAGE_CLIPEMBEDS", + "link": 48 + }, + { + "localized_name": "start_image", + "name": "start_image", + "shape": 7, + "type": "IMAGE", + "link": 78 + }, + { + "localized_name": "end_image", + "name": "end_image", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "control_embeds", + "name": "control_embeds", + "shape": 7, + "type": "WANVIDIMAGE_EMBEDS", + "link": null + }, + { + "localized_name": "temporal_mask", + "name": "temporal_mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "extra_latents", + "name": "extra_latents", + "shape": 7, + "type": "LATENT", + "link": null + }, + { + "localized_name": "add_cond_latents", + "name": "add_cond_latents", + "shape": 7, + "type": "ADD_COND_LATENTS", + "link": null + }, + { + "localized_name": "empty_frame_pad_image", + "name": "empty_frame_pad_image", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 50 + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 51 + }, + { + "localized_name": "num_frames", + "name": "num_frames", + "type": "INT", + "widget": { + "name": "num_frames" + }, + "link": 52 + } + ], + "outputs": [ + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 82 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "44feb24290db02279988a2ce8845ee65e62f3cce", + "Node name for S&R": "WanVideoImageToVideoEncode" + }, + "widgets_values": [ + 512, + 720, + 81, + 0.03, + 1, + 1, + false, + false, + false, + 0 + ] + } + ], + "groups": [], + "links": [ + { + "id": 4, + "origin_id": 12, + "origin_slot": 1, + "target_id": -20, + "target_slot": 0, + "type": "INT" + }, + { + "id": 5, + "origin_id": 12, + "origin_slot": 2, + "target_id": -20, + "target_slot": 1, + "type": "INT" + }, + { + "id": 6, + "origin_id": -10, + "origin_slot": 0, + "target_id": 12, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 7, + "origin_id": -10, + "origin_slot": 1, + "target_id": 12, + "target_slot": 2, + "type": "INT" + }, + { + "id": 8, + "origin_id": -10, + "origin_slot": 2, + "target_id": 12, + "target_slot": 3, + "type": "INT" + }, + { + "id": 10, + "origin_id": 12, + "origin_slot": 0, + "target_id": 15, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 11, + "origin_id": -10, + "origin_slot": 3, + "target_id": 15, + "target_slot": 0, + "type": "CLIP_VISION" + }, + { + "id": 23, + "origin_id": 17, + "origin_slot": 0, + "target_id": -20, + "target_slot": 4, + "type": "LATENT" + }, + { + "id": 24, + "origin_id": 12, + "origin_slot": 0, + "target_id": 17, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 25, + "origin_id": -10, + "origin_slot": 4, + "target_id": 17, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 47, + "origin_id": -10, + "origin_slot": 4, + "target_id": 19, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 48, + "origin_id": 15, + "origin_slot": 0, + "target_id": 19, + "target_slot": 1, + "type": "WANVIDIMAGE_CLIPEMBEDS" + }, + { + "id": 50, + "origin_id": -10, + "origin_slot": 1, + "target_id": 19, + "target_slot": 9, + "type": "INT" + }, + { + "id": 51, + "origin_id": -10, + "origin_slot": 2, + "target_id": 19, + "target_slot": 10, + "type": "INT" + }, + { + "id": 52, + "origin_id": -10, + "origin_slot": 5, + "target_id": 19, + "target_slot": 11, + "type": "INT" + }, + { + "id": 74, + "origin_id": 12, + "origin_slot": 0, + "target_id": -20, + "target_slot": 3, + "type": "IMAGE" + }, + { + "id": 78, + "origin_id": 12, + "origin_slot": 0, + "target_id": 19, + "target_slot": 2, + "type": "IMAGE" + }, + { + "id": 81, + "origin_id": -10, + "origin_slot": 6, + "target_id": 12, + "target_slot": 4, + "type": "COMBO" + }, + { + "id": 82, + "origin_id": 19, + "origin_slot": 0, + "target_id": -20, + "target_slot": 2, + "type": "WANVIDIMAGE_EMBEDS" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "1f7cf909-f4b2-4a82-b3d5-8e1bde7a687e", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 36, + "lastLinkId": 113, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "First Sampler", + "inputNode": { + "id": -10, + "bounding": [ + 1805.2876548332397, + 593.6885431803782, + 152.66666412353516, + 320 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 2917.4543189567758, + 517.7785431803774, + 156.8000030517578, + 60 + ] + }, + "inputs": [ + { + "id": "03555a5e-26f8-4c22-be6c-c04fd5730314", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "linkIds": [ + 7, + 97, + 98 + ], + "localized_name": "text_embeds", + "label": "text_embeds_1", + "shape": 7, + "pos": [ + 1937.9543189567748, + 613.6885431803782 + ] + }, + { + "id": "13d993ea-fa10-43a2-ab24-0387043a359b", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "linkIds": [ + 99, + 111 + ], + "label": "image_embeds_1", + "pos": [ + 1937.9543189567748, + 633.6885431803782 + ] + }, + { + "id": "74400b66-02e3-4e05-afac-fc522c50dc3e", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 101 + ], + "label": "model_high_1", + "pos": [ + 1937.9543189567748, + 653.6885431803782 + ] + }, + { + "id": "ba110be6-1231-44bb-9527-116b65d7ae4d", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 102 + ], + "label": "model_low_1", + "pos": [ + 1937.9543189567748, + 673.6885431803782 + ] + }, + { + "id": "0ca5aad8-2770-4b8c-adc6-5bdd325e6945", + "name": "steps", + "type": "INT", + "linkIds": [ + 45, + 87, + 88 + ], + "pos": [ + 1937.9543189567748, + 693.6885431803782 + ] + }, + { + "id": "1083f183-4997-432c-8172-a7f4c2ee9e3f", + "name": "cfg", + "type": "FLOAT", + "linkIds": [ + 89, + 90 + ], + "pos": [ + 1937.9543189567748, + 713.6885431803782 + ] + }, + { + "id": "ed2443d0-56de-42a8-9f2c-92338421551c", + "name": "shift", + "type": "FLOAT", + "linkIds": [ + 91, + 92 + ], + "pos": [ + 1937.9543189567748, + 733.6885431803782 + ] + }, + { + "id": "4ac865ff-5a94-4a54-bc72-7acda1fa706b", + "name": "sigma", + "type": "FLOAT", + "linkIds": [ + 26 + ], + "pos": [ + 1937.9543189567748, + 753.6885431803782 + ] + }, + { + "id": "27c86e44-31fa-4880-a2d3-968f6ce2d00a", + "name": "vae", + "type": "WANVAE", + "linkIds": [ + 28 + ], + "pos": [ + 1937.9543189567748, + 773.6885431803782 + ] + }, + { + "id": "595299b8-9381-48cc-a5d4-2bc32f52ac2b", + "name": "experimental_args", + "type": "EXPERIMENTALARGS", + "linkIds": [ + 104 + ], + "pos": [ + 1937.9543189567748, + 793.6885431803782 + ] + }, + { + "id": "681260e7-91eb-4409-ad77-fd4ae9c16f39", + "name": "experimental_args_1", + "type": "EXPERIMENTALARGS", + "linkIds": [ + 105 + ], + "pos": [ + 1937.9543189567748, + 813.6885431803782 + ] + }, + { + "id": "8d079a04-391c-4c58-b02c-68f38a73cbf8", + "name": "extra_latents", + "type": "LATENT", + "linkIds": [], + "pos": [ + 1937.9543189567748, + 833.6885431803782 + ] + }, + { + "id": "ec4ba46e-851c-4f20-84b0-35dba9a9f51d", + "name": "feta_args", + "type": "FETAARGS", + "linkIds": [ + 106, + 107 + ], + "pos": [ + 1937.9543189567748, + 853.6885431803782 + ] + }, + { + "id": "9f8b4fe7-b70f-45b7-9905-bf8009b7789b", + "name": "slg_args", + "type": "SLGARGS", + "linkIds": [ + 108, + 109 + ], + "pos": [ + 1937.9543189567748, + 873.6885431803782 + ] + } + ], + "outputs": [ + { + "id": "6c75445b-3af8-4a18-9976-505cf96d932e", + "name": "images", + "type": "IMAGE", + "linkIds": [ + 29 + ], + "label": "first_sampler_results", + "pos": [ + 2937.4543189567758, + 537.7785431803774 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 19, + "type": "WanVideoDecode", + "pos": [ + 2910.9376548332393, + 304.578543180378 + ], + "size": [ + 270, + 198 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "WANVAE", + "link": 28 + }, + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 103 + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": [ + 29 + ] + } + ], + "title": "Decode 1", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoDecode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + false, + 272, + 272, + 144, + 128, + "default" + ] + }, + { + "id": 22, + "type": "CreateCFGScheduleFloatList", + "pos": [ + 1689.8013641635544, + 1000.9169895416974 + ], + "size": [ + 298.26666870117185, + 178 + ], + "flags": {}, + "order": 2, + "mode": 4, + "inputs": [ + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": 45 + } + ], + "outputs": [ + { + "localized_name": "float_list", + "name": "float_list", + "type": "FLOAT", + "links": [ + 46 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e3c2a1431bcb7f0b9fd11a40d732d16ac117578a", + "Node name for S&R": "CreateCFGScheduleFloatList" + }, + "widgets_values": [ + 5, + 5, + 5, + "linear", + 0, + 0.01 + ] + }, + { + "id": 18, + "type": "WanVideoSigmaToStep", + "pos": [ + 1676.418041028482, + 520.6335974345466 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "sigma", + "name": "sigma", + "type": "FLOAT", + "widget": { + "name": "sigma" + }, + "link": 26 + } + ], + "outputs": [ + { + "localized_name": "step", + "name": "step", + "type": "INT", + "links": [ + 93, + 94 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSigmaToStep", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 0.9 + ] + }, + { + "id": 35, + "type": "WanVideoSampler", + "pos": [ + 2039.8581781198502, + 158.401896511617 + ], + "size": [ + 340.4500045776367, + 1154.7428635817307 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 101 + }, + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 99 + }, + { + "localized_name": "text_embeds", + "name": "text_embeds", + "shape": 7, + "type": "WANVIDEOTEXTEMBEDS", + "link": 97 + }, + { + "localized_name": "samples", + "name": "samples", + "shape": 7, + "type": "LATENT", + "link": null + }, + { + "localized_name": "feta_args", + "name": "feta_args", + "shape": 7, + "type": "FETAARGS", + "link": 106 + }, + { + "localized_name": "context_options", + "name": "context_options", + "shape": 7, + "type": "WANVIDCONTEXT", + "link": null + }, + { + "localized_name": "cache_args", + "name": "cache_args", + "shape": 7, + "type": "CACHEARGS", + "link": null + }, + { + "localized_name": "flowedit_args", + "name": "flowedit_args", + "shape": 7, + "type": "FLOWEDITARGS", + "link": null + }, + { + "localized_name": "slg_args", + "name": "slg_args", + "shape": 7, + "type": "SLGARGS", + "link": 108 + }, + { + "localized_name": "loop_args", + "name": "loop_args", + "shape": 7, + "type": "LOOPARGS", + "link": null + }, + { + "localized_name": "experimental_args", + "name": "experimental_args", + "shape": 7, + "type": "EXPERIMENTALARGS", + "link": 104 + }, + { + "localized_name": "sigmas", + "name": "sigmas", + "shape": 7, + "type": "SIGMAS", + "link": null + }, + { + "localized_name": "unianimate_poses", + "name": "unianimate_poses", + "shape": 7, + "type": "UNIANIMATE_POSE", + "link": null + }, + { + "localized_name": "fantasytalking_embeds", + "name": "fantasytalking_embeds", + "shape": 7, + "type": "FANTASYTALKING_EMBEDS", + "link": null + }, + { + "localized_name": "uni3c_embeds", + "name": "uni3c_embeds", + "shape": 7, + "type": "UNI3C_EMBEDS", + "link": null + }, + { + "localized_name": "multitalk_embeds", + "name": "multitalk_embeds", + "shape": 7, + "type": "MULTITALK_EMBEDS", + "link": null + }, + { + "localized_name": "freeinit_args", + "name": "freeinit_args", + "shape": 7, + "type": "FREEINITARGS", + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": 87 + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": 89 + }, + { + "localized_name": "shift", + "name": "shift", + "type": "FLOAT", + "widget": { + "name": "shift" + }, + "link": 91 + }, + { + "localized_name": "end_step", + "name": "end_step", + "shape": 7, + "type": "INT", + "widget": { + "name": "end_step" + }, + "link": 93 + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 113 + ] + }, + { + "localized_name": "denoised_samples", + "name": "denoised_samples", + "type": "LATENT", + "links": [] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "1c24ef50f8dd289b3204e8c2453918ffd787d766", + "Node name for S&R": "WanVideoSampler" + }, + "widgets_values": [ + 5, + 1, + 5, + 402110663486119, + "randomize", + false, + "er_sde", + 0, + 1, + false, + "comfy", + 0, + -1, + true + ] + }, + { + "id": 36, + "type": "WanVideoSampler", + "pos": [ + 2413.4107713016906, + 152.62546673180512 + ], + "size": [ + 340.4500045776367, + 1154.7428635817307 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 102 + }, + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 111 + }, + { + "localized_name": "text_embeds", + "name": "text_embeds", + "shape": 7, + "type": "WANVIDEOTEXTEMBEDS", + "link": 98 + }, + { + "localized_name": "samples", + "name": "samples", + "shape": 7, + "type": "LATENT", + "link": 113 + }, + { + "localized_name": "feta_args", + "name": "feta_args", + "shape": 7, + "type": "FETAARGS", + "link": 107 + }, + { + "localized_name": "context_options", + "name": "context_options", + "shape": 7, + "type": "WANVIDCONTEXT", + "link": null + }, + { + "localized_name": "cache_args", + "name": "cache_args", + "shape": 7, + "type": "CACHEARGS", + "link": null + }, + { + "localized_name": "flowedit_args", + "name": "flowedit_args", + "shape": 7, + "type": "FLOWEDITARGS", + "link": null + }, + { + "localized_name": "slg_args", + "name": "slg_args", + "shape": 7, + "type": "SLGARGS", + "link": 109 + }, + { + "localized_name": "loop_args", + "name": "loop_args", + "shape": 7, + "type": "LOOPARGS", + "link": null + }, + { + "localized_name": "experimental_args", + "name": "experimental_args", + "shape": 7, + "type": "EXPERIMENTALARGS", + "link": 105 + }, + { + "localized_name": "sigmas", + "name": "sigmas", + "shape": 7, + "type": "SIGMAS", + "link": null + }, + { + "localized_name": "unianimate_poses", + "name": "unianimate_poses", + "shape": 7, + "type": "UNIANIMATE_POSE", + "link": null + }, + { + "localized_name": "fantasytalking_embeds", + "name": "fantasytalking_embeds", + "shape": 7, + "type": "FANTASYTALKING_EMBEDS", + "link": null + }, + { + "localized_name": "uni3c_embeds", + "name": "uni3c_embeds", + "shape": 7, + "type": "UNI3C_EMBEDS", + "link": null + }, + { + "localized_name": "multitalk_embeds", + "name": "multitalk_embeds", + "shape": 7, + "type": "MULTITALK_EMBEDS", + "link": null + }, + { + "localized_name": "freeinit_args", + "name": "freeinit_args", + "shape": 7, + "type": "FREEINITARGS", + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": 88 + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": 90 + }, + { + "localized_name": "shift", + "name": "shift", + "type": "FLOAT", + "widget": { + "name": "shift" + }, + "link": 92 + }, + { + "localized_name": "start_step", + "name": "start_step", + "shape": 7, + "type": "INT", + "widget": { + "name": "start_step" + }, + "link": 94 + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 103 + ] + }, + { + "localized_name": "denoised_samples", + "name": "denoised_samples", + "type": "LATENT", + "links": null + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "1c24ef50f8dd289b3204e8c2453918ffd787d766", + "Node name for S&R": "WanVideoSampler" + }, + "widgets_values": [ + 5, + 1, + 5, + 76214059997879, + "randomize", + false, + "er_sde", + 0, + 1, + false, + "comfy", + 0, + -1, + false + ] + } + ], + "groups": [], + "links": [ + { + "id": 26, + "origin_id": -10, + "origin_slot": 7, + "target_id": 18, + "target_slot": 0, + "type": "FLOAT" + }, + { + "id": 28, + "origin_id": -10, + "origin_slot": 8, + "target_id": 19, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 29, + "origin_id": 19, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 45, + "origin_id": -10, + "origin_slot": 4, + "target_id": 22, + "target_slot": 0, + "type": "INT" + }, + { + "id": 87, + "origin_id": -10, + "origin_slot": 4, + "target_id": 35, + "target_slot": 17, + "type": "INT" + }, + { + "id": 88, + "origin_id": -10, + "origin_slot": 4, + "target_id": 36, + "target_slot": 17, + "type": "INT" + }, + { + "id": 89, + "origin_id": -10, + "origin_slot": 5, + "target_id": 35, + "target_slot": 18, + "type": "FLOAT" + }, + { + "id": 90, + "origin_id": -10, + "origin_slot": 5, + "target_id": 36, + "target_slot": 18, + "type": "FLOAT" + }, + { + "id": 91, + "origin_id": -10, + "origin_slot": 6, + "target_id": 35, + "target_slot": 19, + "type": "FLOAT" + }, + { + "id": 92, + "origin_id": -10, + "origin_slot": 6, + "target_id": 36, + "target_slot": 19, + "type": "FLOAT" + }, + { + "id": 93, + "origin_id": 18, + "origin_slot": 0, + "target_id": 35, + "target_slot": 20, + "type": "INT" + }, + { + "id": 94, + "origin_id": 18, + "origin_slot": 0, + "target_id": 36, + "target_slot": 20, + "type": "INT" + }, + { + "id": 97, + "origin_id": -10, + "origin_slot": 0, + "target_id": 35, + "target_slot": 2, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 98, + "origin_id": -10, + "origin_slot": 0, + "target_id": 36, + "target_slot": 2, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 99, + "origin_id": -10, + "origin_slot": 1, + "target_id": 35, + "target_slot": 1, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 101, + "origin_id": -10, + "origin_slot": 2, + "target_id": 35, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 102, + "origin_id": -10, + "origin_slot": 3, + "target_id": 36, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 103, + "origin_id": 36, + "origin_slot": 0, + "target_id": 19, + "target_slot": 1, + "type": "LATENT" + }, + { + "id": 104, + "origin_id": -10, + "origin_slot": 9, + "target_id": 35, + "target_slot": 10, + "type": "EXPERIMENTALARGS" + }, + { + "id": 105, + "origin_id": -10, + "origin_slot": 10, + "target_id": 36, + "target_slot": 10, + "type": "EXPERIMENTALARGS" + }, + { + "id": 106, + "origin_id": -10, + "origin_slot": 12, + "target_id": 35, + "target_slot": 4, + "type": "FETAARGS" + }, + { + "id": 107, + "origin_id": -10, + "origin_slot": 12, + "target_id": 36, + "target_slot": 4, + "type": "FETAARGS" + }, + { + "id": 108, + "origin_id": -10, + "origin_slot": 13, + "target_id": 35, + "target_slot": 8, + "type": "SLGARGS" + }, + { + "id": 109, + "origin_id": -10, + "origin_slot": 13, + "target_id": 36, + "target_slot": 8, + "type": "SLGARGS" + }, + { + "id": 111, + "origin_id": -10, + "origin_slot": 1, + "target_id": 36, + "target_slot": 1, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 113, + "origin_id": 35, + "origin_slot": 0, + "target_id": 36, + "target_slot": 3, + "type": "LATENT" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "c498c212-f2a5-4b86-b79a-d5e4deb32166", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 34, + "lastLinkId": 97, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Input Image Processing (2nd)", + "inputNode": { + "id": -10, + "bounding": [ + 1422.9276548332389, + 822.7685431803775, + 135.0500030517578, + 240 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 2378.2076548332393, + 788.8885431803775, + 138.31666564941406, + 120 + ] + }, + "inputs": [ + { + "id": "39721886-ae3d-442a-8d83-c802583cb505", + "name": "image", + "type": "IMAGE", + "linkIds": [ + 92, + 94 + ], + "pos": [ + 1537.9776578849967, + 842.7685431803775 + ] + }, + { + "id": "2db4cd36-5a5d-4051-abb3-dc19d946b189", + "name": "width", + "type": "INT", + "linkIds": [ + 54 + ], + "pos": [ + 1537.9776578849967, + 862.7685431803775 + ] + }, + { + "id": "594508e6-933c-43d3-bff2-d21eade0613f", + "name": "height", + "type": "INT", + "linkIds": [ + 55 + ], + "pos": [ + 1537.9776578849967, + 882.7685431803775 + ] + }, + { + "id": "bf17138c-3670-44cc-ac66-41fbbc07d698", + "name": "clip_vision", + "type": "CLIP_VISION", + "linkIds": [ + 11 + ], + "pos": [ + 1537.9776578849967, + 902.7685431803775 + ] + }, + { + "id": "39ec8261-e16f-4914-868b-acb6fbd42cf1", + "name": "vae", + "type": "WANVAE", + "linkIds": [ + 53, + 75 + ], + "pos": [ + 1537.9776578849967, + 922.7685431803775 + ] + }, + { + "id": "63c948c7-852e-48d4-b258-5bdc4b23a8d7", + "name": "num_frames", + "type": "INT", + "linkIds": [ + 56 + ], + "pos": [ + 1537.9776578849967, + 942.7685431803775 + ] + }, + { + "id": "1ac603fb-2437-4b77-aa6d-55f7c7fafe2c", + "name": "frame_count", + "type": "INT", + "linkIds": [], + "pos": [ + 1537.9776578849967, + 962.7685431803775 + ] + }, + { + "id": "63461d20-8499-4665-9ad7-040a032aa2ec", + "name": "control_images", + "type": "IMAGE", + "linkIds": [ + 40, + 50, + 67 + ], + "label": "reference_image", + "pos": [ + 1537.9776578849967, + 982.7685431803775 + ] + }, + { + "id": "e8ebad2a-15b6-47ef-8faa-68abce550cfe", + "name": "extra_latents", + "type": "LATENT", + "linkIds": [ + 41 + ], + "pos": [ + 1537.9776578849967, + 1002.7685431803775 + ] + }, + { + "id": "89cf4526-22cc-4d5d-8a87-1c7fcd714048", + "name": "memory_frames", + "type": "IMAGE", + "linkIds": [ + 95 + ], + "pos": [ + 1537.9776578849967, + 1022.7685431803775 + ] + } + ], + "outputs": [ + { + "id": "b89d7bd6-4d16-4625-ad4c-90bd0890b635", + "name": "width", + "type": "INT", + "linkIds": [ + 4 + ], + "pos": [ + 2398.2076548332393, + 808.8885431803775 + ] + }, + { + "id": "0c5dd3c7-f558-45df-ae7d-edb412b19cd3", + "name": "height", + "type": "INT", + "linkIds": [ + 5 + ], + "pos": [ + 2398.2076548332393, + 828.8885431803775 + ] + }, + { + "id": "e4e7c866-c217-4370-92f4-3401cffa0757", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "linkIds": [ + 76 + ], + "label": "image_embeds_2", + "pos": [ + 2398.2076548332393, + 848.8885431803775 + ] + }, + { + "id": "80ef43d6-d5e2-4d14-8640-c391c081a33e", + "name": "CONTINUED", + "type": "IMAGE", + "linkIds": [], + "pos": [ + 2398.2076548332393, + 868.8885431803775 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 30, + "type": "WanVideoEncode", + "pos": [ + 1952.1260603826624, + 1212.2236245623783 + ], + "size": [ + 273.7666702270508, + 242 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "WANVAE", + "link": 75 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 97 + }, + { + "localized_name": "mask", + "name": "mask", + "shape": 7, + "type": "MASK", + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 78 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "95255c7ffa29d90af6b0597b10d59a7946618b61", + "Node name for S&R": "WanVideoEncode" + }, + "widgets_values": [ + false, + 272, + 272, + 144, + 128, + 0, + 1 + ] + }, + { + "id": 31, + "type": "WanVideoAddStoryMemLatents", + "pos": [ + 2296.0820515084633, + 1036.1990879274101 + ], + "size": [ + 262.0000061035156, + 46 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "embeds", + "name": "embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 77 + }, + { + "localized_name": "memory_latents", + "name": "memory_latents", + "type": "LATENT", + "link": 78 + } + ], + "outputs": [ + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 76 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "95255c7ffa29d90af6b0597b10d59a7946618b61", + "Node name for S&R": "WanVideoAddStoryMemLatents" + }, + "widgets_values": [] + }, + { + "id": 15, + "type": "WanVideoClipVisionEncode", + "pos": [ + 1944.1476548332394, + 402.5885431803783 + ], + "size": [ + 280.96666564941404, + 262 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_vision", + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 11 + }, + { + "localized_name": "image_1", + "name": "image_1", + "type": "IMAGE", + "link": 67 + }, + { + "localized_name": "image_2", + "name": "image_2", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "negative_image", + "name": "negative_image", + "shape": 7, + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_CLIPEMBEDS", + "links": [ + 52 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoClipVisionEncode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 1, + 1, + "disabled", + "concat", + false, + 16, + 0.15 + ] + }, + { + "id": 23, + "type": "WanVideoImageToVideoEncode", + "pos": [ + 1939.2635702688156, + 730.142173231865 + ], + "size": [ + 308.5000061035156, + 434 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "shape": 7, + "type": "WANVAE", + "link": 53 + }, + { + "localized_name": "clip_embeds", + "name": "clip_embeds", + "shape": 7, + "type": "WANVIDIMAGE_CLIPEMBEDS", + "link": 52 + }, + { + "localized_name": "start_image", + "name": "start_image", + "shape": 7, + "type": "IMAGE", + "link": 93 + }, + { + "localized_name": "end_image", + "name": "end_image", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "control_embeds", + "name": "control_embeds", + "shape": 7, + "type": "WANVIDIMAGE_EMBEDS", + "link": null + }, + { + "localized_name": "temporal_mask", + "name": "temporal_mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "extra_latents", + "name": "extra_latents", + "shape": 7, + "type": "LATENT", + "link": null + }, + { + "localized_name": "add_cond_latents", + "name": "add_cond_latents", + "shape": 7, + "type": "ADD_COND_LATENTS", + "link": null + }, + { + "localized_name": "empty_frame_pad_image", + "name": "empty_frame_pad_image", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 54 + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 55 + }, + { + "localized_name": "num_frames", + "name": "num_frames", + "type": "INT", + "widget": { + "name": "num_frames" + }, + "link": 56 + } + ], + "outputs": [ + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 77 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "44feb24290db02279988a2ce8845ee65e62f3cce", + "Node name for S&R": "WanVideoImageToVideoEncode" + }, + "widgets_values": [ + 1.5, + 1.5, + 81, + 0.03, + 1, + 1, + false, + false, + false, + 0 + ] + }, + { + "id": 33, + "type": "FunPackStoryMemKeyframeExtractor", + "pos": [ + 1543.7567571703735, + 1130.6690553792619 + ], + "size": [ + 360.58331909179685, + 174 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "frames", + "name": "frames", + "type": "IMAGE", + "link": 94 + }, + { + "localized_name": "memory_frames", + "name": "memory_frames", + "shape": 7, + "type": "IMAGE", + "link": 95 + } + ], + "outputs": [ + { + "localized_name": "keyframes", + "name": "keyframes", + "type": "IMAGE", + "links": [] + }, + { + "localized_name": "keyframe_count", + "name": "keyframe_count", + "type": "INT", + "links": null + } + ], + "properties": { + "aux_id": "olivv-cs/ComfyUI-FunPack", + "ver": "6beaeeef3290e7fcf9f72b8ccd77c4930fdd6668", + "Node name for S&R": "FunPackStoryMemKeyframeExtractor" + }, + "widgets_values": [ + "nsfw_clip_vision.safetensors", + 8, + 0.9, + true, + 3 + ] + }, + { + "id": 34, + "type": "FunPackStoryMemLastFrameExtractor", + "pos": [ + 1588.3771789686366, + 893.5246793918927 + ], + "size": [ + 310.1333374023437, + 82.438182634251 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "frames", + "name": "frames", + "type": "IMAGE", + "link": 92 + } + ], + "outputs": [ + { + "localized_name": "last_frame", + "name": "last_frame", + "type": "IMAGE", + "links": [ + 93 + ] + }, + { + "localized_name": "motion_frames", + "name": "motion_frames", + "type": "IMAGE", + "links": [ + 97 + ] + } + ], + "properties": { + "aux_id": "olivv-cs/ComfyUI-FunPack", + "ver": "6beaeeef3290e7fcf9f72b8ccd77c4930fdd6668", + "Node name for S&R": "FunPackStoryMemLastFrameExtractor" + }, + "widgets_values": [ + 5 + ] + } + ], + "groups": [], + "links": [ + { + "id": 11, + "origin_id": -10, + "origin_slot": 3, + "target_id": 15, + "target_slot": 0, + "type": "CLIP_VISION" + }, + { + "id": 52, + "origin_id": 15, + "origin_slot": 0, + "target_id": 23, + "target_slot": 1, + "type": "WANVIDIMAGE_CLIPEMBEDS" + }, + { + "id": 53, + "origin_id": -10, + "origin_slot": 4, + "target_id": 23, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 54, + "origin_id": -10, + "origin_slot": 1, + "target_id": 23, + "target_slot": 9, + "type": "INT" + }, + { + "id": 55, + "origin_id": -10, + "origin_slot": 2, + "target_id": 23, + "target_slot": 10, + "type": "INT" + }, + { + "id": 56, + "origin_id": -10, + "origin_slot": 5, + "target_id": 23, + "target_slot": 11, + "type": "INT" + }, + { + "id": 67, + "origin_id": -10, + "origin_slot": 7, + "target_id": 15, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 75, + "origin_id": -10, + "origin_slot": 4, + "target_id": 30, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 76, + "origin_id": 31, + "origin_slot": 0, + "target_id": -20, + "target_slot": 2, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 77, + "origin_id": 23, + "origin_slot": 0, + "target_id": 31, + "target_slot": 0, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 78, + "origin_id": 30, + "origin_slot": 0, + "target_id": 31, + "target_slot": 1, + "type": "LATENT" + }, + { + "id": 92, + "origin_id": -10, + "origin_slot": 0, + "target_id": 34, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 93, + "origin_id": 34, + "origin_slot": 0, + "target_id": 23, + "target_slot": 2, + "type": "IMAGE" + }, + { + "id": 94, + "origin_id": -10, + "origin_slot": 0, + "target_id": 33, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 95, + "origin_id": -10, + "origin_slot": 9, + "target_id": 33, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 97, + "origin_id": 34, + "origin_slot": 1, + "target_id": 30, + "target_slot": 1, + "type": "IMAGE" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "11ced874-ea26-4f3b-9f38-b2832afbf879", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 38, + "lastLinkId": 74, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "First Sampler Settings", + "inputNode": { + "id": -10, + "bounding": [ + 1667.468654833238, + 551.5005431803779, + 121.11666870117188, + 180 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 2361.8937305789664, + 500.98833635058827, + 134.33333587646484, + 140 + ] + }, + "inputs": [ + { + "id": "471bfea9-04ce-4034-9e34-8f0f57458f3b", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 12 + ], + "label": "model_high", + "pos": [ + 1768.5853235344098, + 571.5005431803779 + ] + }, + { + "id": "82834c07-0e51-41fe-af68-85357f44487d", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 13 + ], + "label": "model_low", + "pos": [ + 1768.5853235344098, + 591.5005431803779 + ] + }, + { + "id": "86266dd6-70db-44c0-ac1b-8cf8b8ae7366", + "name": "t5", + "type": "WANTEXTENCODER", + "linkIds": [ + 17 + ], + "label": "text_encoder", + "pos": [ + 1768.5853235344098, + 611.5005431803779 + ] + }, + { + "id": "0fe1554b-9f58-420a-a2ad-2d61d7fd4cfe", + "name": "prev_lora", + "type": "WANVIDLORA", + "linkIds": [ + 19 + ], + "label": "global_loras_h", + "pos": [ + 1768.5853235344098, + 631.5005431803779 + ] + }, + { + "id": "df9a7eef-1cb4-4a80-8cc3-c5f413c10dde", + "name": "prev_lora_1", + "type": "WANVIDLORA", + "linkIds": [ + 20 + ], + "label": "global_loras_l", + "pos": [ + 1768.5853235344098, + 651.5005431803779 + ] + }, + { + "id": "70a27afa-f504-4315-a664-b62a5d7ebb93", + "name": "qwen", + "type": "QWENMODEL", + "linkIds": [], + "pos": [ + 1768.5853235344098, + 671.5005431803779 + ] + }, + { + "id": "affff3aa-f848-4200-a01a-d6755d1b7d64", + "name": "prompt", + "type": "STRING", + "linkIds": [ + 74 + ], + "pos": [ + 1768.5853235344098, + 691.5005431803779 + ] + } + ], + "outputs": [ + { + "id": "b5e9fe79-c181-4a71-9614-1a51998fdee4", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "linkIds": [ + 16 + ], + "localized_name": "text_embeds", + "label": "text_embeds_1", + "pos": [ + 2381.8937305789664, + 520.9883363505883 + ] + }, + { + "id": "de4bf3d1-ea64-4bec-808e-6f9c98d596fc", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 14 + ], + "label": "model_high_1", + "pos": [ + 2381.8937305789664, + 540.9883363505883 + ] + }, + { + "id": "2d83ee90-a1ae-43a1-bc21-f38bca374163", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 15 + ], + "label": "model_low_1", + "pos": [ + 2381.8937305789664, + 560.9883363505883 + ] + }, + { + "id": "64da2556-7669-4ed9-951e-a6707f23df15", + "name": "text_embeds_1", + "type": "WANVIDEOTEXTEMBEDS", + "linkIds": [ + 31 + ], + "label": "text_embeds_h_1", + "pos": [ + 2381.8937305789664, + 580.9883363505883 + ] + }, + { + "id": "09bc671a-6163-44c3-bf06-965f8a9ba745", + "name": "STRING", + "type": "STRING", + "linkIds": [], + "label": "qwen_history", + "pos": [ + 2381.8937305789664, + 600.9883363505883 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 18, + "type": "WanVideoSetLoRAs", + "pos": [ + 1896.1191475953115, + 1192.0482609053868 + ], + "size": [ + 174.50000610351563, + 46 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 12 + }, + { + "localized_name": "lora", + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 10 + } + ], + "outputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 14 + ] + } + ], + "title": "Model H 1", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSetLoRAs", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 19, + "type": "WanVideoSetLoRAs", + "pos": [ + 2164.6021093234176, + 1187.554822215377 + ], + "size": [ + 174.50000610351563, + 46 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 13 + }, + { + "localized_name": "lora", + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 11 + } + ], + "outputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 15 + ] + } + ], + "title": "Model L 1", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSetLoRAs", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 20, + "type": "WanVideoTextEncode", + "pos": [ + 1898.5967322194224, + 460.12081936003693 + ], + "size": [ + 400, + 234 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "t5", + "name": "t5", + "shape": 7, + "type": "WANTEXTENCODER", + "link": 17 + }, + { + "localized_name": "model_to_offload", + "name": "model_to_offload", + "shape": 7, + "type": "WANVIDEOMODEL", + "link": null + }, + { + "localized_name": "positive_prompt", + "name": "positive_prompt", + "type": "STRING", + "widget": { + "name": "positive_prompt" + }, + "link": 74 + } + ], + "outputs": [ + { + "localized_name": "text_embeds", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "links": [ + 16, + 31 + ] + } + ], + "title": "1st Sampler Text Encode", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoTextEncode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": { + "positive_prompt": true + } + } + }, + "widgets_values": [ + "", + "", + true, + false, + "gpu" + ] + }, + { + "id": 16, + "type": "WanVideoLoraSelectMulti", + "pos": [ + 1828.717567245158, + 793.2555771669853 + ], + "size": [ + 271.84999694824216, + 342 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "prev_lora", + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 19 + }, + { + "localized_name": "blocks", + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "lora", + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 10 + ] + } + ], + "title": "1st Sampler LoRAs High", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoLoraSelectMulti", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + "none", + 0.35, + "storymem_h.safetensors", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + true, + false + ] + }, + { + "id": 17, + "type": "WanVideoLoraSelectMulti", + "pos": [ + 2120.791082095819, + 793.2555771669853 + ], + "size": [ + 271.84999694824216, + 342 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "prev_lora", + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 20 + }, + { + "localized_name": "blocks", + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "lora", + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 11 + ] + } + ], + "title": "1st Sampler LoRAs Low", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoLoraSelectMulti", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + "none", + 0.35, + "storymem_l.safetensors", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + true, + false + ] + } + ], + "groups": [], + "links": [ + { + "id": 10, + "origin_id": 16, + "origin_slot": 0, + "target_id": 18, + "target_slot": 1, + "type": "WANVIDLORA" + }, + { + "id": 11, + "origin_id": 17, + "origin_slot": 0, + "target_id": 19, + "target_slot": 1, + "type": "WANVIDLORA" + }, + { + "id": 12, + "origin_id": -10, + "origin_slot": 0, + "target_id": 18, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 13, + "origin_id": -10, + "origin_slot": 1, + "target_id": 19, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 14, + "origin_id": 18, + "origin_slot": 0, + "target_id": -20, + "target_slot": 1, + "type": "WANVIDEOMODEL" + }, + { + "id": 15, + "origin_id": 19, + "origin_slot": 0, + "target_id": -20, + "target_slot": 2, + "type": "WANVIDEOMODEL" + }, + { + "id": 16, + "origin_id": 20, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 17, + "origin_id": -10, + "origin_slot": 2, + "target_id": 20, + "target_slot": 0, + "type": "WANTEXTENCODER" + }, + { + "id": 19, + "origin_id": -10, + "origin_slot": 3, + "target_id": 16, + "target_slot": 0, + "type": "WANVIDLORA" + }, + { + "id": 20, + "origin_id": -10, + "origin_slot": 4, + "target_id": 17, + "target_slot": 0, + "type": "WANVIDLORA" + }, + { + "id": 31, + "origin_id": 20, + "origin_slot": 0, + "target_id": -20, + "target_slot": 3, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 74, + "origin_id": -10, + "origin_slot": 6, + "target_id": 20, + "target_slot": 2, + "type": "STRING" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "f8a1a675-ee93-411d-8a3c-9ea2a87d0a58", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 20, + "lastLinkId": 41, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Second Sampler", + "inputNode": { + "id": -10, + "bounding": [ + 1805.2876548332397, + 593.6885431803782, + 152.66666412353516, + 300 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 2917.4543189567758, + 517.7785431803774, + 176.5, + 60 + ] + }, + "inputs": [ + { + "id": "03555a5e-26f8-4c22-be6c-c04fd5730314", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "linkIds": [ + 7, + 15 + ], + "localized_name": "text_embeds", + "label": "text_embeds_2", + "shape": 7, + "pos": [ + 1937.9543189567748, + 613.6885431803782 + ] + }, + { + "id": "13d993ea-fa10-43a2-ab24-0387043a359b", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "linkIds": [ + 10, + 14 + ], + "label": "image_embeds_2", + "pos": [ + 1937.9543189567748, + 633.6885431803782 + ] + }, + { + "id": "74400b66-02e3-4e05-afac-fc522c50dc3e", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 12 + ], + "label": "model_high_2", + "pos": [ + 1937.9543189567748, + 653.6885431803782 + ] + }, + { + "id": "ba110be6-1231-44bb-9527-116b65d7ae4d", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 13 + ], + "label": "model_low_2", + "pos": [ + 1937.9543189567748, + 673.6885431803782 + ] + }, + { + "id": "0ca5aad8-2770-4b8c-adc6-5bdd325e6945", + "name": "steps", + "type": "INT", + "linkIds": [ + 16, + 17 + ], + "pos": [ + 1937.9543189567748, + 693.6885431803782 + ] + }, + { + "id": "1083f183-4997-432c-8172-a7f4c2ee9e3f", + "name": "cfg", + "type": "FLOAT", + "linkIds": [ + 19 + ], + "pos": [ + 1937.9543189567748, + 713.6885431803782 + ] + }, + { + "id": "ed2443d0-56de-42a8-9f2c-92338421551c", + "name": "shift", + "type": "FLOAT", + "linkIds": [ + 20, + 21 + ], + "pos": [ + 1937.9543189567748, + 733.6885431803782 + ] + }, + { + "id": "4ac865ff-5a94-4a54-bc72-7acda1fa706b", + "name": "sigma", + "type": "FLOAT", + "linkIds": [ + 26 + ], + "pos": [ + 1937.9543189567748, + 753.6885431803782 + ] + }, + { + "id": "27c86e44-31fa-4880-a2d3-968f6ce2d00a", + "name": "vae", + "type": "WANVAE", + "linkIds": [ + 28 + ], + "pos": [ + 1937.9543189567748, + 773.6885431803782 + ] + }, + { + "id": "16ca6036-fb6b-4513-85c4-4e16a5acfa7b", + "name": "experimental_args", + "type": "EXPERIMENTALARGS", + "linkIds": [ + 31 + ], + "pos": [ + 1937.9543189567748, + 793.6885431803782 + ] + }, + { + "id": "37a73e06-f886-4038-9c7e-5921ecf72a32", + "name": "experimental_args_1", + "type": "EXPERIMENTALARGS", + "linkIds": [ + 32 + ], + "pos": [ + 1937.9543189567748, + 813.6885431803782 + ] + }, + { + "id": "4369b3f6-b03a-4457-9dc4-927bcc204398", + "name": "feta_args", + "type": "FETAARGS", + "linkIds": [ + 36, + 37 + ], + "pos": [ + 1937.9543189567748, + 833.6885431803782 + ] + }, + { + "id": "5c5c0b35-e6e5-44be-bc82-dadbf60ed63d", + "name": "slg_args", + "type": "SLGARGS", + "linkIds": [ + 38, + 39 + ], + "pos": [ + 1937.9543189567748, + 853.6885431803782 + ] + } + ], + "outputs": [ + { + "id": "6c75445b-3af8-4a18-9976-505cf96d932e", + "name": "images", + "type": "IMAGE", + "linkIds": [ + 29 + ], + "label": "second_sampler_results", + "pos": [ + 2937.4543189567758, + 537.7785431803774 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 18, + "type": "WanVideoSigmaToStep", + "pos": [ + 1913.8976548332391, + 921.6785431803784 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "sigma", + "name": "sigma", + "type": "FLOAT", + "widget": { + "name": "sigma" + }, + "link": 26 + } + ], + "outputs": [ + { + "localized_name": "step", + "name": "step", + "type": "INT", + "links": [ + 24, + 25 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSigmaToStep", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 0.9 + ] + }, + { + "id": 19, + "type": "WanVideoDecode", + "pos": [ + 2910.9376548332393, + 304.578543180378 + ], + "size": [ + 270, + 198 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "WANVAE", + "link": 28 + }, + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 27 + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": [ + 29 + ] + } + ], + "title": "Decode 2", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoDecode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + false, + 272, + 272, + 144, + 128, + "default" + ] + }, + { + "id": 14, + "type": "WanVideoSampler", + "pos": [ + 2205.50765483324, + 298.52854318037816 + ], + "size": [ + 327.66666412353516, + 1136.7619011847528 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 12 + }, + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 10 + }, + { + "localized_name": "text_embeds", + "name": "text_embeds", + "shape": 7, + "type": "WANVIDEOTEXTEMBEDS", + "link": 7 + }, + { + "localized_name": "samples", + "name": "samples", + "shape": 7, + "type": "LATENT", + "link": null + }, + { + "localized_name": "feta_args", + "name": "feta_args", + "shape": 7, + "type": "FETAARGS", + "link": 36 + }, + { + "localized_name": "context_options", + "name": "context_options", + "shape": 7, + "type": "WANVIDCONTEXT", + "link": null + }, + { + "localized_name": "cache_args", + "name": "cache_args", + "shape": 7, + "type": "CACHEARGS", + "link": null + }, + { + "localized_name": "flowedit_args", + "name": "flowedit_args", + "shape": 7, + "type": "FLOWEDITARGS", + "link": null + }, + { + "localized_name": "slg_args", + "name": "slg_args", + "shape": 7, + "type": "SLGARGS", + "link": 38 + }, + { + "localized_name": "loop_args", + "name": "loop_args", + "shape": 7, + "type": "LOOPARGS", + "link": null + }, + { + "localized_name": "experimental_args", + "name": "experimental_args", + "shape": 7, + "type": "EXPERIMENTALARGS", + "link": 31 + }, + { + "localized_name": "sigmas", + "name": "sigmas", + "shape": 7, + "type": "SIGMAS", + "link": null + }, + { + "localized_name": "unianimate_poses", + "name": "unianimate_poses", + "shape": 7, + "type": "UNIANIMATE_POSE", + "link": null + }, + { + "localized_name": "fantasytalking_embeds", + "name": "fantasytalking_embeds", + "shape": 7, + "type": "FANTASYTALKING_EMBEDS", + "link": null + }, + { + "localized_name": "uni3c_embeds", + "name": "uni3c_embeds", + "shape": 7, + "type": "UNI3C_EMBEDS", + "link": null + }, + { + "localized_name": "multitalk_embeds", + "name": "multitalk_embeds", + "shape": 7, + "type": "MULTITALK_EMBEDS", + "link": null + }, + { + "localized_name": "freeinit_args", + "name": "freeinit_args", + "shape": 7, + "type": "FREEINITARGS", + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": 16 + }, + { + "localized_name": "shift", + "name": "shift", + "type": "FLOAT", + "widget": { + "name": "shift" + }, + "link": 20 + }, + { + "localized_name": "end_step", + "name": "end_step", + "shape": 7, + "type": "INT", + "widget": { + "name": "end_step" + }, + "link": 24 + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 11 + ] + }, + { + "localized_name": "denoised_samples", + "name": "denoised_samples", + "type": "LATENT", + "links": null + } + ], + "title": "Sampler 2 H", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSampler", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 5, + 1, + 5, + 736643172496809, + "randomize", + false, + "er_sde", + 0, + 1, + false, + "comfy", + 0, + -1, + false + ] + }, + { + "id": 17, + "type": "WanVideoSampler", + "pos": [ + 2560.0376548332397, + 298.528543180378 + ], + "size": [ + 327.66666412353516, + 1136.7619011847528 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 13 + }, + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 14 + }, + { + "localized_name": "text_embeds", + "name": "text_embeds", + "shape": 7, + "type": "WANVIDEOTEXTEMBEDS", + "link": 15 + }, + { + "localized_name": "samples", + "name": "samples", + "shape": 7, + "type": "LATENT", + "link": 11 + }, + { + "localized_name": "feta_args", + "name": "feta_args", + "shape": 7, + "type": "FETAARGS", + "link": 37 + }, + { + "localized_name": "context_options", + "name": "context_options", + "shape": 7, + "type": "WANVIDCONTEXT", + "link": null + }, + { + "localized_name": "cache_args", + "name": "cache_args", + "shape": 7, + "type": "CACHEARGS", + "link": null + }, + { + "localized_name": "flowedit_args", + "name": "flowedit_args", + "shape": 7, + "type": "FLOWEDITARGS", + "link": null + }, + { + "localized_name": "slg_args", + "name": "slg_args", + "shape": 7, + "type": "SLGARGS", + "link": 39 + }, + { + "localized_name": "loop_args", + "name": "loop_args", + "shape": 7, + "type": "LOOPARGS", + "link": null + }, + { + "localized_name": "experimental_args", + "name": "experimental_args", + "shape": 7, + "type": "EXPERIMENTALARGS", + "link": 32 + }, + { + "localized_name": "sigmas", + "name": "sigmas", + "shape": 7, + "type": "SIGMAS", + "link": null + }, + { + "localized_name": "unianimate_poses", + "name": "unianimate_poses", + "shape": 7, + "type": "UNIANIMATE_POSE", + "link": null + }, + { + "localized_name": "fantasytalking_embeds", + "name": "fantasytalking_embeds", + "shape": 7, + "type": "FANTASYTALKING_EMBEDS", + "link": null + }, + { + "localized_name": "uni3c_embeds", + "name": "uni3c_embeds", + "shape": 7, + "type": "UNI3C_EMBEDS", + "link": null + }, + { + "localized_name": "multitalk_embeds", + "name": "multitalk_embeds", + "shape": 7, + "type": "MULTITALK_EMBEDS", + "link": null + }, + { + "localized_name": "freeinit_args", + "name": "freeinit_args", + "shape": 7, + "type": "FREEINITARGS", + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": 17 + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": 19 + }, + { + "localized_name": "shift", + "name": "shift", + "type": "FLOAT", + "widget": { + "name": "shift" + }, + "link": 21 + }, + { + "localized_name": "start_step", + "name": "start_step", + "shape": 7, + "type": "INT", + "widget": { + "name": "start_step" + }, + "link": 25 + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 27 + ] + }, + { + "localized_name": "denoised_samples", + "name": "denoised_samples", + "type": "LATENT", + "links": null + } + ], + "title": "Sampler 2 L", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSampler", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": { + "steps": true, + "cfg": true, + "shift": true + } + } + }, + "widgets_values": [ + 5, + 1, + 5, + 45104975056808, + "randomize", + false, + "er_sde", + 0, + 1, + false, + "comfy", + 0, + -1, + false + ] + } + ], + "groups": [], + "links": [ + { + "id": 7, + "origin_id": -10, + "origin_slot": 0, + "target_id": 14, + "target_slot": 2, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 10, + "origin_id": -10, + "origin_slot": 1, + "target_id": 14, + "target_slot": 1, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 11, + "origin_id": 14, + "origin_slot": 0, + "target_id": 17, + "target_slot": 3, + "type": "LATENT" + }, + { + "id": 12, + "origin_id": -10, + "origin_slot": 2, + "target_id": 14, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 13, + "origin_id": -10, + "origin_slot": 3, + "target_id": 17, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 14, + "origin_id": -10, + "origin_slot": 1, + "target_id": 17, + "target_slot": 1, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 15, + "origin_id": -10, + "origin_slot": 0, + "target_id": 17, + "target_slot": 2, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 16, + "origin_id": -10, + "origin_slot": 4, + "target_id": 14, + "target_slot": 17, + "type": "INT" + }, + { + "id": 17, + "origin_id": -10, + "origin_slot": 4, + "target_id": 17, + "target_slot": 17, + "type": "INT" + }, + { + "id": 19, + "origin_id": -10, + "origin_slot": 5, + "target_id": 17, + "target_slot": 18, + "type": "FLOAT" + }, + { + "id": 20, + "origin_id": -10, + "origin_slot": 6, + "target_id": 14, + "target_slot": 18, + "type": "FLOAT" + }, + { + "id": 21, + "origin_id": -10, + "origin_slot": 6, + "target_id": 17, + "target_slot": 19, + "type": "FLOAT" + }, + { + "id": 24, + "origin_id": 18, + "origin_slot": 0, + "target_id": 14, + "target_slot": 19, + "type": "INT" + }, + { + "id": 25, + "origin_id": 18, + "origin_slot": 0, + "target_id": 17, + "target_slot": 20, + "type": "INT" + }, + { + "id": 26, + "origin_id": -10, + "origin_slot": 7, + "target_id": 18, + "target_slot": 0, + "type": "FLOAT" + }, + { + "id": 27, + "origin_id": 17, + "origin_slot": 0, + "target_id": 19, + "target_slot": 1, + "type": "LATENT" + }, + { + "id": 28, + "origin_id": -10, + "origin_slot": 8, + "target_id": 19, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 29, + "origin_id": 19, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 31, + "origin_id": -10, + "origin_slot": 9, + "target_id": 14, + "target_slot": 10, + "type": "EXPERIMENTALARGS" + }, + { + "id": 32, + "origin_id": -10, + "origin_slot": 10, + "target_id": 17, + "target_slot": 10, + "type": "EXPERIMENTALARGS" + }, + { + "id": 36, + "origin_id": -10, + "origin_slot": 11, + "target_id": 14, + "target_slot": 4, + "type": "FETAARGS" + }, + { + "id": 37, + "origin_id": -10, + "origin_slot": 11, + "target_id": 17, + "target_slot": 4, + "type": "FETAARGS" + }, + { + "id": 38, + "origin_id": -10, + "origin_slot": 12, + "target_id": 14, + "target_slot": 8, + "type": "SLGARGS" + }, + { + "id": 39, + "origin_id": -10, + "origin_slot": 12, + "target_id": 17, + "target_slot": 8, + "type": "SLGARGS" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "0d5ea664-7ebe-4da9-b561-a899d31bb5d8", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 30, + "lastLinkId": 87, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Input Image Processing (3rd)", + "inputNode": { + "id": -10, + "bounding": [ + 1422.9276548332389, + 822.7685431803775, + 135.0500030517578, + 240 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 2378.2076548332393, + 788.8885431803775, + 137.88333129882812, + 120 + ] + }, + "inputs": [ + { + "id": "39721886-ae3d-442a-8d83-c802583cb505", + "name": "image", + "type": "IMAGE", + "linkIds": [ + 80, + 82 + ], + "pos": [ + 1537.9776578849967, + 842.7685431803775 + ] + }, + { + "id": "2db4cd36-5a5d-4051-abb3-dc19d946b189", + "name": "width", + "type": "INT", + "linkIds": [ + 53 + ], + "pos": [ + 1537.9776578849967, + 862.7685431803775 + ] + }, + { + "id": "594508e6-933c-43d3-bff2-d21eade0613f", + "name": "height", + "type": "INT", + "linkIds": [ + 54 + ], + "pos": [ + 1537.9776578849967, + 882.7685431803775 + ] + }, + { + "id": "bf17138c-3670-44cc-ac66-41fbbc07d698", + "name": "clip_vision", + "type": "CLIP_VISION", + "linkIds": [ + 11 + ], + "pos": [ + 1537.9776578849967, + 902.7685431803775 + ] + }, + { + "id": "39ec8261-e16f-4914-868b-acb6fbd42cf1", + "name": "vae", + "type": "WANVAE", + "linkIds": [ + 50, + 68 + ], + "pos": [ + 1537.9776578849967, + 922.7685431803775 + ] + }, + { + "id": "63c948c7-852e-48d4-b258-5bdc4b23a8d7", + "name": "num_frames", + "type": "INT", + "linkIds": [ + 55 + ], + "pos": [ + 1537.9776578849967, + 942.7685431803775 + ] + }, + { + "id": "1ac603fb-2437-4b77-aa6d-55f7c7fafe2c", + "name": "frame_count", + "type": "INT", + "linkIds": [], + "pos": [ + 1537.9776578849967, + 962.7685431803775 + ] + }, + { + "id": "a4b5fc06-d47b-4559-b8a8-ee78102e3501", + "name": "control_images", + "type": "IMAGE", + "linkIds": [ + 39, + 49, + 60 + ], + "label": "reference_image", + "pos": [ + 1537.9776578849967, + 982.7685431803775 + ] + }, + { + "id": "6d169e89-7c46-4f11-8d7f-6980aa589459", + "name": "extra_latents", + "type": "LATENT", + "linkIds": [ + 40 + ], + "pos": [ + 1537.9776578849967, + 1002.7685431803775 + ] + }, + { + "id": "797a83b1-0d4b-4fdf-9fee-566f546c8db2", + "name": "image_2", + "type": "IMAGE", + "linkIds": [ + 85 + ], + "pos": [ + 1537.9776578849967, + 1022.7685431803775 + ] + } + ], + "outputs": [ + { + "id": "b89d7bd6-4d16-4625-ad4c-90bd0890b635", + "name": "width", + "type": "INT", + "linkIds": [ + 4 + ], + "pos": [ + 2398.2076548332393, + 808.8885431803775 + ] + }, + { + "id": "0c5dd3c7-f558-45df-ae7d-edb412b19cd3", + "name": "height", + "type": "INT", + "linkIds": [ + 5 + ], + "pos": [ + 2398.2076548332393, + 828.8885431803775 + ] + }, + { + "id": "e4e7c866-c217-4370-92f4-3401cffa0757", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "linkIds": [ + 71 + ], + "label": "image_embeds_3", + "pos": [ + 2398.2076548332393, + 848.8885431803775 + ] + }, + { + "id": "f85e201e-40b7-455a-a376-c1e43c1403ec", + "name": "CONTINUED", + "type": "IMAGE", + "linkIds": [], + "pos": [ + 2398.2076548332393, + 868.8885431803775 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 15, + "type": "WanVideoClipVisionEncode", + "pos": [ + 1944.1476548332394, + 402.5885431803783 + ], + "size": [ + 280.96666564941404, + 262 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_vision", + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 11 + }, + { + "localized_name": "image_1", + "name": "image_1", + "type": "IMAGE", + "link": 60 + }, + { + "localized_name": "image_2", + "name": "image_2", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "negative_image", + "name": "negative_image", + "shape": 7, + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_CLIPEMBEDS", + "links": [ + 51 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoClipVisionEncode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + }, + "rejects_ue_links": true + }, + "widgets_values": [ + 1, + 1, + "disabled", + "concat", + false, + 16, + 0.15 + ] + }, + { + "id": 26, + "type": "WanVideoEncode", + "pos": [ + 1927.140646370735, + 1199.0942917197474 + ], + "size": [ + 273.7666702270508, + 242 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "WANVAE", + "link": 68 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 87 + }, + { + "localized_name": "mask", + "name": "mask", + "shape": 7, + "type": "MASK", + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 70 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "95255c7ffa29d90af6b0597b10d59a7946618b61", + "Node name for S&R": "WanVideoEncode" + }, + "widgets_values": [ + false, + 272, + 272, + 144, + 128, + 0, + 1 + ] + }, + { + "id": 27, + "type": "WanVideoAddStoryMemLatents", + "pos": [ + 2275.817602080614, + 979.2322268040388 + ], + "size": [ + 262.0000061035156, + 46 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "embeds", + "name": "embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 69 + }, + { + "localized_name": "memory_latents", + "name": "memory_latents", + "type": "LATENT", + "link": 70 + } + ], + "outputs": [ + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 71 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "95255c7ffa29d90af6b0597b10d59a7946618b61", + "Node name for S&R": "WanVideoAddStoryMemLatents" + }, + "widgets_values": [] + }, + { + "id": 23, + "type": "WanVideoImageToVideoEncode", + "pos": [ + 1921.7958935011388, + 720.5014886078465 + ], + "size": [ + 308.5000061035156, + 434 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "shape": 7, + "type": "WANVAE", + "link": 50 + }, + { + "localized_name": "clip_embeds", + "name": "clip_embeds", + "shape": 7, + "type": "WANVIDIMAGE_CLIPEMBEDS", + "link": 51 + }, + { + "localized_name": "start_image", + "name": "start_image", + "shape": 7, + "type": "IMAGE", + "link": 83 + }, + { + "localized_name": "end_image", + "name": "end_image", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "control_embeds", + "name": "control_embeds", + "shape": 7, + "type": "WANVIDIMAGE_EMBEDS", + "link": null + }, + { + "localized_name": "temporal_mask", + "name": "temporal_mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "extra_latents", + "name": "extra_latents", + "shape": 7, + "type": "LATENT", + "link": null + }, + { + "localized_name": "add_cond_latents", + "name": "add_cond_latents", + "shape": 7, + "type": "ADD_COND_LATENTS", + "link": null + }, + { + "localized_name": "empty_frame_pad_image", + "name": "empty_frame_pad_image", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 53 + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 54 + }, + { + "localized_name": "num_frames", + "name": "num_frames", + "type": "INT", + "widget": { + "name": "num_frames" + }, + "link": 55 + } + ], + "outputs": [ + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 69 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "44feb24290db02279988a2ce8845ee65e62f3cce", + "Node name for S&R": "WanVideoImageToVideoEncode" + }, + "widgets_values": [ + 1.5, + 1.5, + 81, + 0.03, + 1, + 1, + false, + false, + false, + 0 + ] + }, + { + "id": 29, + "type": "FunPackStoryMemKeyframeExtractor", + "pos": [ + 1534.7448678326007, + 1158.6212920241023 + ], + "size": [ + 360.58331909179685, + 174 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "frames", + "name": "frames", + "type": "IMAGE", + "link": 80 + }, + { + "localized_name": "memory_frames", + "name": "memory_frames", + "shape": 7, + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "localized_name": "keyframes", + "name": "keyframes", + "type": "IMAGE", + "links": [] + }, + { + "localized_name": "keyframe_count", + "name": "keyframe_count", + "type": "INT", + "links": null + } + ], + "properties": { + "aux_id": "olivv-cs/ComfyUI-FunPack", + "ver": "6beaeeef3290e7fcf9f72b8ccd77c4930fdd6668", + "Node name for S&R": "FunPackStoryMemKeyframeExtractor" + }, + "widgets_values": [ + "nsfw_clip_vision.safetensors", + 8, + 0.9, + true, + 3 + ] + }, + { + "id": 30, + "type": "FunPackStoryMemLastFrameExtractor", + "pos": [ + 1582.4278217543063, + 859.0745302082616 + ], + "size": [ + 310.1333374023437, + 82.438182634251 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "frames", + "name": "frames", + "type": "IMAGE", + "link": 82 + } + ], + "outputs": [ + { + "localized_name": "last_frame", + "name": "last_frame", + "type": "IMAGE", + "links": [ + 83 + ] + }, + { + "localized_name": "motion_frames", + "name": "motion_frames", + "type": "IMAGE", + "links": [ + 87 + ] + } + ], + "properties": { + "aux_id": "olivv-cs/ComfyUI-FunPack", + "ver": "6beaeeef3290e7fcf9f72b8ccd77c4930fdd6668", + "Node name for S&R": "FunPackStoryMemLastFrameExtractor" + }, + "widgets_values": [ + 5 + ] + } + ], + "groups": [], + "links": [ + { + "id": 11, + "origin_id": -10, + "origin_slot": 3, + "target_id": 15, + "target_slot": 0, + "type": "CLIP_VISION" + }, + { + "id": 50, + "origin_id": -10, + "origin_slot": 4, + "target_id": 23, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 51, + "origin_id": 15, + "origin_slot": 0, + "target_id": 23, + "target_slot": 1, + "type": "WANVIDIMAGE_CLIPEMBEDS" + }, + { + "id": 53, + "origin_id": -10, + "origin_slot": 1, + "target_id": 23, + "target_slot": 9, + "type": "INT" + }, + { + "id": 54, + "origin_id": -10, + "origin_slot": 2, + "target_id": 23, + "target_slot": 10, + "type": "INT" + }, + { + "id": 55, + "origin_id": -10, + "origin_slot": 5, + "target_id": 23, + "target_slot": 11, + "type": "INT" + }, + { + "id": 60, + "origin_id": -10, + "origin_slot": 7, + "target_id": 15, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 68, + "origin_id": -10, + "origin_slot": 4, + "target_id": 26, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 69, + "origin_id": 23, + "origin_slot": 0, + "target_id": 27, + "target_slot": 0, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 70, + "origin_id": 26, + "origin_slot": 0, + "target_id": 27, + "target_slot": 1, + "type": "LATENT" + }, + { + "id": 71, + "origin_id": 27, + "origin_slot": 0, + "target_id": -20, + "target_slot": 2, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 80, + "origin_id": -10, + "origin_slot": 0, + "target_id": 29, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 82, + "origin_id": -10, + "origin_slot": 0, + "target_id": 30, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 83, + "origin_id": 30, + "origin_slot": 0, + "target_id": 23, + "target_slot": 2, + "type": "IMAGE" + }, + { + "id": 85, + "origin_id": -10, + "origin_slot": 9, + "target_id": 29, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 87, + "origin_id": 30, + "origin_slot": 1, + "target_id": 26, + "target_slot": 1, + "type": "IMAGE" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "72c19279-7025-4a9a-bf8e-0e890c70044f", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 20, + "lastLinkId": 41, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Third Sampler", + "inputNode": { + "id": -10, + "bounding": [ + 1805.2876548332397, + 593.6885431803782, + 152.66666412353516, + 300 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 2917.4543189567758, + 517.7785431803774, + 160.28333282470703, + 60 + ] + }, + "inputs": [ + { + "id": "03555a5e-26f8-4c22-be6c-c04fd5730314", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "linkIds": [ + 7, + 15 + ], + "localized_name": "text_embeds", + "label": "text_embeds_3", + "shape": 7, + "pos": [ + 1937.9543189567748, + 613.6885431803782 + ] + }, + { + "id": "13d993ea-fa10-43a2-ab24-0387043a359b", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "linkIds": [ + 10, + 14 + ], + "label": "image_embeds_3", + "pos": [ + 1937.9543189567748, + 633.6885431803782 + ] + }, + { + "id": "74400b66-02e3-4e05-afac-fc522c50dc3e", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 12 + ], + "label": "model_high_3", + "pos": [ + 1937.9543189567748, + 653.6885431803782 + ] + }, + { + "id": "ba110be6-1231-44bb-9527-116b65d7ae4d", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 13 + ], + "label": "model_low_3", + "pos": [ + 1937.9543189567748, + 673.6885431803782 + ] + }, + { + "id": "0ca5aad8-2770-4b8c-adc6-5bdd325e6945", + "name": "steps", + "type": "INT", + "linkIds": [ + 16, + 17 + ], + "pos": [ + 1937.9543189567748, + 693.6885431803782 + ] + }, + { + "id": "1083f183-4997-432c-8172-a7f4c2ee9e3f", + "name": "cfg", + "type": "FLOAT", + "linkIds": [ + 19 + ], + "pos": [ + 1937.9543189567748, + 713.6885431803782 + ] + }, + { + "id": "ed2443d0-56de-42a8-9f2c-92338421551c", + "name": "shift", + "type": "FLOAT", + "linkIds": [ + 20, + 21 + ], + "pos": [ + 1937.9543189567748, + 733.6885431803782 + ] + }, + { + "id": "4ac865ff-5a94-4a54-bc72-7acda1fa706b", + "name": "sigma", + "type": "FLOAT", + "linkIds": [ + 26 + ], + "pos": [ + 1937.9543189567748, + 753.6885431803782 + ] + }, + { + "id": "27c86e44-31fa-4880-a2d3-968f6ce2d00a", + "name": "vae", + "type": "WANVAE", + "linkIds": [ + 28 + ], + "pos": [ + 1937.9543189567748, + 773.6885431803782 + ] + }, + { + "id": "a9119b00-fd81-436b-bfcc-e911b1683c19", + "name": "experimental_args", + "type": "EXPERIMENTALARGS", + "linkIds": [ + 31 + ], + "pos": [ + 1937.9543189567748, + 793.6885431803782 + ] + }, + { + "id": "29c92312-7739-421a-9b44-1f32f3c3f243", + "name": "experimental_args_1", + "type": "EXPERIMENTALARGS", + "linkIds": [ + 32 + ], + "pos": [ + 1937.9543189567748, + 813.6885431803782 + ] + }, + { + "id": "f98e0a7e-59a3-47f0-bd5f-bbb3797a5d1c", + "name": "feta_args", + "type": "FETAARGS", + "linkIds": [ + 36, + 37 + ], + "pos": [ + 1937.9543189567748, + 833.6885431803782 + ] + }, + { + "id": "6e0f73cf-c572-4dd2-831a-b7227c221325", + "name": "slg_args", + "type": "SLGARGS", + "linkIds": [ + 38, + 39 + ], + "pos": [ + 1937.9543189567748, + 853.6885431803782 + ] + } + ], + "outputs": [ + { + "id": "6c75445b-3af8-4a18-9976-505cf96d932e", + "name": "images", + "type": "IMAGE", + "linkIds": [ + 29 + ], + "label": "third_sampler_results", + "pos": [ + 2937.4543189567758, + 537.7785431803774 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 18, + "type": "WanVideoSigmaToStep", + "pos": [ + 1913.8976548332391, + 921.6785431803784 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "sigma", + "name": "sigma", + "type": "FLOAT", + "widget": { + "name": "sigma" + }, + "link": 26 + } + ], + "outputs": [ + { + "localized_name": "step", + "name": "step", + "type": "INT", + "links": [ + 24, + 25 + ] + } + ], + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSigmaToStep", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 0.9 + ] + }, + { + "id": 19, + "type": "WanVideoDecode", + "pos": [ + 2910.9376548332393, + 304.578543180378 + ], + "size": [ + 270, + 198 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "WANVAE", + "link": 28 + }, + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 27 + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": [ + 29 + ] + } + ], + "title": "Decode 3", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoDecode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + false, + 272, + 272, + 144, + 128, + "default" + ] + }, + { + "id": 17, + "type": "WanVideoSampler", + "pos": [ + 2560.0376548332397, + 298.528543180378 + ], + "size": [ + 327.66666412353516, + 1136.7619011847528 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 13 + }, + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 14 + }, + { + "localized_name": "text_embeds", + "name": "text_embeds", + "shape": 7, + "type": "WANVIDEOTEXTEMBEDS", + "link": 15 + }, + { + "localized_name": "samples", + "name": "samples", + "shape": 7, + "type": "LATENT", + "link": 11 + }, + { + "localized_name": "feta_args", + "name": "feta_args", + "shape": 7, + "type": "FETAARGS", + "link": 37 + }, + { + "localized_name": "context_options", + "name": "context_options", + "shape": 7, + "type": "WANVIDCONTEXT", + "link": null + }, + { + "localized_name": "cache_args", + "name": "cache_args", + "shape": 7, + "type": "CACHEARGS", + "link": null + }, + { + "localized_name": "flowedit_args", + "name": "flowedit_args", + "shape": 7, + "type": "FLOWEDITARGS", + "link": null + }, + { + "localized_name": "slg_args", + "name": "slg_args", + "shape": 7, + "type": "SLGARGS", + "link": 38 + }, + { + "localized_name": "loop_args", + "name": "loop_args", + "shape": 7, + "type": "LOOPARGS", + "link": null + }, + { + "localized_name": "experimental_args", + "name": "experimental_args", + "shape": 7, + "type": "EXPERIMENTALARGS", + "link": 32 + }, + { + "localized_name": "sigmas", + "name": "sigmas", + "shape": 7, + "type": "SIGMAS", + "link": null + }, + { + "localized_name": "unianimate_poses", + "name": "unianimate_poses", + "shape": 7, + "type": "UNIANIMATE_POSE", + "link": null + }, + { + "localized_name": "fantasytalking_embeds", + "name": "fantasytalking_embeds", + "shape": 7, + "type": "FANTASYTALKING_EMBEDS", + "link": null + }, + { + "localized_name": "uni3c_embeds", + "name": "uni3c_embeds", + "shape": 7, + "type": "UNI3C_EMBEDS", + "link": null + }, + { + "localized_name": "multitalk_embeds", + "name": "multitalk_embeds", + "shape": 7, + "type": "MULTITALK_EMBEDS", + "link": null + }, + { + "localized_name": "freeinit_args", + "name": "freeinit_args", + "shape": 7, + "type": "FREEINITARGS", + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": 17 + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": 19 + }, + { + "localized_name": "shift", + "name": "shift", + "type": "FLOAT", + "widget": { + "name": "shift" + }, + "link": 21 + }, + { + "localized_name": "start_step", + "name": "start_step", + "shape": 7, + "type": "INT", + "widget": { + "name": "start_step" + }, + "link": 25 + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 27 + ] + }, + { + "localized_name": "denoised_samples", + "name": "denoised_samples", + "type": "LATENT", + "links": null + } + ], + "title": "Sampler 3 L", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSampler", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": { + "steps": true, + "cfg": true, + "shift": true + } + } + }, + "widgets_values": [ + 5, + 1, + 5, + 69400118448639, + "randomize", + false, + "er_sde", + 0, + 1, + false, + "comfy", + 0, + -1, + false + ] + }, + { + "id": 14, + "type": "WanVideoSampler", + "pos": [ + 2205.50765483324, + 298.52854318037816 + ], + "size": [ + 327.66666412353516, + 1136.7619011847528 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 12 + }, + { + "localized_name": "image_embeds", + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 10 + }, + { + "localized_name": "text_embeds", + "name": "text_embeds", + "shape": 7, + "type": "WANVIDEOTEXTEMBEDS", + "link": 7 + }, + { + "localized_name": "samples", + "name": "samples", + "shape": 7, + "type": "LATENT", + "link": null + }, + { + "localized_name": "feta_args", + "name": "feta_args", + "shape": 7, + "type": "FETAARGS", + "link": 36 + }, + { + "localized_name": "context_options", + "name": "context_options", + "shape": 7, + "type": "WANVIDCONTEXT", + "link": null + }, + { + "localized_name": "cache_args", + "name": "cache_args", + "shape": 7, + "type": "CACHEARGS", + "link": null + }, + { + "localized_name": "flowedit_args", + "name": "flowedit_args", + "shape": 7, + "type": "FLOWEDITARGS", + "link": null + }, + { + "localized_name": "slg_args", + "name": "slg_args", + "shape": 7, + "type": "SLGARGS", + "link": 39 + }, + { + "localized_name": "loop_args", + "name": "loop_args", + "shape": 7, + "type": "LOOPARGS", + "link": null + }, + { + "localized_name": "experimental_args", + "name": "experimental_args", + "shape": 7, + "type": "EXPERIMENTALARGS", + "link": 31 + }, + { + "localized_name": "sigmas", + "name": "sigmas", + "shape": 7, + "type": "SIGMAS", + "link": null + }, + { + "localized_name": "unianimate_poses", + "name": "unianimate_poses", + "shape": 7, + "type": "UNIANIMATE_POSE", + "link": null + }, + { + "localized_name": "fantasytalking_embeds", + "name": "fantasytalking_embeds", + "shape": 7, + "type": "FANTASYTALKING_EMBEDS", + "link": null + }, + { + "localized_name": "uni3c_embeds", + "name": "uni3c_embeds", + "shape": 7, + "type": "UNI3C_EMBEDS", + "link": null + }, + { + "localized_name": "multitalk_embeds", + "name": "multitalk_embeds", + "shape": 7, + "type": "MULTITALK_EMBEDS", + "link": null + }, + { + "localized_name": "freeinit_args", + "name": "freeinit_args", + "shape": 7, + "type": "FREEINITARGS", + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": 16 + }, + { + "localized_name": "shift", + "name": "shift", + "type": "FLOAT", + "widget": { + "name": "shift" + }, + "link": 20 + }, + { + "localized_name": "end_step", + "name": "end_step", + "shape": 7, + "type": "INT", + "widget": { + "name": "end_step" + }, + "link": 24 + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": [ + 11 + ] + }, + { + "localized_name": "denoised_samples", + "name": "denoised_samples", + "type": "LATENT", + "links": null + } + ], + "title": "Sampler 3 H", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSampler", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {} + } + }, + "widgets_values": [ + 5, + 1, + 5, + 309875920199946, + "randomize", + false, + "er_sde", + 0, + 1, + false, + "comfy", + 0, + -1, + false + ] + } + ], + "groups": [], + "links": [ + { + "id": 7, + "origin_id": -10, + "origin_slot": 0, + "target_id": 14, + "target_slot": 2, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 10, + "origin_id": -10, + "origin_slot": 1, + "target_id": 14, + "target_slot": 1, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 11, + "origin_id": 14, + "origin_slot": 0, + "target_id": 17, + "target_slot": 3, + "type": "LATENT" + }, + { + "id": 12, + "origin_id": -10, + "origin_slot": 2, + "target_id": 14, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 13, + "origin_id": -10, + "origin_slot": 3, + "target_id": 17, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 14, + "origin_id": -10, + "origin_slot": 1, + "target_id": 17, + "target_slot": 1, + "type": "WANVIDIMAGE_EMBEDS" + }, + { + "id": 15, + "origin_id": -10, + "origin_slot": 0, + "target_id": 17, + "target_slot": 2, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 16, + "origin_id": -10, + "origin_slot": 4, + "target_id": 14, + "target_slot": 17, + "type": "INT" + }, + { + "id": 17, + "origin_id": -10, + "origin_slot": 4, + "target_id": 17, + "target_slot": 17, + "type": "INT" + }, + { + "id": 19, + "origin_id": -10, + "origin_slot": 5, + "target_id": 17, + "target_slot": 18, + "type": "FLOAT" + }, + { + "id": 20, + "origin_id": -10, + "origin_slot": 6, + "target_id": 14, + "target_slot": 18, + "type": "FLOAT" + }, + { + "id": 21, + "origin_id": -10, + "origin_slot": 6, + "target_id": 17, + "target_slot": 19, + "type": "FLOAT" + }, + { + "id": 24, + "origin_id": 18, + "origin_slot": 0, + "target_id": 14, + "target_slot": 19, + "type": "INT" + }, + { + "id": 25, + "origin_id": 18, + "origin_slot": 0, + "target_id": 17, + "target_slot": 20, + "type": "INT" + }, + { + "id": 26, + "origin_id": -10, + "origin_slot": 7, + "target_id": 18, + "target_slot": 0, + "type": "FLOAT" + }, + { + "id": 27, + "origin_id": 17, + "origin_slot": 0, + "target_id": 19, + "target_slot": 1, + "type": "LATENT" + }, + { + "id": 28, + "origin_id": -10, + "origin_slot": 8, + "target_id": 19, + "target_slot": 0, + "type": "WANVAE" + }, + { + "id": 29, + "origin_id": 19, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 31, + "origin_id": -10, + "origin_slot": 9, + "target_id": 14, + "target_slot": 10, + "type": "EXPERIMENTALARGS" + }, + { + "id": 32, + "origin_id": -10, + "origin_slot": 10, + "target_id": 17, + "target_slot": 10, + "type": "EXPERIMENTALARGS" + }, + { + "id": 36, + "origin_id": -10, + "origin_slot": 11, + "target_id": 14, + "target_slot": 4, + "type": "FETAARGS" + }, + { + "id": 37, + "origin_id": -10, + "origin_slot": 11, + "target_id": 17, + "target_slot": 4, + "type": "FETAARGS" + }, + { + "id": 38, + "origin_id": -10, + "origin_slot": 12, + "target_id": 17, + "target_slot": 8, + "type": "SLGARGS" + }, + { + "id": 39, + "origin_id": -10, + "origin_slot": 12, + "target_id": 14, + "target_slot": 8, + "type": "SLGARGS" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "7c1d786b-9a8f-4ee0-8abf-2cd57b7d2882", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 53, + "lastLinkId": 145, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Second Sampler Settings", + "inputNode": { + "id": -10, + "bounding": [ + 2539.7308197858433, + 958.920102151578, + 121.11666870117188, + 200 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 3263.3583744113776, + 595.0557402962498, + 125.06666564941406, + 140 + ] + }, + "inputs": [ + { + "id": "59004e92-cbff-45bf-be76-52ece8d402bd", + "name": "t5", + "type": "WANTEXTENCODER", + "linkIds": [ + 84 + ], + "localized_name": "t5", + "label": "text_encoder", + "shape": 7, + "pos": [ + 2640.847488487015, + 978.920102151578 + ] + }, + { + "id": "5c57a6ee-94e4-40c1-97c2-4d52cc145dc3", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 95 + ], + "label": "model_high", + "pos": [ + 2640.847488487015, + 998.920102151578 + ] + }, + { + "id": "65bba66d-c93c-42bf-81ea-8f3c50304d1d", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 96 + ], + "label": "model_low", + "pos": [ + 2640.847488487015, + 1018.920102151578 + ] + }, + { + "id": "5784878d-6f02-43e0-be93-cf910a1c1c0d", + "name": "prev_lora", + "type": "WANVIDLORA", + "linkIds": [ + 97 + ], + "label": "global_loras_h", + "pos": [ + 2640.847488487015, + 1038.920102151578 + ] + }, + { + "id": "b9878078-679f-447a-b0d7-34b74eae89af", + "name": "prev_lora_1", + "type": "WANVIDLORA", + "linkIds": [ + 98 + ], + "label": "global_loras_l", + "pos": [ + 2640.847488487015, + 1058.920102151578 + ] + }, + { + "id": "e50c31f6-9410-4f6d-9c5a-248cb6b78323", + "name": "", + "type": "*", + "linkIds": [], + "label": "qwen_history", + "pos": [ + 2640.847488487015, + 1078.920102151578 + ] + }, + { + "id": "572faf02-c66f-427a-be23-4e249d02d984", + "name": "qwen", + "type": "QWENMODEL", + "linkIds": [], + "pos": [ + 2640.847488487015, + 1098.920102151578 + ] + }, + { + "id": "4ebdfeac-547c-4fe2-bc36-df43bb0a5d55", + "name": "prompt", + "type": "STRING", + "linkIds": [ + 141, + 145 + ], + "pos": [ + 2640.847488487015, + 1118.920102151578 + ] + } + ], + "outputs": [ + { + "id": "06295f78-c49b-4649-bab0-2eb7be4bd45f", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "linkIds": [ + 101 + ], + "label": "text_embeds_2", + "pos": [ + 3283.3583744113776, + 615.0557402962498 + ] + }, + { + "id": "4291f952-44b6-402f-a36d-b8e4ec2dafa1", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 102 + ], + "label": "model_high_2", + "pos": [ + 3283.3583744113776, + 635.0557402962498 + ] + }, + { + "id": "a7f77847-ba47-435a-8383-28e0e2999738", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 103 + ], + "label": "model_low_2", + "pos": [ + 3283.3583744113776, + 655.0557402962498 + ] + }, + { + "id": "ee0d4384-64e9-408f-b365-ec44da3fc03f", + "name": "STRING", + "type": "STRING", + "linkIds": [], + "label": "qwen_history", + "pos": [ + 3283.3583744113776, + 675.0557402962498 + ] + }, + { + "id": "40a6d29d-c35d-4420-8967-2359b00d9bd3", + "name": "", + "type": "*", + "linkIds": [ + 142 + ], + "label": "next", + "pos": [ + 3283.3583744113776, + 695.0557402962498 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 39, + "type": "WanVideoSetLoRAs", + "pos": [ + 2779.9327744113775, + 1271.4595402962482 + ], + "size": [ + 174.50000610351563, + 46 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 95 + }, + { + "localized_name": "lora", + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 99 + } + ], + "outputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 102 + ] + } + ], + "title": "Model H 2", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSetLoRAs", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 40, + "type": "WanVideoSetLoRAs", + "pos": [ + 3047.8630744113784, + 1261.2108402962479 + ], + "size": [ + 174.50000610351563, + 46 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 96 + }, + { + "localized_name": "lora", + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 100 + } + ], + "outputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 103 + ] + } + ], + "title": "Model L 2", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSetLoRAs", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 53, + "type": "Reroute", + "pos": [ + 3457.730562771356, + 786.5394541242073 + ], + "size": [ + 140, + 60 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 141 + } + ], + "outputs": [ + { + "name": "", + "type": "*", + "links": [ + 142 + ] + } + ], + "properties": { + "showOutputText": false, + "horizontal": false + } + }, + { + "id": 38, + "type": "WanVideoTextEncode", + "pos": [ + 2794.9865010290196, + 550.4000329914412 + ], + "size": [ + 400, + 234 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "t5", + "name": "t5", + "shape": 7, + "type": "WANTEXTENCODER", + "link": 84 + }, + { + "localized_name": "model_to_offload", + "name": "model_to_offload", + "shape": 7, + "type": "WANVIDEOMODEL", + "link": null + }, + { + "localized_name": "positive_prompt", + "name": "positive_prompt", + "type": "STRING", + "widget": { + "name": "positive_prompt" + }, + "link": 145 + } + ], + "outputs": [ + { + "localized_name": "text_embeds", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "links": [ + 101 + ] + } + ], + "title": "2nd Sampler Text Encode", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoTextEncode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "", + "", + false, + false, + "gpu" + ] + }, + { + "id": 41, + "type": "WanVideoLoraSelectMulti", + "pos": [ + 2736.7126234720145, + 852.8430685483781 + ], + "size": [ + 271.84999694824216, + 342 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "prev_lora", + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 97 + }, + { + "localized_name": "blocks", + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "lora", + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 99 + ] + } + ], + "title": "2nd Sampler LoRAs High", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoLoraSelectMulti", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "storymem_h.safetensors", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + true, + false + ] + }, + { + "id": 42, + "type": "WanVideoLoraSelectMulti", + "pos": [ + 3053.155759310313, + 863.8162723058252 + ], + "size": [ + 271.84999694824216, + 342 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "prev_lora", + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 98 + }, + { + "localized_name": "blocks", + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "lora", + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 100 + ] + } + ], + "title": "2nd Sampler LoRAs Low", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoLoraSelectMulti", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "storymem_l.safetensors", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + true, + false + ] + } + ], + "groups": [], + "links": [ + { + "id": 84, + "origin_id": -10, + "origin_slot": 0, + "target_id": 38, + "target_slot": 0, + "type": "WANTEXTENCODER" + }, + { + "id": 95, + "origin_id": -10, + "origin_slot": 1, + "target_id": 39, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 96, + "origin_id": -10, + "origin_slot": 2, + "target_id": 40, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 97, + "origin_id": -10, + "origin_slot": 3, + "target_id": 41, + "target_slot": 0, + "type": "WANVIDLORA" + }, + { + "id": 98, + "origin_id": -10, + "origin_slot": 4, + "target_id": 42, + "target_slot": 0, + "type": "WANVIDLORA" + }, + { + "id": 99, + "origin_id": 41, + "origin_slot": 0, + "target_id": 39, + "target_slot": 1, + "type": "WANVIDLORA" + }, + { + "id": 100, + "origin_id": 42, + "origin_slot": 0, + "target_id": 40, + "target_slot": 1, + "type": "WANVIDLORA" + }, + { + "id": 101, + "origin_id": 38, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 102, + "origin_id": 39, + "origin_slot": 0, + "target_id": -20, + "target_slot": 1, + "type": "WANVIDEOMODEL" + }, + { + "id": 103, + "origin_id": 40, + "origin_slot": 0, + "target_id": -20, + "target_slot": 2, + "type": "WANVIDEOMODEL" + }, + { + "id": 141, + "origin_id": -10, + "origin_slot": 7, + "target_id": 53, + "target_slot": 0, + "type": "*" + }, + { + "id": 142, + "origin_id": 53, + "origin_slot": 0, + "target_id": -20, + "target_slot": 4, + "type": "*" + }, + { + "id": 145, + "origin_id": -10, + "origin_slot": 7, + "target_id": 38, + "target_slot": 2, + "type": "STRING" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + }, + { + "id": "4ac2bcc5-d41a-4215-9f81-c1806288f1de", + "version": 1, + "state": { + "lastGroupId": 0, + "lastNodeId": 59, + "lastLinkId": 166, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Third Sampler Settings", + "inputNode": { + "id": -10, + "bounding": [ + 3262.173042410893, + 963.5634835023513, + 121.11666870117188, + 200 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 3952.949474411377, + 666.7966402962497, + 124.63333129882812, + 100 + ] + }, + "inputs": [ + { + "id": "1946aab9-a934-4e77-95c9-712806aa71de", + "name": "t5", + "type": "WANTEXTENCODER", + "linkIds": [ + 105 + ], + "localized_name": "t5", + "label": "text_encoder", + "shape": 7, + "pos": [ + 3363.2897111120647, + 983.5634835023513 + ] + }, + { + "id": "f20ba555-60e9-4cf7-8255-aec351bc78c3", + "name": "prev_lora", + "type": "WANVIDLORA", + "linkIds": [ + 127 + ], + "label": "global_loras_h", + "pos": [ + 3363.2897111120647, + 1003.5634835023513 + ] + }, + { + "id": "85a74d94-9828-464d-8cae-e179e04063c7", + "name": "prev_lora_1", + "type": "WANVIDLORA", + "linkIds": [ + 128 + ], + "label": "global_loras_l", + "pos": [ + 3363.2897111120647, + 1023.5634835023513 + ] + }, + { + "id": "d1a7ef54-4d66-4321-a29f-6f2c086bcbf1", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 129 + ], + "label": "model_high", + "pos": [ + 3363.2897111120647, + 1043.5634835023513 + ] + }, + { + "id": "d6cbe78b-835c-434c-b1bd-c7e20854f7f4", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 130 + ], + "label": "model_low", + "pos": [ + 3363.2897111120647, + 1063.5634835023513 + ] + }, + { + "id": "f07cd0e8-2964-48ae-8bae-55cf0202b229", + "name": "", + "type": "*", + "linkIds": [], + "label": "qwen_history", + "pos": [ + 3363.2897111120647, + 1083.5634835023513 + ] + }, + { + "id": "59acc3af-0b38-4c48-a6de-32b83492960c", + "name": "qwen", + "type": "QWENMODEL", + "linkIds": [], + "pos": [ + 3363.2897111120647, + 1103.5634835023513 + ] + }, + { + "id": "3905a48f-5f42-4fe0-a634-a9bdf13cbdb9", + "name": "prompt", + "type": "STRING", + "linkIds": [ + 165 + ], + "pos": [ + 3363.2897111120647, + 1123.5634835023513 + ] + } + ], + "outputs": [ + { + "id": "0b9d88f8-a126-4804-8857-8d976805b192", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "linkIds": [ + 131 + ], + "label": "text_embeds_3", + "pos": [ + 3972.949474411377, + 686.7966402962497 + ] + }, + { + "id": "7958bb24-7452-4da4-a734-565e9cddb64a", + "name": "model", + "type": "WANVIDEOMODEL", + "linkIds": [ + 132 + ], + "label": "model_high_3", + "pos": [ + 3972.949474411377, + 706.7966402962497 + ] + }, + { + "id": "df275bbd-e794-49b7-ab41-43fa4c1d940b", + "name": "model_1", + "type": "WANVIDEOMODEL", + "linkIds": [ + 133 + ], + "label": "model_low_3", + "pos": [ + 3972.949474411377, + 726.7966402962497 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 48, + "type": "WanVideoSetLoRAs", + "pos": [ + 3468.0597744113775, + 1336.7363402962492 + ], + "size": [ + 174.50000610351563, + 46 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 129 + }, + { + "localized_name": "lora", + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 125 + } + ], + "outputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 132 + ] + } + ], + "title": "Model H 3", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSetLoRAs", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 49, + "type": "WanVideoSetLoRAs", + "pos": [ + 3755.0233744113784, + 1342.5927402962482 + ], + "size": [ + 174.50000610351563, + 46 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "link": 130 + }, + { + "localized_name": "lora", + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 126 + } + ], + "outputs": [ + { + "localized_name": "model", + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 133 + ] + } + ], + "title": "Model L 3", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoSetLoRAs", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 45, + "type": "WanVideoTextEncode", + "pos": [ + 3498.2734744113773, + 580.8036402962498 + ], + "size": [ + 400, + 234 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "t5", + "name": "t5", + "shape": 7, + "type": "WANTEXTENCODER", + "link": 105 + }, + { + "localized_name": "model_to_offload", + "name": "model_to_offload", + "shape": 7, + "type": "WANVIDEOMODEL", + "link": null + }, + { + "localized_name": "positive_prompt", + "name": "positive_prompt", + "type": "STRING", + "widget": { + "name": "positive_prompt" + }, + "link": 165 + } + ], + "outputs": [ + { + "localized_name": "text_embeds", + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "links": [ + 131 + ] + } + ], + "title": "3rd Sampler Text Encode", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoTextEncode", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "", + "", + false, + false, + "gpu" + ] + }, + { + "id": 46, + "type": "WanVideoLoraSelectMulti", + "pos": [ + 3416.8162744113765, + 891.6499402962494 + ], + "size": [ + 271.84999694824216, + 342 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "prev_lora", + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 127 + }, + { + "localized_name": "blocks", + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "lora", + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 125 + ] + } + ], + "title": "3rd Sampler LoRAs High", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoLoraSelectMulti", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "storymem_h.safetensors", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + true, + false + ] + }, + { + "id": 47, + "type": "WanVideoLoraSelectMulti", + "pos": [ + 3723.4208744113766, + 887.8653402962494 + ], + "size": [ + 271.84999694824216, + 342 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "prev_lora", + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 128 + }, + { + "localized_name": "blocks", + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "lora", + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 126 + ] + } + ], + "title": "3rd Sampler LoRAs Low", + "properties": { + "cnr_id": "comfyui-wanvideowrapper", + "ver": "1.3.8", + "Node name for S&R": "WanVideoLoraSelectMulti", + "aux_id": "kijai/ComfyUI-WanVideoWrapper", + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "storymem_l.safetensors", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + "none", + 1, + true, + false + ] + } + ], + "groups": [], + "links": [ + { + "id": 105, + "origin_id": -10, + "origin_slot": 0, + "target_id": 45, + "target_slot": 0, + "type": "WANTEXTENCODER" + }, + { + "id": 125, + "origin_id": 46, + "origin_slot": 0, + "target_id": 48, + "target_slot": 1, + "type": "WANVIDLORA" + }, + { + "id": 126, + "origin_id": 47, + "origin_slot": 0, + "target_id": 49, + "target_slot": 1, + "type": "WANVIDLORA" + }, + { + "id": 127, + "origin_id": -10, + "origin_slot": 1, + "target_id": 46, + "target_slot": 0, + "type": "WANVIDLORA" + }, + { + "id": 128, + "origin_id": -10, + "origin_slot": 2, + "target_id": 47, + "target_slot": 0, + "type": "WANVIDLORA" + }, + { + "id": 129, + "origin_id": -10, + "origin_slot": 3, + "target_id": 48, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 130, + "origin_id": -10, + "origin_slot": 4, + "target_id": 49, + "target_slot": 0, + "type": "WANVIDEOMODEL" + }, + { + "id": 131, + "origin_id": 45, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "WANVIDEOTEXTEMBEDS" + }, + { + "id": 132, + "origin_id": 48, + "origin_slot": 0, + "target_id": -20, + "target_slot": 1, + "type": "WANVIDEOMODEL" + }, + { + "id": 133, + "origin_id": 49, + "origin_slot": 0, + "target_id": -20, + "target_slot": 2, + "type": "WANVIDEOMODEL" + }, + { + "id": 165, + "origin_id": -10, + "origin_slot": 7, + "target_id": 45, + "target_slot": 2, + "type": "STRING" + } + ], + "extra": { + "workflowRendererVersion": "LG", + "ue_links": [], + "links_added_by_ue": [] + } + } + ] + }, + "config": {}, + "extra": { + "ds": { + "scale": 0.6759523542019267, + "offset": [ + -783.7011230491592, + -73.24969449450128 + ] + }, + "frontendVersion": "1.34.9", + "workflowRendererVersion": "LG", + "VHS_latentpreview": true, + "VHS_latentpreviewrate": 0, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true, + "ue_links": [ + { + "downstream": 21, + "downstream_slot": 8, + "upstream": "8", + "upstream_slot": 0, + "controller": 31, + "type": "WANVAE" + }, + { + "downstream": 24, + "downstream_slot": 8, + "upstream": "8", + "upstream_slot": 0, + "controller": 31, + "type": "WANVAE" + }, + { + "downstream": 46, + "downstream_slot": 0, + "upstream": "6", + "upstream_slot": 0, + "controller": 30, + "type": "WANTEXTENCODER" + }, + { + "downstream": 46, + "downstream_slot": 2, + "upstream": "3", + "upstream_slot": 0, + "controller": 42, + "type": "WANVIDLORA" + }, + { + "downstream": 46, + "downstream_slot": 3, + "upstream": "4", + "upstream_slot": 0, + "controller": 44, + "type": "WANVIDLORA" + }, + { + "downstream": 46, + "downstream_slot": 4, + "upstream": "2", + "upstream_slot": 0, + "controller": 40, + "type": "WANVIDEOMODEL" + }, + { + "downstream": 46, + "downstream_slot": 5, + "upstream": "2", + "upstream_slot": 1, + "controller": 41, + "type": "WANVIDEOMODEL" + }, + { + "downstream": 27, + "downstream_slot": 0, + "upstream": "2", + "upstream_slot": 0, + "controller": 40, + "type": "WANVIDEOMODEL" + }, + { + "downstream": 27, + "downstream_slot": 1, + "upstream": "2", + "upstream_slot": 1, + "controller": 41, + "type": "WANVIDEOMODEL" + }, + { + "downstream": 27, + "downstream_slot": 2, + "upstream": "6", + "upstream_slot": 0, + "controller": 30, + "type": "WANTEXTENCODER" + }, + { + "downstream": 27, + "downstream_slot": 3, + "upstream": "3", + "upstream_slot": 0, + "controller": 42, + "type": "WANVIDLORA" + }, + { + "downstream": 27, + "downstream_slot": 4, + "upstream": "4", + "upstream_slot": 0, + "controller": 44, + "type": "WANVIDLORA" + }, + { + "downstream": 17, + "downstream_slot": 8, + "upstream": "8", + "upstream_slot": 0, + "controller": 31, + "type": "WANVAE" + }, + { + "downstream": 39, + "downstream_slot": 0, + "upstream": "6", + "upstream_slot": 0, + "controller": 30, + "type": "WANTEXTENCODER" + }, + { + "downstream": 39, + "downstream_slot": 2, + "upstream": "2", + "upstream_slot": 0, + "controller": 40, + "type": "WANVIDEOMODEL" + }, + { + "downstream": 39, + "downstream_slot": 3, + "upstream": "2", + "upstream_slot": 1, + "controller": 41, + "type": "WANVIDEOMODEL" + }, + { + "downstream": 39, + "downstream_slot": 4, + "upstream": "3", + "upstream_slot": 0, + "controller": 42, + "type": "WANVIDLORA" + }, + { + "downstream": 39, + "downstream_slot": 5, + "upstream": "4", + "upstream_slot": 0, + "controller": 44, + "type": "WANVIDLORA" + }, + { + "downstream": 19, + "downstream_slot": 3, + "upstream": "10", + "upstream_slot": 0, + "controller": 32, + "type": "CLIP_VISION" + }, + { + "downstream": 19, + "downstream_slot": 4, + "upstream": "8", + "upstream_slot": 0, + "controller": 31, + "type": "WANVAE" + }, + { + "downstream": 19, + "downstream_slot": 7, + "upstream": "48", + "upstream_slot": 0, + "controller": 47, + "type": "IMAGE" + }, + { + "downstream": 13, + "downstream_slot": 3, + "upstream": "10", + "upstream_slot": 0, + "controller": 32, + "type": "CLIP_VISION" + }, + { + "downstream": 13, + "downstream_slot": 4, + "upstream": "8", + "upstream_slot": 0, + "controller": 31, + "type": "WANVAE" + }, + { + "downstream": 23, + "downstream_slot": 3, + "upstream": "10", + "upstream_slot": 0, + "controller": 32, + "type": "CLIP_VISION" + }, + { + "downstream": 23, + "downstream_slot": 4, + "upstream": "8", + "upstream_slot": 0, + "controller": 31, + "type": "WANVAE" + }, + { + "downstream": 23, + "downstream_slot": 7, + "upstream": "48", + "upstream_slot": 0, + "controller": 47, + "type": "IMAGE" + } + ], + "links_added_by_ue": [ + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386 + ] + }, + "version": 0.4 +} \ No newline at end of file From 08b51f2d431194c2d86a20baae1c58288311856f Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Fri, 26 Dec 2025 14:48:48 +0200 Subject: [PATCH 12/19] Experimental Qwen enhanced prompt input in StoryMem JSON converter --- funpack.py | 245 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 170 insertions(+), 75 deletions(-) diff --git a/funpack.py b/funpack.py index 7fc037a2..2c5b9d52 100644 --- a/funpack.py +++ b/funpack.py @@ -19,6 +19,7 @@ from comfy.utils import ProgressBar import comfy.clip_vision import math import json +from comfy.utils import ProgressBar # Constants from StoryMem IMAGE_FACTOR = 28 @@ -28,117 +29,210 @@ MAX_KEYFRAME_NUM = 3 ADAPTIVE_ALPHA = 0.01 HPSV3_QUALITY_THRESHOLD = 3.0 + class FunPackStoryMemJSONConverter: """ - FunPack StoryMem LoRA JSON Converter for WAN2.2 - Strict matching: video_prompts count == first_frame_prompt count == cut count - (as per official examples) + FunPack StoryMem LoRA JSON Converter - supports both manual input and Qwen-generated output. + + If 'use_qwen_output' is enabled: + - Takes 'qwen_output' (string) from Kijai's WanVideoPromptExtender/Qwen node + - Parses the full story JSON (as produced by StoryMem-style system prompt) + - Splits into up to 3 separate scene JSONs (one per output) + - Each output contains story_name, story_overview + exactly ONE scene + - Extra scenes beyond 3 are ignored + + If 'use_qwen_output' is false → falls back to original manual scene inputs. + + Expected Qwen output structure (example: black.json): + { + "story_name": str, + "story_overview": str, + "scenes": [ + { + "scene_num": int, + "video_prompts": list[str], + "first_frame_prompt": list[str], + "cut": list[bool] + }, + ... + ] + } """ @classmethod def INPUT_TYPES(cls): return { "required": { + "use_qwen_output": ("BOOLEAN", { + "default": False, + "label_on": "Use Qwen Output", + "label_off": "Manual Input", + "tooltip": "When enabled: ignores all manual scene inputs below! Uses 'qwen_output' string instead." + }), + # ── Qwen mode inputs ─────────────────────────────────────── + "qwen_output": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "Paste/connect the raw string output from Kijai's Qwen prompt enhancer node here" + }), + + # ── Manual mode inputs (hidden in practice by warning) ───── "story_name": ("STRING", {"default": "My Story Title"}), - "story_overview": ("STRING", {"multiline": True, "default": "Brief description of the overall story..."}), + "story_overview": ("STRING", {"multiline": True, "default": "Brief description..."}), - # Scene 1 (Sampler 1) "scene1_video_prompts": ("STRING", {"multiline": True, "default": "prompt 1\nprompt 2\nprompt 3"}), - "scene1_first_frames": ("STRING", {"multiline": True, "default": "first frame 1\nfirst frame 2\nfirst frame 3"}), - "scene1_cuts": ("STRING", {"default": "true, false, false", "tooltip": "comma-separated booleans — must match # of prompts"}), + "scene1_first_frames": ("STRING", {"multiline": True, "default": "frame 1\nframe 2\nframe 3"}), + "scene1_cuts": ("STRING", {"default": "true, false, false"}), - # Scene 2 (Sampler 2) "scene2_video_prompts": ("STRING", {"multiline": True, "default": ""}), "scene2_first_frames": ("STRING", {"multiline": True, "default": ""}), - "scene2_cuts": ("STRING", {"default": "", "tooltip": "comma-separated boolean values"}), + "scene2_cuts": ("STRING", {"default": ""}), - # Scene 3 (Sampler 3) "scene3_video_prompts": ("STRING", {"multiline": True, "default": ""}), "scene3_first_frames": ("STRING", {"multiline": True, "default": ""}), - "scene3_cuts": ("STRING", {"default": "", "tooltip": "comma-separated boolean values"}), + "scene3_cuts": ("STRING", {"default": ""}), + }, + "optional": { + "qwen_warning": ("STRING", { + "multiline": True, + "default": "!!! QWEN MODE ACTIVE !!!\nAll inputs below are IGNORED\nConnect Qwen output above.", + "tooltip": "Visible reminder - only relevant when use_qwen_output = True" + }) } } RETURN_TYPES = ("STRING", "STRING", "STRING") - RETURN_NAMES = ("json_sampler_1", "json_sampler_2", "json_sampler_3") + RETURN_NAMES = ("json_scene_1", "json_scene_2", "json_scene_3") OUTPUT_NODE = True - FUNCTION = "format_json" + FUNCTION = "convert" CATEGORY = "FunPack" - def format_json(self, - story_name, - story_overview, + def convert(self, + use_qwen_output, + qwen_output, + story_name, story_overview, + scene1_video_prompts, scene1_first_frames, scene1_cuts, + scene2_video_prompts, scene2_first_frames, scene2_cuts, + scene3_video_prompts, scene3_first_frames, scene3_cuts, + qwen_warning=""): - scene1_video_prompts, scene1_first_frames, scene1_cuts, - scene2_video_prompts, scene2_first_frames, scene2_cuts, - scene3_video_prompts, scene3_first_frames, scene3_cuts): + if use_qwen_output: + if not qwen_output.strip(): + raise ValueError("Qwen mode enabled but 'qwen_output' is empty! Connect Kijai's prompt enhancer output.") - scenes_input = [ - (scene1_video_prompts, scene1_first_frames, scene1_cuts, 1), - (scene2_video_prompts, scene2_first_frames, scene2_cuts, 2), - (scene3_video_prompts, scene3_first_frames, scene3_cuts, 3), - ] + pbar = ProgressBar(2) - outputs = ["", "", ""] + try: + full_data = json.loads(qwen_output) + except json.JSONDecodeError as e: + raise ValueError(f"Failed to parse Qwen output as JSON:\n{str(e)}\n\nMake sure system prompt instructs Qwen to return **only** valid JSON.") - for i, (video_text, first_text, cuts_text, scene_num) in enumerate(scenes_input): - if not video_text.strip(): - outputs[i] = "" - continue + story_name = full_data.get("story_name", "Generated Story") + story_overview = full_data.get("story_overview", "Generated overview") + scenes = full_data.get("scenes", []) - # Split prompts (skip empty lines) - video_prompts = [p.strip() for p in video_text.split("\n") if p.strip()] - first_prompts = [f.strip() for f in first_text.split("\n") if f.strip()] + if not isinstance(scenes, list) or not scenes: + raise ValueError("Qwen JSON must contain non-empty 'scenes' list.") - num_prompts = len(video_prompts) - if num_prompts == 0: - outputs[i] = "" - continue + outputs = ["", "", ""] - # Enforce matching lengths for prompts and first-frames (per examples) - if len(first_prompts) != num_prompts: - raise ValueError( - f"Scene {scene_num}: Number of video prompts ({num_prompts}) " - f"must match number of first frame prompts ({len(first_prompts)})" - ) + for i, scene in enumerate(scenes[:3]): + if not isinstance(scene, dict): + continue - # Parse cuts - if cuts_text.strip(): - cuts_str = [c.strip().lower() for c in cuts_text.split(",") if c.strip()] - cuts = [] - for c in cuts_str: - if c in ("true", "t", "1", "yes"): - cuts.append(True) - elif c in ("false", "f", "0", "no", ""): - cuts.append(False) - else: - raise ValueError(f"Invalid cut value in scene {scene_num}: '{c}' (use true/false)") - else: - # Default: all False (no cuts), matching common safe starting point - cuts = [False] * num_prompts + scene_num = scene.get("scene_num", i+1) + video_prompts = scene.get("video_prompts", []) + first_frame_prompt = scene.get("first_frame_prompt", []) + cut = scene.get("cut", []) - # Enforce: cuts must match number of prompts exactly (per examples) - if len(cuts) != num_prompts: - raise ValueError( - f"Scene {scene_num}: Number of cut values ({len(cuts)}) " - f"must match number of prompts ({num_prompts})" - ) + # Basic validation + if not video_prompts: + continue + if len(video_prompts) != len(first_frame_prompt) or len(video_prompts) != len(cut): + raise ValueError( + f"Scene {scene_num}: lengths mismatch → " + f"video_prompts({len(video_prompts)}), " + f"first_frame_prompt({len(first_frame_prompt)}), " + f"cut({len(cut)})" + ) - scene = { - "scene_num": scene_num, - "video_prompts": video_prompts, - "first_frame_prompt": first_prompts, - "cut": cuts - } + single_scene_data = { + "scene_num": scene_num, + "video_prompts": video_prompts, + "first_frame_prompt": first_frame_prompt, + "cut": cut + } - full_json = { - "story_name": story_name.strip(), - "story_overview": story_overview.strip(), - "scenes": [scene] - } + json_data = { + "story_name": story_name, + "story_overview": story_overview, + "scenes": [single_scene_data] + } - outputs[i] = json.dumps(full_json, indent=2, ensure_ascii=False) + outputs[i] = json.dumps(json_data, indent=2, ensure_ascii=False) - return tuple(outputs) + pbar.update(2) + return tuple(outputs) + + else: + # ── Original manual mode ─────────────────────────────────────── + scenes_input = [ + (scene1_video_prompts, scene1_first_frames, scene1_cuts, 1), + (scene2_video_prompts, scene2_first_frames, scene2_cuts, 2), + (scene3_video_prompts, scene3_first_frames, scene3_cuts, 3), + ] + + outputs = ["", "", ""] + + for i, (video_text, first_text, cuts_text, scene_num) in enumerate(scenes_input): + if not video_text.strip(): + continue + + video_prompts = [p.strip() for p in video_text.split("\n") if p.strip()] + if not video_prompts: + continue + + first_prompts = [f.strip() for f in first_text.split("\n") if f.strip()] + + if len(first_prompts) != len(video_prompts): + raise ValueError( + f"Manual scene {scene_num}: video prompts ({len(video_prompts)}) ≠ " + f"first frames ({len(first_prompts)})" + ) + + if cuts_text.strip(): + cuts_str = [c.strip().lower() for c in cuts_text.split(",")] + cuts = [] + for c in cuts_str: + if c in ("true", "t", "1", "yes"): + cuts.append(True) + elif c in ("false", "f", "0", "no", ""): + cuts.append(False) + else: + raise ValueError(f"Invalid cut value in manual scene {scene_num}: '{c}'") + else: + cuts = [False] * len(video_prompts) + + if len(cuts) != len(video_prompts): + raise ValueError( + f"Manual scene {scene_num}: cut count ({len(cuts)}) ≠ prompt count" + ) + + scene = { + "scene_num": scene_num, + "video_prompts": video_prompts, + "first_frame_prompt": first_prompts, + "cut": cuts + } + + full_json = { + "story_name": story_name.strip(), + "story_overview": story_overview.strip(), + "scenes": [scene] + } + + outputs[i] = json.dumps(full_json, indent=2, ensure_ascii=False) + + return tuple(outputs) class FunPackImg2LatentInterpolation: @classmethod @@ -797,3 +891,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From 32eaa10fcca76f4594da166abf10db7c46d0acdf Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:17:03 +0200 Subject: [PATCH 13/19] Parser fix - allow one cut bool per scene --- funpack.py | 154 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 108 insertions(+), 46 deletions(-) diff --git a/funpack.py b/funpack.py index 2c5b9d52..fc20ed53 100644 --- a/funpack.py +++ b/funpack.py @@ -29,8 +29,7 @@ MAX_KEYFRAME_NUM = 3 ADAPTIVE_ALPHA = 0.01 HPSV3_QUALITY_THRESHOLD = 3.0 - -class FunPackStoryMemJSONConverter: +class FunPackStoryMemJSONConverterQwenOutput: """ FunPack StoryMem LoRA JSON Converter - supports both manual input and Qwen-generated output. @@ -40,6 +39,8 @@ class FunPackStoryMemJSONConverter: - Splits into up to 3 separate scene JSONs (one per output) - Each output contains story_name, story_overview + exactly ONE scene - Extra scenes beyond 3 are ignored + - Handles 'cut' as single bool by replicating it across all prompts in the scene + - Forces first cut to True per StoryMem guidelines If 'use_qwen_output' is false → falls back to original manual scene inputs. @@ -52,7 +53,7 @@ class FunPackStoryMemJSONConverter: "scene_num": int, "video_prompts": list[str], "first_frame_prompt": list[str], - "cut": list[bool] + "cut": list[bool] or bool # Now supports single bool }, ... ] @@ -64,38 +65,75 @@ class FunPackStoryMemJSONConverter: "required": { "use_qwen_output": ("BOOLEAN", { "default": False, - "label_on": "Use Qwen Output", - "label_off": "Manual Input", - "tooltip": "When enabled: ignores all manual scene inputs below! Uses 'qwen_output' string instead." + "label_on": "Use Qwen Output (ignores manual scenes below)", + "label_off": "Use Manual Scene Inputs", + "tooltip": "Toggle between Qwen-generated full story JSON or classic manual per-scene setup" }), - # ── Qwen mode inputs ─────────────────────────────────────── "qwen_output": ("STRING", { "multiline": True, "default": "", - "tooltip": "Paste/connect the raw string output from Kijai's Qwen prompt enhancer node here" + "tooltip": "Connect STRING output from Kijai's WanVideoPromptExtender / Qwen enhancer here.\nDrag wire onto the left side of this box to convert to input socket." + }), + "story_name": ("STRING", { + "default": "", + "tooltip": "Story title (used in all output JSONs)" + }), + "story_overview": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "Overall story summary (shared across all scenes)" + }), + # Scene 1 + "scene1_video_prompts": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "One prompt per line (each = 5-sec clip)" + }), + "scene1_first_frame_prompts": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "First frame description per prompt (must match count)" + }), + "scene1_cut_values": ("STRING", { + "default": "", + "tooltip": "Comma-separated booleans: true,false,true,... (must match prompt count; first usually true)" + }), + # Scene 2 + "scene2_video_prompts": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "One prompt per line (each = 5-sec clip)" + }), + "scene2_first_frame_prompts": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "First frame description per prompt (must match count)" + }), + "scene2_cut_values": ("STRING", { + "default": "", + "tooltip": "Comma-separated booleans: true,false,true,... (must match prompt count; first usually true)" + }), + # Scene 3 + "scene3_video_prompts": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "One prompt per line (each = 5-sec clip)" + }), + "scene3_first_frame_prompts": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "First frame description per prompt (must match count)" + }), + "scene3_cut_values": ("STRING", { + "default": "", + "tooltip": "Comma-separated booleans: true,false,true,... (must match prompt count; first usually true)" }), - - # ── Manual mode inputs (hidden in practice by warning) ───── - "story_name": ("STRING", {"default": "My Story Title"}), - "story_overview": ("STRING", {"multiline": True, "default": "Brief description..."}), - - "scene1_video_prompts": ("STRING", {"multiline": True, "default": "prompt 1\nprompt 2\nprompt 3"}), - "scene1_first_frames": ("STRING", {"multiline": True, "default": "frame 1\nframe 2\nframe 3"}), - "scene1_cuts": ("STRING", {"default": "true, false, false"}), - - "scene2_video_prompts": ("STRING", {"multiline": True, "default": ""}), - "scene2_first_frames": ("STRING", {"multiline": True, "default": ""}), - "scene2_cuts": ("STRING", {"default": ""}), - - "scene3_video_prompts": ("STRING", {"multiline": True, "default": ""}), - "scene3_first_frames": ("STRING", {"multiline": True, "default": ""}), - "scene3_cuts": ("STRING", {"default": ""}), }, "optional": { - "qwen_warning": ("STRING", { + "qwen_mode_notice": ("STRING", { "multiline": True, - "default": "!!! QWEN MODE ACTIVE !!!\nAll inputs below are IGNORED\nConnect Qwen output above.", - "tooltip": "Visible reminder - only relevant when use_qwen_output = True" + "default": "!!! QWEN MODE ACTIVE !!!\nAll manual inputs below are completely ignored\nConnect the Qwen JSON string above.", + "tooltip": "Reminder - only visible/meaningful when use_qwen_output = True" }) } } @@ -110,10 +148,10 @@ class FunPackStoryMemJSONConverter: use_qwen_output, qwen_output, story_name, story_overview, - scene1_video_prompts, scene1_first_frames, scene1_cuts, - scene2_video_prompts, scene2_first_frames, scene2_cuts, - scene3_video_prompts, scene3_first_frames, scene3_cuts, - qwen_warning=""): + scene1_video_prompts, scene1_first_frame_prompts, scene1_cut_values, + scene2_video_prompts, scene2_first_frame_prompts, scene2_cut_values, + scene3_video_prompts, scene3_first_frame_prompts, scene3_cut_values, + qwen_mode_notice=""): if use_qwen_output: if not qwen_output.strip(): @@ -141,20 +179,38 @@ class FunPackStoryMemJSONConverter: scene_num = scene.get("scene_num", i+1) video_prompts = scene.get("video_prompts", []) - first_frame_prompt = scene.get("first_frame_prompt", []) + first_frame_prompt = scene.get("first_frame_prompt", []) # Note: renamed from first_frame_prompts for consistency cut = scene.get("cut", []) - # Basic validation if not video_prompts: continue - if len(video_prompts) != len(first_frame_prompt) or len(video_prompts) != len(cut): + + num_prompts = len(video_prompts) + + if len(first_frame_prompt) != num_prompts: raise ValueError( - f"Scene {scene_num}: lengths mismatch → " - f"video_prompts({len(video_prompts)}), " - f"first_frame_prompt({len(first_frame_prompt)}), " - f"cut({len(cut)})" + f"Scene {scene_num}: video_prompts ({num_prompts}) ≠ " + f"first_frame_prompt ({len(first_frame_prompt)})" ) + # Handle cut: if single bool, replicate across all prompts + if isinstance(cut, bool): + cut = [cut] * num_prompts + elif not isinstance(cut, list): + raise ValueError(f"Scene {scene_num}: 'cut' must be bool or list of bools, got {type(cut)}") + + # Check length after potential conversion + if len(cut) != num_prompts: + raise ValueError( + f"Scene {scene_num}: 'cut' length ({len(cut)}) ≠ " + f"prompt count ({num_prompts})" + ) + + # Force first cut to True (per StoryMem: "The first prompt in the story must always have True") + # Note: This applies per scene, but if the whole story is multi-scene, the first of scene 1 is the global first + if num_prompts > 0: + cut[0] = True + single_scene_data = { "scene_num": scene_num, "video_prompts": video_prompts, @@ -176,9 +232,9 @@ class FunPackStoryMemJSONConverter: else: # ── Original manual mode ─────────────────────────────────────── scenes_input = [ - (scene1_video_prompts, scene1_first_frames, scene1_cuts, 1), - (scene2_video_prompts, scene2_first_frames, scene2_cuts, 2), - (scene3_video_prompts, scene3_first_frames, scene3_cuts, 3), + (scene1_video_prompts, scene1_first_frame_prompts, scene1_cut_values, 1), + (scene2_video_prompts, scene2_first_frame_prompts, scene2_cut_values, 2), + (scene3_video_prompts, scene3_first_frame_prompts, scene3_cut_values, 3), ] outputs = ["", "", ""] @@ -199,24 +255,30 @@ class FunPackStoryMemJSONConverter: f"first frames ({len(first_prompts)})" ) + num_prompts = len(video_prompts) + if cuts_text.strip(): - cuts_str = [c.strip().lower() for c in cuts_text.split(",")] + cuts_str = [c.strip().lower() for c in cuts_text.split(",") if c.strip()] cuts = [] for c in cuts_str: if c in ("true", "t", "1", "yes"): cuts.append(True) - elif c in ("false", "f", "0", "no", ""): + elif c in ("false", "f", "0", "no"): cuts.append(False) else: raise ValueError(f"Invalid cut value in manual scene {scene_num}: '{c}'") else: - cuts = [False] * len(video_prompts) + cuts = [False] * num_prompts - if len(cuts) != len(video_prompts): + if len(cuts) != num_prompts: raise ValueError( f"Manual scene {scene_num}: cut count ({len(cuts)}) ≠ prompt count" ) + # Force first cut to True for consistency + if num_prompts > 0: + cuts[0] = True + scene = { "scene_num": scene_num, "video_prompts": video_prompts, @@ -233,7 +295,6 @@ class FunPackStoryMemJSONConverter: outputs[i] = json.dumps(full_json, indent=2, ensure_ascii=False) return tuple(outputs) - class FunPackImg2LatentInterpolation: @classmethod def INPUT_TYPES(cls): @@ -892,3 +953,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From 4b49604ad96e3debd9db99a7047b8fc3f0700f5f Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:18:42 +0200 Subject: [PATCH 14/19] forgot to change class name --- funpack.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/funpack.py b/funpack.py index fc20ed53..146ce740 100644 --- a/funpack.py +++ b/funpack.py @@ -29,7 +29,7 @@ MAX_KEYFRAME_NUM = 3 ADAPTIVE_ALPHA = 0.01 HPSV3_QUALITY_THRESHOLD = 3.0 -class FunPackStoryMemJSONConverterQwenOutput: +class FunPackStoryMemJSONConverter: """ FunPack StoryMem LoRA JSON Converter - supports both manual input and Qwen-generated output. @@ -954,3 +954,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From 32cd02ea59fa320ae0f9011faeb51cf04ea81ed8 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Fri, 26 Dec 2025 16:36:30 +0200 Subject: [PATCH 15/19] Removed unnecessary restrictions for story-to-JSON converter --- funpack.py | 128 +++++++++++++++++++++++------------------------------ 1 file changed, 56 insertions(+), 72 deletions(-) diff --git a/funpack.py b/funpack.py index 146ce740..c96a78aa 100644 --- a/funpack.py +++ b/funpack.py @@ -29,35 +29,18 @@ MAX_KEYFRAME_NUM = 3 ADAPTIVE_ALPHA = 0.01 HPSV3_QUALITY_THRESHOLD = 3.0 -class FunPackStoryMemJSONConverter: +class FunPackStoryMemJSONConverterQwenOutput: """ FunPack StoryMem LoRA JSON Converter - supports both manual input and Qwen-generated output. - If 'use_qwen_output' is enabled: - - Takes 'qwen_output' (string) from Kijai's WanVideoPromptExtender/Qwen node - - Parses the full story JSON (as produced by StoryMem-style system prompt) - - Splits into up to 3 separate scene JSONs (one per output) - - Each output contains story_name, story_overview + exactly ONE scene - - Extra scenes beyond 3 are ignored - - Handles 'cut' as single bool by replicating it across all prompts in the scene - - Forces first cut to True per StoryMem guidelines + Features: + - Lenient parsing: auto-adjusts mismatched lengths for cut/first_frame_prompt + - Handles 'cut' as single bool (replicates) or list + - NO forced first cut=True (user can control via prompt or manual input) + - Safe defaults on invalid data → no crashes + - Splits full Qwen story into up to 3 separate scene JSONs - If 'use_qwen_output' is false → falls back to original manual scene inputs. - - Expected Qwen output structure (example: black.json): - { - "story_name": str, - "story_overview": str, - "scenes": [ - { - "scene_num": int, - "video_prompts": list[str], - "first_frame_prompt": list[str], - "cut": list[bool] or bool # Now supports single bool - }, - ... - ] - } + When use_qwen_output=False → uses manual per-scene inputs with the same leniency. """ @classmethod def INPUT_TYPES(cls): @@ -92,11 +75,11 @@ class FunPackStoryMemJSONConverter: "scene1_first_frame_prompts": ("STRING", { "multiline": True, "default": "", - "tooltip": "First frame description per prompt (must match count)" + "tooltip": "First frame description per prompt (will auto-adjust to match count)" }), "scene1_cut_values": ("STRING", { "default": "", - "tooltip": "Comma-separated booleans: true,false,true,... (must match prompt count; first usually true)" + "tooltip": "Comma-separated booleans: true,false,true,... (will auto-adjust to match prompt count)" }), # Scene 2 "scene2_video_prompts": ("STRING", { @@ -107,11 +90,11 @@ class FunPackStoryMemJSONConverter: "scene2_first_frame_prompts": ("STRING", { "multiline": True, "default": "", - "tooltip": "First frame description per prompt (must match count)" + "tooltip": "First frame description per prompt (will auto-adjust to match count)" }), "scene2_cut_values": ("STRING", { "default": "", - "tooltip": "Comma-separated booleans: true,false,true,... (must match prompt count; first usually true)" + "tooltip": "Comma-separated booleans: true,false,true,... (will auto-adjust to match prompt count)" }), # Scene 3 "scene3_video_prompts": ("STRING", { @@ -122,11 +105,11 @@ class FunPackStoryMemJSONConverter: "scene3_first_frame_prompts": ("STRING", { "multiline": True, "default": "", - "tooltip": "First frame description per prompt (must match count)" + "tooltip": "First frame description per prompt (will auto-adjust to match count)" }), "scene3_cut_values": ("STRING", { "default": "", - "tooltip": "Comma-separated booleans: true,false,true,... (must match prompt count; first usually true)" + "tooltip": "Comma-separated booleans: true,false,true,... (will auto-adjust to match prompt count)" }), }, "optional": { @@ -179,7 +162,7 @@ class FunPackStoryMemJSONConverter: scene_num = scene.get("scene_num", i+1) video_prompts = scene.get("video_prompts", []) - first_frame_prompt = scene.get("first_frame_prompt", []) # Note: renamed from first_frame_prompts for consistency + first_frame_prompt = scene.get("first_frame_prompt", []) cut = scene.get("cut", []) if not video_prompts: @@ -187,29 +170,27 @@ class FunPackStoryMemJSONConverter: num_prompts = len(video_prompts) - if len(first_frame_prompt) != num_prompts: - raise ValueError( - f"Scene {scene_num}: video_prompts ({num_prompts}) ≠ " - f"first_frame_prompt ({len(first_frame_prompt)})" - ) + # Lenient: adjust first_frame_prompt + if len(first_frame_prompt) < num_prompts: + if first_frame_prompt: + first_frame_prompt += [first_frame_prompt[-1]] * (num_prompts - len(first_frame_prompt)) + else: + first_frame_prompt = [""] * num_prompts + elif len(first_frame_prompt) > num_prompts: + first_frame_prompt = first_frame_prompt[:num_prompts] - # Handle cut: if single bool, replicate across all prompts + # Lenient: handle cut (single bool or mismatched list) if isinstance(cut, bool): cut = [cut] * num_prompts - elif not isinstance(cut, list): - raise ValueError(f"Scene {scene_num}: 'cut' must be bool or list of bools, got {type(cut)}") + elif not isinstance(cut, list) or not all(isinstance(c, bool) for c in cut): + cut = [False] * num_prompts # Default to no cuts + else: + if len(cut) < num_prompts: + cut += [cut[-1] if cut else False] * (num_prompts - len(cut)) + elif len(cut) > num_prompts: + cut = cut[:num_prompts] - # Check length after potential conversion - if len(cut) != num_prompts: - raise ValueError( - f"Scene {scene_num}: 'cut' length ({len(cut)}) ≠ " - f"prompt count ({num_prompts})" - ) - - # Force first cut to True (per StoryMem: "The first prompt in the story must always have True") - # Note: This applies per scene, but if the whole story is multi-scene, the first of scene 1 is the global first - if num_prompts > 0: - cut[0] = True + # NO forced first cut=True anymore single_scene_data = { "scene_num": scene_num, @@ -230,7 +211,7 @@ class FunPackStoryMemJSONConverter: return tuple(outputs) else: - # ── Original manual mode ─────────────────────────────────────── + # Manual mode - same leniency scenes_input = [ (scene1_video_prompts, scene1_first_frame_prompts, scene1_cut_values, 1), (scene2_video_prompts, scene2_first_frame_prompts, scene2_cut_values, 2), @@ -247,37 +228,38 @@ class FunPackStoryMemJSONConverter: if not video_prompts: continue - first_prompts = [f.strip() for f in first_text.split("\n") if f.strip()] - - if len(first_prompts) != len(video_prompts): - raise ValueError( - f"Manual scene {scene_num}: video prompts ({len(video_prompts)}) ≠ " - f"first frames ({len(first_prompts)})" - ) - num_prompts = len(video_prompts) + first_prompts = [f.strip() for f in first_text.split("\n") if f.strip()] + + # Lenient adjust first_prompts + if len(first_prompts) < num_prompts: + if first_prompts: + first_prompts += [first_prompts[-1]] * (num_prompts - len(first_prompts)) + else: + first_prompts = [""] * num_prompts + elif len(first_prompts) > num_prompts: + first_prompts = first_prompts[:num_prompts] + + # Parse cuts leniently if cuts_text.strip(): cuts_str = [c.strip().lower() for c in cuts_text.split(",") if c.strip()] cuts = [] for c in cuts_str: if c in ("true", "t", "1", "yes"): cuts.append(True) - elif c in ("false", "f", "0", "no"): - cuts.append(False) else: - raise ValueError(f"Invalid cut value in manual scene {scene_num}: '{c}'") + cuts.append(False) # default for invalid or false else: cuts = [False] * num_prompts - if len(cuts) != num_prompts: - raise ValueError( - f"Manual scene {scene_num}: cut count ({len(cuts)}) ≠ prompt count" - ) + # Lenient adjust cuts + if len(cuts) < num_prompts: + cuts += [cuts[-1] if cuts else False] * (num_prompts - len(cuts)) + elif len(cuts) > num_prompts: + cuts = cuts[:num_prompts] - # Force first cut to True for consistency - if num_prompts > 0: - cuts[0] = True + # NO forced first cut=True scene = { "scene_num": scene_num, @@ -287,14 +269,15 @@ class FunPackStoryMemJSONConverter: } full_json = { - "story_name": story_name.strip(), - "story_overview": story_overview.strip(), + "story_name": story_name.strip() or "Manual Story", + "story_overview": story_overview.strip() or "Manual overview", "scenes": [scene] } outputs[i] = json.dumps(full_json, indent=2, ensure_ascii=False) return tuple(outputs) + class FunPackImg2LatentInterpolation: @classmethod def INPUT_TYPES(cls): @@ -955,3 +938,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From 52ad03afab5f883a7f98bdc1a0a91a607c1c346c Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Fri, 26 Dec 2025 16:38:45 +0200 Subject: [PATCH 16/19] forgot again --- funpack.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/funpack.py b/funpack.py index c96a78aa..e674f454 100644 --- a/funpack.py +++ b/funpack.py @@ -29,7 +29,7 @@ MAX_KEYFRAME_NUM = 3 ADAPTIVE_ALPHA = 0.01 HPSV3_QUALITY_THRESHOLD = 3.0 -class FunPackStoryMemJSONConverterQwenOutput: +class FunPackStoryMemJSONConverter: """ FunPack StoryMem LoRA JSON Converter - supports both manual input and Qwen-generated output. @@ -939,3 +939,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From b1014433636c42e97756e507b58b8bdccea5193b Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 1 Jan 2026 19:27:45 +0200 Subject: [PATCH 17/19] Added "Creative Template" node It stores the pre-made templates for your prompts where you have to only put placeholders for dynamic variables, and then change only them whenever you need to generate the same video but with different character or environment, or whatever. You can basically put anything. --- funpack.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/funpack.py b/funpack.py index e674f454..7541c2d7 100644 --- a/funpack.py +++ b/funpack.py @@ -906,6 +906,80 @@ class FunPackStoryMemLastFrameExtractor: return (last_frame, motion_frames) +import os +import json + +class FunPackCreativeTemplate: + @classmethod + def INPUT_TYPES(s): + # Path to templates.json in the same directory as this script + template_file = os.path.join(os.path.dirname(__file__), "templates.json") + templates = {} + if os.path.exists(template_file): + with open(template_file, 'r') as f: + try: + templates = json.load(f) + except json.JSONDecodeError: + templates = {} + template_names = sorted(list(templates.keys())) + ["Custom"] + default_template = template_names[0] if template_names else "Custom" + + return { + "required": { + "template_name": (template_names, {"default": default_template}), + "template_text": ("STRING", {"multiline": True, "default": ""}), + "replacements": ("STRING", {"multiline": True, "default": ""}), + }, + "optional": { + "save_name": ("STRING", {"default": ""}), + } + } + + RETURN_TYPES = ("STRING",) + FUNCTION = "replace" + CATEGORY = "FunPack/Text" + DESCRIPTION = "Select or create text templates, replace placeholders, and output the result." + + def replace(self, template_name, template_text, replacements, save_name=""): + # Load templates + template_file = os.path.join(os.path.dirname(__file__), "templates.json") + templates = {} + if os.path.exists(template_file): + with open(template_file, 'r') as f: + try: + templates = json.load(f) + except json.JSONDecodeError: + templates = {} + + # Get the template string + if template_name == "Custom": + if not template_text.strip(): + return ("",) # Empty if no custom text provided + template_str = template_text + else: + template_str = templates.get(template_name, "") + + # Parse replacements (format: KEY: value per line) + replace_dict = {} + for line in replacements.splitlines(): + if ':' in line: + key, val = line.split(':', 1) + replace_dict[key.strip()] = val.strip() + + # Perform replacements + for key, val in replace_dict.items(): + template_str = template_str.replace(f"[{key}]", val) + + # Save new template if save_name provided and using Custom + if save_name and template_name == "Custom" and template_text.strip(): + templates[save_name] = template_text + # Create directories if needed (though unlikely) + os.makedirs(os.path.dirname(template_file), exist_ok=True) + with open(template_file, 'w') as f: + json.dump(templates, f, indent=4) + + return (template_str,) + # Update NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS NODE_CLASS_MAPPINGS = { @@ -916,6 +990,7 @@ NODE_CLASS_MAPPINGS = { "FunPackPromptEnhancer": FunPackPromptEnhancer, "FunPackVideoStitch": FunPackVideoStitch, "FunPackContinueVideo": FunPackContinueVideo, + "FunPackCreativeTemplate": FunPackCreativeTemplate, } NODE_DISPLAY_NAME_MAPPINGS = { @@ -925,8 +1000,8 @@ NODE_DISPLAY_NAME_MAPPINGS = { "FunPackImg2LatentInterpolation": "FunPack Img2Latent Interpolation", "FunPackPromptEnhancer": "FunPack Prompt Enhancer (Standalone)", "FunPackVideoStitch": "FunPack Video Stitch", - "FunPackContinueVideo": "FunPack Continue Video" - + "FunPackContinueVideo": "FunPack Continue Video", + "FunPackCreativeTemplate": "FunPack Creative Template" } @@ -940,3 +1015,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { + From 0dfaa51e154954ba66d87809b21899793149e52f Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 1 Jan 2026 19:36:38 +0200 Subject: [PATCH 18/19] Create pyproject.toml --- pyproject.toml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..e1108ab6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,15 @@ +# pyproject.toml +[project] +name = "ComfyUI-FunPack" # Unique identifier for your node. Immutable after creation. +description = "A set of nodes for experiments with video generation models, including Prompt Enhancer, Video Stitch, Creative Template and many other nodes." +version = "1.0.0" # Custom Node version. Must be semantically versioned. +license = { file = "LICENSE.txt" } +dependencies = [] # Filled in from requirements.txt + +[project.urls] +Repository = "https://github.com/aimfordeb/ComfyUI-FunPack" + +[tool.comfy] +PublisherId = "aimfordeb" # TODO (fill in Publisher ID from Comfy Registry Website). +DisplayName = "ComfyUI-FunPack" # Display name for the Custom Node. Can be changed later. +Icon = "https://example.com/icon.png" # SVG, PNG, JPG or GIF (MAX. 800x400px) From a746610a0496d3e95d72468be1ae9e91e0c9a759 Mon Sep 17 00:00:00 2001 From: aimfordeb <133010426+aimfordeb@users.noreply.github.com> Date: Thu, 1 Jan 2026 19:48:28 +0200 Subject: [PATCH 19/19] Fixed pyproject.toml --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e1108ab6..e4278b87 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,9 @@ # pyproject.toml [project] -name = "ComfyUI-FunPack" # Unique identifier for your node. Immutable after creation. +name = "funpack" # Unique identifier for your node. Immutable after creation. description = "A set of nodes for experiments with video generation models, including Prompt Enhancer, Video Stitch, Creative Template and many other nodes." version = "1.0.0" # Custom Node version. Must be semantically versioned. -license = { file = "LICENSE.txt" } +license = { text = "GNU GPL v3" } dependencies = [] # Filled in from requirements.txt [project.urls]