Topaz Generative Upscale
Topaz Generative Upscale — when the image doesn't have the detail to begin with
- image
- provider
- image
There's a whole class of image where a scaler is the wrong tool: a 2013 JPEG, a screenshot of a screenshot, a soft AI render you'd like to keep, a face from a group photo. The detail you want isn't in the file. Someone has to invent it. That's this node.
Topaz Generative Upscale is the other Topaz line - Wonder 3.5, Bloom 2, Reimagine, Redefine, Recovery V2 - and it's generation wearing an upscaler's clothes. It's the cloud equivalent of the SeedVR2 / SUPIR rung people argue about locally, and it belongs to the same rule: every generative step rewrites what it doesn't know, faces first.
How it works
An IMAGE goes in, the pack uploads it to Topaz's generative endpoint, polls the async task until it's done, and returns the decoded result as a single image output. Nothing touches your GPU. The five models in the dropdown are genuinely different tools rather than versions of one thing: Wonder 3.5 is an enhancement-strength lift, Recovery V2 is restoration (its one knob is a detail level), Redefine leans on texture, Reimagine is the aggressive reworker that adds generated detail and has flags for preserving faces and colours, and Bloom 2 is the softest, most painterly of the set.
Connection settings live on the separate Provider: Topaz Labs node. Leave provider unconnected and the node uses the official key from api_key.json or TOPAZ_API_KEY.
The inputs that matter
model- choose this first; it changes what's below it. Several models expose apromptand acreativitylevel, and on a couple of them leaving the prompt empty makes the service describe the image itself rather than you guessing what it wants to hear. For everything else, the dropdown hands you that model's own sliders, which is why a Reimagine pass can protect facial identity and a Recovery pass can't.scale_factor- 1 to 16 in 0.1 steps, used when the exact-size fields are 0. Generative upscales are where the factor really bites: 2x is the honest default, 4x starts asking the model to fill in a lot.output_width/output_height- request exact dimensions instead of a factor.crop_to_fill- crop or letterbox when the aspect ratio changes.output_format-pngunless you're delivering something smaller.extra- a JSON object merged into the request, for anything not exposed as a widget.retry_count- total attempts; 1 means no retry. On a paid, slow call, don't set this on a whim.
Output is one image, ready for a Save node or another pass.
Notice what's not at the top level: there are no face controls here, unlike the precision node. On this family, face handling belongs to the individual model, so if preserving a recognisable face matters, you pick the model that offers it rather than turning a dial. That's the design telling you what these models do.
Installing
ComfyUI Manager, search the pack title; or:
cd ComfyUI/custom_nodes
git clone https://github.com/yogurt7771/ComfyUI-YogurtNodes.git
cd ComfyUI-YogurtNodes && pip install -r requirements.txt
Restart, and find it under YogurtNodes/LLM/Upscale. Runtime display names in this pack carry a " (Yogurt Nodes)" suffix. Key file:
# custom_nodes/ComfyUI-YogurtNodes/yogurt_nodes/llm/api_key.json
{ "topaz": "your-topaz-api-key" }
Where people get burned
Slow and metered is the combination that catches people out. These jobs can run for minutes; raise task_timeout on the provider node to something generous rather than stacking retries, because each retry is another billed call.
Then the quality reality check, which the local upscaling threads have been hammering for two years: on an already-clean image, a generative pass adds texture nobody asked for, and SUPIR's whole reputation carries the same caveat - the top reply in its praise thread was "why does it change the facial features so much?", answered with "the model doesn't know the person so it fits it to what it does know." If there's a face you need to keep, give it its own pass and composite, or drop to the precision node. And if the job is video, don't run this per frame - per-frame upscalers shimmer on fine repeating texture because consecutive frames resolve it differently. That's a different job with different tools.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image to process. | |
| model | COMBO | Model version; the inputs below change with the selected model. | |
| scale_factor | FLOAT | 2.01–16 | Upscale factor, used when output_width and output_height are 0. |
| output_width | INT | 00–32000 | Exact width; 0 uses scale_factor. |
| output_height | INT | 00–32000 | Exact height; 0 uses scale_factor. |
| crop_to_fill | BOOLEAN | false | Crop instead of letterboxing on ratio change. |
| output_format | COMBO | png | Returned file format. |
| extra | STRING | Optional JSON object merged into the request (for parameters not exposed as inputs). | |
| retry_count | INT | 11–10 | Total attempts on failure. |
| provideropt | YOGURT_LLM_PROVIDER | Provider node. When unconnected, the official API is used with keys from api_key.json or environment variables. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |