Protoface MAI Image 2.5 · Edit Image
One image in, one edit out
- image
- mask
- files
- run id
What it is
Microsoft's MAI Image 2.5, in edit mode, wrapped by the Protoface pack. You give it one picture and an instruction - "make the label read ARBOR DAY", "swap the background to a plain studio sweep", "remove the person on the left" - and it comes back with an edited image as a native IMAGE tensor you can wire into whatever's next.
Reach for it when the edit is described in words and the whole image should stay coherent, as opposed to a masked inpaint where you're telling a local sampler exactly which pixels to redraw. The tradeoff is the usual API one: per-call cost, your image goes to a server, and the result is what the provider's model decided rather than what your checkpoint and LoRA would have done. If you have a local FLUX or Qwen setup with a favourite inpaint workflow, this node is for the jobs where setting that up is more work than it's worth - a quick product shot, a slide graphic, a mockup.
The nice detail: the node outputs a native mask as well as the image. For a text-driven edit you rarely need it, but it means the node slots into mask-aware graphs instead of dead-ending at Save Image.
The inputs
prompt is the instruction, plain natural language. If you've spent months writing CLIP-flavoured tag soup, unlearn it here - these edit models respond better to a sentence including the word "keep": "keep the lighting and the product, change the backdrop to charcoal seamless".
image is a single asset. Singular. This is the structural difference from sibling nodes in the pack that take images plural with a reference list - MAI edit gives you exactly one input frame, so any multi-image compositing has to happen on your side first, or in a different model's node. Easy mistake when you're copying a wired-up graph.
output_format defaults to png, which is what you want while iterating; switch to jpg when you're generating hundreds of variants and care about disk.
size is labelled "the aspect ratio of the edited image" and defaults to auto - so despite the name it's a shape picker, and auto means "match what I gave you." Leave it there unless you specifically want a re-frame, because a non-auto ratio is a request to change the composition as well as the content.
generation_id is the money field: fixed reuses or resumes the same paid job, incremented buys a new generation. It is not a seed, and there's no seed here at all - the model's randomness isn't exposed, which is a real ergonomic difference from the P-Image and Recraft nodes. You iterate by rewording the prompt, not by re-rolling.
request_scope is auto-assigned per node in the UI. Headless queueing has to supply a stable unique value or the node refuses to submit.
Outputs
image (IMAGE, list), mask (MASK, list, inverted-alpha semantics like the rest of ComfyUI), files (PROTOFACE_FILE, list - the untouched originals, useful when you asked for png and want to keep alpha), and run id. All the media outputs are lists; ComfyUI maps downstream nodes over them, so a single node handling several results doesn't need a loop.
run id is worth wiring to a text display if you're doing batch work. It's the only handle you have on a job once the browser's closed.
Install
Nothing to download - the model isn't yours, that's the point. Requirements are ComfyUI 0.41.0+, Python 3.10+, and four packages:
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
(httpx, jsonschema, Pillow, av>=14.) ComfyUI-Manager users: search Protoface, install protoface-nodes, restart, reload the browser tab. Then click Protoface in the lower-right and paste a key from your Protoface account.
Where people get bitten
Wiring a batch into image throws expects one asset; split the image/audio batch first - that error string comes straight out of the adapter and it's telling you the truth: one frame per call.
A missing key after a restart looks like an auth failure; the key is memory-only by design, so re-enter it or set PROTOFACE_API_KEY_FILE.
And the one that actually costs money: if a job times out or the browser drops, do not bump generation_id to "retry". Keep it, requeue, or use Protoface Resume Run with the run id. Also keep ~/.cache/protoface-comfyui around - it holds the journal that makes that recovery possible, and deleting it mid-job is how people end up paying twice for one picture.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The instruction describing how to edit the input image. | |
| image | COMBO | A public URL, a data URI, or an asset id. | |
| output_format | COMBO | png | The format of the edited image. |
| size | COMBO | auto | The aspect ratio of the edited 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 | — |