Agate Loader
The 522 MB node every Agate workflow starts from
- agate
Agate is LogoLabs' 260M text-to-image model: trained from scratch in 145 GPU-hours, MIT-licensed weights, 0.550 on GenEval. It isn't an SD 1.5 fine-tune and isn't a diffusion UNet - and it samples in SD 1.x's latent space, which is why it hands its output to stock ComfyUI nodes instead of demanding a bespoke pipeline.
Agate Loader is how you get there. It's the least glamorous node in the pack and the one you'll pick apart longest, because half its dropdowns change how the model runs downstream.
What it does
One safetensors file in ComfyUI/models/agate/ becomes an AGATE_MODEL handle. That handle is the whole interface: Agate Sampler, Agate Generate and Agate Plan Viewer all take it as their first input, and nothing else in the pack runs without it.
It's 522 MB for a 260M model because it isn't just weights: generator, text encoder (a fine-tuned Ettin-68M, ModernBERT-family), tokenizer and config all live in one bundle, with config and tokenizer tucked into the safetensors metadata. You don't source an encoder separately.
The inputs that matter
Five required widgets, and exactly one of them is a thing you'll never touch again.
checkpoint is a dropdown of single-file checkpoints in models/agate/. Out of the box there's one entry, agate-preview-001.safetensors, and if it's missing the node downloads it from Logolabs/agate-preview-001. The repo is public - no Hugging Face login, no gating to brace for.
decoder - sd-vae or taesd - is only read by Agate Generate, which needs a decoder of its own: sd-vae (SD-VAE ft-MSE, best quality) or taesd (tiny, faster, lighter, slightly softer). If you're going Agate Sampler → VAE Decode, this dropdown does nothing at all.
device is auto, cuda or cpu; auto follows ComfyUI. Forcing cuda without CUDA raises rather than silently falling back, which is at least honest, and cpu runs fp32 at 2–2.7 seconds per step - a debugging setting, not a workflow.
cuda_graphs is on by default and it's why this little model feels instant: Agate's per-step arithmetic is small enough that kernel launches dominate, so each denoising step is recorded as a CUDA graph and replayed. The price is the first run of every input shape - a new batch size cost 20 seconds the first time on the author's RTX 4060. If you're sweeping batch_size, turn it off.
load_guide preloads the guide model that autoguide steers against, so the extra 0.5 GB of VRAM lands here instead of mid-sample. Leave it off unless you're using autoguide.
model_folder is the advanced one: a local folder in the release layout (config.json, generator.safetensors, text_encoder/) or a Hugging Face repo id, which overrides the checkpoint dropdown entirely. It's the escape hatch for exact fp32 CPU results, since the single file is bf16-rounded.
Output: agate. One wire, into a sampler.
Installing it
Manager → search Agate or agate-comfyui → Install → restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/logolabs/agate-comfyui
pip install -r agate-comfyui/requirements.txt
Use ComfyUI's own Python for that pip call (portable build: ..\python_embeded\python.exe -m pip install -r agate-comfyui\requirements.txt). What actually installs is modest - diffusers>=0.30, transformers>=4.48, safetensors, huggingface_hub - and nothing pins or replaces torch. The nodes land under LogoLabs → Agate.
Then the model files. agate-preview-001.safetensors (522 MB) goes in models/agate/ and downloads itself on first use. agate-guide-27600.safetensors (522 MB) goes in the same folder, fetched only when you actually turn autoguide up. And vae-ft-mse-840000-ema-pruned.safetensors (335 MB) goes in models/vae/, only for the Sampler → VAE Decode route - most SD 1.5 setups already have it.
Where people get burned
transformers is the one that bites hardest. The text encoder is ModernBERT, which needs >=4.48, and plenty of healthy ComfyUI installs ship something older - the loader then imports fine and dies in a way that reads like a broken pack rather than a stale dependency. Check that version first. It's classic ComfyUI dependency hell: custom nodes install into one shared environment with no isolation.
Then the first-run weirdness, which is not a hang. The first generation after starting ComfyUI takes 26–28 seconds: weights load, cuDNN picks its kernels, the CUDA graph gets recorded. Once per session - and briefly again for each new shape, since every batch size and prompt-length bucket (64/128/256/512 tokens) gets its own graph. Changing checkpoint, device or cuda_graphs also invalidates the cache; the pack keeps exactly one Agate in memory.
Offline machines are fine: grab both files from the comfyui/ folder of the model repo and drop them in models/agate/. An agate: entry in extra_model_paths.yaml works too if your models live elsewhere.
One side effect to file away before you blame something else. On CUDA, loading Agate sets torch.backends.cudnn.benchmark = True and disables PyTorch's cuDNN attention backend for the whole ComfyUI process, because those are the kernels Agate was trained with. Other models keep working - just with those settings. If some other checkpoint's output shifted after you added Agate to a workflow, that's why.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| checkpoint | COMBO | agate-preview-001.safetensors | Single-file checkpoints in models/agate/. agate-preview-001.safetensors is downloaded from huggingface.co/Logolabs/agate-preview-001 if it is missing. |
| decoder | COMBO | sd-vae | Only used by Agate Generate. sd-vae: SD-VAE ft-MSE, best quality. taesd: tiny decoder, faster and lighter, slightly softer. |
| device | COMBO | auto | auto uses ComfyUI's device |
| cuda_graphs | BOOLEAN | true | Record each denoising step as a CUDA graph (much faster; the first run per batch size and prompt length is slower) |
| load_guide | BOOLEAN | false | Preload the guide model used by autoguide. Otherwise it loads on first use. |
| model_folderopt | STRING | Advanced: instead of the checkpoint, a Hugging Face repo id or a local folder in the release layout (config.json, generator.safetensors, text_encoder/) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| agate | AGATE_MODEL | — |