Nodes/Protoface/Protoface P-Image · Edit Image
ComfyUI Node

Protoface P-Image · Edit Image

The cheap fast one you'll actually use for drafts

By protoface-ai·Created 22 days ago·Updated 13 days ago· 0
Protoface P-Image · Edit Image
    • image
    • mask
    • files
    • run id
    ◄prompt►
    ◄images▾►
    ◄aspect_ratiomatch_input_image►
    ◄output_formatpng►
    ◄seed▾►
    ◄generation_id0►
    ◄request_scope►

    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.

    CategoryProtoface/Image/pruna-ai

    Inputs (7)

    NameTypeDefaultDescription
    promptSTRINGEdit instruction.
    imagesCOMBOPublic URLs, data URIs, or asset ids.
    aspect_ratioCOMBOmatch_input_imageAspect ratio of the generated image.
    output_formatCOMBOpngOutput image format.
    seedCOMBORandom seed. -1 means random.
    generation_idINT00–9007199254740991Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed.
    request_scopeSTRINGAutomatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret.

    Outputs (4)

    NameTypeDescription
    imageIMAGE—
    maskMASK—
    filesPROTOFACE_FILE—
    run idSTRING—