AgentStack
SKILL verified MIT Self-run

Ltxv2 Video

skill-artokun-comfyui-mcp-ltxv2-video · by artokun

Build Lightricks LTX-2 / LTX-2.3 video workflows — text-to-video, image-to-video, GGUF and bundled checkpoints, distilled model, camera control LoRAs, synchronized audio, two-stage upscaling, and swapping alternate/GGUF base models

No reviews yet
0 installs
14 views
0.0% view→install

Install

$ agentstack add skill-artokun-comfyui-mcp-ltxv2-video

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No 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.

Are you the author of Ltxv2 Video? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

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-2split_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.3split_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-2split_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 via comfy.sd.load_clip([gemma, ckpt], type=LTXV). This is the audio-video encoder driving both video and audio/voice. Do NOT use DualCLIPLoader(type=ltxv) + a separate ltx-2.3_text_projection file — 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 CFGGuider cfg=1 (distilled); the LTXVideo repo example uses MultimodalGuider + 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_VideoCombine fail with ffmpeg ... could not be found otherwise.

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; use LTXAVTextEncoderLoader.
  • 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: success but no video file / outputs only 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 for Failed to validate prompt for output N and fix that node (missing ffmpeg, a broken connection, a model-not-in-list).
  • DualCLIPLoader reshape [15360,1920] invalid for input 27582328 → wrong/truncated gemma → use gemma_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 history outputs entry isn't under images/videos/gifs, so a naive "find the video" check misses it. Look on disk under output/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 via dynamic_paths/finalize_prefix. A flat key is rejected required_input_missing.
  • Reroute is virtual — its connections must be passed through (consumer resolves to the Reroute's input), else everything downstream dangles and the graph short-circuits.
  • VHS_VideoCombine stores widgets_values as 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's widgets_values by 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.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.