LTX Prompt Relay Encode + Temporal LoRA
Prompt Relay that makes a LoRA stronger in one scene and weaker in the next
- model
- clip
- latent
- model
- positive
Here's the itch this node scratches: Prompt Relay lets you schedule prompts across a video - this segment is a zombie chase, that segment is a calm alley - but your LoRA is stuck at one strength for the whole clip. So the scene that wants a heavy style LoRA and the scene that doesn't are out of luck. LTXPromptRelayEncodeWithTemporalLora fixes that by letting you schedule up to four LoRAs independently per segment, with their strength following the same segment timeline as the prompts. It's Prompt Relay Encode plus a temporal LoRA scheduler in one node.
How it works. First it does the standard relay encode: splits global_prompt + local_prompts (pipe-separated), converts segment_lengths from pixel frames to latent frames, builds the per-segment token mask, and patches the model's attention. Then, for each enabled LoRA slot, it parses lora_segment_weights (a comma-separated list, one weight per segment), builds a per-token strength mask across the whole latent, and applies the LoRA through per-token multiplier hooks - so a module's effective LoRA weight scales frame by frame instead of sitting constant. lora_fade_frames (per slot, default 0) crossfades between segment strengths over the given number of frames instead of snapping. There are four identical slots (lora_name through lora_name_4), each with lora_segment_weights, lora_model_strength (default 1), lora_clip_strength (default 0), and lora_fade_frames. Leave a slot's name blank and it's skipped.
What you actually set. latent must be an empty video latent - its shape defines the timeline, so the node reads dimensions from it. local_prompts is one prompt per segment, pipe-separated ("zombie chase|calm alley"), and segment_lengths is the matching comma list. epsilon (0.001) is the boundary sharpness as usual. Then for each LoRA: pick lora_name, give lora_segment_weights one value per segment, and set lora_fade_frames if you want gradual handoffs. debug_temporal_lora turns on console logging so you can watch the mask get built. Outputs are just model and positive - the patched model and the relay conditioning, wired straight into your sampler.
Install - the pack's one-liner:
cd ComfyUI/custom_nodes
git clone https://github.com/Yogurt1192/LTXDirector-Extender.git
Restart ComfyUI, and note the README's important caveat: this node is a standalone opt-in path, deliberately not validated inside the LTX Director extension flow. The author kept it separate on purpose so a regression could be traced to either the extension timing fixes or the LoRA scheduling layer, not guessed at. Use it standalone; if you merge it into an extender workflow, expect to be the tester.
Where people get burned. The weight list must match the number of segments exactly, or you get a validation error. Weights are clamped to 0–1.5 (the source logs a warning if you exceed that). If a LoRA resolves to zero model patches, it's almost certainly architecture-incompatible with LTX - the node raises instead of silently doing nothing, which is the good kind of failure. And don't expect lora_clip_strength to do temporal things: the source warns that clip-side temporal modulation isn't implemented, so leave it at 0 and put your schedule in lora_model_strength territory.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| latent | LATENT | Empty latent video — dimensions are read from its shape. | |
| global_prompt | STRING | — | |
| local_prompts | STRING | — | |
| segment_lengths | STRING | — | |
| epsilon | FLOAT | 0.00100.000001–0.99 | — |
| lora_name | COMBO | LoRA slot 1. Leave blank to disable. | |
| lora_segment_weights | STRING | — | |
| lora_model_strength | FLOAT | 1.000–2 | — |
| lora_clip_strength | FLOAT | 0.000–2 | — |
| lora_fade_frames | INT | 00–200 | — |
| lora_name_2 | COMBO | LoRA slot 2. Leave blank to disable. | |
| lora_segment_weights_2 | STRING | — | |
| lora_model_strength_2 | FLOAT | 1.000–2 | — |
| lora_clip_strength_2 | FLOAT | 0.000–2 | — |
| lora_fade_frames_2 | INT | 00–200 | — |
| lora_name_3 | COMBO | LoRA slot 3. Leave blank to disable. | |
| lora_segment_weights_3 | STRING | — | |
| lora_model_strength_3 | FLOAT | 1.000–2 | — |
| lora_clip_strength_3 | FLOAT | 0.000–2 | — |
| lora_fade_frames_3 | INT | 00–200 | — |
| lora_name_4 | COMBO | LoRA slot 4. Leave blank to disable. | |
| lora_segment_weights_4 | STRING | — | |
| lora_model_strength_4 | FLOAT | 1.000–2 | — |
| lora_clip_strength_4 | FLOAT | 0.000–2 | — |
| lora_fade_frames_4 | INT | 00–200 | — |
| debug_temporal_lora | BOOLEAN | false | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |