Multi-Keyframe Video Stitching
Creates a smooth video using 6 key frames.It auto fills in the motion between frames and stitchs the segments together seamlessly.
Inside the workflow
A read-only preview of the source template. Open it in Cloud to explore the nodes and make changes.
Loading the graph
Open full-size workflow preview- Output
- Video
- Author
- ComfyUI
Call this model from your code
The request below uses the same prepared graph and settings as the Playground. Each submission can start a paid run; do not automatically retry a submission whose outcome is unknown.
What you need
- Runs on
- Comfy Cloud
- Key
- COMFY_API_KEY
- Your files
- Uploaded by the code from their urls
Needs a paid Cloud plan and credits.
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"62": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_keyframe_1_FILENAME"
},
"_meta": {
"title": "Start Frame"
}
},
"122": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_keyframe_2_FILENAME"
},
"_meta": {
"title": "End Frame"
}
},
"124": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_keyframe_3_FILENAME"
},
"_meta": {
"title": "End Frame"
}
},
"126": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_keyframe_4_FILENAME"
},
"_meta": {
"title": "End Frame"
}
},
"128": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_keyframe_5_FILENAME"
},
"_meta": {
"title": "End Frame"
}
},
"130": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_keyframe_6_FILENAME"
},
"_meta": {
"title": "End Frame"
}
},
"133": {
"class_type": "ImageBatch",
"inputs": {
"image1": [
"140:8",
0
],
"image2": [
"141:8",
0
]
},
"_meta": {
"title": "Batch Images (DEPRECATED)"
}
},
"134": {
"class_type": "ImageBatch",
"inputs": {
"image1": [
"133",
0
],
"image2": [
"142:8",
0
]
},
"_meta": {
"title": "Batch Images (DEPRECATED)"
}
},
"135": {
"class_type": "ImageBatch",
"inputs": {
"image1": [
"134",
0
],
"image2": [
"143:8",
0
]
},
"_meta": {
"title": "Batch Images (DEPRECATED)"
}
},
"136": {
"class_type": "ImageBatch",
"inputs": {
"image1": [
"135",
0
],
"image2": [
"144:8",
0
]
},
"_meta": {
"title": "Batch Images (DEPRECATED)"
}
},
"145": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 24,
"images": [
"136",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"146": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/ComfyUI",
"format": "auto",
"format.codec": "auto",
"video": [
"145",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"140:37": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"140:38": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"device": "default",
"type": "wan"
},
"_meta": {
"title": "Load CLIP"
}
},
"140:39": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "wan_2.1_vae.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"140:54": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"140:91",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"140:55": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"140:92",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"140:56": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"140:57": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "enable",
"cfg": 1,
"end_at_step": 2,
"latent_image": [
"140:67",
2
],
"model": [
"140:54",
0
],
"negative": [
"140:67",
1
],
"noise_seed": 106238756028535,
"positive": [
"140:67",
0
],
"return_with_leftover_noise": "enable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 0,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"140:58": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "disable",
"cfg": 1,
"end_at_step": 10000,
"latent_image": [
"140:57",
0
],
"model": [
"140:55",
0
],
"negative": [
"140:67",
1
],
"noise_seed": 0,
"positive": [
"140:67",
0
],
"return_with_leftover_noise": "disable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 2,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"140:6": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"140:38",
0
],
"text": "A time-lapse from a locked-off camera on the same hilltop: the stormy indigo twilight lifts and dawn breaks over the lone hawthorn tree. Clouds race across the sky and thin out, mist rolls through the hollows and burns away, and pale pink blossom bursts open all along the tree's twisted branches. Fresh green shoots spread over the rolling hill and the light warms from cold violet to soft rose and gold. The tree, the hill and the horizon stay exactly in place; only the season, the sky and the light change, smoothly and continuously, as the seasons advance in a single fluid shot with no cuts."
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"140:60": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 16,
"images": [
"140:8",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"140:67": {
"class_type": "WanFirstLastFrameToVideo",
"inputs": {
"batch_size": 1,
"end_image": [
"122",
0
],
"height": 480,
"length": 25,
"negative": [
"140:7",
0
],
"positive": [
"140:6",
0
],
"start_image": [
"62",
0
],
"vae": [
"140:39",
0
],
"width": 832
},
"_meta": {
"title": "WanFirstLastFrameToVideo"
}
},
"140:7": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"140:38",
0
],
"text": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"140:8": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"140:58",
0
],
"vae": [
"140:39",
0
]
},
"_meta": {
"title": "VAE Decode"
}
},
"140:91": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors",
"model": [
"140:37",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"140:92": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors",
"model": [
"140:56",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"141:37": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"141:38": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"device": "default",
"type": "wan"
},
"_meta": {
"title": "Load CLIP"
}
},
"141:39": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "wan_2.1_vae.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"141:54": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"141:91",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"141:55": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"141:92",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"141:56": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"141:57": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "enable",
"cfg": 1,
"end_at_step": 2,
"latent_image": [
"141:67",
2
],
"model": [
"141:54",
0
],
"negative": [
"141:67",
1
],
"noise_seed": 332092862784409,
"positive": [
"141:67",
0
],
"return_with_leftover_noise": "enable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 0,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"141:58": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "disable",
"cfg": 1,
"end_at_step": 10000,
"latent_image": [
"141:57",
0
],
"model": [
"141:55",
0
],
"negative": [
"141:67",
1
],
"noise_seed": 0,
"positive": [
"141:67",
0
],
"return_with_leftover_noise": "disable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 2,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"141:6": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"141:38",
0
],
"text": "A time-lapse from a locked-off camera on the same hilltop: spring turns into high summer around the lone hawthorn tree. The pink blossom falls away and drifts on the wind as dense dark-green leaves fill the crown. The grass on the hill grows tall and lush, wildflowers open in waves of white and yellow, and tall white clouds build and sail across a bright blue midday sky, their shadows sweeping over the slopes. The tree, the hill and the horizon stay exactly in place; only the season, the sky and the light change, smoothly and continuously, in a single fluid shot with no cuts."
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"141:60": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 16,
"images": [
"141:8",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"141:67": {
"class_type": "WanFirstLastFrameToVideo",
"inputs": {
"batch_size": 1,
"end_image": [
"124",
0
],
"height": 480,
"length": 25,
"negative": [
"141:7",
0
],
"positive": [
"141:6",
0
],
"start_image": [
"122",
0
],
"vae": [
"141:39",
0
],
"width": 832
},
"_meta": {
"title": "WanFirstLastFrameToVideo"
}
},
"141:7": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"141:38",
0
],
"text": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"141:8": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"141:58",
0
],
"vae": [
"141:39",
0
]
},
"_meta": {
"title": "VAE Decode"
}
},
"141:91": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors",
"model": [
"141:37",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"141:92": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors",
"model": [
"141:56",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"142:37": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"142:38": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"device": "default",
"type": "wan"
},
"_meta": {
"title": "Load CLIP"
}
},
"142:39": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "wan_2.1_vae.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"142:54": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"142:91",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"142:55": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"142:92",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"142:56": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"142:57": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "enable",
"cfg": 1,
"end_at_step": 2,
"latent_image": [
"142:67",
2
],
"model": [
"142:54",
0
],
"negative": [
"142:67",
1
],
"noise_seed": 502081291840272,
"positive": [
"142:67",
0
],
"return_with_leftover_noise": "enable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 0,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"142:58": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "disable",
"cfg": 1,
"end_at_step": 10000,
"latent_image": [
"142:57",
0
],
"model": [
"142:55",
0
],
"negative": [
"142:67",
1
],
"noise_seed": 0,
"positive": [
"142:67",
0
],
"return_with_leftover_noise": "disable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 2,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"142:6": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"142:38",
0
],
"text": "A time-lapse from a locked-off camera on the same hilltop: summer fades into autumn as the sun sinks to golden hour behind the lone hawthorn tree. The leaves turn from green to amber, orange and deep red, a few of them tumbling away in gusts of wind. The tall grass dries to a warm gold, and the tree's long shadow stretches slowly across the hill as the low sun slides sideways. Clouds glow copper and pink. The tree, the hill and the horizon stay exactly in place; only the season, the sky and the light change, smoothly and continuously, in one fluid shot with no cuts."
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"142:60": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 16,
"images": [
"142:8",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"142:67": {
"class_type": "WanFirstLastFrameToVideo",
"inputs": {
"batch_size": 1,
"end_image": [
"126",
0
],
"height": 480,
"length": 25,
"negative": [
"142:7",
0
],
"positive": [
"142:6",
0
],
"start_image": [
"124",
0
],
"vae": [
"142:39",
0
],
"width": 832
},
"_meta": {
"title": "WanFirstLastFrameToVideo"
}
},
"142:7": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"142:38",
0
],
"text": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"142:8": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"142:58",
0
],
"vae": [
"142:39",
0
]
},
"_meta": {
"title": "VAE Decode"
}
},
"142:91": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors",
"model": [
"142:37",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"142:92": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors",
"model": [
"142:56",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"143:37": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"143:38": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"device": "default",
"type": "wan"
},
"_meta": {
"title": "Load CLIP"
}
},
"143:39": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "wan_2.1_vae.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"143:54": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"143:91",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"143:55": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"143:92",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"143:56": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"143:57": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "enable",
"cfg": 1,
"end_at_step": 2,
"latent_image": [
"143:67",
2
],
"model": [
"143:54",
0
],
"negative": [
"143:67",
1
],
"noise_seed": 282609046210025,
"positive": [
"143:67",
0
],
"return_with_leftover_noise": "enable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 0,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"143:58": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "disable",
"cfg": 1,
"end_at_step": 10000,
"latent_image": [
"143:57",
0
],
"model": [
"143:55",
0
],
"negative": [
"143:67",
1
],
"noise_seed": 0,
"positive": [
"143:67",
0
],
"return_with_leftover_noise": "disable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 2,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"143:6": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"143:38",
0
],
"text": "A time-lapse from a locked-off camera on the same hilltop: autumn gives way to deep winter as dusk falls over the lone hawthorn tree. The last red leaves blow off and the branches stand bare. Snow begins to fall, first in a few flakes, then thickly, settling on every branch and smoothing the whole hill under a soft white blanket. The warm sunset drains into a cold blue-violet sky with a thin band of last light on the horizon. The tree, the hill and the horizon stay exactly in place; only the season, the sky and the light change, smoothly and continuously, in one fluid shot with no cuts."
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"143:60": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 16,
"images": [
"143:8",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"143:67": {
"class_type": "WanFirstLastFrameToVideo",
"inputs": {
"batch_size": 1,
"end_image": [
"128",
0
],
"height": 480,
"length": 25,
"negative": [
"143:7",
0
],
"positive": [
"143:6",
0
],
"start_image": [
"126",
0
],
"vae": [
"143:39",
0
],
"width": 832
},
"_meta": {
"title": "WanFirstLastFrameToVideo"
}
},
"143:7": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"143:38",
0
],
"text": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"143:8": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"143:58",
0
],
"vae": [
"143:39",
0
]
},
"_meta": {
"title": "VAE Decode"
}
},
"143:91": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors",
"model": [
"143:37",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"143:92": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors",
"model": [
"143:56",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"144:37": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"144:38": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"device": "default",
"type": "wan"
},
"_meta": {
"title": "Load CLIP"
}
},
"144:39": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "wan_2.1_vae.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"144:54": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"144:91",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"144:55": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"144:92",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"144:56": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"144:57": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "enable",
"cfg": 1,
"end_at_step": 2,
"latent_image": [
"144:67",
2
],
"model": [
"144:54",
0
],
"negative": [
"144:67",
1
],
"noise_seed": 1081792442176464,
"positive": [
"144:67",
0
],
"return_with_leftover_noise": "enable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 0,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"144:58": {
"class_type": "KSamplerAdvanced",
"inputs": {
"add_noise": "disable",
"cfg": 1,
"end_at_step": 10000,
"latent_image": [
"144:57",
0
],
"model": [
"144:55",
0
],
"negative": [
"144:67",
1
],
"noise_seed": 0,
"positive": [
"144:67",
0
],
"return_with_leftover_noise": "disable",
"sampler_name": "euler",
"scheduler": "simple",
"start_at_step": 2,
"steps": 4
},
"_meta": {
"title": "KSampler (Advanced)"
}
},
"144:6": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"144:38",
0
],
"text": "A time-lapse from a locked-off camera on the same hilltop: winter dusk deepens into a clear, still night above the bare, snow-dusted hawthorn tree. The last glow on the horizon fades away, the sky darkens to deep navy and black, and stars appear one by one until the faint band of the galaxy arcs over the tree. Moonlight rises from the side and glints on the snow, giving the hill a silver edge, while the stars wheel slowly across the sky. The tree, the hill and the horizon stay exactly in place; only the sky and the light change, smoothly and continuously, with no cuts."
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"144:60": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 16,
"images": [
"144:8",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"144:67": {
"class_type": "WanFirstLastFrameToVideo",
"inputs": {
"batch_size": 1,
"end_image": [
"130",
0
],
"height": 480,
"length": 25,
"negative": [
"144:7",
0
],
"positive": [
"144:6",
0
],
"start_image": [
"128",
0
],
"vae": [
"144:39",
0
],
"width": 832
},
"_meta": {
"title": "WanFirstLastFrameToVideo"
}
},
"144:7": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"144:38",
0
],
"text": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"144:8": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"144:58",
0
],
"vae": [
"144:39",
0
]
},
"_meta": {
"title": "VAE Decode"
}
},
"144:91": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors",
"model": [
"144:37",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"144:92": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors",
"model": [
"144:56",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
}
})
workflow.set_input("62", "image", client.assets.from_url("https://comfy.org/catalog-media/355e43fc-9314-423c-9bb4-60e392f6b905/409d71e0-812f-475d-a889-049ee879c67f"))
workflow.set_input("122", "image", client.assets.from_url("https://comfy.org/catalog-media/e2928720-cfd8-44d8-88c1-5600eee2df6f/bbe0e7d2-dc7b-4fa2-b232-10a9463b7480"))
workflow.set_input("124", "image", client.assets.from_url("https://comfy.org/catalog-media/4ee3c115-a4fd-4fc8-a5de-66a1043ff111/014a35ec-33e3-452f-bbd2-5781cf7d92ca"))
workflow.set_input("126", "image", client.assets.from_url("https://comfy.org/catalog-media/103c269e-16ee-410f-94e9-7a1bb568299e/2fa4c753-28e4-4e34-a3da-e5457e6bc939"))
workflow.set_input("128", "image", client.assets.from_url("https://comfy.org/catalog-media/deac9ebe-14cb-4897-b6f6-064b209d708b/48acce99-e35a-4fe7-94ec-286f0db330a4"))
workflow.set_input("130", "image", client.assets.from_url("https://comfy.org/catalog-media/f0d772c2-0333-499d-ab54-6aa9f60ada1d/e2765e2c-73ad-4b0f-a727-6b2db2e34b2e"))
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)
for output in job.get_outputs("146"):
output.to_file(output.name)Try an example
About this workflow
The Multi-Keyframe Video Stitching workflow in ComfyUI is designed to transform a series of static images into a fluid video sequence. Utilizing six key frames, this workflow automatically generates the transitional frames needed to create a seamless video. At the core of this process is the Wan2.2 model, which excels at interpreting motion between images to ensure smooth transitions.
The workflow begins with the LoadImage and ImageBatch nodes, which prepare the key frames for processing. The intermediate nodes, such as 11ac0cb0-38fb-41d4-9a55-7c44422b2516 and 1c5f4533-5d1e-4449-97ca-9027b9ea9c11, handle the interpolation of frames by predicting and filling in the motion paths. Finally, the CreateVideo and SaveVideo nodes compile the frames into a cohesive video file.
This workflow is particularly useful for creators looking to produce animations or video content from still images without requiring extensive manual editing. By automating the interpolation process, it saves time and ensures consistency in the motion between frames. The use of advanced nodes and the Wan2.2 model allows for high-quality video output that maintains the integrity of the original images while providing a natural flow of motion.
Questions & answers
This workflow is optimized for six key frames to ensure smooth transitions and efficient processing.
Yes, you can adjust the speed by modifying the frame rate settings in the CreateVideo node.
The SaveVideo node supports common video formats such as MP4 and AVI for the final output.
No prior experience is necessary. The workflow is designed to be user-friendly and intuitive for beginners.