Qwen3-VL Prompt Generator (Uncensored)
The 'Uncensored' Qwen3-VL Prompt Generator That Doesn't Call Any API
- image
- video
- generated_prompt
- seed
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_loadedis on, it POSTs to the OpenAI-compatible endpoint athttp://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_loadedoff), it falls back to shelling out tollama-clias 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.pyis wrong. - Broken presets - if a
system_prompts.jsonedit breaks parsing, the node falls back to defaults; the repo keeps.bak_*.jsonbackups.
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.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | enhance | 3 options: enhance, describe, multimodal |
| text | STRING | — | |
| temperature | FLOAT | 0.700–2 | — |
| max_tokens | INT | 70016–4096 | — |
| preset_prompt | COMBO | 📝 Enhance | 6 options: 📝 Enhance, 📝 Refine, 📝 Creative Rewrite, 📝 Detailed Visual, 📝 Artistic Style, 📝 Technical Specs |
| use_preset_tokens | BOOLEAN | true | — |
| seed | INT | 11–2147483647 | — |
| control_after_generate | COMBO | randomize | 4 options: fixed, increment, decrement, randomize |
| keep_model_loaded | BOOLEAN | true | — |
| frame_count | INT | 161–64 | — |
| imageopt | IMAGE | — | |
| videoopt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| generated_prompt | STRING | — |
| seed | INT | — |