Skip to content
Docs

Using LTX 2.3 Video on Chutes

LTX 2.3 is Lightricks' 22B joint audio-video foundation model: it generates video and a synchronized soundtrack in one pass. On Chutes it runs as an 8-step FP8 distilled deployment covering text-to-video, image-to-video, and multi-keyframe interpolation through a single endpoint.

Overview

LTX 2.3 updates LTX-2 (paper: "LTX-2: Efficient Joint Audio-Visual Foundation Model", arXiv 2601.03233) with improved audio and visual quality and stronger prompt adherence. It is a DiT-based model that produces synchronized video and audio within a single model rather than pairing separate generators. Lightricks publishes several checkpoints; the full trainable model is ltx-2.3-22b-dev, and this chute serves ltx-2.3-22b-distilled-1.1, distilled to run in 8 steps at CFG=1 with, per Lightricks, a different aesthetic and improved audio versus distilled 1.0. Weights are released under the LTX-2 Community License Agreement.

The runtime checkpoint here is ltx23-2.3-distilled-1.1-fp8-merged.safetensors: the FP8-scaled transformer from Kijai/LTX2.3_comfy merged with BF16 video and audio VAEs, text projection, and the Lightricks x2 spatial upscaler, using the Comfy-Org FP8 Gemma text encoder from the LTX-2 repo.

Model specifications

PropertyValue
Parameters22B (per Lightricks checkpoint naming)
ArchitectureDiT-based joint audio-video foundation model
ModesText-to-video, image-to-video, multi-keyframe interpolation
AudioSynchronized, generated jointly (on by default)
Inference stepsFixed at 8 (distilled-1.1, CFG=1)
Resolution256x256 up to 3840x2160; snapped to multiples of 64 on this chute
Duration~20 s at 480p-1080p, ~10 s at 1440p, ~5 s at 4K width
Frame rate8-50 fps, default 24; frame count snapped to Nx8+1
LicenseLTX-2 Community License Agreement
PrecisionFP8 transformer + BF16 VAE/text-projection/upscaler (as served)
ReleaseMarch 2026 (Lightricks/LTX-2.3 on Hugging Face)

Quick start

Own-host chute: POST a flat JSON body to /generate. Only prompt is required; the response is raw MP4 bytes (with audio) unless return_json is true.

curl -X POST "https://vonkaiser-ltx-23-video.chutes.ai/generate" \
  -H "Authorization: Bearer $CHUTES_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "rain on a neon-lit street at night, a taxi passes, distant thunder",
    "width": 768,
    "height": 512,
    "duration": 6,
    "generate_audio": true,
    "guidance_scale": 3.1
  }' \
  --output output.mp4
import base64
import os
import requests

resp = requests.post(
    "https://vonkaiser-ltx-23-video.chutes.ai/generate",
    headers={"Authorization": f"Bearer {os.environ['CHUTES_API_KEY']}"},
    json={
        "prompt": "the portrait comes alive, she smiles and turns toward the window",
        "input_image_b64": base64.b64encode(open("portrait.png", "rb").read()).decode(),
        "width": 768,
        "height": 512,
        "duration": 5,
        "generate_audio": True,
        "guidance_scale": 3.1,
    },
    timeout=900,
)
resp.raise_for_status()
open("output.mp4", "wb").write(resp.content)
const resp = await fetch("https://vonkaiser-ltx-23-video.chutes.ai/generate", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.CHUTES_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    prompt: "a paper boat drifts down a gutter stream after rain, close tracking shot",
    width: 1280,
    height: 704,
    duration: 6,
    video_format: "mp4",
  }),
});
const { writeFile } = await import("node:fs/promises");
await writeFile("output.mp4", Buffer.from(await resp.arrayBuffer()));

For keyframe interpolation, send a keyframes array of 2+ entries (base64 image + frame index, optional strength/crf); at least one keyframe must be at frame index 0, and keyframes takes precedence over input_image_b64.

Parameters and tuning

