Nodes/ComfyUI-GGUF-Loader/LTX-2.3 ID-LoRA Prompt Editor ⚡
ComfyUI Node

LTX-2.3 ID-LoRA Prompt Editor ⚡

The captioner wrote it — you get to edit it before it becomes the prompt

By ChrisColeTech·Created about a month ago·Updated 4 days ago· 10
LTX-2.3 ID-LoRA Prompt Editor ⚡
    • tagged_prompt
    • visual_text
    • speech_text
    • sounds_text
    • speech_text_batch
    source
    visual
    speech
    sounds

    An ID-LoRA talking-head pipeline lives and dies on its prompt: the [VISUAL]/[SPEECH]/[SOUNDS] block that tells LTX-2.3 what the frame shows, what the person literally says, and what the audio sounds like. Captioners produce that block, and captioners get things wrong - the spoken line is stiff, the visual is over-described, the sounds are garbage. LTX-2.3 ID-LoRA Prompt Editor is the review-and-fix station: wire a captioner's output into source, the three sections fill into editable boxes, you fix what you want, and the node reassembles the corrected tagged prompt.

    What it does

    Feed it the captioner's raw output through source (a captioner like LMStudioVisionPrompt is the intended upstream). On a run, the three multiline boxes - visual, speech, sounds - fill with the parsed fields, and they stay directly editable. Here's the genuinely clever part: type over any field and your edit survives later runs; generate a genuinely new caption and all three refresh to it. The node remembers the source string it last parsed (keyed by node id, in Python) rather than guessing from whether a box looks empty, and a small paired web script writes the resolved values back. That "auto-filled and editable and edit-preserving" combination is not something comfy-core gives you - its only populate-from-execution widget is hard-coded read-only - so this is real custom work, not a stock widget dressed up.

    Outputs:

    • tagged_prompt - the reassembled [VISUAL]: .../[SPEECH]: .../[SOUNDS]: ... string for CLIPTextEncode.
    • visual_text / speech_text / sounds_text - the sections individually. Wire speech_text straight into a TTS node's text input so what you typed is exactly what gets spoken.
    • speech_text_batch - [SPEECH] split into one clip per non-blank line (blank line = separator), as a real comfy list. Pair it with LTXV23SpeechBatchSelector to pick one clip by index.

    How it parses

    The parser stops each field at the next [TAG]: marker rather than running to end-of-string, so a wordy [SPEECH] can't swallow the [SOUNDS] section that follows it - a failure mode of naive text-splitting that this node specifically guards. It's an output node, so it's where a chain's results land: captioner → this → CLIPTextEncode/TTS.

    Where it sits in the pipeline

    Photo + reference voice → captioner (LMStudioVisionPrompt) → this editor → the tagged prompt into the LTX-2.3 text path, speech_text into a TTS node → LTXV23ImgToVideo → sampler → LTXV23AVDecode. The edit step is what makes the difference between a talking-head demo and something that actually delivers the line you wanted.

    Installing it

    Part of the CCTech pack:

    cd ComfyUI/custom_nodes
    git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
    cd ComfyUI-GGUF-Loader
    pip install --upgrade gguf
    

    Restart; under 🤖 CCTech/LTX-2.3. The edit-preservation logic is Python-side (tested without a GPU); the widget write-back is the web/ JS this pack ships - keep the pack's web/ folder intact when you install, or the boxes stop auto-filling while the node still runs.

    Gotchas

    The source socket expects the captioner's full output (or just the tagged block - it tolerates both). And the keep-the-edit-vs-refresh decision is made on the source string, so if you re-queue with the same captioner output after editing, it keeps your edit - that's the feature, but it means a stale captioner output won't overwrite a fix you already made. Re-run the captioner to genuinely refresh.

    Category🤖 CCTech/LTX-2.3

    Inputs (4)

    NameTypeDefaultDescription
    sourceSTRINGThe captioner's raw output - its full two-part text, or just the tagged block.
    visualSTRING
    speechSTRING
    soundsSTRING

    Outputs (5)

    NameTypeDescription
    tagged_promptSTRING
    visual_textSTRING
    speech_textSTRING
    sounds_textSTRING
    speech_text_batchSTRING