Generated reference · ComfyUI workflow · motion

LTX-2.5 Audio-Video

LTX-2.5 22B dev generating synchronized audio and video in one sampling pass per stage, on the shape of the ComfyUI LTX-2.5 templates: text or image to video in two stages (half resolution, 2x latent upscale, a short distilled refine) …

motion63nodesGPU H100out unspecified~441sv1.0.0

On this page

LTX-2.5 22B dev generating synchronized audio and video in one sampling pass per stage, on the shape of the ComfyUI LTX-2.5 templates: text or image to video in two stages (half resolution, 2x latent upscale, a short distilled refine), first/last frame and reference-sheet (Ingredients IC-LoRA) in one stage, and an optional 2x pixel re-render through the Pixel Spatial Upscaler IC-LoRA.

63Graph nodes
35Node classes
23Inputs
9Models

Tags: motionltx-2.5audio-videotext-to-videoimage-to-videofirst-last-framereference-sheetrunpod-serverlessvolume-backed

Inputs (23)#

The typed parameter surface callers bind when they request this workflow. Enum options and numeric bounds are the values the workflow document declares.

modeenumdefault t2v
t2v and i2v run the ComfyUI LTX-2.5 two-stage templates (video_ltx2_5_t2v / video_ltx2_5_i2v): sample at half the output size, upscale the latent 2x, refine 3 steps. i2v writes start_image into both stages' latents. flf2v runs the one-stage first/last-frame template (video_ltx2_5_flf2v): start_image and end_image are guides at frame 0 and the last frame. ingredients (A.01.03) conditions one stage on reference_sheet through the LTX-2.5 Ingredients IC-LoRA.
options: t2vi2vflf2vingredients
promptstringrequireddefault a wooden boat creaking against a dock at dawn, gulls calling in the distance
What should happen AND what it should sound like; one prompt drives both tracks. LTX-2.5 multishot is written into this prompt (Lightricks' prompting guide); there is no per-shot input. In ingredients mode use the model card's two parts: 'Reference sheet: <the panels> Generated video: <the action>'.
negative_promptstringdefault pc game, console game, video game, cartoon, childish, ugly
What to avoid, in both tracks. The default is the LTX-2.5 t2v/i2v templates' own; the Ingredients model card suggests 'worst quality, inconsistent motion, blurry, jittery, distorted'.
shotsarraydefault []
Native multishot (A.01.02): 2 to 4 shot descriptions, composed into the one chronological paragraph Lightricks' prompting guide prescribes and used as the prompt. Write the first as a full sentence and each later one as its framing ('a medium close-up of her face as she...'); reuse the same identifiers for anyone who recurs. Leave prompt at its default when you set shots; both together are refused.
shot_transitionenumdefault hard_cut
How later shots are joined: hard_cut 'A hard cut jumps to', match_cut 'A match cut transitions to', dissolve 'The shot dissolves into'.
options: hard_cutmatch_cutdissolve
start_imageimage
i2v: the still the clip starts from. flf2v: the first frame. Required in those two modes, ignored in the others.
end_imageimage
flf2v only: the last frame. Required in that mode, ignored in the others.
image_strengthfloatdefault 0.7min 0.0max 1.0
i2v: LTXVImgToVideoInplace strength in stage one; flf2v: both LTXVAddGuide strengths. 0.7 in all three places of the LTX-2.5 templates. i2v's stage-two re-anchor stays at the template's 1.0.
reference_sheetimage
ingredients only: one composite image with a clean panel per character (face close-up and turnaround), prop and location, on a black background with no text (Ingredients model card). It is padded with black to 768x448 and repeated into the static control video the IC-LoRA reads. Required in that mode, ignored in the others.
ingredients_strengthfloatdefault 1.0min 0.0max 2.0
ingredients only: strength_model of the Ingredients IC-LoRA. 1.0 is the model card's recommendation (the weights ship pre-scaled); Lightricks' example workflow ships 1.3.
generate_audiobooleandefault true
When false the audio track is not decoded or muxed. The audio latent is still allocated and sampled: LTX generates the two together, and removing it would change the video.
resolutionenumdefault 1280x704
Output frame size. Every option is a multiple of 64 so the two-stage modes' half-size first stage stays on LTX's 32 px latent grid. ingredients ignores it and renders the Ingredients IC-LoRA's single trained bucket, 768x448 (model card: other resolutions are out of distribution). upscale pixel_x2 doubles both edges of whichever size rendered.
options: 1280x704704x12801024x576768x4481920x1088
lengthintegerdefault 121min 9max 193
Frames, 8n+1 (LTX's latent stride). 121 is 5 s at 24 fps, the templates' default and the Ingredients recipe. In ingredients mode the reference video is max(length, 121) frames, because the model card requires at least 121.
auto_durationbooleandefault false
Let the LTX-2.5 duration head size the clip from the prompt (ComfyUI LTXVDurationPredictor, snapped to 8k+1 frames). length becomes the upper bound, so the cost estimate stays an upper bound. t2v, i2v and flf2v only.
fpsenumdefault 24
Frame rate, fed to LTXVConditioning, the audio latent and the muxer so both tracks share one clock. 24 is the LTX-2.5 templates' and the Ingredients recipe's rate.
options: 2425
stepsintegerdefault 30min 1max 40
speed_mode default only: dev-model steps in stage one. 30 is LTX_2_4_PARAMS in Lightricks' ltx-pipelines, which LTX-2.5 inherits; no ComfyUI LTX-2.5 template runs the non-distilled path.
cfg_videofloatdefault 3.0min 0.0max 20.0
speed_mode default only: guidance on the video half in stage one (ltx-pipelines LTX-2.4+ video cfg_scale 3.0).
cfg_audiofloatdefault 7.0min 0.0max 20.0
speed_mode default only: guidance on the audio half in stage one (ltx-pipelines audio cfg_scale 7.0, also LTXVDualCFGGuider's own default).
seedintegerdefault 0min 0
Noise seed of the first stage. The refine stage and the pixel_x2 pass use the fixed seed 42 their templates ship.
samplerenumdefault euler
speed_mode default only: the stage-one sampler.
options: eulerdpmpp_2muni_pceuler_ancestral
schedulerenumdefault simple
speed_mode default only: the stage-one schedule.
options: simplenormalbetakarras
speed_modeenumdefault default
distilled (V.12.03 parity) applies ltx-2.5-22b-distilled-lora-450 to the dev transformer at strength 1.0 and samples stage one on the 8-step distilled sigma list with CFG 1, the recipe of every LTX-2.5 template (which load the distilled transformer this volume does not carry); steps, cfg_video, cfg_audio, sampler and scheduler are ignored. The sampler is euler_ancestral (t2v/i2v templates), euler_ancestral_cfg_pp (Lightricks' Ingredients example) or SamplerEulerAncestral with eta 0 (flf2v template). The two-stage refine and the pixel_x2 pass always run distilled, in both modes.
options: defaultdistilled
upscaleenumdefault none
pixel_x2 (A.01.03) re-renders the finished clip at twice its width and height through the LTX-2.5 Pixel Spatial Upscaler IC-LoRA at strength 1.0, with the decoded clip as the half-resolution reference (the LoRA's reference_downscale_factor 2) and the first pass's audio frozen, on an 8-step distilled pass. Lightricks recommends a low base (~280p) for it; the per-job pixel cap refuses sizes whose doubled frame does not fit.
options: nonepixel_x2

ComfyUI node graph (63)#

The executable ComfyUI prompt graph: 63 nodes across 35 distinct node classes, wired by 85 data dependencies. Nodes tinted green come from a custom node pack this workflow declares; the rest are ComfyUI core / baked-community classes.

flowchart TD n0["1: UNETLoader"] n1["2: CLIPLoader"] n2["3: VAELoader"] n3["4: VAELoader"] n4["5: LatentUpscaleModelLoader"] n5["6: LoraLoaderModelOnly"] n6["7: CLIPTextEncode"] n7["8: CLIPTextEncode"] n8["9: LTXVConditioning"] n9["10: EmptyLTXVLatentVideo"] n10["11: LoadImage"] n11["12: ResizeImageMaskNode"] n12["13: LTXVPreprocess"] n13["14: LTXVImgToVideoInplace"] n14["15: LoadImage"] n15["16: ResizeImageMaskNode"] n16["17: ResizeImageMaskNode"] n17["18: LTXVPreprocess"] n18["19: LTXVPreprocess"] n19["20: LTXVAddGuide"] n20["21: LTXVAddGuide"] n21["22: LoadImage"] n22["23: ResizeAndPadImage"] n23["24: RepeatImageBatch"] n24["25: LTXICLoRALoaderModelOnly"] n25["26: LTXAddVideoICLoRAGuide"] n26["27: LTXVEmptyLatentAudio"] n27["28: LTXVConcatAVLatent"] n28["29: LTXVDualCFGGuider"] n29["30: KSamplerSelect"] n30["31: SamplerEulerAncestral"] n31["32: BasicScheduler"] n32["33: ManualSigmas"] n33["34: RandomNoise"] n34["35: SamplerCustomAdvanced"] n35["36: LTXVSeparateAVLatent"] n36["37: LTXVCropGuides"] n37["38: LTXVLatentUpsampler"] n38["39: LTXVImgToVideoInplace"] n39["40: LTXVConcatAVLatent"] n40["41: RandomNoise"] n41["42: LTXVDualCFGGuider"] n42["43: KSamplerSelect"] n43["44: ManualSigmas"] n44["45: SamplerCustomAdvanced"] n45["46: LTXVSeparateAVLatent"] n46["47: VAEDecodeTiled"] n47["48: LTXVAudioVAEDecode"] n48["49: LTXICLoRALoaderModelOnly"] n49["50: EmptyLTXVLatentVideo"] n50["51: LTXAddVideoICLoRAGuide"] n51["52: LTXVSetAudioRefTokens"] n52["53: LTXVConcatAVLatent"] n53["54: RandomNoise"] n54["55: CFGGuider"] n55["56: KSamplerSelect"] n56["57: ManualSigmas"] n57["58: SamplerCustomAdvanced"] n58["59: LTXVSeparateAVLatent"] n59["60: LTXVCropGuides"] n60["61: VAEDecodeTiled"] n61["62: CreateVideo"] n62["63: SaveVideo"] n0 -->|model| n5 n1 -->|clip| n6 n1 -->|clip| n7 n6 -->|positive| n8 n7 -->|negative| n8 n10 -->|input| n11 n11 -->|image| n12 n3 -->|vae| n13 n12 -->|image| n13 n9 -->|latent| n13 n10 -->|input| n15 n14 -->|input| n16 n15 -->|image| n17 n16 -->|image| n18 n8 -->|positive| n19 n8 -->|negative| n19 n3 -->|vae| n19 n9 -->|latent| n19 n17 -->|image| n19 n19 -->|positive| n20 n19 -->|negative| n20 n3 -->|vae| n20 n19 -->|latent| n20 n18 -->|image| n20 n21 -->|image| n22 n22 -->|image| n23 n8 -->|positive| n25 n8 -->|negative| n25 n3 -->|vae| n25 n9 -->|latent| n25 n23 -->|image| n25 n24 -->|latent_downscale_factor| n25 n2 -->|audio_vae| n26 n26 -->|audio_latent| n27 n0 -->|model| n31 n33 -->|noise| n34 n28 -->|guider| n34 n27 -->|latent_image| n34 n34 -->|av_latent| n35 n35 -->|latent| n36 n35 -->|samples| n37 n4 -->|upscale_model| n37 n3 -->|vae| n37 n3 -->|vae| n38 n12 -->|image| n38 n37 -->|latent| n38 n35 -->|audio_latent| n39 n5 -->|model| n41 n8 -->|positive| n41 n8 -->|negative| n41 n40 -->|noise| n44 n41 -->|guider| n44 n42 -->|sampler| n44 n43 -->|sigmas| n44 n39 -->|latent_image| n44 n44 -->|av_latent| n45 n3 -->|vae| n46 n2 -->|audio_vae| n47 n5 -->|model| n48 n8 -->|positive| n50 n8 -->|negative| n50 n3 -->|vae| n50 n49 -->|latent| n50 n46 -->|image| n50 n48 -->|latent_downscale_factor| n50 n8 -->|positive| n51 n8 -->|negative| n51 n50 -->|video_latent| n52 n51 -->|audio_latent| n52 n48 -->|model| n54 n50 -->|positive| n54 n50 -->|negative| n54 n53 -->|noise| n57 n54 -->|guider| n57 n55 -->|sampler| n57 n56 -->|sigmas| n57 n52 -->|latent_image| n57 n57 -->|av_latent| n58 n50 -->|positive| n59 n50 -->|negative| n59 n58 -->|latent| n59 n59 -->|samples| n60 n3 -->|vae| n60 n47 -->|audio| n61 n61 -->|video| n62
Data-flow DAG — scroll to zoom, drag to pan.

Nodes (63)#

1UNETLoadercore
unet_name = ltx-2.5-22b-dev-transformer-bf16.safetensorsweight_dtype = default
outputs: MODEL
2CLIPLoadercore
clip_name = gemma4-12b-with-proj-ltx-2.5-bf16.safetensorstype = ltxvdevice = default
outputs: CLIP
3VAELoadercore
vae_name = ltx-2.5-audio-vae-bf16.safetensors
outputs: VAE
4VAELoadercore
vae_name = ltx-2.5-video-vae-bf16.safetensors
outputs: VAE
5LatentUpscaleModelLoadercore
model_name = ltx-2.5-latent-spatial-upscaler-x2-bf16-1.0.safetensors
outputs: LATENT_UPSCALE_MODEL
6LoraLoaderModelOnlycore
model = ◂ node 1 · out[0]lora_name = ltx-2.5-22b-distilled-lora-450-bf16.safetensorsstrength_model = 1.0
outputs: MODEL
7CLIPTextEncodecore
clip = ◂ node 2 · out[0]text = {{prompt}} tmpl
outputs: CONDITIONING
8CLIPTextEncodecore
clip = ◂ node 2 · out[0]text = {{negative_prompt}} tmpl
outputs: CONDITIONING
9LTXVConditioningcore
positive = ◂ node 7 · out[0]negative = ◂ node 8 · out[0]frame_rate = {{float(fps)}} tmpl
outputs: CONDITIONINGCONDITIONING
10EmptyLTXVLatentVideocore
width = {{ingredients_size.width if mode == 'ingredients' else resolution_map[resolution].width // stage_one_divisor[mode]}} tmplheight = {{ingredients_size.height if mode == 'ingredients' else resolution_map[resolution].height // stage_one_divisor[mode]}} tmpllength = {{length}} tmplbatch_size = 1
outputs: LATENT
11LoadImagecore
image = {{start_image}} tmpl
outputs: IMAGEMASK
12ResizeImageMaskNodecore
input = ◂ node 11 · out[0]resize_type = scale longer dimensionresize_type.longer_size = 1536scale_method = lanczos
outputs: IMAGE
13LTXVPreprocesscore
image = ◂ node 12 · out[0]img_compression = 18
outputs: IMAGE
14LTXVImgToVideoInplacecore
vae = ◂ node 4 · out[0]image = ◂ node 13 · out[0]latent = ◂ node 10 · out[0]strength = {{image_strength}} tmplbypass = false
outputs: LATENT
15LoadImagecore
image = {{end_image}} tmpl
outputs: IMAGEMASK
16ResizeImageMaskNodecore
input = ◂ node 11 · out[0]resize_type = scale dimensionsresize_type.width = {{resolution_map[resolution].width}} tmplresize_type.height = {{resolution_map[resolution].height}} tmplresize_type.crop = centerscale_method = nearest-exact
outputs: IMAGE
17ResizeImageMaskNodecore
input = ◂ node 15 · out[0]resize_type = scale dimensionsresize_type.width = {{resolution_map[resolution].width}} tmplresize_type.height = {{resolution_map[resolution].height}} tmplresize_type.crop = centerscale_method = nearest-exact
outputs: IMAGE
18LTXVPreprocesscore
image = ◂ node 16 · out[0]img_compression = 18
outputs: IMAGE
19LTXVPreprocesscore
image = ◂ node 17 · out[0]img_compression = 18
outputs: IMAGE
20LTXVAddGuidecore
positive = ◂ node 9 · out[0]negative = ◂ node 9 · out[1]vae = ◂ node 4 · out[0]latent = ◂ node 10 · out[0]image = ◂ node 18 · out[0]frame_idx = 0strength = {{image_strength}} tmpl
outputs: CONDITIONINGCONDITIONINGLATENT
21LTXVAddGuidecore
positive = ◂ node 20 · out[0]negative = ◂ node 20 · out[1]vae = ◂ node 4 · out[0]latent = ◂ node 20 · out[2]image = ◂ node 19 · out[0]frame_idx = -1strength = {{image_strength}} tmpl
outputs: CONDITIONINGCONDITIONINGLATENT
22LoadImagecore
image = {{reference_sheet}} tmpl
outputs: IMAGEMASK
23ResizeAndPadImagecore
image = ◂ node 22 · out[0]target_width = {{ingredients_size.width}} tmpltarget_height = {{ingredients_size.height}} tmplpadding_color = blackinterpolation = lanczos
outputs: IMAGE
24RepeatImageBatchcore
image = ◂ node 23 · out[0]amount = {{max(length, 121)}} tmpl
outputs: IMAGE
25LTXICLoRALoaderModelOnlycore
model = {{model_source_map[speed_mode]}} tmpllora_name = ltx-2.5-22b-ic-lora-ingredients-0.9.safetensorsstrength_model = {{ingredients_strength}} tmpl
outputs: MODELFLOAT
26LTXAddVideoICLoRAGuidecore
positive = ◂ node 9 · out[0]negative = ◂ node 9 · out[1]vae = ◂ node 4 · out[0]latent = ◂ node 10 · out[0]image = ◂ node 24 · out[0]frame_idx = 0strength = 1.0latent_downscale_factor = ◂ node 25 · out[1]crop = disableduse_tiled_encode = falsetile_size = 256tile_overlap = 64
outputs: CONDITIONINGCONDITIONINGLATENT
27LTXVEmptyLatentAudiocore
audio_vae = ◂ node 3 · out[0]frames_number = {{length}} tmplframe_rate = {{float(fps)}} tmplbatch_size = 1
outputs: LATENT
28LTXVConcatAVLatentcore
video_latent = {{video_latent_source_map[mode]}} tmplaudio_latent = ◂ node 27 · out[0]
outputs: LATENT
29LTXVDualCFGGuidercore
model = {{model_source_map['ingredients' if mode == 'ingredients' else speed_mode]}} tmplpositive = {{positive_source_map[mode]}} tmplnegative = {{negative_source_map[mode]}} tmplvideo_cfg = {{1.0 if speed_mode == 'distilled' else cfg_video}} tmplaudio_cfg = {{1.0 if speed_mode == 'distilled' else cfg_audio}} tmpl
outputs: GUIDER
30KSamplerSelectcore
sampler_name = {{distilled_sampler_map[mode] if speed_mode == 'distilled' else sampler}} tmpl
outputs: SAMPLER
31SamplerEulerAncestralcore
eta = 0.0s_noise = 1.0
outputs: SAMPLER
32BasicSchedulercore
model = ◂ node 1 · out[0]scheduler = {{scheduler}} tmplsteps = {{steps}} tmpldenoise = 1.0
outputs: SIGMAS
33ManualSigmascore
sigmas = 1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0
outputs: SIGMAS
34RandomNoisecore
noise_seed = {{seed}} tmpl
outputs: NOISE
35SamplerCustomAdvancedcore
noise = ◂ node 34 · out[0]guider = ◂ node 29 · out[0]sampler = {{sampler_source_map['eta0' if mode == 'flf2v' and speed_mode == 'distilled' else 'select']}} tmplsigmas = {{sigma_source_map[speed_mode]}} tmpllatent_image = ◂ node 28 · out[0]
outputs: LATENTLATENT
36LTXVSeparateAVLatentcore
av_latent = ◂ node 35 · out[0]
outputs: LATENTLATENT
37LTXVCropGuidescore
positive = {{positive_source_map[mode]}} tmplnegative = {{negative_source_map[mode]}} tmpllatent = ◂ node 36 · out[0]
outputs: CONDITIONINGCONDITIONINGLATENT
38LTXVLatentUpsamplercore
samples = ◂ node 36 · out[0]upscale_model = ◂ node 5 · out[0]vae = ◂ node 4 · out[0]
outputs: LATENT
39LTXVImgToVideoInplacecore
vae = ◂ node 4 · out[0]image = ◂ node 13 · out[0]latent = ◂ node 38 · out[0]strength = 1.0bypass = false
outputs: LATENT
40LTXVConcatAVLatentcore
video_latent = {{stage_two_video_source_map[mode]}} tmplaudio_latent = ◂ node 36 · out[1]
outputs: LATENT
41RandomNoisecore
noise_seed = 42
outputs: NOISE
42LTXVDualCFGGuidercore
model = ◂ node 6 · out[0]positive = ◂ node 9 · out[0]negative = ◂ node 9 · out[1]video_cfg = 1.0audio_cfg = 1.0
outputs: GUIDER
43KSamplerSelectcore
sampler_name = euler_ancestral
outputs: SAMPLER
44ManualSigmascore
sigmas = 0.85, 0.7250, 0.4219, 0.0
outputs: SIGMAS
45SamplerCustomAdvancedcore
noise = ◂ node 41 · out[0]guider = ◂ node 42 · out[0]sampler = ◂ node 43 · out[0]sigmas = ◂ node 44 · out[0]latent_image = ◂ node 40 · out[0]
outputs: LATENTLATENT
46LTXVSeparateAVLatentcore
av_latent = ◂ node 45 · out[0]
outputs: LATENTLATENT
47VAEDecodeTiledcore
samples = {{video_decode_source_map[mode]}} tmplvae = ◂ node 4 · out[0]tile_size = 512overlap = 64temporal_size = 64temporal_overlap = 16
outputs: IMAGE
48LTXVAudioVAEDecodecore
samples = {{audio_latent_source_map[mode]}} tmplaudio_vae = ◂ node 3 · out[0]
outputs: AUDIO
49LTXICLoRALoaderModelOnlycore
model = ◂ node 6 · out[0]lora_name = ltx-2.5-22b-ic-lora-pixel-spatial-upscaler-x2-1.0.safetensorsstrength_model = 1.0
outputs: MODELFLOAT
50EmptyLTXVLatentVideocore
width = {{2 * (ingredients_size.width if mode == 'ingredients' else resolution_map[resolution].width)}} tmplheight = {{2 * (ingredients_size.height if mode == 'ingredients' else resolution_map[resolution].height)}} tmpllength = {{length}} tmplbatch_size = 1
outputs: LATENT
51LTXAddVideoICLoRAGuidecore
positive = ◂ node 9 · out[0]negative = ◂ node 9 · out[1]vae = ◂ node 4 · out[0]latent = ◂ node 50 · out[0]image = ◂ node 47 · out[0]frame_idx = 0strength = 1.0latent_downscale_factor = ◂ node 49 · out[1]crop = disableduse_tiled_encode = falsetile_size = 256tile_overlap = 64
outputs: CONDITIONINGCONDITIONINGLATENT
52LTXVSetAudioRefTokenscore
positive = ◂ node 9 · out[0]negative = ◂ node 9 · out[1]audio_latent = {{audio_latent_source_map[mode]}} tmpl
outputs: CONDITIONINGCONDITIONINGLATENT
53LTXVConcatAVLatentcore
video_latent = ◂ node 51 · out[2]audio_latent = ◂ node 52 · out[2]
outputs: LATENT
54RandomNoisecore
noise_seed = 42
outputs: NOISE
55CFGGuidercore
model = ◂ node 49 · out[0]positive = ◂ node 51 · out[0]negative = ◂ node 51 · out[1]cfg = 1.0
outputs: GUIDER
56KSamplerSelectcore
sampler_name = euler_ancestral
outputs: SAMPLER
57ManualSigmascore
sigmas = 1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0
outputs: SIGMAS
58SamplerCustomAdvancedcore
noise = ◂ node 54 · out[0]guider = ◂ node 55 · out[0]sampler = ◂ node 56 · out[0]sigmas = ◂ node 57 · out[0]latent_image = ◂ node 53 · out[0]
outputs: LATENTLATENT
59LTXVSeparateAVLatentcore
av_latent = ◂ node 58 · out[0]
outputs: LATENTLATENT
60LTXVCropGuidescore
positive = ◂ node 51 · out[0]negative = ◂ node 51 · out[1]latent = ◂ node 59 · out[0]
outputs: CONDITIONINGCONDITIONINGLATENT
61VAEDecodeTiledcore
samples = ◂ node 60 · out[2]vae = ◂ node 4 · out[0]tile_size = 512overlap = 64temporal_size = 64temporal_overlap = 16
outputs: IMAGE
62CreateVideocore
images = {{final_images_map[upscale]}} tmplfps = {{float(fps)}} tmplaudio = ◂ node 48 · out[0]
outputs: VIDEO
63SaveVideocore
video = ◂ node 62 · out[0]filename_prefix = ltx25-avformat = mp4

Parameter banks (16)#

The prompt / configuration lookup tables this workflow keys into from its inputs — the vocabulary that turns a style / palette / preset selection into graph parameters.

resolution_map (5)#

1280x704
{"width": 1280, "height": 704}
704x1280
{"width": 704, "height": 1280}
1024x576
{"width": 1024, "height": 576}
768x448
{"width": 768, "height": 448}
1920x1088
{"width": 1920, "height": 1088}

ingredients_size (2)#

width
768
height
448

stage_one_divisor (4)#

t2v
2
i2v
2
flf2v
1
ingredients
1

requires_families (1)#

ltx25

model_source_map (3)#

default
10
distilled
60
ingredients
250

positive_source_map (4)#

t2v
90
i2v
90
flf2v
210
ingredients
260

negative_source_map (4)#

t2v
91
i2v
91
flf2v
211
ingredients
261

video_latent_source_map (4)#

t2v
100
i2v
140
flf2v
212
ingredients
262

stage_two_video_source_map (2)#

t2v
380
i2v
390

distilled_sampler_map (3)#

t2v
euler_ancestral
i2v
euler_ancestral
ingredients
euler_ancestral_cfg_pp

sampler_source_map (2)#

select
300
eta0
310

sigma_source_map (2)#

default
320
distilled
330

video_decode_source_map (4)#

t2v
460
i2v
460
flf2v
372
ingredients
372

audio_latent_source_map (4)#

t2v
461
i2v
461
flf2v
361
ingredients
361

final_images_map (2)#

none
470
pixel_x2
610

post_render (1)#

ltx25_shots_duration
{"shots_input": "shots", "transition_input": "shot_transition", "prompt_input": "prompt", "mode_input": "mode", "auto_duration_input": "auto_duration", "length_input": "length", "fps_input": "fps", "duration_modes": ["t2v", "i2v", "flf2v"], "positive_text_node": "7", "conditioning_node": "9", "guider_node": "29", "duration_head_file": "ltx-2.5-duration-head-bf16.safetensors", "min_seconds": 1.0, "length_targets": [{"node": "10", "input": "length"}, {"node": "27", "input": "frames_number"}, {"node": "50", "input": "length"}]}

Models & dependencies#

Custom node packs (1)#

The non-core ComfyUI node classes this graph requires; the RunPod worker image the workflow runs on must bake or install a pack that provides every one of them.

ComfyUI-LTXVideo

Models required (9)#

ltx-2.5-22b-dev-transformer-bf16.safetensors
gemma4-12b-with-proj-ltx-2.5-bf16.safetensors
ltx-2.5-video-vae-bf16.safetensors
ltx-2.5-audio-vae-bf16.safetensors
ltx-2.5-latent-spatial-upscaler-x2-bf16-1.0.safetensors
ltx-2.5-22b-distilled-lora-450-bf16.safetensors
ltx-2.5-22b-ic-lora-ingredients-0.9.safetensors
ltx-2.5-22b-ic-lora-pixel-spatial-upscaler-x2-1.0.safetensors
ltx-2.5-duration-head-bf16.safetensors

Output contract#

What a successful run of this workflow returns.

primary
{"type": "video", "format": "mp4", "codec": "h264", "fps_source": "declared", "audio": true, "alpha": false, "description": "Clip with generated audio muxed in."}

Taxonomy & routing#

How the control plane classifies this workflow — from the committed workflow-taxonomy-registry.json. It drives the consistency / control surface the agentic director can exercise over the workflow.

assetFamily
joint-av-scene
outputPackageProfile
video-master-profile
controlModalities
model-lockprompt-template-locksampler-scheduler-lockseed-lockkeyframe-anchor-locktemporal-lockreference-ensemble
consistencyDimensions
identitymotionenvironment
notes
LTX-2.5 audio+video (A.01.02, A.01.03). Each stage samples ONE concatenated audio+video latent. keyframe-anchor-lock applies in i2v (LTXVImgToVideoInplace in both stages) and flf2v (LTXVAddGuide at the first and last frame); reference-ensemble and the identity dimension apply in ingredients mode, where one reference sheet of characters, props and location conditions the clip through the Ingredients IC-LoRA.