Upscale Generation
Cloud upscale, not local — bump a clip to 4K without touching your VRAM
- client
- video_url
- generation_id
Upscaling in ComfyUI usually means a local model - ESRGAN, SeedVR2, tiled diffusion - grinding through your frames on your GPU. LumaUpscaleGeneration is the opposite of that in every way that matters: you hand it a generation id, it upscales the clip on Luma's servers, and a new, bigger video comes back. No VRAM, no local model, no frame-by-frame passes. Just a paid API call and a wait.
The distinction from the local upscaling stack is worth keeping straight, because the KB's upscaling hierarchy is about local inference. This node sits entirely in the "more pixels over time" bucket - it's a video upscaler, so the model has to keep every frame agreeing with its neighbours, which is the hardest upscaling job and the one where hosted services actually have an advantage: they don't care about your card's memory.
How it works
The node calls Luma's generations.upscale endpoint with the generation_id from any earlier generation node and a target resolution. The choices are 540p, 720p, 1080p, and 4k - so you can also downscale in the same call, though nobody really does that. The upscale is itself a new generation: it returns a fresh video_url and a new generation_id (not the one you fed in), and the node waits for it to complete just like every other node in the pack. save (default on) downloads the result into the outputs folder, named by the new id unless you set filename.
The one practical rule: upscale last. Run this as the final step after extend, interpolate, and audio are done, because every subsequent node would operate on the larger file and cost more. And expect a wait - a 4K upscale of a 9-second clip is a real job on their side.
What to set
generation_id- wire it from the clip you want bigger. It's a required input, so the node knows exactly which video to fetch.resolution-1080pis the sane default for most work;4kfor anything going to a big screen. Each step up costs more and takes longer.
Installing
Pack install as usual: ComfyUI Manager (search "ComfyUI-LumaAI-API"), or clone into ComfyUI/custom_nodes and install requirements.txt. Dependencies are light - lumaai==1.7.0, requests, numpy, Pillow - and there's no model to download because nothing runs locally. You need a LumaAIClient with your API key feeding the client input.
Common issues
- The output looks the same size as the input - check the resolution enum. If the source was 720p and you asked for 720p, you paid for a no-op.
- Upscaling too early in the chain - if you extend or add audio after upscaling, you're doubling up paid work on a big file. Reorder: generate → extend/interpolate → audio → upscale last.
- Local vs cloud expectation mismatch - this is a generative upscale on Luma's model, not a detail-preserving pixel upscaler. If you wanted pure fidelity at zero marginal cost, the local ESRGAN/SeedVR2 route is still the move; this node exists for when you want the bigger resolution without the VRAM bill.
- Credit awareness - 4K is the most expensive upscale tier. Iterate at 1080p, keep the 4K run for the final take.
A small bonus: because the upscaled clip is a new generation with its own id, you can chain two of these (e.g. 720p → 1080p → 4k) if the model allows it - though in practice one hop to the target resolution is both cheaper and cleaner.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| client | LUMACLIENT | — | |
| generation_id | STRING | — | |
| resolution | COMBO | 4 options: 540p, 720p, 1080p, 4k | |
| save | BOOLEAN | true | — |
| filenameopt | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |
| generation_id | STRING | — |