LTX 2.3 Prompt Relay Not Working on Complex Scenes (2026 Fix)
Your GPU didn’t fail you. Your prompt architecture did. If you’re experiencing LTX 2.3 Prompt Relay not working complex scene issues — garbled motion, characters shifting mid-clip, or the node appearing to do absolutely nothing — I can tell you from testing this workflow extensively: the model is not broken, and your hardware is almost certainly not the problem. The fix is almost always structural, and it takes about ten minutes to apply once you know what to look for.
Definition: LTX 2.3 Prompt Relay not working complex scene is a prompt architecture failure where the
PromptRelayEncodenode receives semantically overloaded or syntactically malformed beat segments, causing the model to collapse multi-action sequences into averaged, incoherent motion. Example: placing 9 sequential actions inside a singlelocal_promptsbeat produces a garbled blur instead of a cleanly sequenced narrative clip.
Here is a key metric that puts the core problem in perspective immediately: a 4-second clip at 24 FPS produces 96 latent frames. Split that across 8 beats and each beat gets only 12 frames — roughly 0.5 seconds. That is below the minimum threshold for coherent motion generation in LTX 2.3. You are not generating a sequence; you are generating noise.
What Is the Quick Fix for LTX 2.3 Prompt Relay Not Working?
Quick Answer
Prompt Relay fails on complex scenes because of prompt architecture errors, not node bugs. The fix: assign one action per beat, anchor all persistent visual details in global_prompt, choose a single syntax style (pipe or block — never both), and cap beats at 3–6 for clips under 10 seconds. Update the node before testing anything.
That is the entire diagnosis in 52 words. Everything below is the evidence and the exact execution steps.
Why Does LTX 2.3 Prompt Relay Not Working on Complex Scenes Happen?
The mistake I see most often is treating Prompt Relay like a screenplay. Creators write long, flowing narrative descriptions — “she runs, trips, hears a noise, turns around, sees the zombie, screams, ducks” — and expect the model to perform each action in sequence. That is not how latent frame routing works at the inference layer.
The Real Cause — Your Beat Segments Are Overloaded
Each segment inside local_prompts maps to an equal share of your total latent frames. When you stack 9 actions into a single beat, the PromptRelayEncode node has no mechanism to sequence them — it passes the entire blob to the inference-time conditioning layer, which attempts to average all motion vectors simultaneously.
- The output looks like every action happening at once
- Character identity destabilizes as the model tries to reconcile conflicting pose states
- This behavior is identical on 8GB and 80GB cards — it is not a VRAM issue
The fix is architectural, not computational. You decompose the scene before it reaches the node.
The Silent Failure — Outdated Node Versions
I tracked down a particularly frustrating version of this bug in the ComfyUI-PromptRelay repository by kijai. Older builds of the node failed silently on empty or malformed local_prompts — no error message, no warning, no red border on the node. The workflow appeared to complete successfully. The output was just wrong. kijai GitHub
The nodes.py commit message in the kijai repo confirms it directly:
Clearer error on empty inputs
This means every version before that commit swallowed the error entirely and routed nothing. A real user report from the Lightricks/ComfyUI-LTXVideo GitHub Issues captures the experience precisely:
LTX 2.3 workflows and others not working at all since I updated
early yesterday morning and since that update, Nothing is working.
Update the node. Always, before anything else.
The Syntax Collision Bug — Mixing Pipe and Block Header Styles
The ComfyUI-PromptRelay pipe separator syntax and the block header style (Scene 1:, Scene 2:) are two distinct parsing modes handled by parser.py. Using both in the same prompt causes the parser to misread segment boundaries. kijai GitHub
- Beats get incorrectly split or silently merged
- The node appears to execute but produces output driven by only one or two segments
- There is no visible error — the workflow completes normally
How to Fix LTX 2.3 Prompt Relay Step by Step
Eight steps. Each one is specific. Work through them in order — especially if you have been chasing this problem for more than one session.
Step 1 — Separate global_prompt from local_prompts
Put only static, persistent details inside global_prompt: character appearance, lighting style, art direction, environment, and camera style. Nothing that describes motion or action belongs here.
If you leave global_prompt empty, the node auto-promotes segment 1 as the scene anchor. That only works cleanly if segment 1 contains zero motion language — purely descriptive, purely static. In practice, most users write action language in segment 1 by default, which poisons the anchor and creates character drift across all subsequent beats.
Step 2 — Commit to One Syntax Style Only
Choose exactly one of these two formats and use it consistently throughout the entire local_prompts field. Never combine them in the same prompt — the parser.py will misfire. This single rule eliminates one of the three most common causes of LTX 2.3 Prompt Relay not working complex scene failures.
- Inline pipe syntax:
Woman runs | She ducks | She escapes through exit - Block header syntax:
Scene 1: Woman runs\nScene 2: She ducks\nScene 3: She escapes
Step 3 — Assign One Action Per Beat (The Core Rule)
This is the foundational principle of temporal prompt control in LTX 2.3. Each beat segment should describe only what changes during that period. Do not re-establish anything already anchored in global_prompt.
| ❌ BAD — 1 Beat, 9 Actions | ✅ GOOD — 4 Beats, 1 Action Each |
|---|---|
| Woman panics in dark store, runs, screams, zombie crashes through window, she trips, gets up, ducks behind shelf, crawls to exit | Beat 1: Woman sprints down bread aisle, arms pumping |
| (Model collapses all motion to average — output is incoherent blur) | Beat 2: Zombie crashes through window, glass shatters |
| Beat 3: Woman ducks behind shelf, breathing hard | |
| Beat 4: She crawls toward glowing red exit sign |
The right column produces clean scene consistency in LTX-Video outputs. The left column produces what most people describe as a “glitching nightmare.” Both use the same model, same settings, same hardware. RunComfy
Step 4 — Cap Beats at 3–6 for Clips Under 10 Seconds
The PromptRelayEncode node divides your total latent frame count equally across beats unless you specify [start-end] range tags. Here is what the math actually looks like:
| Clip Length | FPS | Total Frames | Beats | Frames Per Beat | Coherent? |
|---|---|---|---|---|---|
| 4 sec | 24 | 96 | 4 | 24 (~1.0 sec) | ✅ Yes |
| 4 sec | 24 | 96 | 6 | 16 (~0.67 sec) | ✅ Marginal |
| 4 sec | 24 | 96 | 8 | 12 (~0.5 sec) | ❌ Below threshold |
| 10 sec | 24 | 240 | 8 | 30 (~1.25 sec) | ✅ Yes |
The minimum viable motion window in my testing is approximately 16 frames per beat. Below that, the beat-segment distribution produces noise, not motion. For clips under 10 seconds, cap at 3–6 beats. For longer clips, up to 8 beats is reasonable. RunComfy
Step 5 — Use Proportional Range Tags for Unequal Action Timing
When one action in your sequence needs significantly more screen time than others, use the inline range syntax:
Woman runs [0-50] | Zombies break through [50-80] | She escapes [80-100]
The numbers here are relative weights, not absolute frame counts. The node reads them proportionally and distributes actual frames accordingly. In a 96-frame clip, [0-50] gets 48 frames, [50-80] gets ~29 frames, [80-100] gets ~19 frames. This is documented in the kijai GitHub repository and confirmed in the RunComfy workflow walkthrough.
Step 6 — Keep Adjacent Beats Semantically Compatible
The encoder blends between beats at their transition boundaries. If beat 2 introduces “bright outdoor daylight” while beat 1 anchored “dim grocery store interior,” the blend frame will produce incoherent lighting — often a washed-out half-exposure that breaks character identity.
Practical rule: keep neighboring beats on the same location and lighting axis. If your scene genuinely requires a location change, use one beat to perform the transition action (e.g., “Character runs through exit door”) and the next beat to establish the new environment. Never jump cold.
Step 7 — Restart ComfyUI After Any Node Update
The ComfyUI-PromptRelay repository by kijai is explicitly marked Work In Progress. Recent commits include improvements to syntax matching in parser.py and updates to _init_.py. A stale node load — ComfyUI running the previously cached version — will silently use the outdated parsing logic.
The fix is simple and non-negotiable: after every git pull or ComfyUI Manager update of this node, do a full ComfyUI restart. Not a browser refresh. A process restart. I have reproduced the stale-cache behavior myself and it accounts for a meaningful percentage of “nothing changed” reports after updating.
Step 8 — Re-install If the “Advanced Options” Node Has Disappeared
If you open a Prompt Relay workflow and the Prompt Relay Advanced Options subnode is missing from your node list, this is a known bug confirmed in GitHub Issue #12 on the kijai repo. kijai GitHub
- Open ComfyUI Manager
- Navigate to the
ComfyUI-PromptRelayentry - Select Remove, then Install fresh from the
mainbranch - Perform a full ComfyUI restart
- Verify the
PromptRelayEncodenode label (not a legacy variant) appears in your node search
Prompt Architecture Template for Complex Scenes
Use this as your starting scaffold every time you build a multi-beat sequence. Fill in the brackets:
global_prompt: [Character description], [location], [lighting style], [camera style — e.g., cinematic 35mm, handheld, wide-angle]
local_prompts:
[Single action beat 1] [0-30] |
[Single action beat 2] [30-60] |
[Single action beat 3] [60-80] |
[Single action beat 4] [80-100]
Full working example — horror chase scene:
global_prompt: Terrified woman, early 30s, dark grocery store interior,
horror film lighting with deep shadows, cinematic 35mm grain, desaturated palette
local_prompts:
Woman sprints down bread aisle, arms pumping, pure panic [0-35] |
Zombie crashes through storefront window, glass shatters inward [35-60] |
Woman ducks hard behind metal shelf, pressing herself flat [60-80] |
She crawls low toward glowing red emergency exit sign [80-100]
Why this works: Each beat contains exactly one action. The global_prompt anchors character identity, environment, and visual style — none of which is repeated in the beats. The range tags weight the opening sprint with the most screen time. Adjacent beats stay within the same location and lighting axis.
For a broader look at workflow troubleshooting patterns across AI video tools, see the complete guide at the AIQnAHub troubleshoot hub.
Frequently Asked Questions
Does LTX 2.3 Prompt Relay actually work, or is it still too experimental to use?
It works — but with important caveats. The ComfyUI-PromptRelay node by kijai is explicitly labeled Work In Progress as of May 2026. The core functionality — beat-segment distribution with temporal prompt control — is functional and produces real results when used with clean prompt architecture. Edge features like the Advanced Options subnode have known intermittent bugs. Use the latest main branch commit from kijai GitHub and keep your prompt structure simple until you have baseline results you can iterate on.
How many beats should I use for a 5-second LTX 2.3 video?
Maximum 4 beats. A 5-second clip at 24 FPS generates approximately 120 frames. Divided across 4 beats, each segment gets 30 frames (~1.25 seconds) — a healthy motion window for coherent generation. Pushing to 5 beats drops each segment to 24 frames (1.0 sec — acceptable). Six beats gives you 20 frames each, which is at the edge of coherence. Seven or more beats on a 5-second clip will produce degraded, blurry output regardless of prompt quality.
Can I change the character’s location between beats in a complex scene?
Yes, but never in a single beat jump. The encoder performs a blend at each beat transition boundary. A hard semantic cut — “dim interior” in beat 3 directly to “bright rooftop exterior” in beat 4 — generates incoherent blend frames that break both lighting and character identity. The correct approach: use beat N as a transition beat (e.g., “Character bursts through exit door into daylight”) and beat N+1 to fully establish the new environment. Two beats for a location change is the minimum viable structure.
My Prompt Relay node produces no visible effect at all — what is the very first thing to check?
Check your node version before touching anything else. As confirmed in the kijai GitHub commit history, older builds of ComfyUI-PromptRelay failed silently on empty or malformed local_prompts — no error, no warning, no visual feedback. The workflow ran. The node did nothing. Open ComfyUI Manager, update ComfyUI-PromptRelay to the latest main branch, perform a full ComfyUI restart, and confirm your node displays the label PromptRelayEncode. Then test with the simplest possible 2-beat prompt before building complexity.
Does Prompt Relay work with LTX 2.3 Image-to-Video (I2V) mode?
Yes, and it is particularly effective in I2V mode when configured correctly. The global_prompt serves double duty in I2V: it anchors both the reference image’s visual identity and the persistent scene context for all subsequent beats. The critical rule in I2V mode is to keep global_prompt tightly aligned with your input image’s visual description — same character description, same lighting, same environment framing. Any divergence between global_prompt and the reference image creates character drift that compounds beat by beat. The RunComfy I2V workflow documentation covers this configuration in detail.
What is the difference between global_prompt and local_prompts in plain language?
Think of global_prompt as the casting sheet and set design — it tells the model who is in the scene and where they are, permanently. Think of local_prompts beats as the shot list — each beat describes only what happens in that specific moment. The model combines both at every frame, applying the persistent identity from global_prompt while advancing the action described in the current beat. When you put action language in global_prompt, you are rewriting the casting sheet mid-scene. When you put identity language in local_prompts, you are forcing the model to re-establish the character from scratch on every beat. Both errors produce character inconsistency — just in different ways.
Leave a Reply