Nodes/ForgeNeo Bridge/Forge Compat Import / Spec
ComfyUI Node

Forge Compat Import / Spec

A Forge PNG is just a text blob — this node turns it into something ComfyUI can run

By ukr8b3g-cmyk·Created 26 days ago·Updated 7 days ago· 3
Forge Compat Import / Spec
    • spec
    • report
    ◄source_mode▾►
    ◄profile▾►
    ◄policy▾►
    ◄payload{"config_hash":null,"effective":{"assets":[],"family":"anima","guidance":{"batching_policy":"as_loaded","ngms":0.0,"ngms_all_steps":false,"skip_early_cfg":0.0},"image":{"batch_size":1,"height":1344,"width":1024},"loras":[],"mode":"txt2img","noise":{"batch_seed_rule":"forge_image_rng","ensd":"0","seed":"1895162280","seed_resize_from":{"height":0,"width":0},"source":"CPU","stream_policy":"forge_image_rng_private_v1","subseed":"0","subseed_strength":0.0},"numeric":{"anima_adapter_dtype":"as_loaded","attention_backend":"as_loaded","model_dtype":"as_loaded","reference_environment_id":null,"sampling_dtype":"fp32","text_encoder_dtype":"as_loaded","vae_dtype":"as_loaded"},"prediction_type":"flow","sampling":{"beta_alpha":0.6,"beta_beta":0.6,"cfg":1.5,"denoise":1.0,"discard_penultimate_requested":false,"eta_ancestral":1.0,"eta_ddim":0.0,"flow_match_options":{"invert_sigmas":false,"stochastic_sampling":false,"use_beta_sigmas":false,"use_dynamic_shifting":false,"use_exponential_sigmas":false,"use_karras_sigmas":false},"img2img_extra_noise":0.0,"img2img_step_mode":"forge_scaled","noise_schedule":"Default","rho":null,"s_churn":0.0,"s_noise":1.0,"s_tmax":0.0,"s_tmin":0.0,"sampler":"euler","scheduler":"simple","sgm_noise_multiplier_requested":false,"shift":3.0,"sigma_max":null,"sigma_min":null,"steps":10},"sdxl":null,"text":{"clip_skip":null,"comma_padding_backtrack":20,"emphasis":"Original","layer_policy":"anima_last","lora_policy":"explicit_loader_only","negative_raw":"blurry, low quality, text, watermark","parser":"forge_neo_710f1e25","positive_raw":"A red ceramic teapot on a wooden table, a white cup on the right, soft window light, plain background.","schedule_clock":"forge_denoiser_call"}},"extensions":{},"policy":"strict","profile":{"id":"forge-neo@710f1e25","reference_commit":"710f1e25fcac84d880cbccf27d11b2e3276e589e","reference_repository":"Haoming02/sd-webui-forge-classic"},"provenance":{"/assets":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/family":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/guidance":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/image":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/loras":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/mode":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/noise":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/numeric":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/prediction_type":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/sampling":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/sdxl":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/text":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null}},"requested":{},"schema_version":"1.0.0","source":{"exporter":"unknown","exporter_version":null,"filename":null,"image_sha256":null,"kind":"manual","native_workflow_present":false,"raw_fields":[],"raw_infotext":null,"verified_exporter_commit":null},"status":"needs_review","unresolved":[],"unsupported":[],"warnings":[]}►
    ◄overrides_json{}►
    ◄image_file►

    Dropping a Forge Neo image onto the ComfyUI canvas looks like magic, and the pack's drag-and-drop frontend takes most of the credit. Underneath, the whole thing starts at one node you'd otherwise never open: Forge Compat Import / Spec. It's the entry point of the legacy four-node chain, and it's where "the text block inside this PNG" becomes a structured, hashed, checkable generation spec.

    Why it has to exist

    Forge and A1111 don't write a workflow into your image. They write a flat human-readable parameters string - prompt, Negative prompt:, then Steps: 30, Sampler: Euler a, CFG scale: 7, Seed: …. That's a settings line, not a graph, and nothing in ComfyUI natively reads it. Which is why the usual answer to "how do I regenerate this Forge image in ComfyUI" is "retype the settings and hope". This node is the exception: it parses that blob, binds the named checkpoints, text encoders, VAEs and LoRAs to files you actually have, and hands out a spec the other three Compat nodes can execute.

    Two gotchas baked into it. Images that already carry a native ComfyUI workflow get kicked back with NATIVE_METADATA_PRIORITY rather than double-imported - Comfy's own importer handles those better, and it will be right. And you need the original file, not a screenshot or a re-encoded copy: the pixels carry nothing, the metadata is the payload.

    The inputs you set

    • source_mode - manual, image, infotext, or spec_json. image reads the file named in the optional image_file field; infotext takes an A1111-style string pasted into payload; the other two parse payload as JSON.
    • policy - strict or exploratory. How firmly it treats fields it couldn't resolve.
    • profile - forge-neo@710f1e25, the Forge Neo commit the pack pins its compatibility behaviour to. There's exactly one option and no reason to want a second.
    • payload - the big JSON document, defaulting to a complete example spec. Open the ForgeNeo Bridge editor from the ComfyUI menu instead of hand-editing this.
    • overrides_json - a JSON Pointer map, default {}, for changing individual fields without rewriting the payload.
    • image_file - input-directory-relative only. Absolute paths and URLs are rejected, so put the PNG in ComfyUI/input/.

    It outputs spec (FORGE_GENERATION_SPEC, wired into Forge Compat Text / Noise / Sampler) and report, a JSON string with the status and any warnings.

    The part worth trusting

    The node never trusts a "ready" flag written into a document. It recomputes status itself - ready, needs_review or unsupported - and an unmatched filename stays in the spec alongside an explanation instead of being silently swapped for whatever looked closest. Given how much of this hobby is guessing which checkpoint someone used, that refusal to improvise is the feature. It also won't adopt a streaming IMAGE tensor as a metadata source, because by then the EXIF is long gone.

    Guard rails: 128 MiB per image, 16 MiB of extracted metadata, 100k characters per prompt, and .., absolute paths and UNC paths are refused. Seeds must fit in uint64, checked before anything reaches the GPU.

    Install

    The pack installs like any other, from custom_nodes:

    cd ComfyUI/custom_nodes
    git clone https://github.com/ukr8b3g-cmyk/ComfyUI-ForgeNeo-Bridge.git
    

    Restart ComfyUI and reload the browser with F5. Nothing is pip-installed at startup and no model auto-downloads; the pack runs on ComfyUI's existing torch/numpy/scipy/Pillow/tqdm, and its Lark parser is vendored in a private namespace so it can't collide with a system lark. Update with git pull --ff-only inside the repo. Manager works too - search the pack title.

    When it goes wrong

    NATIVE_METADATA_PRIORITY - the image had a ComfyUI workflow in it. Use Comfy's normal drag-drop, not this chain.

    ASSET_MISSING or ASSET_AMBIGUOUS shows up downstream on the loaders. The importer deliberately didn't pick a winner; fix the Loader to point at a file you have.

    Status needs_review means it built something, not something correct. Read report before you queue.

    You're on a fork/commit the pack doesn't pin to and results drift. The spec's profile is a specific Forge Neo commit - same-sounding sampler names across Forge variants are not proof of identical implementations, which the pack's own docs say out loud.

    One honest expectation to set: this is a young, single-author pack (the same dev ships a Krea2 bounding-box prompter). The four ForgeCompat nodes are kept around as the legacy, spec-driven path - image drops and fresh graphs build the newer ForgeNeo Bridge nodes instead. If you're wiring by hand, this is still the node everything else hangs off.

    CategoryForgeNeo Bridge

    Inputs (6)

    NameTypeDefaultDescription
    source_modeCOMBO4 options: manual, image, infotext, spec_json
    profileCOMBO1 options: forge-neo@710f1e25
    policyCOMBO2 options: strict, exploratory
    payloadSTRING{"config_hash":null,"effective":{"assets":[],"family":"anima","guidance":{"batching_policy":"as_loaded","ngms":0.0,"ngms_all_steps":false,"skip_early_cfg":0.0},"image":{"batch_size":1,"height":1344,"width":1024},"loras":[],"mode":"txt2img","noise":{"batch_seed_rule":"forge_image_rng","ensd":"0","seed":"1895162280","seed_resize_from":{"height":0,"width":0},"source":"CPU","stream_policy":"forge_image_rng_private_v1","subseed":"0","subseed_strength":0.0},"numeric":{"anima_adapter_dtype":"as_loaded","attention_backend":"as_loaded","model_dtype":"as_loaded","reference_environment_id":null,"sampling_dtype":"fp32","text_encoder_dtype":"as_loaded","vae_dtype":"as_loaded"},"prediction_type":"flow","sampling":{"beta_alpha":0.6,"beta_beta":0.6,"cfg":1.5,"denoise":1.0,"discard_penultimate_requested":false,"eta_ancestral":1.0,"eta_ddim":0.0,"flow_match_options":{"invert_sigmas":false,"stochastic_sampling":false,"use_beta_sigmas":false,"use_dynamic_shifting":false,"use_exponential_sigmas":false,"use_karras_sigmas":false},"img2img_extra_noise":0.0,"img2img_step_mode":"forge_scaled","noise_schedule":"Default","rho":null,"s_churn":0.0,"s_noise":1.0,"s_tmax":0.0,"s_tmin":0.0,"sampler":"euler","scheduler":"simple","sgm_noise_multiplier_requested":false,"shift":3.0,"sigma_max":null,"sigma_min":null,"steps":10},"sdxl":null,"text":{"clip_skip":null,"comma_padding_backtrack":20,"emphasis":"Original","layer_policy":"anima_last","lora_policy":"explicit_loader_only","negative_raw":"blurry, low quality, text, watermark","parser":"forge_neo_710f1e25","positive_raw":"A red ceramic teapot on a wooden table, a white cup on the right, soft window light, plain background.","schedule_clock":"forge_denoiser_call"}},"extensions":{},"policy":"strict","profile":{"id":"forge-neo@710f1e25","reference_commit":"710f1e25fcac84d880cbccf27d11b2e3276e589e","reference_repository":"Haoming02/sd-webui-forge-classic"},"provenance":{"/assets":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/family":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/guidance":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/image":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/loras":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/mode":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/noise":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/numeric":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/prediction_type":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/sampling":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/sdxl":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null},"/text":{"acknowledged":true,"certainty":"explicit","evidence":"Design example only; not extracted generation settings.","origin":"manual_input","raw_key":null}},"requested":{},"schema_version":"1.0.0","source":{"exporter":"unknown","exporter_version":null,"filename":null,"image_sha256":null,"kind":"manual","native_workflow_present":false,"raw_fields":[],"raw_infotext":null,"verified_exporter_commit":null},"status":"needs_review","unresolved":[],"unsupported":[],"warnings":[]}—
    overrides_jsonSTRING{}—
    image_fileoptSTRING—

    Outputs (2)

    NameTypeDescription
    specFORGE_GENERATION_SPEC—
    reportSTRING—