FieldDefaultEffect
promptrequiredScene, motion, and sound description
width x height768 x 512Snapped to multiples of 64 (256-3840 x 256-2160); 1920x1080 becomes 1920x1088
duration / num_frames / fps~4 s at 24 fpsDuration derives frame count; num_frames snaps to Nx8+1; fps 8-50
guidance_scale3.1Prompt adherence vs. naturalness; chute readme documents 1.0-5.1
generate_audiotrueJoint soundtrack in the MP4
negative_prompt"shaky, glitchy, low quality, worst quality, deformed, distorted"Artifact suppression
enhance_promptfalseOn-GPU Llama 3.2 3B prompt rewrite (+Florence-2 captioning for I2V/keyframe); adds 1-3 s
num_inference_steps8 (fixed)Silently overridden to 8 regardless of input
seed / use_random_seedrandomSet seed with use_random_seed: false for reproducibility
video_format"mp4"mp4 or webm

Step count and CFG are baked in by distillation, so guidance_scale, prompt quality, and resolution/duration choices are your main levers. Lightricks' prompting guide emphasizes descriptive, cinematic prose; if your prompt is terse, enhance_prompt does that expansion for you on GPU.

What it's best at

The standout feature is sound: one call returns a clip with a synchronized soundtrack, which removes an entire post-production step for social clips, mood pieces, animatics, and product teasers. Image-to-video animates a still with matching audio, and keyframe interpolation generates coherent motion through multiple anchor frames, useful for controlled transitions and storyboard-driven shots. The 8-step distilled schedule keeps latency low for a 22B model, and 4K-width output is available for short clips.

Honest limits: durations cap at roughly 20 seconds and shrink as resolution rises; steps are fixed so you cannot trade time for extra quality; audio without speech can be lower quality per the model card; and like all video diffusion models it will not render reliable factual or text-heavy content.

How Chutes serves this model

The chute runs on a single RTX 6000 Pro (80 GB VRAM) with the merged FP8 transformer and BF16 VAE stack described above, on its own host with a flat JSON body. Output is streamed back as raw video bytes; return_json: true switches to a JSON envelope. The optional prompt enhancer (Llama 3.2 3B via SGLang, plus Florence-2 for image inputs) runs on the same GPU. See the model page, llms.txt, and openapi.json.

FAQ

Does LTX 2.3 really generate audio with the video?

Yes. LTX-2 is a joint audio-visual foundation model, and this chute has generate_audio: true by default, so the returned MP4 includes a synchronized soundtrack. Lightricks notes audio without speech can be lower quality. Set generate_audio: false for silent output.

Can I change the number of inference steps or use CFG like the full model?

No. This deployment runs the distilled-1.1 checkpoint, which is trained for exactly 8 steps at CFG=1; the endpoint silently overrides any num_inference_steps you send. You can still tune guidance_scale (default 3.1, range 1.0-5.1 per the chute readme).

How does keyframe interpolation work?

Pass a keyframes array of 2 or more entries, each with a base64 image and a frame index (optionally strength and crf); at least one must have frame index 0. The model generates coherent motion through the anchors. keyframes takes precedence over input_image_b64.

What resolutions and durations are supported?

Width and height snap to multiples of 64, from 256x256 up to 3840x2160. Duration caps scale with resolution: roughly 20 seconds at 480p-1080p, 10 seconds at 1440p, and 5 seconds at 4K width. Frame counts snap to Nx8+1 and fps runs 8-50 (default 24).

How do I call the API?

POST a flat JSON body to https://vonkaiser-ltx-23-video.chutes.ai/generate with Authorization: Bearer $CHUTES_API_KEY. Only prompt is required. The response is raw video bytes (mp4 by default, webm optional); set return_json: true to get JSON instead.

Can I use the output commercially?

The weights are under the LTX-2 Community License Agreement, not a standard OSI license. Review the license at github.com/Lightricks/LTX-2/blob/main/LICENSE for the permitted-use terms that apply to your case.

What does enhance_prompt do and should I use it?

It expands your prompt on-GPU with Llama 3.2 3B Instruct before generation, and for I2V/keyframe jobs also captions the first image with Florence-2 so the rewrite matches your input. It is off by default and adds 1-3 seconds. Use it for terse prompts; skip it when you have already written a detailed prompt.

Why did my 1920x1080 request come back as 1920x1088?

The chute snaps dimensions to multiples of 64, so 1080 rounds to 1088. Either accept the snap or request dimensions that are already multiples of 64.

Sources