MOSS-Image Official UNET / DiT Loader
Picking MOSS-Image Base vs SFT
- dit
MOSS-Image isn't a single checkpoint you drop into a Checkpoint Loader. It's a DiT, a 9B text encoder and a VAE shipped as three separate files, and this node loads the first of them. The dropdown you're staring at - model_name - is the whole point of the article: MOSS-Image comes in Base and SFT variants, and they behave differently enough that picking wrong is the most common way to be disappointed by this model.
What this loader actually is
The display name says "UNET / DiT Loader," and DiT is the honest half. MOSS-Image is a diffusion transformer, not a classic UNet, and the underlying pipeline (MOSSImageTransformer) is loaded through the vendor copy of OpenMOSS's own inference code that ships inside this pack. The pack's whole editorial stance is that it doesn't reimplement anything: pinned upstream pipeline file, unmodified, with a validation doc proving tensor parity. If you've been burned by integrations that "work" but silently drift from the reference output, that framing is the reason to use this one.
The file is 10.16 GB in bf16 and comes in two flavours:
moss-image-base-bf16.safetensors- the base model, the one you'd treat as the general-purpose generator and the parent for finetunes.moss-image-sft-bf16.safetensors- the supervised-finetune release, tuned for nicer default output with less prompt babysitting. If you just want the pretty picture, start here.
Both share the exact same text encoder and VAE, so you only download those once.
One thing that surprises people
This node barely loads anything. Pick a file, hit run, and it hands downstream a validated descriptor - path, config, device, precision - not 10 GB of weights sitting in VRAM. The actual materialization happens inside the sampler (the pack builds the transformer lazily with init_empty_weights, assigns the state dict, then frees it when sampling finishes). That's why the memory footprint doesn't show up where you'd expect it, and why this loader is cheap to run on its own. It also means the loader is where file integrity gets checked: it verifies the weight SHA256 against the .assets/manifest.json beside the file, and refuses to run on a mismatch.
The inputs you'll touch
Three required fields, and only one needs thought.
model_name lists whatever is in ComfyUI/models/diffusion_models. device defaults to auto, which follows ComfyUI's own device policy and admits the model to GPU only if it fits (weight size plus about 2 GB of headroom); if it doesn't, it quietly moves to CPU rather than erroring. For a 10 GB DiT that fallback is not subtle in practice - you'll notice. precision defaults to bf16 and is the one knob here worth understanding: fp32 doubles the file's footprint for no benefit anyone has demonstrated on this model. Leave it alone.
Output is a single dit socket of type MOSS_IMAGE_DIT, and it goes to exactly one place: the MOSS-Image Official Sampler. Not KSampler. That custom type exists precisely so you can't wire a MOSS DiT into stock ComfyUI sampling and get plausible-looking but non-official results.
Install
Search ComfyUI MOSS-Image T8 in ComfyUI Manager (publisher t8star, package moss-image-t8) and restart. Manually, from your ComfyUI directory:
cd ComfyUI
git clone https://github.com/T8mars/Comfyui-Moss-Image-T8 custom_nodes/Comfyui-Moss-Image-T8
python -m pip install -r custom_nodes/Comfyui-Moss-Image-T8/requirements.txt
Then pull the weights with the directory structure intact:
hf download t8star/Moss-Image-Comfy --local-dir models \
--include "diffusion_models/*" --include "text_encoders/*" --include "vae/*"
For SFT only, narrow the first include to "diffusion_models/moss-image-sft-bf16.safetensors*" - note the trailing star, because you need the .assets folder next to the weights.
Where people get burned
The dropdown is empty. That means nothing landed in models/diffusion_models, or it landed one directory too deep. The hf download command in the README is run from your ComfyUI root so that --local-dir models creates exactly the folders ComfyUI scans. Everything else is a missing node and a restart away.
You moved the files and deleted the .assets folders. They look like clutter and they are load-bearing: manifest, hashes, and (for the TE) the tokenizer. The loader fails with "incomplete or mismatched component package" when they're gone, which reads scarier than the fix - re-download the file set.
You picked Base, expecting SFT. Base is not worse, it's just less forgiving of vague prompts, and the community-standard advice for any base-versus-tuned pair applies: tune the prompt for the variant you actually loaded.
Dependencies first. The pack wants Python 3.10+, PyTorch 2.9+, Diffusers 0.38–0.41 and Transformers 5.3+. If node import fails with an import error rather than a model error, it's that, not your safetensors.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | 0 options: | |
| device | COMBO | auto | 3 options: auto, cuda, cpu |
| precision | COMBO | bf16 | 2 options: bf16, fp32 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| dit | MOSS_IMAGE_DIT | — |