Skip to content

feat(ui): group nodes by category in add-node dialog#8912

Merged
lstein merged 13 commits intoinvoke-ai:mainfrom
Pfannkuchensack:feat/node-picker-category-grouping
Apr 14, 2026
Merged

feat(ui): group nodes by category in add-node dialog#8912
lstein merged 13 commits intoinvoke-ai:mainfrom
Pfannkuchensack:feat/node-picker-category-grouping

Conversation

@Pfannkuchensack
Copy link
Copy Markdown
Collaborator

@Pfannkuchensack Pfannkuchensack commented Feb 25, 2026

Summary

Add collapsible category grouping to the node picker command palette. Categories are parsed from the backend schema and displayed as expandable sections with caret icons. All categories auto-expand when searching.

Related Issues / Discussions

#7429

QA Instructions

  1. Open the workflow editor
  2. Open the add-node dialog (right-click or shortcut)
  3. Verify nodes are displayed as a flat list by default
  4. Open workflow editor settings (gear icon) and enable "Group Nodes by Category"
  5. Reopen the add-node dialog and verify nodes are now grouped by category with collapsible headers
  6. Click category headers to expand/collapse
  7. Type a search term and verify all matching categories auto-expand, with exact title matches shown first
  8. Clear search and verify categories return to collapsed state
  9. Disable the setting again and verify it returns to a flat list

Merge Plan

No special merge considerations.

Checklist

  • The PR has a short but descriptive title, suitable for a changelog
  • Tests added / updated (if applicable)
  • ❗Changes to a redux slice have a corresponding migration
  • Documentation added / updated (if applicable)
  • Updated What's New copy (if doing a release after this PR)

Add collapsible category grouping to the node picker command palette.
Categories are parsed from the backend schema and displayed as
expandable sections with caret icons. All categories auto-expand
when searching.
@github-actions github-actions Bot added the frontend PRs that change frontend files label Feb 25, 2026
…oritize exact matches

Add a persistent "Group Nodes by Category" setting to workflow editor settings,
allowing users to switch between grouped and flat node list views. Also sort
exact title matches to the top when searching.
@dunkeroni
Copy link
Copy Markdown
Collaborator

I like the feature, and I think it would be worth having enabled by default, but it would need some things first:

  1. Expand All /Collapse All buttons on the modal so that the user can turn it into a big scrollable list or collapse the entries they had open.
  2. We need to revise some of the categories for the nodes that already exist. Examples: Z-image controlnet is in "Control" when the others are all in "Controlnet", and there is a single node named Upscale in the "ESRGAN" category instead of being in the "Upscale" category. The search bar helps with this since it provides the old interaction, but we have a lot of category detritus built up since we never enforced any conventions around creating new ones.

…egories

Add "Expand All" and "Collapse All" link-buttons above the grouped
category list in the add-node dialog so users can quickly open or
close all categories at once. Buttons are hidden during search since
categories auto-expand while searching.

Fix two miscategorized nodes: Z-Image ControlNet was in "Control"
instead of "Controlnet", and Upscale (RealESRGAN) was in "Esrgan"
instead of "Upscale".
@Pfannkuchensack
Copy link
Copy Markdown
Collaborator Author

Something like this?
image

@Pfannkuchensack Pfannkuchensack requested a review from JPPhoto as a code owner March 2, 2026 20:24
@github-actions github-actions Bot added python PRs that change python files invocations PRs that change invocations labels Mar 2, 2026
Reorganize all built-in invocation categories into a consistent set of
18 groups (model, prompt, conditioning, controlnet_preprocessors,
latents, image, mask, inpaint, tiles, upscale, segmentation, math,
strings, primitives, batch, metadata, multimodal, canvas).

- Move denoise/i2l/l2i nodes consistently into "latents"
- Move all mask creation/manipulation nodes into "mask"
- Split ControlNet preprocessors out of "controlnet" into their own group
- Fold "unet", "vllm", "string", "ip_adapter", "t2i_adapter" into larger
  groups
- Move metadata_linked denoise wrappers from "latents" to "metadata"
- Add missing category to ideal_size
- Introduce dedicated "canvas" group for canvas/output/panel nodes

Also adds the now-required `category` field to invocation template
fixtures in validateConnection.test.ts.
@Pfannkuchensack
Copy link
Copy Markdown
Collaborator Author

Node Category Assignments

Model

Main model loaders, LoRA loaders, VAE, and model modifiers.

main_model_loader, sdxl_model_loader, sdxl_refiner_model_loader, sd3_model_loader, flux_model_loader, flux2_klein_model_loader, cogview4_model_loader, z_image_model_loader, vae_loader, model_identifier, lora_loader, lora_collection_loader, lora_selector, sdxl_lora_loader, sdxl_lora_collection_loader, flux_lora_loader, flux_lora_collection_loader, flux_control_lora_loader, flux2_klein_lora_loader, flux2_klein_lora_collection_loader, z_image_lora_loader, z_image_lora_collection_loader, freeu, seamless

Prompt

Text encoders, prompt utilities, and CLIP modifiers.

compel, sdxl_compel_prompt, sdxl_refiner_compel_prompt, clip_skip, flux_text_encoder, flux2_klein_text_encoder, sd3_text_encoder, cogview4_text_encoder, z_image_text_encoder, z_image_seed_variance_enhancer, dynamic_prompt, prompt_from_file, prompt_template

