Lumina-Next-SFT Diffusers
Run Lumina-Next-SFT in ComfyUI — the Apache-licensed flow model everyone skipped
- latents
- LATENT
Don't feel bad if you've never heard of Lumina-Next. It launched mid-2024, did genuinely good work, and then Flux arrived and vacuumed up the entire conversation. The model is Alpha-VLLM's Apache-licensed text-to-image diffusion transformer - T5 text conditioning, flow-matching sampling, no API, no key, all local. This node is the lowest-effort way to actually run it inside ComfyUI: one single node that downloads the model, runs the whole diffusers pipeline, and hands you latents.
You'd reach for it for exactly one reason: curiosity about a real, open, redistributable alternative to the SD/Flux mainstream. The official ComfyUI-native Lumina implementation is a sprawling, fiddly thing. This wrapper is the opposite - one node, prompt in, latents out. It's a small enthusiast project (the author posted it to r/comfyui in July 2024 and was open about figuring out time-aware scaling as he went), so treat it as an on-ramp, not a production workhorse.
How it works
Under the hood it's a thin wrapper around HuggingFace's LuminaText2ImgPipeline. On first run, model_path (default Alpha-VLLM/Lumina-Next-SFT-diffusers) pulls the weights from Hugging Face, then saves a local copy into a folder next to the node itself, so subsequent runs load from disk. It loads in bf16 when your GPU supports it and falls back to fp32 otherwise - that fallback is where your VRAM budget goes, because this is a big transformer plus a T5 text encoder.
The clever bit: it returns a latent scaled for the SDXL VAE (0.13025 scale factor), which is exactly why the author says to decode with the standard SDXL_VAE. It also swaps in a FlowMatchEulerDiscreteScheduler and runs everything with output_type="latent".
Inputs and outputs that matter
You'll actually touch maybe five of these. prompt and negative_prompt are the obvious ones (Lumina isn't guidance-distilled, so the negative prompt really does work here). num_inference_steps (default 30) and guidance_scale (default 4.0) are solid starting points - nudge guidance up if output comes out mushy. seed (‑1 = random) and batch_size (1–4) do what you expect.
The rest are Lumina's personality:
scaling_watershed(0.3) - Lumina's resolution-scaling control. Leave it alone until you're pushing high resolutions.proportional_attn(True) - keeps cross-attention proportional as resolution grows, so big generations don't fall apart. Keep it on.clean_caption(True) - runs a caption-cleaning pass on your prompt before encoding.max_sequence_length(256) - T5's token cap for the prompt. Generous enough.use_time_shift/t_shift- the flow-matchingshiftknob. Off by default; flipping it on sets scheduler shift to1 + t_shift, redistributing sampling effort between composition and detail.strengthplus the optionallatentsinput - this is your img2img. Feed a latent in and lower strength to blend.
Output is a single LATENT. Wire it into a VAE Decode node using SDXL_VAE - the node never decodes for you, which trips up everyone on first run.
Installing it
The pack is in ComfyUI Manager - search "Lumina". Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Excidos/ComfyUI-Lumina-Next-SFT-DiffusersWrapper
Then restart ComfyUI. (Ignore the README's own clone URL - it's stale and points at a differently-named repo.) The heavy lifting is the dependency list: this installs the development branch of diffusers straight from GitHub (git+https://github.com/huggingface/diffusers), plus transformers, accelerate, and torchdiffeq. The README warns about it and so do I: that dev-branch diffusers is the single most likely thing to break other nodes that pin an older diffusers. It's the classic custom-node dependency collision, in the flesh.
Common issues
- Other nodes start erroring after install - the dev-branch diffusers. It's usually fixable by re-pinning diffusers to a stable release, at which point this node may stop working too. Pick your poison.
- Black image out of the decode - check the console. On any exception the node returns zeroed latents instead of raising, so the UI shows you a clean black box and the real error is in the log. Memory errors show up here.
- OOM - the first run downloads several GB of weights and bf16 is your friend; on GPUs without it the fp32 fallback is hungry.
- All-zero latents - if you feed a blank latent, the node injects noise automatically rather than failing, so "it ran but looks like static" means check your latent source.
It's a fun way to spend an evening with a model the community genuinely forgot. The repo even ships example workflows, including an iterative upscaler built on SDXL-Lightning. And if Lumina-Next hooks you, the real successor - Lumina-Image-2.0 - landed in 2025 with day-one ComfyUI support and a proper Apache license. That's where the model lives now; this node is how you try the warm-up act.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| model_path | STRING | Alpha-VLLM/Lumina-Next-SFT-diffusers | — |
| prompt | STRING | — | |
| negative_prompt | STRING | — | |
| num_inference_steps | INT | 301–200 | — |
| guidance_scale | FLOAT | 4.000.1–20 | — |
| seed | INT | -1 | — |
| batch_size | INT | 11–4 | — |
| scaling_watershed | FLOAT | 0.300–1 | — |
| proportional_attn | BOOLEAN | true | — |
| clean_caption | BOOLEAN | true | — |
| max_sequence_length | INT | 25664–512 | — |
| use_time_shift | BOOLEAN | false | — |
| t_shift | INT | 41–20 | — |
| strength | FLOAT | 1.000–1 | — |
| latentsopt | LATENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |