Protoface GPT Image 2 · Edit Image
Multi-image in, no seed, argue with it in English
- image
- mask
- files
- run id
Why this one and not an inpaint graph
GPT Image's reputation is instruction-following and text rendering - it reads a sentence and does the sentence, which is why it's the model people use when the edit involves words in the picture (a sign, a label, a t-shirt graphic, a UI screenshot) or a compositional change that's easier to describe than to mask. You could build that locally with an inpaint mask and a text encoder, and you'd get a different, more controllable, less obedient result.
Notice the plural: images. This edit node takes a list of inputs, so the edit can be "put the object from the second image into the first" or "make these two product shots match" - multi-image reference, not a single source frame. Several siblings in the pack take a single image (the MAI edit node, for one); this is the one built for a set.
And notice what's absent: no seed, no negative prompt, no steps. GPT Image 2 decides. Your iteration lever is the sentence you typed.
The inputs
prompt is the instruction. Write it as one clear directive plus a preservation clause - "replace the background with a plain white sweep, keep the product, its shadow and its label exactly as they are" - because these models will happily redesign things you liked if you don't tell them not to.
images takes one or more assets: public URLs, data URIs, or asset ids, and the socket grows as you connect. Order matters when your prompt says "the second image."
quality defaults to medium, and its tooltip is refreshingly blunt: higher quality costs more. Start at medium, only climb when the output is going in front of somebody.
resolution defaults to 1k.
aspect_ratio has no default and its tooltip says it's auto-detected from the input image if not specified - so leaving it alone means "match my source," which is usually what you want for an edit. Setting it explicitly is how you ask for a re-frame, and the model will happily refill the new area.
output_format defaults to png.
generation_id is the paid-job identity: fixed to reuse or resume, incremented for a fresh, freshly-billed generation. Since there's no seed, this is the only thing in the node that resembles reproducibility - and what it actually gives you is the same picture back, not a new roll of the same prompt. request_scope is assigned per node by the frontend; headless callers must supply a stable value or submission is refused.
Outputs
image (IMAGE, list), mask (MASK, list, inverted-alpha convention), files (PROTOFACE_FILE originals for Protoface Save File), and run id. The mask is a nice bonus on an API node - it means a downstream masked composite or refine doesn't need a separate segmentation step.
Install
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
ComfyUI 0.41.0+, Python 3.10+, deps httpx, jsonschema, Pillow, av>=14. Or Manager → search Protoface → protoface-nodes → restart → reload the tab. Then Protoface, bottom-right, key. Remember the key is memory-only; a restart clears it.
Do note the billing distinction the README makes: this extension bills your Protoface account directly and is independent of Comfy's Partner Nodes and credits. Having Com credits buys you nothing here.
Where people get bitten
Cost per attempt. Quality medium at 1k is the sane loop; running high-res, high-quality passes while you're still figuring out the wording is how a quick asset turns into a surprising invoice.
Batching. images is a list reference input, not a batch-in/one-out operation - connect three images and they're three references to one edit, not three edits. For three separate edits, three nodes.
Recovery. A timeout or a killed tab leaves the job alive: keep generation_id and requeue, or use Protoface Resume Run with the run id. Incrementing the ID to retry is a new charge, not a retry. And don't clear ~/.cache/protoface-comfyui while you're debugging - that's the journal that proves you already submitted this exact request.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The positive prompt for the generation. | |
| images | COMBO | Public URLs, data URIs, or asset ids. | |
| quality | COMBO | medium | The quality of the generated image. Higher quality costs more. |
| resolution | COMBO | 1k | The resolution of the output image. |
| aspect_ratio | COMBO | The aspect ratio of the generated image. Auto-detected from input image if not specified. | |
| output_format | COMBO | png | The format of the output image. |
| 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 | — |