Save Kolors
The Full Checkpoint Export for Uploading Your Kolors Merges
- model
- vae
If you've been merging Kolors models in ComfyUI, there are exactly two things you can do with the result: keep it locally, or upload it to a Chinese online generator like LiblibAI or Tusiart so people can run it without a local GPU. The first is easy. The second is why this node exists. "Save Kolors" writes your merged model out as a complete, standard-format .safetensors checkpoint - model weights plus VAE, in the naming convention those platforms actually accept.
Kolors itself is the mid-2024 Kuaishou model that western reddit largely moved past once Flux landed (it's a UNet paired with ChatGLM3 for the text encoder, which is why it handles Chinese prompts so well). But on LiblibAI and Tusiart, Kolors is still a going concern, and their uploaders don't want a diffusers folder dump - they want one self-contained checkpoint file. This node is the export step in that pipeline.
How it works
It's the same save logic as ComfyUI's built-in Save Checkpoint node, minus the text encoder. The node calls state_dict_for_saving(None, vae.get_sd(), None) on your model - that's ComfyUI's way of saying "give me the weights for the UNet and this VAE, fused into one state dict" - then writes it out as a safetensors with metadata: {'format': 'pt'}.
Note the None where the CLIP state dict would go. This is a UNet-plus-VAE file, not a self-contained model with a baked-in text encoder. The README's phrase for it is "sd format Kolors": the standard checkpoint layout that the updated ComfyUI-Kolors-MZ loader knows how to handle, and that LiblibAI/Tusiart can serve. You aren't exporting a text encoder, because for Kolors that's ChatGLM3 and those platforms provide it themselves.
The inputs that matter
Three required inputs, two of which you'll actually touch:
- model (MODEL) - the merged Kolors UNet. Same source as the pack's other node: load Kolors via ComfyUI-Kolors-MZ, merge, and pipe the result in here.
- vae (VAE) - gets baked into the file. This matters more than it looks: feed the VAE you actually want in the output, because once it's written you're carrying it around. For Kolors the SDXL-compatible VAE is the usual choice.
- filename (STRING) - defaults to
checkpoints/ComfyUI, and like its sibling node it writes into ComfyUI's output directory. So the default lands atComfyUI/output/checkpoints/ComfyUI.safetensors. Pick something descriptive so you can find it later, because you'll be dragging it into a browser upload form.
No outputs - it's an output node, run it and grab the file.
Installing it
Same story as the whole pack - no dependencies, no model downloads:
cd ComfyUI/custom_nodes
git clone https://github.com/lrzjason/Comfyui-Kolors-Utils.git
Restart ComfyUI and search for "Save Kolors". The pack ships only the two node classes plus a Kolors key map, so this is a thirty-second install.
Where people get burned
The naming is the trap. Because it's called "Save Kolors" you might expect it to produce a fully self-contained Kolors model. It doesn't - there's no text encoder in the file, by design. Local use always needs ComfyUI-Kolors-MZ (or another Kolors loader) to supply ChatGLM3. Uploading to LiblibAI/Tusiart works because those platforms already have the encoder side set up; if you're not uploading, this node's only real advantage over the built-in Save Checkpoint is that the MZ loader was updated to recognize its output.
The other gotcha is scope. This node saves whatever MODEL you give it, full stop - merge an SDXL model and export, and you'll get an SDXL checkpoint with a Kolors-ish name. It's a file writer, not a validator. Keep it pointed at actual Kolors merges and it'll serve you fine.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| filename | STRING | checkpoints/ComfyUI | — |
| vae | VAE | — |
Outputs (0)
No outputs