Nodes/comfyui_qwen3vl_uncensored/Qwen3-VL Prompt Generator (Uncensored)
ComfyUI Node

Qwen3-VL Prompt Generator (Uncensored)

The 'Uncensored' Qwen3-VL Prompt Generator That Doesn't Call Any API

By neverlow-mo·Created 7 months ago·Updated 7 months ago· 0
Qwen3-VL Prompt Generator (Uncensored)
  • image
  • video
  • generated_prompt
  • seed
modeenhance
text
temperature0.70
max_tokens700
preset_prompt📝 Enhance
use_preset_tokenstrue
seed1
control_after_generaterandomize
keep_model_loadedtrue
frame_count16

The name is half a lie. This node doesn't generate anything itself - it's a local prompt enhancer and image/video captioner that hands your text to a Qwen3-VL model running under llama.cpp. The "uncensored" part isn't the node either; it comes from the abliterated Qwen3-VL GGUF you point it at. What the name gets right: no API, no key, no cloud, fully offline. That's the whole pitch, and it's a real one.

You drop it upstream of the sampler. Type a rough idea, it rewrites it into a fat, structured photography prompt that feeds your CLIP or LLM encoder; or feed it an image and it writes you a caption. Qwen3-VL is an understanding model, not a generator - the KB's Qwen3-VL panel calls it exactly that - so this node is the bridge that turns what it reads into what your diffusion model writes with.

How it actually works

Read the source and the README story diverges a bit. There's no requirements.txt - everything is Python stdlib plus the torch/numpy/PIL ComfyUI already ships. The heavy lifting happens outside ComfyUI in llama.cpp, and there are two paths:

  • llama-server - if keep_model_loaded is on, it POSTs to the OpenAI-compatible endpoint at http://127.0.0.1:8089 (base64 image, chat completions, seed, max_tokens).
  • llama-cli - if the server isn't reachable (or you turn keep_model_loaded off), it falls back to shelling out to llama-cli as a subprocess. This is where the code earns its keep: it wrangles llama.cpp's messy terminal output through a PTY, strips ANSI/backspace spinner junk, and extracts just the model's answer.

Video is handled the same way it is in llama.cpp: frames get sampled (frame_count, 1–64), squashed into a contact-sheet grid, and sent as a single image. Images and videos are written to temp PNGs and cleaned up after. There's even a raw llama_wrapper.py.v5 and a "ULTIMATE" variant sitting in the repo - this is clearly one person's evolving personal tool, not a polished release.

The inputs that matter

  • mode - enhance (text → richer prompt), describe (image/video → caption; errors if you give it no image), multimodal (text + image together).
  • preset_prompt - six presets (Enhance, Refine, Creative Rewrite, Detailed Visual, Artistic Style, Technical Specs), each with its own system prompt and token budget, all editable in system_prompts.json.
  • text, image, video - the raw material.
  • seed + control_after_generate - the node also outputs the seed as an INT, so you can loop it back for reproducible rewrites.

Two honest gotchas the widgets don't tell you: temperature is accepted but never actually reaches the model in the shipped code (the node just never passes it through), and max_tokens always wins, so the per-preset token defaults are mostly decorative from the node path. Set max_tokens and move on.

Installing it (the real part)

The ComfyUI side is boring:

cd ComfyUI/custom_nodes
git clone https://github.com/neverlow-mo/comfyui_qwen3vl_uncensored

then restart ComfyUI. That's it - no pip install. The actual setup is everything the README doesn't tell you: you need llama.cpp built, a Qwen3-VL GGUF plus its mmproj, and then you must edit config.py, which ships with the author's machine paths hardcoded (~/ai/llama-cpp-core/build/bin/llama-cli, a model at /mnt/popbackup/...). The reference setup is the huihui/noctrex Qwen3-VL-30B-A3B-Instruct-abliterated Q4_K_M (about 18GB + a 1GB mmproj), which is the model this pack was built around - that MoE runs fast because only ~3B params are active. On startup the node prints config warnings if your paths don't exist, so watch the console.

Troubleshooting

  • "llama-server not reachable" - expected if you haven't started llama-server; it auto-falls back to CLI. Start one on port 8089 with your model and mmproj if you want the fast, model-stays-loaded path.
  • VRAM - this is the real constraint. The 30B Q4 build sits around 19GB and barely fits 16GB cards even at Q3. If you're on a mid-range card, an 8B Q8 abliterated build is the saner choice and the community runs those for exactly this job.
  • German error strings ("Modell nicht gefunden") - the author is German; don't panic, it means the model path in config.py is wrong.
  • Broken presets - if a system_prompts.json edit breaks parsing, the node falls back to defaults; the repo keeps .bak_*.json backups.

Is it worth it? If you already run llama.cpp and want an uncensored, offline Qwen3-VL in the graph without another server, it's a nice DIY find. If you just want Qwen captioning, the far more mainstream ComfyUI-QwenVL pack covers the same ground with less config surgery. And since every LLM node executes arbitrary Python with your user's access - the pack's own README says "check code before use" - glance at the source before you trust it.

Categoryprompt/qwen3vl

Inputs (12)

NameTypeDefaultDescription
modeCOMBOenhance3 options: enhance, describe, multimodal
textSTRING
temperatureFLOAT0.700–2
max_tokensINT70016–4096
preset_promptCOMBO📝 Enhance6 options: 📝 Enhance, 📝 Refine, 📝 Creative Rewrite, 📝 Detailed Visual, 📝 Artistic Style, 📝 Technical Specs
use_preset_tokensBOOLEANtrue
seedINT11–2147483647
control_after_generateCOMBOrandomize4 options: fixed, increment, decrement, randomize
keep_model_loadedBOOLEANtrue
frame_countINT161–64
imageoptIMAGE
videooptIMAGE

Outputs (2)

NameTypeDescription
generated_promptSTRING
seedINT