Forge Compat Import / Spec
A Forge PNG is just a text blob — this node turns it into something ComfyUI can run
- spec
- report
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, orspec_json.imagereads the file named in the optionalimage_filefield;infotexttakes an A1111-style string pasted intopayload; the other two parsepayloadas JSON.policy-strictorexploratory. 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 inComfyUI/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.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| source_mode | COMBO | 4 options: manual, image, infotext, spec_json | |
| profile | COMBO | 1 options: forge-neo@710f1e25 | |
| policy | COMBO | 2 options: strict, exploratory | |
| payload | STRING | {"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 | STRING | {} | — |
| image_fileopt | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| spec | FORGE_GENERATION_SPEC | — |
| report | STRING | — |