Nodes/PromptNodethingLD/🎬 Cinematic Prompt LD
ComfyUI Node

🎬 Cinematic Prompt LD

This node hires a local LLM to write your LTX prompts β€” camera plan included

By verqqaΒ·Created 3 months agoΒ·Updated 3 months agoΒ· 3
🎬 Cinematic Prompt LD
    • image
    • prompt
    • negative
    β—„duration_s5.0β–Ί
    β—„fps24β–Ί
    β—„model_fileβ–Ύβ–Ί
    β—„mmproj_fileβ–Ύβ–Ί
    β—„shot_typeβ–Ύβ–Ί
    β—„dialoguefalseβ–Ί
    β—„povfalseβ–Ί
    β—„user_intentβ–Ί
    β—„lora_triggersβ–Ί
    β—„confirmed_promptβ–Ί
    β—„image_b64β–Ί
    β—„res_scale1.00β–Ί
    β—„video_modeβ–Ύβ–Ί
    β—„t2v_orientationβ–Ύβ–Ί

    Cinematic Prompt LD is the node that writes your LTX prompt for you, and it doesn't handwave. It runs a ~15 GB local LLM through a three-pass "Decide β†’ Write β†’ Check β†’ Fix" pipeline, then hands you a prompt where every beat has a locked camera move and a negative prompt that doesn't fight your chosen style. LTX is fast but famously literal - this node is basically an enforcement layer for that weakness.

    The name is also a lie in the best way: no API, no key, no cloud. It boots llama-server from llama.cpp on localhost:8080 as a subprocess and talks to it over HTTP. Everything stays on your machine.

    How it works: decide, write, check, fix

    Most prompt nodes ask an LLM once and pray. This one structures the ask:

    1. Choreography pre-pass. A small JSON-forced call (temperature 0.4) makes the LLM commit to a per-beat camera plan before any prose - move, position, and pace for each beat, drawn from a per-style palette. INTIMATE only allows dolly-in moves; STATIC gets a fixed frame. If the JSON pass fails, a deterministic fallback plan takes over, so generation never runs without a locked plan. Decide the shots first, then write to them.
    2. Main generation. The LLM writes the actual prompt against that locked plan, with a word budget that scales with beat count (120 + 95 Γ— beats, roughly 6 seconds per beat). LTX-2.3 guidance is baked into the system prompt - main action first, one action per beat, explicit light source and direction, no "snaps" or "suddenly" (except JUMPCUT mode, where every beat after the first must open with "The scene suddenly jump cuts to…").
    3. Lint + auto-repair. Regex checks run over the result: teleport words, banned hype words ("beautiful", "stunning", "palpable"), camera restatements, speed conflicts. Violations trigger one surgical repair turn. Fail twice and it flags the output instead of looping.

    The architectural bit worth knowing: the LLM work happens in the browser. The node registers SSE routes (/cinematic_prompt_ld/generate_stream) and its embedded JS UI runs the pipeline live with token streaming, a boot countdown, and a Stop button. The node's own run() is almost an afterthought - it returns the prompt you already confirmed, plus the first-frame image.

    The inputs and outputs that matter

    The UI hides most of the plumbing, so you really set four things:

    • shot_type - the camera style: LLM DECIDES, STATIC, CINEMATIC, INTIMATE, HANDHELD, JUMPCUT, and more. This locks the camera palette and the negative prompt.
    • user_intent - what's actually happening in the scene, in plain words.
    • duration_s and fps - clip length and frame rate; beats are derived from duration (~6s each) and the frame count is rounded to LTX's multiples of 8.
    • model_file / mmproj_file - dropdowns populated from your models folder (see install).

    video_mode flips between i2v and t2v; in i2v you also get image_b64 (the uploaded still) and res_scale, which walks a resolution ladder anchored at your image's native size rather than guessing a random resolution. Outputs are the things you wire into your LTX workflow: image (the resized/padded conditioning frame - a black frame in t2v), prompt (the confirmed positive), and negative (style-aware negatives built deterministically in Python, never through the LLM). All three feed LTX nodes directly.

    Installing it

    Three pieces, and none of them is a Python dependency - the pyproject.toml is bare, because the node talks to llama-server over HTTP:

    # 1. llama-server binary (Linux/macOS)
    mkdir -p ~/llama && chmod +x ~/llama/llama-server   # grab it from llama.cpp releases
    
    # 2. A GGUF model into ~/models (C:\models on Windows)
    #    e.g. nohurry/gemma-4-26B-A4B-it-heretic-GUFF (q4_k_m ~15 GB for 24 GB VRAM)
    
    # 3. The node itself
    cd ComfyUI/custom_nodes && git clone https://github.com/verqqa/PromptNodethingLD
    

    Then restart ComfyUI and load workflowLD2.json from the repo. ComfyUI Manager also works: Install via Git URL, paste the repo, restart. For vision (image understanding in i2v), grab the mmproj file too - its filename must start with mmproj; the dropdown filters on that prefix.

    Common issues

    • "No confirmed prompt. Generate and confirm in the UI first." - you queued the workflow without using the node's own Generate β†’ Confirm flow. The node deliberately refuses to run blind.
    • Model won't appear in the dropdown. The node only enumerates your fixed models directory (~/models or C:\models). Drop the GGUF somewhere else and it's invisible.
    • Your checkpoint got evicted. Before generating, the node calls unload_all_models() to free VRAM for the LLM. Don't fill VRAM before generation - the README's VRAM guidance is there for a reason.
    • It talks to the wrong server. The health check on port 8080 reuses whatever's already answering there. If you have another llama-server or service on 8080, close it first.
    • llama-server not found / Model not found errors are path problems: the binary must be at ~/llama/llama-server, the model in the models dir.

    It's a niche tool with a heavy install, but if LTX prompting is your bottleneck - and it usually is - this is the one I'd reach for over the single-shot prompt LLM nodes.

    CategoryLoRa-Daddy/Prompt

    Inputs (14)

    NameTypeDefaultDescription
    duration_sFLOAT5.01–60β€”
    fpsINT241–60β€”
    model_fileCOMBO1 options: None
    mmproj_fileCOMBO1 options: None (text-only)
    shot_typeCOMBO12 options: LLM DECIDES, STATIC, CINEMATIC, INTIMATE, HANDHELD, LOCKED OFF, +6
    dialogueBOOLEANfalseβ€”
    povBOOLEANfalseβ€”
    user_intentSTRINGβ€”
    lora_triggersSTRINGβ€”
    confirmed_promptSTRINGβ€”
    image_b64STRINGβ€”
    res_scaleFLOAT1.000.1–1β€”
    video_modeCOMBO2 options: i2v, t2v
    t2v_orientationCOMBO3 options: Portrait 9:16 (1088Γ—1920), Landscape 16:9 (1920Γ—1088), Square 1:1 (1024Γ—1024)

    Outputs (3)

    NameTypeDescription
    imageIMAGEβ€”
    promptSTRINGβ€”
    negativeSTRINGβ€”