Protoface Qwen Image 3.0 · Edit Image
Qwen Image 3.0 Edit Without the 20GB Download
- image
- mask
- files
- run id
If you've spent any time on Qwen-Image-Edit, you know the shape of the workflow: load a photo, type "change her jacket to olive canvas, keep the face", wait. Qwen Image 3.0 is the next model in that line, and Alibaba did not open-weight it. That's the whole reason this node exists - it's an editing model you can't download, wired into a graph that behaves like a local one.
What you're actually getting
Alibaba's Qwen-Image editing line is the one people still run locally (2511 on Apache 2.0 weights, the thing with the drift fix and the LoRA support), and the read on the family is that its real strength is following a specific instruction while leaving the rest of the frame alone. Qwen Image 3.0 keeps that behaviour and adds stronger prompt following and cleaner detail. There are no weights to grab, so the only path to it is an API - the model isn't on your machine, the node pretends it is.
The practical appeal is unglamorous: no 20GB checkpoint, no quantization rabbit hole, no thirty-second wait on a 3060. You get the output as a normal IMAGE tensor and keep compositing, upscaling and masking locally.
How the mechanism works
Protoface doesn't ship one hand-written class per model. At startup it reads a bundled JSON catalog (44 models, 95 tasks) and generates a native ComfyUI V3 node for each model/task pair, with controls built from that model's public request schema. So this node is the same shared code as every other Protoface node - what differs is the schema it was generated from.
When you queue, it validates your payload against that schema before spending anything, converts your tensors to PNG, uploads any media it hasn't seen before (uploads are cached by content hash), submits the job, polls, then downloads the result into its own state directory and decodes it into ComfyUI types. Images come back as a list plus a matching mask. There's a progress bar and an interrupt hook, so a cancel actually hits the HTTP layer - though Protoface is upfront that cancellation is best effort and doesn't imply a refund.
The controls you'll actually set
prompt is the edit instruction and it takes Chinese and English, capped at 800 characters. images is where your source goes - up to three of them, and the slots grow as you connect assets. If you connect a Load Image node holding a batch of four, the node refuses with "expects one asset; split the image/audio batch first"; that's deliberate, not a bug.
resolution is a 1k/2k tier, and the tooltip is honest about what it is: the billing tier. aspect_ratio is optional - leave it on Default and the edit follows your first input image's ratio, which is what you want most of the time. enable_prompt_expansion defaults to on and quietly rewrites your prompt with an LLM before the edit. Great for loose vibes, bad for "move the left hand exactly 12 pixels". Turn it off when precision matters.
seed is optional and takes -1 (random) or an explicit 0–2147483647. generation_id is the one you should read twice: it is not a seed. Keep it fixed and the pack reuses or resumes the same paid job; increment it and you've bought a new generation.
Outputs
image is a list, so downstream nodes map over it automatically. mask comes from the result's alpha channel, inverted in the ComfyUI convention - wire it straight into an inpaint or composite. files carries the original downloaded assets (including transparent PNGs) for the Protoface Save File node. run id is a plain string you can hand to Protoface Resume Run or paste into a support ticket.
Install
Manager is the easy path: search Protoface, install protoface-nodes, restart, reload the browser. If the registry index hasn't caught up:
cd ComfyUI/custom_nodes
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git protoface
python -m pip install -r protoface/requirements.txt
That pulls httpx, jsonschema, Pillow and av - PyAV is the one that matters for video results, so it's worth confirming it installed with ComfyUI's own interpreter rather than a system Python. Needs ComfyUI 0.41.0+ and Python 3.10+. Then click Protoface in the lower-right corner and paste your account key; it lives in server memory and won't survive a restart, which is why headless rigs use PROTOFACE_API_KEY_FILE.
Where people get burned
"API key required" right after a restart. Expected. The interactive key is memory-only by design, so nothing is stored in your workflow. Re-enter it, or set the env var.
Editing the wrong image. With three refs connected and no explicit aspect_ratio, the model may work from the second or third. Be explicit about which image the prompt refers to.
Requoting an unchanged graph and paying twice. If you changed the prompt, the assets or any parameter, that's a new request by definition. Only a byte-identical requeue resumes the journaled job - that's what keeps a crash from costing you money, and it's also why "just press queue again" is safer than it looks.
Comfy Cloud won't work. It doesn't permit arbitrary custom nodes, and Protoface bills your Protoface account directly rather than using Comfy credits.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Text prompt describing the desired edit, supports Chinese and English (max 800 characters) | |
| images | COMBO | Public URLs, data URIs, or asset ids. | |
| resolution | COMBO | 1k | Output resolution tier used for billing. |
| aspect_ratio | COMBO | Aspect ratio of the generated image. Leave empty to use the first input image ratio. | |
| enable_prompt_expansion | BOOLEAN | true | Whether to enable intelligent prompt expansion |
| seed | COMBO | Random seed for reproducibility (-1 for random, 0-2147483647 for specific seed) | |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |