LTX-2.3: Image to Video
Upload an image to generate a video with improved motion consistency and fine details, including enhanced support for portrait formats and audio quality.
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({
"75": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/LTX_2.3_i2v",
"format": "auto",
"format.codec": "auto",
"video": [
"267:242",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"269": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_image_FILENAME"
},
"_meta": {
"title": "Load Image"
}
},
"267:201": {
"class_type": "PrimitiveBoolean",
"inputs": {
"value": False
},
"_meta": {
"title": "Switch to Text to Video?"
}
},
"267:209": {
"class_type": "KSamplerSelect",
"inputs": {
"sampler_name": "euler_ancestral_cfg_pp"
},
"_meta": {
"title": "KSamplerSelect"
}
},
"267:211": {
"class_type": "ManualSigmas",
"inputs": {
"sigmas": "0.85, 0.7250, 0.4219, 0.0"
},
"_meta": {
"title": "ManualSigmas"
}
},
"267:212": {
"class_type": "LTXVCropGuides",
"inputs": {
"latent": [
"267:217",
0
],
"negative": [
"267:239",
1
],
"positive": [
"267:239",
0
]
},
"_meta": {
"title": "LTXVCropGuides"
}
},
"267:213": {
"class_type": "CFGGuider",
"inputs": {
"cfg": 1,
"model": [
"267:232",
0
],
"negative": [
"267:212",
1
],
"positive": [
"267:212",
0
]
},
"_meta": {
"title": "CFG Guider"
}
},
"267:214": {
"class_type": "LTXVEmptyLatentAudio",
"inputs": {
"audio_vae": [
"267:221",
0
],
"batch_size": 1,
"frame_rate": [
"267:261",
1
],
"frames_number": [
"267:225",
0
]
},
"_meta": {
"title": "Empty LTXV Latent Audio"
}
},
"267:215": {
"class_type": "SamplerCustomAdvanced",
"inputs": {
"guider": [
"267:231",
0
],
"latent_image": [
"267:222",
0
],
"noise": [
"267:237",
0
],
"sampler": [
"267:209",
0
],
"sigmas": [
"267:252",
0
]
},
"_meta": {
"title": "SamplerCustomAdvanced"
}
},
"267:216": {
"class_type": "RandomNoise",
"inputs": {
"noise_seed": 42
},
"_meta": {
"title": "RandomNoise"
}
},
"267:217": {
"class_type": "LTXVSeparateAVLatent",
"inputs": {
"av_latent": [
"267:215",
0
]
},
"_meta": {
"title": "Separate AV Latent"
}
},
"267:218": {
"class_type": "LTXVSeparateAVLatent",
"inputs": {
"av_latent": [
"267:219",
0
]
},
"_meta": {
"title": "Separate AV Latent"
}
},
"267:219": {
"class_type": "SamplerCustomAdvanced",
"inputs": {
"guider": [
"267:213",
0
],
"latent_image": [
"267:229",
0
],
"noise": [
"267:216",
0
],
"sampler": [
"267:246",
0
],
"sigmas": [
"267:211",
0
]
},
"_meta": {
"title": "SamplerCustomAdvanced"
}
},
"267:220": {
"class_type": "LTXVAudioVAEDecode",
"inputs": {
"audio_vae": [
"267:221",
0
],
"samples": [
"267:218",
1
]
},
"_meta": {
"title": "LTXV Audio VAE Decode"
}
},
"267:221": {
"class_type": "LTXVAudioVAELoader",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors"
},
"_meta": {
"title": "Load LTXV Audio VAE"
}
},
"267:222": {
"class_type": "LTXVConcatAVLatent",
"inputs": {
"audio_latent": [
"267:214",
0
],
"video_latent": [
"267:249",
0
]
},
"_meta": {
"title": "Concat AV Latent"
}
},
"267:225": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 121
},
"_meta": {
"title": "Length"
}
},
"267:228": {
"class_type": "EmptyLTXVLatentVideo",
"inputs": {
"batch_size": 1,
"height": [
"267:259",
1
],
"length": [
"267:225",
0
],
"width": [
"267:256",
1
]
},
"_meta": {
"title": "Empty LTXV Latent Video"
}
},
"267:229": {
"class_type": "LTXVConcatAVLatent",
"inputs": {
"audio_latent": [
"267:217",
1
],
"video_latent": [
"267:230",
0
]
},
"_meta": {
"title": "Concat AV Latent"
}
},
"267:230": {
"class_type": "LTXVImgToVideoInplace",
"inputs": {
"bypass": [
"267:201",
0
],
"image": [
"267:248",
0
],
"latent": [
"267:253",
0
],
"strength": 1,
"vae": [
"267:236",
2
]
},
"_meta": {
"title": "LTXVImgToVideoInplace"
}
},
"267:231": {
"class_type": "CFGGuider",
"inputs": {
"cfg": 1,
"model": [
"267:232",
0
],
"negative": [
"267:239",
1
],
"positive": [
"267:239",
0
]
},
"_meta": {
"title": "CFG Guider"
}
},
"267:232": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "ltx-2.3-22b-distilled-lora-384.safetensors",
"model": [
"267:236",
0
],
"strength_model": 0.5
},
"_meta": {
"title": "Load LoRA"
}
},
"267:233": {
"class_type": "LatentUpscaleModelLoader",
"inputs": {
"model_name": "ltx-2.3-spatial-upscaler-x2-1.1.safetensors"
},
"_meta": {
"title": "Load Latent Upscale Model"
}
},
"267:235": {
"class_type": "ResizeImagesByLongerEdge",
"inputs": {
"images": [
"267:238",
0
],
"longer_edge": 1536
},
"_meta": {
"title": "Resize Images by Longer Edge (DEPRECATED)"
}
},
"267:236": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors"
},
"_meta": {
"title": "Load Checkpoint"
}
},
"267:237": {
"class_type": "RandomNoise",
"inputs": {
"noise_seed": 723381549937839
},
"_meta": {
"title": "RandomNoise"
}
},
"267:238": {
"class_type": "ResizeImageMaskNode",
"inputs": {
"input": [
"269",
0
],
"resize_type": "scale dimensions",
"resize_type.crop": "center",
"resize_type.height": [
"267:258",
0
],
"resize_type.width": [
"267:257",
0
],
"scale_method": "lanczos"
},
"_meta": {
"title": "Resize Image/Mask"
}
},
"267:239": {
"class_type": "LTXVConditioning",
"inputs": {
"frame_rate": [
"267:261",
0
],
"negative": [
"267:247",
0
],
"positive": [
"267:240",
0
]
},
"_meta": {
"title": "LTXVConditioning"
}
},
"267:240": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"267:243",
0
],
"text": [
"267:274",
0
]
},
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"267:242": {
"class_type": "CreateVideo",
"inputs": {
"audio": [
"267:220",
0
],
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": [
"267:261",
0
],
"images": [
"267:251",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"267:243": {
"class_type": "LTXAVTextEncoderLoader",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors",
"device": "default",
"text_encoder": "gemma_3_12B_it_fp4_mixed.safetensors"
},
"_meta": {
"title": "Load LTXV Audio Text Encoder"
}
},
"267:246": {
"class_type": "KSamplerSelect",
"inputs": {
"sampler_name": "euler_cfg_pp"
},
"_meta": {
"title": "KSamplerSelect"
}
},
"267:247": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"267:272",
1
],
"text": "pc game, console game, video game, cartoon, childish, ugly"
},
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"267:248": {
"class_type": "LTXVPreprocess",
"inputs": {
"image": [
"267:235",
0
],
"img_compression": 18
},
"_meta": {
"title": "LTXV Preprocess"
}
},
"267:249": {
"class_type": "LTXVImgToVideoInplace",
"inputs": {
"bypass": [
"267:201",
0
],
"image": [
"267:248",
0
],
"latent": [
"267:228",
0
],
"strength": 0.7,
"vae": [
"267:236",
2
]
},
"_meta": {
"title": "LTXVImgToVideoInplace"
}
},
"267:251": {
"class_type": "VAEDecodeTiled",
"inputs": {
"overlap": 64,
"samples": [
"267:218",
0
],
"temporal_overlap": 4,
"temporal_size": 4096,
"tile_size": 768,
"vae": [
"267:236",
2
]
},
"_meta": {
"title": "VAE Decode (Tiled)"
}
},
"267:252": {
"class_type": "ManualSigmas",
"inputs": {
"sigmas": "1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0"
},
"_meta": {
"title": "ManualSigmas"
}
},
"267:253": {
"class_type": "LTXVLatentUpsampler",
"inputs": {
"samples": [
"267:217",
0
],
"upscale_model": [
"267:233",
0
],
"vae": [
"267:236",
2
]
},
"_meta": {
"title": "LTXVLatentUpsampler"
}
},
"267:256": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a/2",
"values.a": [
"267:257",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"267:257": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 1280
},
"_meta": {
"title": "Width"
}
},
"267:258": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 720
},
"_meta": {
"title": "Height"
}
},
"267:259": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a/2",
"values.a": [
"267:258",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"267:260": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 25
},
"_meta": {
"title": "Frame Rate"
}
},
"267:261": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a",
"values.a": [
"267:260",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"267:266": {
"class_type": "PrimitiveStringMultiline",
"inputs": {
"value": "The dancer lands from her leap on the wet granite plaza and flows straight into a slow spinning turn, her indigo silk robe whipping out in a wide arc and her silver-streaked hair lifting in the wind. She sweeps one arm low across the reflective stone, rises onto her toes, then stretches both arms toward the storm clouds and holds the pose as fine drizzle drifts across the frame. The camera starts low and wide, then orbits halfway around her in one smooth continuous move, pushing in as she reaches upward so she ends in a medium shot against the hazy twilight. Her bare feet splash small ripples in the puddles. Sound of gusting wind, soft rain on stone, fabric snapping in the air and her steady breathing, with no music."
},
"_meta": {
"title": "Prompt"
}
},
"267:272": {
"class_type": "LoraLoader",
"inputs": {
"clip": [
"267:243",
0
],
"lora_name": "gemma-3-12b-it-abliterated_lora_rank64_bf16.safetensors",
"model": [
"267:236",
0
],
"strength_clip": 1,
"strength_model": 1
},
"_meta": {
"title": "Load LoRA (Model and CLIP)"
}
},
"267:274": {
"class_type": "TextGenerateLTX2Prompt",
"inputs": {
"clip": [
"267:272",
1
],
"image": [
"269",
0
],
"max_length": 256,
"mtp": "auto",
"prompt": [
"267:266",
0
],
"sampling_mode": "on",
"sampling_mode.min_p": 0.05,
"sampling_mode.repetition_penalty": 1.05,
"sampling_mode.seed": 0,
"sampling_mode.temperature": 0.7,
"sampling_mode.top_k": 64,
"sampling_mode.top_p": 0.95,
"thinking": False,
"use_default_template": True
},
"_meta": {
"title": "Generate LTX2 Prompt"
}
},
"267:275": {
"class_type": "PreviewAny",
"inputs": {
"source": [
"267:274",
0
]
},
"_meta": {
"title": "Preview as Text"
}
}
})
workflow.set_input("269", "image", client.assets.from_url("https://comfy.org/catalog-media/6bf242fd-aaa2-44da-a4d2-aae9ebc6d13b/9ca60480-d521-414d-8f6e-a9729e884690"))
# 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("75"):
output.to_file(output.name)Try an example
About this workflow
The LTX-2.3: Image to Video workflow is designed to transform static images into dynamic video sequences with enhanced motion consistency and detailed visual fidelity. By leveraging the LTX-2.3 model from Lightricks, this workflow excels in maintaining the integrity of fine details while transitioning from image to video format. It also offers robust support for portrait formats, ensuring that videos retain their intended aspect ratios and compositions. The workflow integrates several key nodes, including LoadImage for importing the initial image, and SaveVideo for exporting the final video output. Additionally, the b94257db-cdc1-45d3-8913-ca61e782d9c1 node is crucial for processing and enhancing audio quality, thereby enriching the overall video experience.
Technically, this workflow operates by first loading an image through the LoadImage node, which serves as the foundational input. The LTX-2.3 model then applies sophisticated algorithms to generate a sequence of frames that smoothly transition from the initial image. This is achieved by interpreting the core actions and visual details specified in the prompts, allowing for a coherent narrative flow. The SaveVideo node finalizes the process by compiling these frames into a cohesive video file. This workflow is particularly useful for creators looking to add dynamic elements to still images, whether for storytelling, marketing, or artistic purposes.
Questions & answers
The LoadImage node supports common image formats such as JPEG, PNG, and BMP.
Yes, the frame rate can be adjusted within the LTX-2.3 model settings to suit your specific needs.
Yes, the workflow includes a node for enhancing audio quality, allowing you to integrate custom audio tracks.
The workflow supports portrait formats, and you can configure settings in the LTX-2.3 model to preserve the aspect ratio.