一体节点 · 内部加载
What 一体节点 · 内部加载 actually does
- 模型
- CLIP
- VAE
First, the thing nobody tells you: you don't add this node
"一体节点 · 内部加载" (roughly "unified node · internal loading") lives under the 模型加载/内部 category, and that second word is the important one. It is not a node you drag onto the canvas. Every time you press Queue with the pack's console node (集合控制台 / CJUnifiedModelLoaderTest) somewhere in your graph, a submission hook rewrites the prompt server-side before ComfyUI validates it: the console is removed and one of these is dropped in for each of 主模型 / CLIP / VAE you told it to load internally, wired to whatever the console's output ports were feeding.
So this is the machine code the console compiles to. Three of these replace what used to be three loader nodes and the bookkeeping of keeping them in sync. You'll meet it in three situations: you're debugging someone's exported API JSON and the node IDs look like __cjml__9f2c…, you're hand-building a prompt, or something went wrong and you're reading the queue's error message. In all of them the inputs below are what you actually edit.
The three inputs, and the one you'll touch
kind is the slot: model, clip, or vae. files is a JSON array of paths relative to the registered model folders (models/diffusion_models, models/text_encoders, and so on) - exactly one file for model and VAE, up to four for CLIP, because a CLIP slot can be a stack (CLIP-L plus T5 was the standard Flux pairing, and modern LLM-encoded models ship the encoder as its own separate file entirely). options_json is the loading options, which is where the interesting knobs live: weight_dtype for fp8 (fp8_e4m3fn, fp8_e4m3fn_fast, fp8_e5m2), device: cpu to keep an encoder off the card, clip_type for what the encoder is for, and the GGUF trio dequant_dtype, patch_dtype, patch_on_device.
Outputs are 模型, CLIP and VAE - all three sockets always, with only the one matching kind carrying anything. That's how one class serves three slots.
Why a single loader instead of three
Because the settings that matter are per-file, and they travel with the file instead of with a node you have to remember. Swapping a Q8_0 diffusion model for the fp8 version changes one entry, not a loader type. Mixing a GGUF UNet with a full-precision fp8 encoder is a normal thing to want on a 12GB card and this handles it, in the same slot config, without a second loader family.
It also gets caching right, which most homebrew loaders don't. The node's change detector hashes the file's path plus its size and mtime, so re-quantizing a file in place forces a reload, while changing your prompt does not. That's the IS_CHANGED contract: the engine only re-runs a node when this value changes, and a loader that skips it will happily serve you the old weights all evening.
Under the hood
Paths get validated (relative only, no traversal, no absolutes), resolved against folder_paths, and sniffed for a .gguf suffix. GGUF takes a separate branch that uses a vendored llama.cpp-derived loader with custom operations, so quantized weights dequantize per layer at runtime rather than expanding into VRAM up front. That is also why stacking LoRAs on a GGUF model is measurably slower than on the safetensors - each patched layer has to come up to compute precision and go back down. Everything native goes through plain comfy.sd.load_diffusion_model / load_clip / VAE with safe_load.
Install
It ships inside the pack; there's nothing separate to get. Search ComfyUI-ChuangJie in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/lefango/ComfyUI-ChuangJie.git
Then install the pack's requirements with ComfyUI's python - gguf>=0.13.0,<0.19, sentencepiece, protobuf - because the GGUF branch imports gguf at load time:
cd ComfyUI && python -m pip install -r custom_nodes/ComfyUI-ChuangJie/requirements.txt
Native safetensors/ckpt loading works without those packages; only GGUF needs them.
Where people get burned
- "无法可靠判断 CLIP 用途" -
clip_typewas left onautoand the console couldn't work out the family from your model's name or metadata. Set the purpose manually in the CLIP slot rather than trusting the guess. - Mixing GGUF and scaled-FP8 in one CLIP slot is rejected on purpose. The two dequant paths don't compose. Pick one representation per encoder slot.
- GGUF is diffusion-model and text-encoder only. A
.ggufcheckpoint or VAE gets refused, and that's correct - those formats don't exist in a useful way. - "GGUF 依赖未安装" means the
ggufmodule isn't in ComfyUI's environment, not that the file is broken. Rerun the pip line above with the right interpreter and restart. - "当前 ComfyUI 无法识别此主模型结构" is a core-version problem, not a pack problem. New architectures (MOSS-Image, a fresh Qwen release) need a ComfyUI core that knows them.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| kind | STRING | — | |
| files | STRING | — | |
| options_json | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| 模型 | MODEL | — |
| CLIP | CLIP | — |
| VAE | VAE | — |