LTX Director (Koolook)
The legacy LTX Director ID that keeps old workflows alive
- model
- clip
- audio_vae
- optional_latent
- model
- positive
- video_latent
- audio_latent
- guide_data
- frame_rate
- combined_audio
If you search ComfyUI for "LTX Director" you'll find two nodes with the same display name, and this is the one you probably shouldn't add. LTXDirector__koolook_v1_3_2 is the compatibility alias Koolook keeps registered so saved workflows from the v1.3.2 era keep opening after an upgrade. The active Director is LTXDirector__koolook; this ID is backed by the v1.3.9-era implementation (LTXDirectorLegacyV132). It exists for your old JSON files, not for your new project.
What it is
When Koolook bumped its Director fork from upstream v1.3.x to v2.0.2, it deliberately kept the old node ID registered. ComfyUI workflows store node IDs by name, so without the alias, every saved workflow referencing LTXDirector__koolook_v1_3_2 would fail to load. The alias preserves your library while the canonical ID rolls to the new implementation. The name is a lie in one sense - it's not actually the old code running, it's a legacy-input-contract wrapper - but the ID stays stable, which is what saved workflows care about.
How it differs from the current Director
The v1.3.2 contract is the older Koolook shape. It has relay_overrides (a JSON dict of per-stream Prompt Relay overrides - video_strength, video_window_scale, audio_strength, audio_window_scale, audio_epsilon) and audio_transcript_json (a timed speech transcript that auto-builds local_prompts, segment_lengths, and timeline_data before Prompt Relay conditioning runs). Both were dropped as unused in the v2.0.2 node. It also lacks everything the new node gained: no reference_images/Ghost Mask, no keyframe_ease, no snap_keyframes_to_grid, no motion_guide_data output, no clean_latent_frames/clean_pixel_frames. Same timeline editor, older contract.
The inputs that matter
Everything else works like the Director you already know: global_prompt conditions the whole clip and anchors persistent characters; duration_frames only sets the timeline's visual scale (real frame count comes from the latent); epsilon controls Prompt Relay's penalty decay (0.001 paper default for sharp segment boundaries, 0.5+ for softer); and timeline_data, local_prompts, segment_lengths, guide_strength are all auto-populated from the timeline editor - don't hand-edit them unless you're recovering a saved state. Optional audio_vae and optional_latent override the auto-generated audio and video latents; use_custom_audio toggles between timeline audio and generated audio.
Outputs: model, positive conditioning, video_latent, audio_latent, guide_data (into your LTXDirectorGuide), frame_rate, and combined_audio.
What to actually do with it
Three cases. Your old workflow won't load: don't panic, this ID is why - it keeps loading against the v1.3.9 implementation. You're starting fresh: add LTXDirector__koolook instead, because that's where every new feature (ghost references, keyframe ease, motion guides) lives. And if you relied on relay_overrides or audio_transcript_json in a saved graph, know that the v2.0.2 node won't have them - port those workflows or keep the alias around deliberately.
Installing it
Same pack, same steps: ComfyUI Manager → Install Custom Nodes → "ComfyUI-Koolook", restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/malkuthro/ComfyUI-Koolook.git
Restart after. It needs the same LTX/Prompt Relay ecosystem as the main Director - LTXDirectorGuide and friends come from the WhatDreamsCost or Lightricks packs, and the Koolook fork only ships the Director itself. And the README's standing one-install warning: Manager installs land in custom_nodes/koolook/, so don't combine Manager with a manual clone or the workflow store can corrupt on restart.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| global_prompt | STRING | Conditions the entire video. Anchors persistent characters, objects, and scene context. | |
| duration_frames | INT | 1201–10000 | Total timeline length in pixel-space frames. Used by the editor for visual scale only. |
| duration_seconds | FLOAT | 5.000.1–1000 | Total timeline duration in seconds (computed/synced from frames). |
| timeline_data | STRING | JSON state of the timeline editor (auto-managed; do not edit by hand). | |
| local_prompts | STRING | Auto-populated from the timeline editor. | |
| segment_lengths | STRING | Auto-populated from the timeline editor (pixel-space frame counts). | |
| epsilon | FLOAT | 0.00100.0001–0.99 | Penalty decay parameter. Values below ~0.1 all produce sharp boundaries (paper default 0.001). For softer transitions, try 0.5 or higher. |
| guide_strength | STRING | Auto-populated from the timeline editor (comma-separated guide strengths for image segments). | |
| audio_vaeopt | VAE | Optional. Connect an Audio VAE to generate audio latents. | |
| optional_latentopt | LATENT | Optional. Connect a latent to override the auto-generated one. | |
| use_custom_audioopt | BOOLEAN | false | Toggle between using timeline audio (ON) and generating audio from scratch (OFF). |
| frame_rateopt | FLOAT | 241–240 | Frames per second — only affects how time is displayed in the timeline editor when time_units is set to 'seconds'. |
| display_modeopt | COMBO | seconds | Display the ruler, segment ranges, length input, and total in frames or seconds. Internal storage is always pixel-space frames. |
| custom_widthopt | INT | 00–8192 | Target output width for all image segments. Set to 0 to use the original image width. |
| custom_heightopt | INT | 00–8192 | Target output height for all image segments. Set to 0 to use the original image height. |
| resize_methodopt | COMBO | maintain aspect ratio | How to resize image segments to fit the target dimensions. |
| divisible_byopt | INT | 321–256 | Snap the final output image dimensions to be divisible by this number (e.g. 32 for LTX). |
| img_compressionopt | INT | 180–100 | H.264 CRF compression to apply to each guide image. 0 = no compression, higher = more artefacts. |
| relay_overridesopt | STRING | Koolook: JSON dict of Prompt Relay per-stream overrides. Empty = upstream defaults. Supported keys: video_strength (float), video_window_scale (float), audio_strength (float), audio_window_scale (float), audio_epsilon (float). Example: {"video_strength": 10.0}. Underscore-prefixed keys are ignored. | |
| audio_transcript_jsonopt | STRING | Koolook: optional timed speech transcript JSON. Paste or link {"phrases":[{"start":0,"end":0.5,"text":"What?"}]} to auto-build local_prompts, segment_lengths, and timeline_data before Prompt Relay conditioning runs. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| video_latent | LATENT | Auto-generated LTXV empty latent (only populated when no latent is connected). |
| audio_latent | LATENT | Auto-generated audio latent (uses custom audio if enabled). |
| guide_data | GUIDE_DATA | — |
| frame_rate | FLOAT | The frame rate used for the timeline. |
| combined_audio | AUDIO | Combined timeline audio layout. |