Create seamless transitions with LTX 2.3
Create seamless transitions between shots with this LTX 2.3 workflow, featuring the FLW LoRA from Systsms
查看工作流内部
源模板的只读预览。在 Cloud 中打开,即可查看节点并进行修改。
Loading the graph
Open full-size workflow preview- 输出
- 视频
- 作者
- ComfyUI
从代码中调用该模型
以下请求使用与体验区相同的预设图和设置。每次提交都可能开始一次付费运行;如果提交结果未知,请勿自动重试。
What you need
- Runs on
- Comfy Cloud
- 密钥
- COMFY_API_KEY
- 你的文件
- 由代码根据链接上传
需要付费的 Cloud 方案和额度。
# 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({
"1": {
"class_type": "DiffusionModelLoaderKJ",
"inputs": {
"compute_dtype": "bf16",
"enable_fp16_accumulation": False,
"model_name": "ltx-2.3-22b-dev_transformer_only_bf16.safetensors",
"patch_cublaslinear": False,
"sage_attention": "disabled",
"weight_dtype": "default"
},
"_meta": {
"title": "Diffusion Model Loader KJ"
}
},
"4": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "ltx-2.3-22b-distilled-1.1_lora-dynamic_fro09_avg_rank_111_bf16.safetensors",
"model": [
"49",
0
],
"strength_model": 0.5
},
"_meta": {
"title": "Load LoRA"
}
},
"5": {
"class_type": "VAELoaderKJ",
"inputs": {
"device": "main_device",
"vae_name": "LTX23_video_vae_bf16.safetensors",
"weight_dtype": "bf16"
},
"_meta": {
"title": "VAELoader KJ"
}
},
"6": {
"class_type": "VAELoaderKJ",
"inputs": {
"device": "main_device",
"vae_name": "LTX23_audio_vae_bf16.safetensors",
"weight_dtype": "bf16"
},
"_meta": {
"title": "VAELoader KJ"
}
},
"8": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"33",
0
],
"text": [
"80",
0
]
},
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"9": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"33",
0
],
"text": ""
},
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"10": {
"class_type": "LTXVConditioning",
"inputs": {
"frame_rate": 24,
"negative": [
"9",
0
],
"positive": [
"8",
0
]
},
"_meta": {
"title": "LTXVConditioning"
}
},
"13": {
"class_type": "LTXVAddGuide",
"inputs": {
"frame_idx": 0,
"image": [
"74",
0
],
"latent": [
"14",
0
],
"negative": [
"10",
1
],
"positive": [
"10",
0
],
"strength": 1,
"vae": [
"5",
0
]
},
"_meta": {
"title": "LTXVAddGuide"
}
},
"14": {
"class_type": "EmptyLTXVLatentVideo",
"inputs": {
"batch_size": 1,
"height": [
"74",
2
],
"length": [
"74",
3
],
"width": [
"74",
1
]
},
"_meta": {
"title": "Empty LTXV Latent Video"
}
},
"15": {
"class_type": "LTXVConcatAVLatent",
"inputs": {
"audio_latent": [
"29",
0
],
"video_latent": [
"13",
2
]
},
"_meta": {
"title": "Concat AV Latent"
}
},
"17": {
"class_type": "SamplerCustomAdvanced",
"inputs": {
"guider": [
"19",
0
],
"latent_image": [
"15",
0
],
"noise": [
"18",
0
],
"sampler": [
"20",
0
],
"sigmas": [
"21",
0
]
},
"_meta": {
"title": "SamplerCustomAdvanced"
}
},
"18": {
"class_type": "RandomNoise",
"inputs": {
"noise_seed": 644688566928704
},
"_meta": {
"title": "RandomNoise"
}
},
"19": {
"class_type": "CFGGuider",
"inputs": {
"cfg": 1,
"model": [
"4",
0
],
"negative": [
"13",
1
],
"positive": [
"13",
0
]
},
"_meta": {
"title": "CFG Guider"
}
},
"20": {
"class_type": "KSamplerSelect",
"inputs": {
"sampler_name": "euler_ancestral_cfg_pp"
},
"_meta": {
"title": "KSamplerSelect"
}
},
"21": {
"class_type": "BasicScheduler",
"inputs": {
"denoise": 1,
"model": [
"4",
0
],
"scheduler": "linear_quadratic",
"steps": 8
},
"_meta": {
"title": "BasicScheduler"
}
},
"23": {
"class_type": "LTXVSeparateAVLatent",
"inputs": {
"av_latent": [
"17",
0
]
},
"_meta": {
"title": "Separate AV Latent"
}
},
"24": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"31",
2
],
"vae": [
"5",
0
]
},
"_meta": {
"title": "VAE Decode"
}
},
"25": {
"class_type": "LTXVAudioVAEDecode",
"inputs": {
"audio_vae": [
"6",
0
],
"samples": [
"23",
1
]
},
"_meta": {
"title": "LTXV Audio VAE Decode"
}
},
"26": {
"class_type": "VHS_VideoCombine",
"inputs": {
"audio": [
"25",
0
],
"crf": 10,
"filename_prefix": "SYSTMS_FLW",
"format": "video/h264-mp4",
"frame_rate": 24,
"images": [
"24",
0
],
"loop_count": 0,
"pingpong": False,
"pix_fmt": "yuv420p",
"save_metadata": True,
"save_output": True,
"trim_to_audio": False
},
"_meta": {
"title": "Video Combine 🎥🅥🅗🅢"
}
},
"29": {
"class_type": "SetLatentNoiseMask",
"inputs": {
"mask": [
"30",
0
],
"samples": [
"98",
0
]
},
"_meta": {
"title": "Set Latent Noise Mask"
}
},
"30": {
"class_type": "SolidMask",
"inputs": {
"height": [
"74",
2
],
"value": 0,
"width": [
"74",
1
]
},
"_meta": {
"title": "Create Solid Mask"
}
},
"31": {
"class_type": "LTXVCropGuides",
"inputs": {
"latent": [
"23",
0
],
"negative": [
"13",
0
],
"positive": [
"13",
0
]
},
"_meta": {
"title": "LTXVCropGuides"
}
},
"33": {
"class_type": "DualCLIPLoader",
"inputs": {
"clip_name1": "gemma_3_12B_it.safetensors",
"clip_name2": "ltx-2.3_text_projection_bf16.safetensors",
"device": "default",
"type": "ltxv"
},
"_meta": {
"title": "Load CLIP (Dual)"
}
},
"49": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "systms__SYSTMS-FLW-IC-LORA-LTX-23__SYSTMS_FLW_V1_LTX23.safetensors",
"model": [
"1",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"61": {
"class_type": "GeminiNode",
"inputs": {
"model": "gemini-3-1-pro",
"prompt": "your task is to write an LTX 2.3 LoRA video prompt that describes the attached video, inferring a seamless morphing transition where the gray area is, using the following formula:\n\n[Action A] seamlessly transforms into [Action B]. \n[Subject A description] becomes [Subject B description]. \n[Setting A] shifts to [Setting B]. \n[Camera behavior across the transition]. \n[Lighting/mood continuity].\n\nHere is an example of what that might look like:\n\nA motocross rider performing a mid-air backflip seamlessly transforms into a man standing and holding a basketball. The upside-down rider on a dirt bike becomes a young man in a black t-shirt and white shorts. A mountainous landscape over a lake shifts to an outdoor urban basketball court with a city skyline. The camera holds steady through the morph, keeping the central figure framed. Soft evening daylight throughout, continuous and even.\n\nreturn the prompt only",
"seed": 42,
"system_prompt": "",
"video": [
"63",
0
]
},
"_meta": {
"title": "Google Gemini"
}
},
"63": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 24,
"images": [
"74",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"69": {
"class_type": "VHS_LoadVideo",
"inputs": {
"custom_height": 0,
"custom_width": 0,
"force_rate": 0,
"format": "None",
"frame_load_cap": 25,
"select_every_nth": 1,
"skip_first_frames": 99,
"video": "UPLOADED_shot_a_FILENAME"
},
"_meta": {
"title": "SHOT A"
}
},
"70": {
"class_type": "VHS_LoadVideo",
"inputs": {
"custom_height": 0,
"custom_width": 0,
"force_rate": 0,
"format": "None",
"frame_load_cap": 25,
"select_every_nth": 1,
"skip_first_frames": 0,
"video": "UPLOADED_shot_b_FILENAME"
},
"_meta": {
"title": "SHOT B"
}
},
"71": {
"class_type": "WanVideoVACEStartToEndFrame",
"inputs": {
"empty_frame_level": 0.5,
"end_image": [
"82",
0
],
"end_index": -1,
"num_frames": 97,
"start_image": [
"81",
0
],
"start_index": 0
},
"_meta": {
"title": "WanVideo VACE Start To End Frame"
}
},
"74": {
"class_type": "GetImageSizeAndCount",
"inputs": {
"image": [
"71",
0
]
},
"_meta": {
"title": "Get Image Size & Count"
}
},
"80": {
"class_type": "JoinStrings",
"inputs": {
"delimiter": " ",
"string1": [
"86",
0
],
"string2": [
"61",
0
]
},
"_meta": {
"title": "Join Strings"
}
},
"81": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 32,
"height": 0,
"image": [
"69",
0
],
"keep_proportion": "resize",
"pad_color": "0, 0, 0",
"upscale_method": "lanczos",
"width": 1024
},
"_meta": {
"title": "Resize Image v2"
}
},
"82": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 32,
"height": [
"81",
2
],
"image": [
"70",
0
],
"keep_proportion": "crop",
"pad_color": "0, 0, 0",
"upscale_method": "lanczos",
"width": [
"81",
1
]
},
"_meta": {
"title": "Resize Image v2"
}
},
"86": {
"class_type": "PrimitiveString",
"inputs": {
"value": "FLW,"
},
"_meta": {
"title": "Text"
}
},
"96": {
"class_type": "LoadAudio",
"inputs": {
"audio": "UPLOADED_audio_FILENAME"
},
"_meta": {
"title": "Load Audio"
}
},
"98": {
"class_type": "LTXVAudioVAEEncode",
"inputs": {
"audio": [
"96",
0
],
"audio_vae": [
"6",
0
]
},
"_meta": {
"title": "LTXV Audio VAE Encode"
}
}
})
workflow.set_input("96", "audio", client.assets.from_url("https://comfy.org/catalog-media/62e56757-cd38-4e0c-bd65-4e796e740bd3/edd102b3-2d44-4ae0-b061-3a8c9cced5e6"))
workflow.set_input("69", "video", client.assets.from_url("https://comfy.org/catalog-media/f9a20f4c-7c3d-41a1-a6a0-d6347d4e528a/6541acd4-2f2b-470c-90a6-fa00623a9039"))
workflow.set_input("70", "video", client.assets.from_url("https://comfy.org/catalog-media/32276661-de3f-4636-9a29-92948278fa76/f7ef431a-9fc9-4ce9-93d5-c8572d383e62"))
# 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("26"):
output.to_file(output.name)试试一个示例
关于此工作流
This ComfyUI workflow builds seamless, text-guided transitions between two source clips using the LTX 2.3 video diffusion model and the SYSTMS FLW transition LoRA. The MODELS group loads the transformer-only LTX 2.3 backbone via DiffusionModelLoaderKJ, the matching VAE with VAELoaderKJ, and applies the FLW LoRA using LoraLoaderModelOnly to bias the model toward natural, flow-like shot changes. Prompts are encoded with CLIPTextEncode (optionally auto-generated by a Gemini node), then routed through LTXVConditioning and LTXVAddGuide to steer the transition content and style.
Under the hood, the workflow allocates a timeline in EmptyLTXVLatentVideo, manages A/V latent streams with LTXVSeparateAVLatent and LTXVConcatAVLatent, and localizes denoising to the handoff region using SolidMask and SetLatentNoiseMask. Sampling is handled by SamplerCustomAdvanced with CFGGuider, KSamplerSelect, BasicScheduler, and RandomNoise for reproducibility.
After inference, VAEDecode reconstructs frames and VHS_VideoCombine assembles them into a final video. LTXVCropGuides provides compositional guides to keep subjects aligned between shots, helping the model generate cleaner, more believable morphs.
常见问答
No. It is optional. Disconnect its string output from CLIPTextEncode and enter your own prompt. Use the template: "FLW, [Action A] seamlessly transforms into [Action B], [details]".
Set the frame load caps on Clip A and Clip B, then set the total frame count on EmptyLTXVLatentVideo. Transition length = total frames − Clip A frames − Clip B frames.
Place the LTX 2.3 transformer model in models/diffusion_models, the SYSTMS FLW LoRA in models/loras, and the VAE in models/vae. Load them via DiffusionModelLoaderKJ, LoraLoaderModelOnly, and VAELoaderKJ respectively.
Keep CFG scale moderate (around 3–5), ensure subjects are similarly framed using LTXVCropGuides, and restrict heavy denoising to the handoff region with SolidMask + SetLatentNoiseMask. You can also lower resolution or steps slightly to avoid over-cooking details outside the transition.