Protoface P-Image · Edit Image
The cheap fast one you'll actually use for drafts
- image
- mask
- files
- run id
Utility model, and that's a compliment
Pruna AI's P-Image is pitched by Protoface as "a fast utility model for drafts and resolution changes" - generate, edit, upscale, all three as separate nodes in this pack. Nothing about it is trying to be the best-looking image model you can call. It's trying to be the one you can afford to call fifteen times while you work out what you actually want.
That's a genuinely useful role in a workflow: P-Image to find the composition and the wording, then the same prompt through GPT Image or MAI for the frame you deliver. Same graph shape, cheap first pass, expensive last pass. And it's the only model here with a seed on the edit node, which is what makes iteration on this one possible in a way it isn't on the seedless nodes.
The inherent tradeoff of an API node still stands - a network call, a bill, your image on somebody's server - but at utility-tier pricing, throwing a dozen edits at it is a defensible thing to do.
The inputs
prompt is the edit instruction. Short and directive. "Make it a rainy street at night, keep the subject" - one change plus one preservation.
images is plural here, so multi-reference edits are possible: the thing to edit, plus anything you want it to match.
aspect_ratio defaults to match_input_image, which is the sensible one. You're editing, not re-framing; forcing a ratio is a request for the model to invent the edges.
output_format defaults to png.
seed is a dynamic combo: -1 is random, a number pins the attempt. This is the important difference from the pack's other edit nodes. Bump the seed to browse variations, pin it when a good one lands, then reword the prompt and keep the seed fixed to isolate what your words changed.
generation_id (0 by default) is the paid-job identity - fixed to reuse or resume, incremented to buy a new generation. Note the separation: generation_id says "this is the same request" while seed says "this is the same starting point." Confusing the two is the standard beginner error here. Change the seed and you have changed the payload, which is a new request regardless of what the ID says.
request_scope is frontend-assigned; headless workflows must supply a stable unique value.
Outputs
image (IMAGE, list), mask (MASK, list - real inverted-alpha semantics, so it composites properly), files (PROTOFACE_FILE, list of untouched originals for Protoface Save File), run id (string). The mask on an edit node is quietly useful: it means a downstream masked blend or local refine doesn't need its own segmentation.
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. Then the Protoface button, lower-right, and paste your key.
No models, obviously - Pruna's model isn't downloadable through this, and you shouldn't go looking for a checkpoint to put in models/. If a workflow imports this node and something's missing at load time, it's the Python deps, not weights.
Where people get bitten
Treating it as the quality model. It's a utility tier; if an edit comes back looking soft compared to what you get elsewhere, that's the tier, not your prompt. Same prompt through the MAI or GPT Image edit node is the comparison to run.
Batching into images - the adapter's "expects one asset; split the image/audio batch first" is about single-value fields, so check whether the socket you wired is a list or a single.
And recovery: a timeout leaves the job alive. Keep generation_id and the seed, requeue or resume with the run id, and don't bump either one "to retry" unless you're genuinely after a different image.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Edit instruction. | |
| images | COMBO | Public URLs, data URIs, or asset ids. | |
| aspect_ratio | COMBO | match_input_image | Aspect ratio of the generated image. |
| output_format | COMBO | png | Output image format. |
| seed | COMBO | Random seed. -1 means random. | |
| 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 | — |