Nodes/ComfyUI LC Vision Nodes/LC Vision Prompt Enhancer πŸ“
ComfyUI Node

LC Vision Prompt Enhancer πŸ“

A local 8B that rewrites your prompt and stops talking

By lonecatone23Β·Created 3 days agoΒ·Updated about 17 hours agoΒ· 1
LC Vision Prompt Enhancer πŸ“
  • vision_model
  • text
β—„prompt_textβ–Ί
β—„presetβ–Ύβ–Ί
β—„custom_system_promptβ–Ί
β—„style_tagNoneβ–Ί
β—„max_tokens1024β–Ί
β—„temperature0.70β–Ί
β—„top_p0.90β–Ί
β—„repetition_penalty1.10β–Ί
β—„seed0β–Ί

A vision model is still a perfectly good text-only LLM when you don't attach anything to the message. That sentence is the entire node.

Wire the LC Vision Loader's handle in, type a rough prompt, pick a preset, get a rewritten prompt out. No images, no API key, no per-call cost. It's the local prompt-enhancer pattern, and the reason to prefer this over an Ollama call is the usual one: it's offline, it's uncensored, and it reuses a model already sitting in VRAM for captioning.

Why you'd bother

Prompt enhancement earns its keep by removing the blank page, not by being clever. The pattern is mainstream enough that "prompt enhancer" mentions in this community went up roughly twentyfold between 2023 and 2026, and the 2026 architecture makes it a natural fit: if the checkpoint's encoder is itself a language model reading an instruction, having a second language model write that instruction is translation between two things that speak the same language.

The catch - where most enhancers embarrass themselves - is that a chat model doesn't emit a clean prompt by default. It emits chat: a preamble, a numbered list of its reasoning, <think> scaffolding. On an LLM-encoded base, all of that lands in your conditioning as literal prompt text. This node has two defenses.

How it works

Presets live in lc_vision_presets.json, not in code, so you can edit them without touching Python. Four originals ship with it: Enhance (expand a rough idea with lighting, texture, mood, without inventing subjects), Refine (cleanup only, add nothing), Creative Rewrite (reinterpret the scene around the same subject) and Detailed Visual (maximum concrete photographic specificity - lighting direction, lens character, materials, palette).

A Custom entry sits at the top of the dropdown and reads your system prompt straight off the custom_system_prompt socket, which is how you get per-workflow control without editing JSON. Pick Custom with an empty socket and it raises a clear error rather than guessing.

Then the think-leak guard. Each preset's system prompt already ends with "no <think> or reasoning of any kind", and for Qwen3-family models the node prepends /no_think to your text so the reasoning path never opens. If the output still looks like planning text - a first-person lead-in, or an actual <think tag - it runs one constrained retry: a stricter system prompt asking for just the final prompt, no planning, no narration, at a lower temperature and an offset seed. Anything that slips through anyway gets stripped of tags before you see it.

style_tag is shared with the Caption node but works differently on plain text: a marker goes at the front, the style directive goes at the end, for recency. Realistic, Anime, Cartoon, Cinematic, Hentai, Fantasy - same list, same wording, one implementation behind both nodes.

Where the presets come from is worth a note: the upstream QwenVL-Mod pack has a genuinely good 22-preset library and none of it is here, deliberately - that's creative content under GPL-3.0, so this pack ships its own four.

Inputs and output

Required: vision_model, prompt_text (the rough prompt - the box you'll live in) and preset. Optional: custom_system_prompt, style_tag, and the sampling controls - max_tokens (1024), temperature (0.7, the highest of the three Run nodes here, because this one is meant to be creative), top_p (0.9), repetition_penalty (1.1) and seed.

Output is a single text string. Into CLIPTextEncode, or into a string-concat node if you want your original wording alongside it.

Install

ComfyUI Manager, search ComfyUI LC Vision Nodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_Vision_nodes.git

__init__.py must sit directly in that folder, then restart ComfyUI. All four nodes in the pack share one dependency: install.py fetches a vision-capable llama-cpp-python wheel matching your Python and CUDA version from the JamePeng fork's release assets. There's no requirements.txt in the repo, and there can't be a useful one, because those wheels aren't published to PyPI. Models download from the Loader node.

When it goes wrong

"Preset not found." You edited lc_vision_presets.json and deleted one a workflow still references. Put the entry back, or switch that node to Custom.

"Custom is empty." Custom doesn't fall back to anything - that's the Moviemaker's behavior, not this node's. Fill the socket or pick a real preset.

The rewrite drifts off your subject. That's the enhancer failure mode, not a bug: asked to add detail, a model adds detail you didn't ask for. Enhance invents mood; Creative Rewrite is supposed to invent. For fidelity, use Refine - it's explicitly told to return the prompt nearly unchanged when it's already clean.

Everything comes out with the same flavor. Change the seed, or raise temperature slightly. At 0.0 this node is deterministic and literal.

It keeps leaking preamble. Check that your model is actually Qwen3-family, since the /no_think injection only fires for those. If it is and the retry still isn't cleaning up, ask for a shorter output - long generations are where a chat model starts narrating.

CategoryLC Vision

Inputs (10)

NameTypeDefaultDescription
vision_modelLC_VISION_MODELHandle from LC Vision Loader. Works fine text-only -- nothing image-specific is required.
prompt_textSTRINGThe rough prompt to rewrite.
presetCOMBOWhich system_prompt from lc_vision_presets.json to rewrite through. 'Custom' reads its system prompt from the custom_system_prompt socket instead. Add more presets by editing that file.
custom_system_promptoptSTRINGUsed only when preset is 'Custom' -- read directly instead of a lc_vision_presets.json entry.
style_tagoptCOMBONoneCommits the rewritten prompt to a specific visual style, on top of whatever the preset already does. 'None' leaves style unconstrained.
max_tokensoptINT102416–16384Upper limit on generated tokens. Generation can stop earlier on its own; this only caps the ceiling.
temperatureoptFLOAT0.700–2Sampling randomness. 0 = deterministic and literal, higher = more varied wording at some cost to focus.
top_poptFLOAT0.900–1Nucleus sampling: only sample from the smallest set of tokens covering this cumulative probability. Lower = more focused, higher = more varied.
repetition_penaltyoptFLOAT1.100.5–2Penalizes tokens the model has already used, to discourage repetitive or looping output. 1.0 = no penalty.
seedoptINT00–4294967295Sampling seed. Same seed + same inputs should reproduce the same output, modulo hardware/threading nondeterminism.

Outputs (1)

NameTypeDescription
textSTRINGβ€”