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
コードからこのモデルを呼び出す
以下のリクエストでは、Playground と同じ準備済みグラフと設定を使用します。送信ごとに有料実行が開始される場合があります。結果が不明な送信を自動的に再試行しないでください。
What you need
- Runs on
- Comfy Cloud
- キー
- COMFY_API_KEY
- ファイル
- コードによって URL からアップロードされます
有料の 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.