Kandinsky 6 Beautify Prompt (Qwen3.5-9B)
Kandinsky 6 Wants a Script, Not a Prompt
- clip
- image
- video_caption
- audio_caption
- full_prompt
"two parrots on a branch, cinematic" was a great prompt in 2023. Kandinsky 6 is not that model. It wants a shot description with camera behaviour, subject action, and an explicit tag block for what the shot sounds like - and if you want dialogue, the spoken words have to be fenced in the model's own syntax. You can write that by hand. Or you can let the node do it.
What it is
Kandinsky 6 Beautify Prompt (Qwen3.5-9B) is a prompt expander that runs a local Qwen3.5-9B inside the graph and rewrites your rough idea into the caption shape Kandinsky 6 was trained on. Rough idea in, video_caption + audio_caption out, ready for Kandinsky 6 Text Encode.
This is the "LLM as a tool" pattern rather than the "LLM as an encoder" one, and the distinction matters here. The Qwen2.5-VL that conditions the DiT is a component of the model - you don't get to swap it. The Qwen3.5-9B this node runs is a separate thing you load yourself with a Load CLIP node, purely to write text. Set clip to that, not to the Kandinsky text encoder. Getting that wrong is a confusing install-level mistake, because both are Qwen-family models and the error won't say "wrong model, doofus."
How it works
It picks one of two bundled system prompts depending on whether you connected an image - t2av for text-to-video, i2av for image-to-video - and wraps your captions in Qwen3.5's chat template. Thinking is off (<think> is emitted empty), MTP is off.
Then it generates, and then it checks its own homework, which is the part I actually like. The output must have balanced <S>/<E> speech tags and exactly one <AUDCAP>/<ENDAUDCAP> pair. Fail the check and it retries up to three times, then raises with the validation error and a suggestion: raise max_tokens, change the seed, or set enabled to false. A raw prompt enhancer that emits chatty preamble or half-open tags poisons your conditioning silently; this one would rather stop.
The inputs that matter
clip - Qwen3.5-9B via Load CLIP. It's a lazy input, so while enabled is false the model isn't even loaded.
video_caption / audio_caption - your draft, which becomes the user turn. Type your spoken lines inside <S>...<E> where they're said; the tooltip is explicit that dialogue goes in the video caption, and the audio caption is for voices and sounds. Setting the file to enabled: false passes both straight through, untransformed - the escape hatch when the model mangles your careful wording.
image (optional) - connect it for I2VA so the expander can see what it's expanding. Leave it off for T2VA.
seed, max_tokens (1500), temperature (0.3), repetition_penalty (1.1). The seed has control_after_generate, so you can reroll the rewrite without rerolling the video - useful, because the caption is often the difference between a good take and a mush take. Temperature 0.3 is about right; this is a rewriting job, not a creativity job.
Three outputs: video_caption, audio_caption, and full_prompt (the joined caption with the <AUDCAP> block already embedded) if you want to eyeball or log what was actually sent.
Install
Same pack, one install:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-Kandinsky-T8.git
cd Comfyui-Kandinsky-T8
python -m pip install -r requirements.txt
Restart ComfyUI afterwards. You'll also need a Qwen3.5-9B checkpoint loadable through ComfyUI's Load CLIP. That's roughly another 9B-model's worth of VRAM on top of the DiT - the pack's reference run was a 24 GB RTX 5090 laptop, and ComfyUI will offload, but expect this node to shave the headroom you had for a longer clip.
Where it goes wrong
"failed after 3 attempts." Read the trailing reason it prints. answer cut by max_tokens means exactly that - the rewrite hit the cap mid-sentence and the assertion caught it; raise max_tokens. Anything mentioning unbalanced speech tags means the model wrote dialogue without closing it; a different seed usually fixes it. Either way, enabled: false gets you moving again in one click.
Subject drift. This is an enhancer, so it will add detail you didn't ask for - it's a rewriting model with a descriptive mandate. If a specific line or action matters, put it in the draft explicitly; the system prompt will build around it rather than invent over the top of it. The community's fix for enhancers generally is to narrow the model's job rather than trust one free-form rewrite, and that applies here.
Unexpected VRAM pressure. If you're already tight on the DiT, the 9B expander is the first thing to disable - you write good captions once and reuse them across seeds anyway.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | Qwen3.5-9B from Load CLIP, not the Kandinsky text encoder. | |
| video_caption | STRING | Describe the scene and motion. Put exact spoken lines inside <S>...<E>. | |
| audio_caption | STRING | Describe voices and sounds; spoken words belong in the video caption. | |
| enabled | BOOLEAN | true | — |
| seed | INT | 420–18446744073709550000 | — |
| max_tokens | INT | 15001–32768 | — |
| temperature | FLOAT | 0.300.01–2 | — |
| repetition_penalty | FLOAT | 1.101–5 | — |
| imageopt | IMAGE | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video_caption | STRING | — |
| audio_caption | STRING | — |
| full_prompt | STRING | — |