zhenzhen-VOSR2-4K-image-upscale-lowprice
One Image In, One 4K Image Out — and No Settings to Argue About
- input_image
- api_config
- image
- image_url
- task_id
- response
"Which upscaler" is an unanswerable question until you say which of three jobs you mean: more pixels, more detail, or more pixels over time. This node does the second one. It takes a single image, hands it to the vendor's VOSR2 service, and gives you back a 4K render - invented detail included, because at that lift it cannot be anything else.
So the honest framing: this is the cloud version of the SeedVR2-shaped job. If you already run SeedVR2 or FlashVSR locally, you own the better-known tools - the KB's own read is that SeedVR2 takes the heavy restoration lifts and FlashVSR wins on speed for already-decent sources. VOSR2 isn't in that conversation; I checked, and the model name has zero footprint in the community corpus. What you're buying isn't a better upscaler, it's not needing a GPU and not downloading weights.
How it works
Dead simple, and refreshingly so:
- Your
IMAGEis encoded to PNG and uploaded to the service. - The node posts a job with the model string
vosr2-image-upscaleand the uploaded URL. - It polls the task, downloads the result, converts it to a ComfyUI
IMAGE.
That's it. There is no prompt, no denoise strength, no scale factor, no resolution selector, no tile size. The tooltip is the whole spec: exactly one source image, VOSR2 returns one 4K image. The node is the API's shape, and the API has no opinion dials.
Two consequences follow. It's a fixed 4K target, so a 512px thumbnail and a 1920px photo both come back at 4K, and only one of those is a good idea. And it's generative restoration: it will invent eyelashes, pores and fabric weave, and it will also quietly rewrite a face. The KB's upscaling doc is right about this and it applies to cloud models too - give recognisable faces their own pass, and don't trust a 4K regrade of a family photo to keep someone looking like themselves.
The inputs
input_image is the only required one, and it means exactly one image. It'll refuse a batch: if you feed it a five-frame IMAGE tensor it errors out at validation with "accepts exactly one input image, not an image batch" rather than upscaling the first frame and silently dropping the rest. If you're pulling from a batch-producing node, put an Image From Batch node in front of it.
api_config takes the output of a T8Zhenzhen_API_Settings node - the domestic shop endpoint is the default. Leave it unwired and the node falls back to a SEEDANCE_API_KEY environment variable; leave both empty and it tells you so.
skip_error returns a placeholder instead of throwing. On this node that placeholder is a plain white 512×512 image, so a "successful" batch with a white square in it means one job failed and got papered over. Handy for unattended runs, a trap while you're testing.
seed is ComfyUI cache control only - the tooltip says so, and no seed is sent to VOSR2. With it on fixed and nothing else changed, re-running the workflow reuses the cached result and doesn't re-upload or re-bill.
Outputs
image is the 4K picture. image_url is the result link - useful, because if the download step fails on a big 4K file crossing the border you can go get it yourself instead of regenerating. task_id is your receipt for the site's async task list. response is the raw JSON from submit and poll, which is where you look when you want to know whether the job succeeded upstream and the node just gave up waiting.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-zhenzhen
Or search Comfyui-zhenzhen in ComfyUI Manager, install and restart. This is the pleasant part: because the model runs on someone else's hardware, there are no weights, no VRAM requirement and no CUDA drama. The pack's requirements.txt is ordinary Python packages and there's no model folder step at all.
Practical notes
The example workflow in the repo's workflow/ folder is Load Image → this node → Save Image, plus the Settings node. That's the whole graph.
The failures you'll actually see are transport ones. Empty or wrong key: clear error. 429/500: the vendor calls that upstream load, not your mistake - rerun. Large 4K results failing to download over an international link: the pack retries and will bypass a broken HTTP_PROXY, and the site's per-key object-storage region setting (CN/US) is the documented fix.
And budget for it: every run is a metered call, and "cheap" refers to the vendor's domestic price list, not to free. Generating at 1K, upscaling to 4K and then deciding you wanted a different crop is three charges. Crop first.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| input_image | IMAGE | Exactly one source image. VOSR2 returns one 4K image. | |
| api_configopt | ZHENZHEN_SEEDANCE2_CONFIG | — | |
| skip_erroropt | BOOLEAN | false | — |
| seedopt | INT | 00–18446744073709550000 | ComfyUI cache seed only; it is not sent to VOSR2. Fixed reuses the cached result. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| image_url | STRING | — |
| task_id | STRING | — |
| response | STRING | — |