T2V Pipeline
A whole text-to-video graph in one node, minus the honesty
- model
- clip
- vae
- character_conditioning
- video_latent
- preview_frames
- positive_cond
- pipeline_report
Normally a text-to-video graph is a dozen nodes: model loader, text encoders, two prompt encodes, latent noise, sampler, VAE decode, save. T2V Pipeline collapses the middle of that into one node you wire a MODEL, a CLIP and a VAE into. It's a convenience wrapper, and provided you understand one thing about it - the HDR part is prompt text, not pixels - it's a genuinely pleasant way to run video.
What it does
You give it model, clip and vae, two prompts, a size, a frame count and a seed, and it does the whole sampling loop through ComfyUI's own sampler infrastructure. No custom kernels, no shipped weights. The pack's own header for this file lists the supported families: LTX-Video 2.x, HunyuanVideo, Wan 2.1, CogVideoX, Mochi-1. Image models are rejected outright - a 2-D latent model gets a clear error instead of a strange result.
The HDR controls deserve the honest framing up front. peak_nits, target_gamut and hdr_eotf append descriptors to your prompt text - "wide color gamut rec2020 vivid, HDR10 PQ specular highlights, 1000 nits HDR" and so on. Pixel change: none. The node's docs say it twice: "Prompt text only, no pixel change." What they do is steer a model that has seen HDR-described footage toward a punchier, specular-heavy look. hdr_strength (default 0.5) is the weight of that appended text, encoded as (text:weight) with weight = 2 × strength. 0.5 is neutral, 1.0 doubles the emphasis, 0 leaves it out entirely.
That's not a scam, it's just a different job from the pack's HDR Decode nodes. If you want real PQ pixels, sample here and encode later with Video HDR Decode.
The settings that matter
frames (default 25) - the tooltip is the most useful line in the node: the latent holds ceil(frames / temporal compression) frames, so use a multiple of the compression plus 1 (25, 49, 81) to get exactly this many frames back. Ask for 24 and you'll get a slightly different count than you asked for.
steps and cfg default to 0, which means "use the model default" - the LTX-Video preset's 25 steps and 3.5 CFG when no dit_config is connected. Don't read 0 as "zero guidance"; it's "you decide, node."
dit_config is the string output of Video Model Info. Connect it and, if it carries a model_name, that model's defaults replace steps, cfg, sampler_name and scheduler - the widgets stop mattering. This is the difference between an LTX clip and a Wan clip sampling correctly, so it's worth the extra node.
character_conditioning is optional CONDITIONING whose tokens get appended to the positive prompt at weight 0.75; it's skipped without complaint if the embedding width differs. cfg_schedule_json takes a JSON float array from the pack's CFG schedule node and uses only its first value - a static override, because CFG doesn't vary per step here. The known-issues file says that plainly rather than pretending otherwise.
Outputs: video_latent, preview_frames, positive_cond and pipeline_report. The preview is decoded through your VAE so you can look at a frame without a separate decode node - convenient, and it does cost VRAM, so on a long clip it's the first thing to disconnect.
Install
Manager → search Radiance → Install → restart → refresh. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt
Windows portable users: python_embeded\python.exe. Note this node ships no model weights and no video codecs - you still need your own video model, VAE and text encoder, which for a 2026 setup means something like LTX 2.3 or Wan 2.2 loaded through the pack's own Video Loader (or ComfyUI's). Gated repositories on Hugging Face need the licence accepted and HF_TOKEN set.
Where people get burned
The frame-count arithmetic above, mostly - expecting exactly frames back from a non-conforming number.
Then the decode: the latent is not a video file. Wire video_latent into Video Batch Decode (turn output_linear on if the next node is an HDR one), and note the pack's own warning that the VAE is lossy in the highlights - "HDR through a VAE" is documented in the known-issues list, so don't judge a final HDR master by what the preview frame looks like.
And read pipeline_report. It's the node's own account of what it actually ran, which is the fastest way to discover that your dit_config overrode the steps you carefully set.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Video diffusion model. Image models (2-D latents) are rejected. | |
| clip | CLIP | Text encoder matching the model, used for both prompts. | |
| vae | VAE | VAE matching the model. Its compression sets the latent shape and it decodes preview_frames. | |
| positive_prompt | STRING | cinematic HDR video, stunning visuals, 4K, film grain | What to generate. HDR descriptors from peak_nits, target_gamut and hdr_eotf are appended unless hdr_strength is 0. |
| negative_prompt | STRING | watermark, blurry, low quality, sdr, flickering | What to steer away from, encoded with the same text encoder. |
| width | INT | 76864–4096 | Output width in pixels, rounded down to a multiple of the VAE's spatial compression. |
| height | INT | 51264–4096 | Output height in pixels, rounded down to a multiple of the VAE's spatial compression. |
| frames | INT | 251–512 | Requested frames. The latent holds ceil(frames / temporal compression) frames; use a multiple of the compression plus 1 (e.g. 25, 49, 81) to get exactly this count back. |
| seed | INT | 00–2147483648 | Seed for the initial noise and the sampler. |
| dit_configopt | STRING | {} | JSON from RadianceVideoModelInfo. When it carries a model_name, that model's defaults replace steps, cfg, sampler_name and scheduler. |
| character_conditioningopt | CONDITIONING | Optional conditioning whose tokens are appended to the positive prompt at weight 0.75. Skipped if its embedding width differs. | |
| cfg_schedule_jsonopt | STRING | JSON float array from RadianceAudioCFGSchedule. Only the first value is used, as a static CFG override; CFG does not vary per step. | |
| stepsopt | INT | 00–200 | Sampling steps. 0 uses the model default (the LTX-Video preset's 25 when no dit_config is connected). Ignored when dit_config carries a model_name. |
| cfgopt | FLOAT | 0.00–30 | Guidance scale. 0 uses the model default (the LTX-Video preset's 3.5 when no dit_config is connected). cfg_schedule_json overrides it. |
| sampler_nameopt | COMBO | euler | ComfyUI sampler. Ignored when dit_config carries a model_name. |
| scheduleropt | COMBO | normal | ComfyUI sigma scheduler. Ignored when dit_config carries a model_name. |
| peak_nitsopt | COMBO | 1000 | Adds '<n> nits HDR' to the prompt. Prompt text only, no pixel change; 100 requests an SDR look. |
| target_gamutopt | COMBO | BT.2020 | Adds the selected gamut descriptor to the prompt. Prompt text only, no pixel conversion. |
| hdr_eotfopt | COMBO | PQ (ST.2084) | Adds a transfer-function descriptor to the prompt. Prompt text only, no pixel encoding. |
| hdr_strengthopt | FLOAT | 0.500–1 | Prompt weight of the appended HDR descriptors (gamut, EOTF, peak nits), as (text:weight) with weight = 2 x strength: 0.5 is neutral, 1.0 doubles their emphasis, 0 leaves them out. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| video_latent | LATENT | — |
| preview_frames | IMAGE | — |
| positive_cond | CONDITIONING | — |
| pipeline_report | STRING | — |