Qwen-Image-2.1-Pro
The Qwen-Image you can't download
- referenceImages
- advancedFeatures.watermark.image
- image
Why this node exists
Qwen-Image is the family you already trust on your own disk. The 20B base and the Edit line are Apache 2.0, Qwen-Image-Edit became the default open instruction editor, and nothing about it polices your NSFW LoRAs. Then the line went API-only. Qwen-Image-2.0 cut 20B down to a 7B unified generation-plus-editing model and shipped with no weights at all, and 2.1-Pro is the same deal: there is no checkpoint to drop in models/checkpoints.
So this node is the only door. You type a prompt, Runware runs the model on their hardware, and the result comes back as a normal ComfyUI IMAGE you can wire into your local upscaler, mask chain, or Save Image.
That is also the honest cost of it. Your prompt and any reference image leave your machine, the call is metered, and the safety behaviour is Alibaba's, not yours - there is no weight to patch, which is the general shape of the API-node bargain. If the local 20B checkpoint can do the job, use it. Reach for this when you specifically want 2.1 behaviour - its text rendering and unified edit/generate path - and you have no local equivalent.
Worth knowing the ladder: the pack also ships Qwen-Image-2.0-Pro, 3.0-Pro, the Edit-2511 and Edit-Plus nodes, and Layered. Comparing them is a node swap and one queue, which is the nicest thing about having the whole catalog in the menu.
How it runs
Nothing gets loaded into VRAM. The node is an HTTP client: it builds a request (model: alibaba:[email protected], taskType: imageInference), converts anything wired into an IMAGE input into an inline base64 PNG data URI, sends it through the runware-sdk, then downloads the returned image URL and stacks it into a torch tensor. Dependencies are light - runware-sdk, pillow, soundfile - with no model files and no CUDA work beyond whatever your own downstream nodes do.
The API key resolves in this order: RUNWARE_API_KEY environment variable, then the value in ComfyUI's Settings, then ~/.runware/config.yaml written by runware auth login.
Each run prints cost and safety on the node's title bar, e.g. $0.00078 · NSFW: no. That little readout is the reason to keep an eye on numberResults: each result is its own generation, so a 4-result test is four bills like that one.
The inputs that matter
- positivePrompt - the only required input, multiline.
- width / height - default 512, range 182–5792. 512 is a small default for a model like this; set your real dimensions or nothing interesting happens.
- numberResults (1–20) - you get one
IMAGEoutput containing that many frames as a batch. Wire it to Save Image and you get that many files. - referenceImages - an
IMAGEtensor, no upload node needed. - settings.promptExtend - on by default, and it LLM-rewrites your prompt before generation. Convenient, and the enemy of reproducing a look. Turn it off when you want your words to be the actual prompt.
- settings.thinking - off by default; more reasoning, more latency.
- negativePrompt, seed, outputFormat (JPG/PNG/WEBP), outputQuality - the familiar ones. The watermark fields under
advancedFeaturesare inert until you flip that toggle.
The single output is image (IMAGE).
Installing it
ComfyUI Manager → search Runware → install → restart, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
Then set the key once, in ComfyUI Settings → Runware API key, or export RUNWARE_API_KEY (the env var wins). Heads up from the community: Runware's billing is top-up with a minimum charge and a card on file, which is the most common complaint about the platform even among people who rate its pricing.
Where people get burned
RuntimeError: No Runware API key- the key isn't set anywhere the node can see. Set it in Settings or the env var, and restart.- Errors are one clean line on purpose. You'll get something like
Runware: ... [parameter 'width', code …, HTTP 400]. Values outside a parameter's real range are rejected server-side. If you want the full traceback, setRUNWARE_DEBUGbefore launching ComfyUI. - Nothing reproduces. Nine times out of ten it's
promptExtend- the model isn't seeing the prompt you typed. Turn it off, then setseed. - Big dimensions cost more and can be refused. There are real per-model validation rules; the 5792px ceiling is not an invitation.
- The safety check is not a local setting.
safety.checkContentadds latency and reports NSFW on the title bar; what it permits is the provider's call and you can't fine-tune around it.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| positivePrompt | STRING | Text prompt describing elements to include in the generated output. | |
| referenceImagesopt | IMAGE | — | |
| advancedFeatures.watermark.imageopt | IMAGE | — | |
| negativePromptopt | STRING | Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale ≤ 1). | |
| widthopt | INT | 512182–5792 | Width of the generated media in pixels. |
| heightopt | INT | 512182–5792 | Height of the generated media in pixels. |
| seedopt | INT | 00–2147483647 | Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range. |
| numberResultsopt | INT | 11–20 | Number of results to generate. Each result uses a different seed, producing variations of the same parameters. |
| advancedFeaturesopt | BOOLEAN | false | Enable to set advancedFeatures. Off uses the model's default. |
| advancedFeatures.watermark.bgColoropt | STRING | Background color in hex format. | |
| advancedFeatures.watermark.displayPositionopt | COMBO | (default) | Watermark position. |
| advancedFeatures.watermark.fontColoropt | STRING | Text color in hex format. | |
| advancedFeatures.watermark.opacityopt | BOOLEAN | false | Enable to set advancedFeatures.watermark.opacity. Off uses the model's default. |
| advancedFeatures.watermark.opacity_valueopt | FLOAT | 0.100.1–1 | Watermark opacity. |
| advancedFeatures.watermark.textopt | STRING | Watermark text. | |
| settings.promptExtendopt | BOOLEAN | true | Enable LLM-based prompt rewriting to expand and clarify inputs. Affects reproducibility. |
| settings.promptExtendModeopt | COMBO | direct | Rewriting strategy for `promptExtend`. |
| safetyopt | BOOLEAN | false | Enable to set safety. Off uses the model's default. |
| safety.checkContentopt | BOOLEAN | false | Enable or disable content safety checking. Increases total generation time. |
| settings.thinkingopt | BOOLEAN | false | Enables thinking mode for improved quality at the cost of increased generation time. |
| ttlopt | BOOLEAN | false | Enable to set ttl. Off uses the model's default. |
| ttl_valueopt | INT | 60 | Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`. |
| outputFormatopt | COMBO | JPG | File format for the generated image. |
| outputQualityopt | INT | 9520–99 | Compression quality of the output. Higher values preserve quality but increase file size. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |