WorkflowX_DetailerXConnectedSelective
WorkflowX_DetailerXConnectedSelective is the node behind DetailerX's Play button
- model
- vae
- clip
- positive
- negative
- image
- final_image
- processor_images
- detailer_masks
If you found this in the node search box, you're holding a screwdriver that's already inside the machine. WorkflowX_DetailerXConnectedSelective lives under WorkflowX → Internal, shows up with its raw class name instead of a friendly label, and is not meant to be placed by hand. It's the node DetailerX substitutes for itself when you click a processor's Play button.
Why it exists
DetailerX is a chain of twenty-four ordered processors - an upscaler, seven built-in YOLO+SAM detailer rows (hair and anything start disabled, and you can add unlimited custom ones), then a stack of finishing processors: levels, sharpen, grain, LUT, camera simulation, DLSS5. When the chain finishes and the face is a mess, what you want is to re-run the face detailer alone. Not the whole chain. Re-running everything costs minutes and re-rolls stages that were already fine. That is the entire reason the selective nodes exist.
You've seen the counterpart in every other detailer pack: Impact Pack's FaceDetailer is one node, and you rerun the graph. DetailerX gives you a per-processor Play menu instead.
What happens when you click Play
The frontend serializes your graph, walks backwards from the DetailerX node to collect only the ancestors the node actually needs, keeps everything downstream of it, then swaps the target node's class_type to this class and queues that trimmed prompt. So the queue contains a DetailerX-shaped node whose inputs are your real model, vae, clip, positive, negative and image sockets - plus a stage string naming the one processor to run.
That ancestor walk is why this node exists at all. A connected Load Image is a leaf, so it re-reads from disk for nearly nothing; a connected generator has to genuinely run again, because this variant has no retained tensor to reuse. That's the job of the token-based WorkflowX_DetailerXSelective sibling, and the Play menu picks between the two for you.
Server-side it pulls the session token out of the settings JSON (smuggled in as _run), retains the freshly-evaluated inputs so your next click can skip re-evaluating them, and forces pause and skip off. Then it runs one processor against the connected original image with fresh detection.
The inputs and outputs that matter
The six sockets mirror DetailerX exactly and the tooltips are the author's own: model is the authoritative sampling model (presets don't load or replace it), vae must match it, clip is what the local detailer prompt gets encoded with, positive is the incoming conditioning that the detailer's prompt mode either replaces or concatenates, and negative is preserved but inactive at CFG 1. image is what gets processed.
Then settings - the whole node state as JSON, schema version 5 - and stage, the processor id. Stage values match the ids in settings.order (face, hand, upscaler, dlss5, or detailer:<uuid> for custom rows), so renaming a processor doesn't change its stage id.
The three outputs are the same trio DetailerX returns: final_image is the refined result of that single processor, processor_images is a bundle containing just that one stage labelled selective · original input, and detailer_masks is a one-stage mask bundle (empty for non-detector processors like sharpen). Wire final_image into whatever image node you like; the bundles go to DetailerX Preview and DetailerX Masks if you want to see what happened.
Install
Same pack as everything else. ComfyUI Manager → search WorkflowX-Configurator, or:
cd ComfyUI/custom_nodes
git clone https://github.com/haroonaslam/WorkflowX-Configurator
Restart, then hard-refresh the browser. DetailerX itself needs the heavy half of the pack: ultralytics, segment-anything, opencv-python, spandrel, hydra-core and iopath, plus local SAM/detector/upscaler assets that the WorkflowX Downloader node fetches for you. No assets, no refinement.
Where people get burned
Don't add it manually. Queue it by hand and you get Retained inputs unavailable. Run the ordinary workflow again. - there is no session behind the token, because the frontend is what creates one. Same message after a ComfyUI restart: sessions are process-local, capped at 32 of them and roughly 2GB of retained tensors, and the oldest get evicted.
If you requeue an old prompt that already contains one of these nodes, you get Selective refinement session is stale; choose the processor play action again. That's the job id not matching the live session, and the fix is to press Play again rather than dig into the workflow.
Two more: Processor is no longer available: <stage> means you hid or deleted that processor after queuing, and DetailerX cannot be resolved in the current graph means the graph changed under the frontend between the click and the queue.
And calibrate your expectations on community help: this is a one-person pack and DetailerX barely registers in the wider ComfyUI corpus, so the repo's own docs/detailer_x.md is your real manual.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Authoritative sampling model; connect matching CLIP and VAE. Presets do not load or replace it or its attention patches. | |
| vae | VAE | VAE matching the supplied model. RGB/RGBA decoded images are supported; input alpha is preserved. | |
| clip | CLIP | Text encoder matching the model; used for node-wide global and local detailer prompts. | |
| positive | CONDITIONING | Incoming positive conditioning. DetailerX composes incoming, node-wide global, and local detailer conditioning according to each detailer's prompt mode. | |
| negative | CONDITIONING | Incoming negative conditioning. DetailerX composes incoming, node-wide global, and local detailer conditioning according to each detailer's negative mode; all negative conditioning is inactive at CFG 1. | |
| image | IMAGE | RGB or RGBA image batch to process. final_image is completed; processor_images feeds DetailerX Preview; detailer_masks feeds DetailerX Masks. | |
| settings | STRING | {"version": 8, "cache_epoch": 0, "ui": {}, "extra_detailers": {}, "order": ["upscaler", "face", "breast", "pussy", "hand", "foot", "hair", "anything", "brightness", "grain", "hsv", "levels", "sharpen", "rgb", "gamma", "color_balance", "temperature", "lens", "pixel_perturb", "neural_grain", "lut", "camera", "compression", "dlss5"], "visible": {"upscaler": true, "face": true, "breast": true, "pussy": true, "hand": true, "foot": true, "hair": true, "anything": true, "brightness": true, "grain": true, "hsv": true, "levels": true, "sharpen": true, "rgb": false, "gamma": false, "color_balance": false, "temperature": false, "lens": false, "pixel_perturb": false, "neural_grain": false, "lut": false, "camera": false, "compression": false, "dlss5": true}, "entry": {"pause": false, "skip": false, "pause_minutes": 5.0, "wait_indefinitely": false}, "global_seed": {"enabled": false, "mode": "fixed", "seed": 703203187737355}, "global_prompts": {"enabled": true, "positive": "", "negative": ""}, "sam": {"backend": "sam1", "model": "internal:sams/sam_vit_b_01ec64.pth", "device": "Prefer GPU", "enabled": true, "keep_model_loaded": true}, "upscaler": {"enabled": true, "model": "internal:upscale_models/1x-ITF-SkinDiffDetail-Lite-v1.pth", "mode": "rescale", "rescale_factor": 1.5, "resize_width": 1024, "resampling_method": "bilinear", "supersample": false, "rounding_modulus": 8}, "brightness": {"enabled": true, "brightness": 1.0, "contrast": 1.0, "saturation": 1.0}, "grain": {"enabled": true, "grain_power": 0.08, "grain_scale": 1.0, "grain_sat": 1.0, "seed": 0, "seed_mode": "time"}, "hsv": {"enabled": true, "H": 0, "S": -10, "V": 0}, "levels": {"enabled": true, "channel": "RGB", "black_point": 0, "white_point": 249, "gray_point": 1.0, "output_black_point": 0, "output_white_point": 253}, "sharpen": {"enabled": true, "iterations": 1, "kernel_size": 3}, "dlss5": {"enabled": true, "upscaling_mode": "1x (DLAA / native)", "style": "default", "preset": 0, "model_preset": "Default", "enable_dlaa_reconstruction": true, "intensity": 1.0, "tone": 1.0, "structure": 1.25, "skin": -1.0, "auto_mask": "on", "motion": "auto", "scene_change_threshold": 0.24, "batch_mode": "temporal sequence", "warmup_frames": 0, "backend": "auto", "channel_order": "auto", "hdr": "off", "global_tone": -1.0, "detail": 0.3, "color": 0.3}, "rgb": {"enabled": false, "R": 0, "G": 0, "B": 0}, "gamma": {"enabled": false, "gamma": 1.0}, "color_balance": {"enabled": false, "adjust_type": "midtones", "cyan_red": 0.0, "magenta_green": 0.0, "yellow_blue": 0.0, "preserve_luminosity": true}, "temperature": {"enabled": false, "kelvin": 6500}, "lens": {"enabled": false, "lens_shape": "circle", "lens_edge": "around", "lens_curvy": 1.0, "lens_zoom": 1.0, "lens_aperture": 0.5, "blur_intensity": 2}, "pixel_perturb": {"enabled": false, "magnitude": 0.008, "seed": 0, "seed_mode": "random"}, "neural_grain": {"enabled": false, "grain_size": 0.1, "strength": 0.2, "seed": 0, "seed_mode": "random"}, "lut": {"enabled": false, "lut": "internal:luts/BlueArchitecture.cube", "color_space": "linear", "lut_strength": 100}, "camera": {"enabled": false, "initial_jpeg_quality": 98, "vignette_strength": 0.1, "chroma_aberr_strength": 1.0, "bayer_demosaic": true, "iso_noise_scale": 1.0, "sensor_read_noise": 2.0, "hot_pixel_prob": 1e-06, "banding_strength": 0.0, "motion_blur_kernel": 3, "seed": 0, "seed_mode": "random"}, "compression": {"enabled": false, "cycles": 4, "min_quality": 75, "max_quality": 95, "seed": 0, "seed_mode": "random"}, "face": {"enabled": true, "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "seed": 674025021604975, "seed_mode": "fixed", "steps": 15, "cfg": 2.0, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guidance_mode": "incoming", "guidance": 3.5, "denoise": 0.15, "feather": 15, "noise_mask": true, "force_inpaint": true, "bbox_threshold": 0.5, "bbox_dilation": 15, "bbox_crop_factor": 2.5, "detector_proposal": "native", "sam_detection_hint": "center-1", "sam_dilation": 10, "sam_threshold": 0.93, "sam_bbox_expansion": 0, "sam_mask_hint_threshold": 0.7, "sam_mask_hint_use_negative": "False", "drop_size": 10, "prompt": "detailed realistic eyes, nose, lips and ears texture, detailed eyebrows and eyelashes", "prompt_mode": "replace", "negative_prompt": "", "negative_prompt_mode": "incoming", "cycle": 1, "inpaint_model": false, "noise_mask_feather": 20, "tiled_encode": false, "tiled_decode": false, "sam_strategy": "inherit", "sam_override": {"backend": "sam1", "model": "internal:sams/sam_vit_b_01ec64.pth", "device": "Prefer GPU", "keep_model_loaded": true}, "sam3_constraint": "bounding_box", "catalog_revision": 0, "detector": "internal:ultralytics/bbox/face_yolov8m.pt", "label": "Face detailer", "catalog_id": "face", "class_ids": [0], "class_labels": ["face"], "mask_concept": "face", "sam3_mode": "refine_detector", "sam3_threshold": 0.5, "sam3_refine_iterations": 3}, "breast": {"enabled": true, "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "seed": 1077858824591479, "seed_mode": "fixed", "steps": 15, "cfg": 2.0, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guidance_mode": "incoming", "guidance": 3.5, "denoise": 0.45, "feather": 15, "noise_mask": true, "force_inpaint": true, "bbox_threshold": 0.5, "bbox_dilation": 15, "bbox_crop_factor": 2.5, "detector_proposal": "native", "sam_detection_hint": "center-1", "sam_dilation": 10, "sam_threshold": 0.93, "sam_bbox_expansion": 0, "sam_mask_hint_threshold": 0.7, "sam_mask_hint_use_negative": "False", "drop_size": 10, "prompt": "detailed areola and nipple texture", "prompt_mode": "replace", "negative_prompt": "", "negative_prompt_mode": "incoming", "cycle": 1, "inpaint_model": false, "noise_mask_feather": 20, "tiled_encode": false, "tiled_decode": false, "sam_strategy": "inherit", "sam_override": {"backend": "sam1", "model": "internal:sams/sam_vit_b_01ec64.pth", "device": "Prefer GPU", "keep_model_loaded": true}, "sam3_constraint": "bounding_box", "catalog_revision": 0, "detector": "internal:ultralytics/bbox/female-breast-v4.7.pt", "label": "Breast detailer", "catalog_id": "breast", "class_ids": [0, 1], "class_labels": ["breast_pair", "breast_single"], "mask_concept": "breast", "sam3_mode": "refine_detector", "sam3_threshold": 0.5, "sam3_refine_iterations": 3}, "pussy": {"enabled": true, "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "seed": 703203187737355, "seed_mode": "fixed", "steps": 15, "cfg": 2.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guidance_mode": "incoming", "guidance": 3.5, "denoise": 0.5, "feather": 10, "noise_mask": true, "force_inpaint": true, "bbox_threshold": 0.4, "bbox_dilation": 10, "bbox_crop_factor": 3.0, "detector_proposal": "native", "sam_detection_hint": "center-1", "sam_dilation": 10, "sam_threshold": 0.85, "sam_bbox_expansion": 0, "sam_mask_hint_threshold": 0.7, "sam_mask_hint_use_negative": "False", "drop_size": 10, "prompt": "detailed realistic vagina and labia, anatomically correct pussy", "prompt_mode": "replace", "negative_prompt": "", "negative_prompt_mode": "incoming", "cycle": 1, "inpaint_model": false, "noise_mask_feather": 20, "tiled_encode": false, "tiled_decode": false, "sam_strategy": "inherit", "sam_override": {"backend": "sam1", "model": "internal:sams/sam_vit_b_01ec64.pth", "device": "Prefer GPU", "keep_model_loaded": true}, "sam3_constraint": "bounding_box", "catalog_revision": 0, "detector": "internal:ultralytics/bbox/pussyV2.pt", "label": "Pussy detailer", "catalog_id": "pussy", "class_ids": [0], "class_labels": ["pussy"], "mask_concept": "pussy", "sam3_mode": "refine_detector", "sam3_threshold": 0.5, "sam3_refine_iterations": 3}, "hand": {"enabled": true, "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "seed": 703203187737355, "seed_mode": "fixed", "steps": 15, "cfg": 2.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guidance_mode": "incoming", "guidance": 3.5, "denoise": 0.5, "feather": 10, "noise_mask": true, "force_inpaint": true, "bbox_threshold": 0.4, "bbox_dilation": 10, "bbox_crop_factor": 3.0, "detector_proposal": "native", "sam_detection_hint": "center-1", "sam_dilation": 10, "sam_threshold": 0.85, "sam_bbox_expansion": 0, "sam_mask_hint_threshold": 0.7, "sam_mask_hint_use_negative": "False", "drop_size": 10, "prompt": "detailed hands and fingers, defined natural fingernails", "prompt_mode": "replace", "negative_prompt": "", "negative_prompt_mode": "incoming", "cycle": 1, "inpaint_model": false, "noise_mask_feather": 20, "tiled_encode": false, "tiled_decode": false, "sam_strategy": "inherit", "sam_override": {"backend": "sam1", "model": "internal:sams/sam_vit_b_01ec64.pth", "device": "Prefer GPU", "keep_model_loaded": true}, "sam3_constraint": "bounding_box", "catalog_revision": 0, "detector": "internal:ultralytics/bbox/Hands.pt", "label": "Hand detailer", "catalog_id": "hand", "class_ids": [0], "class_labels": ["hand"], "mask_concept": "hand", "sam3_mode": "refine_detector", "sam3_threshold": 0.5, "sam3_refine_iterations": 3}, "foot": {"enabled": true, "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "seed": 703203187737355, "seed_mode": "fixed", "steps": 15, "cfg": 2.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guidance_mode": "incoming", "guidance": 3.5, "denoise": 0.5, "feather": 10, "noise_mask": true, "force_inpaint": true, "bbox_threshold": 0.4, "bbox_dilation": 10, "bbox_crop_factor": 3.0, "detector_proposal": "native", "sam_detection_hint": "center-1", "sam_dilation": 10, "sam_threshold": 0.85, "sam_bbox_expansion": 0, "sam_mask_hint_threshold": 0.7, "sam_mask_hint_use_negative": "False", "drop_size": 10, "prompt": "detailed realistic feet, toes and toenails", "prompt_mode": "replace", "negative_prompt": "", "negative_prompt_mode": "incoming", "cycle": 1, "inpaint_model": false, "noise_mask_feather": 20, "tiled_encode": false, "tiled_decode": false, "sam_strategy": "inherit", "sam_override": {"backend": "sam1", "model": "internal:sams/sam_vit_b_01ec64.pth", "device": "Prefer GPU", "keep_model_loaded": true}, "sam3_constraint": "bounding_box", "catalog_revision": 0, "detector": "internal:ultralytics/bbox/Foot.pt", "label": "Foot detailer", "catalog_id": "foot", "class_ids": [0], "class_labels": ["foot"], "mask_concept": "foot", "sam3_mode": "refine_detector", "sam3_threshold": 0.5, "sam3_refine_iterations": 3}, "hair": {"enabled": false, "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "seed": 703203187737355, "seed_mode": "fixed", "steps": 15, "cfg": 2.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guidance_mode": "incoming", "guidance": 3.5, "denoise": 0.5, "feather": 10, "noise_mask": true, "force_inpaint": true, "bbox_threshold": 0.4, "bbox_dilation": 10, "bbox_crop_factor": 3.0, "detector_proposal": "native", "sam_detection_hint": "center-1", "sam_dilation": 10, "sam_threshold": 0.85, "sam_bbox_expansion": 0, "sam_mask_hint_threshold": 0.7, "sam_mask_hint_use_negative": "False", "drop_size": 10, "prompt": "detailed realistic hair strands, natural hair texture and clean hairline", "prompt_mode": "replace", "negative_prompt": "", "negative_prompt_mode": "incoming", "cycle": 1, "inpaint_model": false, "noise_mask_feather": 20, "tiled_encode": false, "tiled_decode": false, "sam_strategy": "inherit", "sam_override": {"backend": "sam1", "model": "internal:sams/sam_vit_b_01ec64.pth", "device": "Prefer GPU", "keep_model_loaded": true}, "sam3_constraint": "bounding_box", "catalog_revision": 0, "detector": "internal:ultralytics/segm/hair_yolov8n-seg_60.pt", "label": "Hair detailer", "catalog_id": "hair", "class_ids": [0], "class_labels": ["hair"], "mask_concept": "hair", "sam3_mode": "refine_detector", "sam3_threshold": 0.5, "sam3_refine_iterations": 3}, "anything": {"enabled": false, "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "seed": 703203187737355, "seed_mode": "fixed", "steps": 15, "cfg": 2.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guidance_mode": "incoming", "guidance": 3.5, "denoise": 0.5, "feather": 10, "noise_mask": true, "force_inpaint": true, "bbox_threshold": 0.4, "bbox_dilation": 10, "bbox_crop_factor": 3.0, "detector_proposal": "native", "sam_detection_hint": "center-1", "sam_dilation": 10, "sam_threshold": 0.85, "sam_bbox_expansion": 0, "sam_mask_hint_threshold": 0.7, "sam_mask_hint_use_negative": "False", "drop_size": 10, "prompt": "", "prompt_mode": "incoming", "negative_prompt": "", "negative_prompt_mode": "incoming", "cycle": 1, "inpaint_model": false, "noise_mask_feather": 20, "tiled_encode": false, "tiled_decode": false, "sam_strategy": "inherit", "sam_override": {"backend": "sam1", "model": "internal:sams/sam_vit_b_01ec64.pth", "device": "Prefer GPU", "keep_model_loaded": true}, "sam3_constraint": "bounding_box", "catalog_revision": 0, "detector": "", "label": "Anything detailer", "catalog_id": "anything", "class_ids": [], "class_labels": [], "mask_concept": "", "sam3_mode": "refine_detector", "sam3_threshold": 0.5, "sam3_refine_iterations": 3}, "preset": {"id": "qwen21", "label": "Qwen 2.1", "family": "qwen", "revision": 1, "values": {"face": {"steps": 15, "cfg": 2.0, "guidance_mode": "incoming", "guidance": 3.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "cycle": 1}, "breast": {"steps": 15, "cfg": 2.0, "guidance_mode": "incoming", "guidance": 3.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "cycle": 1}, "pussy": {"steps": 15, "cfg": 2.5, "guidance_mode": "incoming", "guidance": 3.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "cycle": 1}, "hand": {"steps": 15, "cfg": 2.5, "guidance_mode": "incoming", "guidance": 3.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "cycle": 1}, "foot": {"steps": 15, "cfg": 2.5, "guidance_mode": "incoming", "guidance": 3.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "cycle": 1}, "hair": {"steps": 15, "cfg": 2.5, "guidance_mode": "incoming", "guidance": 3.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "cycle": 1}, "anything": {"steps": 15, "cfg": 2.5, "guidance_mode": "incoming", "guidance": 3.5, "sampler_name": "dpmpp_2m", "scheduler": "beta", "guide_size": 1024, "guide_size_for": false, "max_size": 1024, "cycle": 1}}}} | — |
| stage | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| final_image | IMAGE | — |
| processor_images | DETAILERX_PROCESSOR_IMAGES | — |
| detailer_masks | DETAILERX_MASKS | — |