Install
$ agentstack add skill-artokun-comfyui-mcp-ltxv2-video ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
LTX-2 / LTX-2.3 Video Workflows
Version naming (read this first)
There is no "LTX 3.2" or "LTX2.3" as separate products — the user's shorthand refers to Lightricks LTX-2.3, a point release of the LTX-2 family. The lineage is:
- LTX-Video (2024) — first text-to-video model from Lightricks.
- LTX-2 / LTX-V2 (Oct 2025) — 19B-class DiT audio-video foundation model. Bundled checkpoint
ltx-2-19b-distilled.safetensors, Gemma 3 12B text encoder. - LTX-2.3 (released ~March 2026) — 22B-parameter DiT update. Rebuilt VAE (sharper textures/faces/hair/text), ~4x larger text connector (text projection) for prompt adherence, native 9:16 portrait, LoRA support, HiFi-GAN vocoder for cleaner synchronized audio, up to 4K@50fps / ~20s clips. Apache 2.0. Distributed primarily as GGUF UNets (community quants) plus separate VAE / text-encoder / text-projection files — NOT a single bundled checkpoint like LTX-2.
When the user says "LTX3.2" / "LTX2.3", treat it as LTX-2.3. This skill covers both LTX-2 (bundled checkpoint path) and LTX-2.3 (GGUF UNet path).
⭐ Render-verified correct setup (read this FIRST — 2026-06-19)
> The GGUF-UNet + DualCLIPLoader + gemma_3_12B_it_fp4_mixed path documented later > in this skill (the Aitrepreneur installer path) produces soft/mushy video with > inaccurate faces and eyes. It runs, but it is NOT the quality path. The setup > below is the official Comfy-Org template, render-proven sharp (1280×704, accurate > faces, synchronized 48 kHz stereo audio).
Models (exact, render-verified)
| Component | File | Source repo | Folder | Notes | |-----------|------|-------------|--------|-------| | Checkpoint | ltx-2.3-22b-dev.safetensors (46 GB, max quality) or ltx-2.3-22b-dev-fp8.safetensors (~23 GB, official VRAM-friendly) | Lightricks/LTX-2.3 / Lightricks/LTX-2.3-fp8 | checkpoints/ (NOT unet/) | The checkpoint carries the transformer and the audio VAE. Loaded by CheckpointLoaderSimple + reused by LTXVAudioVAELoader + LTXAVTextEncoderLoader. | | Gemma text encoder | gemma_3_12B_it_fp8_scaled.safetensors (13 GB) | Comfy-Org/ltx-2 → split_files/text_encoders/ | text_encoders/ | Use fp8_scaled (unpacked). The Aitrepreneur fp4_mixed mirror file is truncated (5.3 GB vs 9.4 GB) AND a packed-fp4 layout core can't reshape → shape [15360,1920] invalid for input 27582328. | | Distilled speed LoRA | ltx_2.3_22b_distilled_1.1_lora_dynamic_fro09_avg_rank_111_bf16.safetensors @ 0.5 | Comfy-Org/ltx-2.3 → split_files/loras/ | loras/ | The newer dynamic rank-111 distilled LoRA — NOT the older ...384-1.1. | | Gemma abliterated LoRA ⭐ | gemma-3-12b-it-abliterated_lora_rank64_bf16.safetensors @ 1.0 | Comfy-Org/ltx-2 → split_files/loras/ | loras/ | Applied to the text-encoder CLIP via a LoraLoader. This is the prompt-accuracy / correct-eyes fix. Missing this = subtly-wrong faces. | | Spatial upscaler | ltx-2.3-spatial-upscaler-x2-1.1.safetensors | Lightricks/LTX-2.3 | latent_upscale_models/ | Used by the stage-2 LTXVLatentUpsampler. Use x2-1.1, not x2-1.0. |
Node stack (the right one)
LTXAVTextEncoderLoader(CORE,comfy_extras/nodes_lt_audio.py) — loads gemma + the full checkpoint together viacomfy.sd.load_clip([gemma, ckpt], type=LTXV). This is the audio-video encoder driving both video and audio/voice. Do NOT useDualCLIPLoader(type=ltxv)+ a separateltx-2.3_text_projectionfile — that is the legacy video-only path and yields mush.- Gemma abliterated LoRA via a
LoraLoader(CLIP LoRA) on the encoder output → CLIPTextEncode. - Two-stage: base sample (~768×512) →
LTXVLatentUpsampler(×2 spatial, uses the upscaler model + the checkpoint VAE) → refine sample → 1280×704 output. The upscale is the sharpness. A single-stage graph is visibly softer. - Guider: the Comfy-Org template uses plain
CFGGuidercfg=1 (distilled); the LTXVideo repo example usesMultimodalGuider+GuiderParameters(separate AUDIO/VIDEO) +ClownSampler_Beta(RES4LYF). Both produce sharp output — the LoRAs + two-stage matter more than the guider. - ffmpeg is required for the final mux:
/python -m pip install imageio-ffmpeg, then reboot.CreateVideo/SaveVideo/VHS_VideoCombinefail withffmpeg ... could not be foundotherwise.
Custom nodes
ComfyUI-LTXVideo (LTXV* nodes, MultimodalGuider, GuiderParameters, LTXVPreprocess, LTXVTiledVAEDecode, GemmaAPITextEncode, LTXFloatToInt) + RES4LYF (ClownSampler_Beta, only for the repo-example sampler). LTXAVTextEncoderLoader, ResizeImageMaskNode, CreateVideo, SaveVideo, ManualSigmas, LTXVScheduler, the Primitive* nodes are all CORE ComfyUI.
Quality troubleshooting (symptom → cause → fix)
- Mushy/garbage, no clear subject → empty positive prompt, or
DualCLIPLoader+projection text encoder. Fix: set a prompt; useLTXAVTextEncoderLoader. - Coherent but soft/blurry, faces & eyes slightly wrong → no two-stage upscale and/or missing the gemma abliterated LoRA and/or the old distilled LoRA. Fix: full two-stage template + both LoRAs above.
status: successbut no video file /outputsonly has a math or text node → the output node (SaveVideo/VHS) failed validation and was silently dropped; the graph short-circuited. Check the ComfyUI log forFailed to validate prompt for output Nand fix that node (missing ffmpeg, a broken connection, a model-not-in-list).DualCLIPLoaderreshape[15360,1920] invalid for input 27582328→ wrong/truncated gemma → usegemma_3_12B_it_fp8_scaled.LatentUpscaleModelLoader: ...x2-1.0 not in list→ reference...x2-1.1.- SaveVideo writes to a subfolder (
video/_NNNNN.mp4) — its historyoutputsentry isn't underimages/videos/gifs, so a naive "find the video" check misses it. Look on disk underoutput/video/.
MCP UI→API converter gotchas (src/services/workflow-converter.ts)
The official template exercised several convertUiToApi gaps (all now fixed — keep in mind if a template still mis-converts):
- V3 dynamic combos (
COMFY_DYNAMICCOMBO_V3, e.g.ResizeImageMaskNode.resize_type): each selected option's nested input must be keyed.(e.g.resize_type.longer_size,resize_type.width), NOT flat — ComfyUI rebuilds the nested dict viadynamic_paths/finalize_prefix. A flat key is rejectedrequired_input_missing. Rerouteis virtual — its connections must be passed through (consumer resolves to the Reroute's input), else everything downstream dangles and the graph short-circuits.VHS_VideoCombinestoreswidgets_valuesas a name→value object, not a positional array.- Typed
Primitive*nodes (PrimitiveInt/Float/Boolean/StringMultiline) are real executable nodes — keep them as link sources, don't bake their values into a consumer'swidgets_valuesby index (mis-positions V3 nested inputs).
Pack
packs/ltx-2.3-txt2vid (and the i2v/flf/extender variants) should be built on this official two-stage template. For a no-input-file T2V pack, set the template's bypass_i2v / "Switch to Text to Video?" boolean true and feed the I2V image input a blank EmptyImage (discarded at runtime but still validates).
> Source note: the install scripts below pull LTX-2.3 files from a third-party mirror repo huggingface.co/Aitrepreneur/FLX, not the official Lightricks/LTX-2.3 repo. The official weights live at huggingface.co/Lightricks/LTX-2.3. Filenames/quants match what those scripts download.
Overview
LTX-2 is a DiT-based video foundation model from Lightricks. It uses a Gemma 3 12B text encoder and supports both text-to-video (T2V) and image-to-video (I2V). Key features:
- Distilled model for fast 8-step generation; dev model for higher quality (~20+ steps)
- Two-stage pipeline: Generate at low res, then 2x spatial upscale in latent space
- Camera control LoRAs for cinematic movements
- Synchronized audio-video generation in a single pass (LTX-2.3 audio VAE + HiFi-GAN vocoder)
- GGUF quantization (LTX-2.3) for low-VRAM local inference via ComfyUI-GGUF
Models
LTX-2 (bundled checkpoint path)
| Component | Node | Model | Notes | |-----------|------|-------|-------| | Checkpoint | CheckpointLoaderSimple | ltx-2-19b-distilled.safetensors | 41GB bf16, distilled variant; bundles VAE internally | | Gemma 3 | CLIPLoader (type=ltxv) | gemma_3_12B_it_fp4_mixed.safetensors | 9GB FP4, in text_encoders/ |
Loading note (LTX-2): The bundled checkpoint contains the VAE internally. The Gemma 3 text encoder loads separately via CLIPLoader with type: "ltxv" pointing at text_encoders/.
LTX-2.3 (GGUF UNet path — current install)
LTX-2.3 ships as a separate GGUF UNet + standalone VAE + text encoder + text projection, not a single bundled checkpoint. The install scripts (see below) place files like this:
| Component | Node | Model file | Folder | Notes | |-----------|------|-----------|--------|-------| | UNet (GGUF) | UnetLoaderGGUF ("Unet Loader (GGUF)", bootleg category, from ComfyUI-GGUF) | ltx-2.3-22b-dev-Q4_K_S.gguf / -Q5_K_S.gguf / -Q8_0.gguf | models/unet/ | 22B dev model. Q4KS =0.21,.gguf models/latentupscalemodels/ltx-2.3-spatial-upscaler-x2-1.1.safetensors models/loras/ltx-2.3-22b-distilled-lora-384-1.1.safetensors models/loras/ltx-2-19b-ic-lora-detailer.safetensors
Custom nodes cloned by all three scripts:
| Node | Repo |
|------|------|
| ComfyUI-Manager | `github.com/ltdrdata/ComfyUI-Manager` |
| **ComfyUI-GGUF** (GGUF UNet loader) | `github.com/city96/ComfyUI-GGUF` |
| **ComfyUI-LTXVideo** (pin `cd5d371…` on RunPod) | `github.com/Lightricks/ComfyUI-LTXVideo` |
| rgthree-comfy | `github.com/rgthree/rgthree-comfy` |
| ComfyUI-Easy-Use | `github.com/yolain/ComfyUI-Easy-Use` |
| ComfyUI-KJNodes | `github.com/kijai/ComfyUI-KJNodes` |
| RES4LYF (advanced samplers e.g. res_2s) | `github.com/ClownsharkBatwing/RES4LYF` |
| ComfyUI-Custom-Scripts | `github.com/pythongosssss/ComfyUI-Custom-Scripts` |
| ComfyUI-VideoHelperSuite | `github.com/Kosinkadink/ComfyUI-VideoHelperSuite` |
| ComfyUI-WanVideoWrapper | `github.com/kijai/ComfyUI-WanVideoWrapper` |
| ComfyUI-Impact-Pack | `github.com/ltdrdata/ComfyUI-Impact-Pack` |
| Comfyui_TTP_Toolset | `github.com/TTPlanetPig/Comfyui_TTP_Toolset` |
| ComfyMath | `github.com/evanspearman/ComfyMath` |
| WhatDreamsCost-ComfyUI | `github.com/WhatDreamsCost/WhatDreamsCost-ComfyUI` |
### LoRAs (Installed)
| LoRA | File | Purpose |
|------|------|---------|
| **Distilled LoRA (384, 2.3)** | `loras/ltx-2.3-22b-distilled-lora-384-1.1.safetensors` | Apply to the 2.3 dev UNet for fast distilled behavior |
| **IC-LoRA detailer** | `loras/ltx-2-19b-ic-lora-detailer.safetensors` | Detail/refinement IC-LoRA |
| **Distilled LoRA (384, LTX-2)** | `ltx2/ltx-2-19b-distilled-lora-384.safetensors` | Apply to LTX-2 base for distilled behavior |
| **Camera Dolly Left** | `ltx-2-19b-lora-camera-control-dolly-left.safetensors` | Camera movement (see Camera Control section) |
### Concept/Style LoRAs (Installed)
Located in `loras/LTXV2/`:
- `style/PLORAV7_LTX_000010500.safetensors`
- `concept/head_swap_v1_13500_first_frame.safetensors`
- `concept/LTX-2 - Better Female Nudity.safetensors`
- `action/LTX2-i2v-OralSuite.safetensors`
- `action/LTX2-i2v-SexThrust.safetensors`
- And more in `concept/` and `action/` subfolders
## Key Nodes
### LTXVConditioning
Binds text conditioning with frame rate information:
```json
{
"class_type": "LTXVConditioning",
"inputs": {
"positive": ["", 0],
"negative": ["", 0],
"frame_rate": 25
}
}
EmptyLTXVLatentVideo
Creates the initial video latent (for T2V):
{
"class_type": "EmptyLTXVLatentVideo",
"inputs": {
"width": 768,
"height": 512,
"length": 97,
"batch_size": 1
}
}
Frame count constraint: Must be 8n + 1 (9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, 97, 105, 113, 121).
LTXVScheduler
Dedicated sigma schedule for LTX-V2 latent space:
{
"class_type": "LTXVScheduler",
"inputs": {
"steps": 8,
"max_shift": 2.05,
"base_shift": 0.95,
"stretch": true,
"terminal": 0.1
}
}
Connect the optional latent input for latent-aware shift scaling.
> Feeding a prior stage's output into I2V (e.g. Krea2 image → LTX video). The > LoadImage that feeds LTXVImgToVideo.image needs the source frame registered > as a ComfyUI INPUT. When that frame is an OUTPUT from an earlier stage, call > stage_output_as_input with its { filename, subfolder?, type? } and drop > the returned input filename into LoadImage. (For a file already on local > disk, upload_image.) NEVER copy the output file into, or guess, a > filesystem input/ path — ComfyUI's input/output dirs may be CUSTOM > (--input-directory / --output-directory), so a guessed path makes > LoadImage reject the file (Invalid image file) and wastes the render. > stage_output_as_input goes through the server API (/view → /upload/image) > and resolves the real dirs correctly.
> VERIFY A VIDEO RENDER VIA THE FILESYSTEM, NOT /history. VHS_VideoCombine > (and similar video nodes) write the .mp4 but frequently do NOT register the > output in ComfyUI's /history — the prompt shows done with an empty outputs map > and no error. Do NOT conclude the render "silently dropped" from > get_history / get_job_status alone. Confirm the file with > list_output_images (it now lists videos too, with kind: "video") — match > the filename_prefix (e.g. ltxv2_….mp4) and check the mtime is fresh — then > chain it into the next stage with stage_output_as_input.
LTXVImgToVideo (For I2V)
All-in-one node that encodes image, creates latent, and wraps conditioning:
{
"class_type": "LTXVImgToVideo",
"inputs": {
"positive": ["", 0],
"negative": ["", 0],
"vae": ["", 2],
"image": ["", 0],
"width": 768,
"height": 512,
"length": 97,
"batch_size": 1,
"strength": 0.6
}
}
> Gotcha — strength controls motion; DON'T set it to 1.0. LTXVImgToVideo.strength > is how strongly the output adheres to the start image: higher = more adherence = LESS > motion. Setting it to 1.0 pins every frame to the start image → a FROZEN i2v with > ZERO motion (the storyboard frames come out basically identical). Keep the verified > value ~0.6 (as in the example above) for proper motion. If a generated i2v clip > shows little/no motion, the FIRST thing to check is that strength wasn't bumped toward > 1.0.
LTXVLatentUpsampler (For Two-Stage Upscale)
{
"class_type": "LTXVLatentUpsampler",
"inputs": {
"latent": ["", 0],
"upscale_model": ["", 0]
}
}
Requires LatentUpscaleModelLoader. Use ltx-2.3-spatial-upscaler-x2-1.1.safetensors for LTX-2.3 (or ltx-2-spatial-upscaler-x2-1.0.safetensors for LTX-2).
Sampler Settings
Distilled Model (Installed)
Uses SamplerCustomAdvanced with manual sigmas, NOT standard KSampler:
| Parameter | Stage 1 (Generate) | Stage 2 (Upscale) | |-----------|--------------------|--------------------| | sampler | euler | euler | | steps | 8 | 4 | | cfg | 1.0 | 1.0 | | scheduler | LTXVScheduler | Manual sigmas |
Stage 1 sigmas (via LTXVScheduler): max_shift=2.05, base_shift=0.95, stretch=true, terminal=0.1
Stage 2 sigmas (manual, for upscale refinement): 0.909375, 0.725, 0.421875, 0.0
Base Model (If Using Distilled LoRA on Base)
| Parameter | Value | |-----------|-------| | sampler | res2s | | steps | 20 | | cfg | 4.0 | | scheduler | LTXVScheduler | | distilledlora_strength | 0.6 |
Resolution and Frame Count
Resolutions (Must be multiples of 32)
| Aspect | Stage 1 | After 2x Upscale | Notes | |--------|---------|---------
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: artokun
- Source: artokun/comfyui-mcp
- License: MIT
- Homepage: https://comfyui-mcp.artokun.io/docs
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.