Nodes/ComfyUI-EditUtils/EditUtils: Flux3Klein Output Extractor lrzjason
ComfyUI Node

EditUtils: Flux3Klein Output Extractor lrzjason

What FLUX.3 Actually Sent to the Model

By lrzjason·Created 9 months ago·Updated 3 days ago· 256
EditUtils: Flux3Klein Output Extractor lrzjason
  • custom_output
  • pad_info
  • main_image
  • vae_images
  • ref_latents
  • full_prompt
  • no_refs_cond
  • mask
  • flow_map
  • bbox_rows
  • composed_prompt

Every EditUtils encoder returns a custom_output - a dict stuffed with everything the encode step computed: prepared images, latents, prompts, pad geometry, a conditioning with the references stripped out. It's a debugging goldmine and a useless thing to hand to a KSampler.

Flux3KleinOutputExtractor_EditUtils unpacks it into ten named sockets so you can wire the parts you want to the places they belong.

You don't need it. The pack's FLUX.3 example doesn't use it. But the moment something looks wrong - composition drifting, a reference that isn't influencing anything, a prompt you're not sure was the prompt - this is the node that answers the question with a string instead of a guess.

The sockets, and which ones are worth wiring

composed_prompt - the string actually handed to the tokenizer: your caption with the FLUX.3 element table appended as a JSON array. full_prompt - the raw user prompt, no table. For FLUX.3 those two differ by exactly the boxes, because there's no "Picture n:" vision prefix to add (references ride as latents on their own token mode, so the text never carries image placeholders). Send composed_prompt to a text preview and you've answered "did my boxes make it into the prompt" permanently.

bbox_rows - the same rows, as a parsed list. The fused, chain-wide table in order, upstream first.

no_refs_cond - a CONDITIONING with reference latents stripped out. This is the useful one people don't expect: it's a clean text conditioning you can feed wherever you'd otherwise reach for ConditioningZeroOut, and it's what to try when you want a pass that ignores the references rather than a zeroed negative.

pad_info - the padding geometry. Wire it into CropWithPadInfo_EditUtils after VAEDecode to undo the padding on the way out. Without it your output keeps the pad, which is why edited images come back a few pixels larger than they went in.

main_image - the prepared main image, post-resize and post-pad. vae_images - the encoded reference images as a list. ref_latents - the latents those produced. mask - the noise mask the encoder built. flow_map - a boolean read from the model config, telling you whether the checkpoint is step-distilled.

All ten come off a single custom_output input, which you take from the generic EditTextEncode_EditUtils node. If you're using the Flux3KleinEditTextEncode_EditUtils shortcut, it also emits custom_output, so this works there too - you just won't have any bbox_rows because the simple path doesn't build a table.

A good use for it

The pack's example graph ends VAEDecode → SaveImage, which is fine for a quick look and wrong for anything else. A sturdier tail:

EditTextEncode_EditUtils ── custom_output ──► Flux3KleinOutputExtractor
                                                └─ pad_info ──► CropWithPadInfo_EditUtils ──► SaveImage
                                                └─ composed_prompt ──► text preview
VAEDecode ──────────────────────────────────────────────────────────► CropWithPadInfo

That's the whole argument for the node in one diagram: the padding has to come back off, and the prompt is the cheapest way to find out whether the graph is doing what you think.

Install

Manager → search ComfyUI-EditUtils → install → restart, or:

cd ComfyUI/custom_nodes
git clone https://github.com/lrzjason/ComfyUI-EditUtils

No pip dependencies and no model files of its own - the extractor only reads a dict. What it does need is a graph that produced that dict: a ComfyUI build with FLUX.3 support, the flux3_image_klein_sd_int8_convrot UNET, qwen3vl_4b_fp8_scaled.safetensors as CLIP type flux3, and flux2-vae.safetensors.

Where people get burned

Reading full_prompt and thinking the table vanished. On the FLUX.3 route full_prompt is deliberately just your prompt; composed_prompt is the one with rows. They're both correct, they're just different strings. This pair trips up nearly everyone the first time, because on the Qwen routes full_prompt is the composed one.

Wiring the extractor and then leaving every socket empty. It's a diagnostic. If bbox_rows is empty, your bbox node isn't generating rows - no id, no valid box, or a chain link missing. That's the fastest way to check.

Expecting it to patch anything. It reads; it doesn't modify the conditioning. If you want references gone from a conditioning you already have, ClearRefLatents_EditUtils is the node that removes them.

Categoryadvanced/conditioning

Inputs (1)

NameTypeDefaultDescription
custom_outputANY—

Outputs (10)

NameTypeDescription
pad_infoANY—
main_imageIMAGE—
vae_imagesLIST—
ref_latentsLIST—
full_promptSTRING—
no_refs_condCONDITIONING—
maskMASK—
flow_mapBOOLEAN—
bbox_rowsLIST—
composed_promptSTRING—