Conditioning

Image- and adapter-based conditioning (no text encoders, no preprocessors).

controlnet, flux_controlnet, z_image_control, t2i_adapter, ip_adapter, flux_ip_adapter, flux_redux, flux_kontext, flux_kontext_image_prep, flux_fill

ControlNet Preprocessors

Pure preprocessor nodes for ControlNet / T2I.

canny_edge_detection, hed_edge_detection, lineart_edge_detection, lineart_anime_edge_detection, mlsd_detection, pidi_edge_detection, dw_openpose_detection, mediapipe_face_detection, depth_anything_depth_estimation, normal_map, color_map, content_shuffle, pbr_maps, heuristic_resize

Latents

Anything that operates on latent tensors (noise, denoise, VAE encode/decode, latent ops).

noise, scheduler, denoise_latents, flux_denoise, flux2_denoise, sd3_denoise, cogview4_denoise, z_image_denoise, tiled_multi_diffusion_denoise_latents, i2l, sd3_i2l, cogview4_i2l, z_image_i2l, flux_vae_encode, flux2_vae_encode, l2i, sd3_l2i, cogview4_l2i, z_image_l2i, flux_vae_decode, flux2_vae_decode, lblend, crop_latents, lresize, lscale, ideal_size

Image

Image manipulation (pixel operations; no latents, no mask creation).

blank_image, show_image, save_image, img_crop, img_pad_crop, img_paste, img_resize, img_scale, img_blur, unsharp_mask, img_lerp, img_ilerp, img_mul, img_chan, img_conv, img_hue_adjust, img_channel_offset, img_channel_multiply, color_correct, img_noise, img_nsfw, img_watermark, decode_watermark, crop_image_to_bounding_box, paste_image_into_bounding_box, invokeai_img_hue_adjust_plus, invokeai_img_enhance, invokeai_ealightness, invokeai_img_blend, invokeai_img_composite, invokeai_img_dilate_erode, invokeai_img_val_thresholds

Mask

Creation and processing of masks (both image masks and tensor masks).

rectangle_mask, create_denoise_mask, create_gradient_mask, tomask, mask_edge, mask_combine, mask_from_id, expand_mask_with_fade, apply_mask_to_image, alpha_mask_to_tensor, image_mask_to_tensor, tensor_mask_to_image, apply_tensor_mask_to_image, invert_tensor_mask, get_image_mask_bounding_box

Inpaint & Infill

Background fill and classic inpainting.

infill_rgba, infill_tile, infill_patchmatch, infill_lama, infill_cv2, cv_inpaint

Tiles

Tile calculation and multi-diffusion helpers.

calculate_image_tiles, calculate_image_tiles_even_split, calculate_image_tiles_min_overlap, tile_to_properties, pair_tile_image, merge_tiles_to_image

Upscale

esrgan, spandrel_image_to_image, spandrel_image_to_image_autoscale

Segmentation & Faces

Object/face detection and segmentation.

segment_anything, grounding_dino, face_off, face_mask_detection, face_identifier

Math & Logic

Arithmetic, randomness, ranges, and logic.

add, sub, mul, div, integer_math, float_math, rand_int, rand_float, float_to_int, round_float, float_range, if

Strings

string_split, string_split_neg, string_join, string_join_three, string_replace

Primitives

Atomic value nodes, including bounding box and color.

boolean, boolean_collection, integer, integer_collection, float, float_collection, string, string_collection, image, image_collection, latents, latents_collection, conditioning, conditioning_collection, color, bounding_box

Batch & Iteration

Batch inputs, generators, and numeric ranges.

image_batch, image_generator, string_batch, string_generator, integer_batch, integer_generator, float_batch, float_generator, range, range_of_size, random_range

Metadata

Includes the metadata_linked denoise wrappers (thematically metadata, not latents).

metadata, metadata_item, merge_metadata, core_metadata, metadata_field_extractor, metadata_item_linked, metadata_from_image, metadata_to_string, metadata_to_integer, metadata_to_float, metadata_to_bool, metadata_to_scheduler, metadata_to_model, metadata_to_sdxl_model, metadata_to_vae, metadata_to_lora_collection, metadata_to_loras, metadata_to_sdlx_loras, metadata_to_controlnets, metadata_to_ip_adapters, metadata_to_t2i_adapters, metadata_to_string_collection, metadata_to_integer_collection, metadata_to_float_collection, metadata_to_bool_collection, denoise_latents_meta, flux_denoise_meta, z_image_denoise_meta

Multimodal / VLM

llava_onevision_vllm

Canvas

canvas_output, canvas_paste_back, canvas_v2_mask_and_crop, image_panel_layout

Copy link
Copy Markdown
Collaborator

@dunkeroni dunkeroni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New categories are much nicer.

@lstein lstein enabled auto-merge (squash) April 14, 2026 00:28
@lstein lstein merged commit 06a1881 into invoke-ai:main Apr 14, 2026
13 checks passed
@Pfannkuchensack Pfannkuchensack deleted the feat/node-picker-category-grouping branch April 14, 2026 00:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

frontend PRs that change frontend files invocations PRs that change invocations python PRs that change python files v6.13.x

Projects

Status: 6.13.x Theme: MODELS

Development

Successfully merging this pull request may close these issues.

3 participants