Skip to content

Commit bbb8864

Browse files
add search aliases to all nodes (#12035)
* feat: Add search_aliases field to node schema Adds `search_aliases` field to improve node discoverability. Users can define alternative search terms for nodes (e.g., "text concat" → StringConcatenate). Changes: - Add `search_aliases: list[str]` to V3 Schema - Add `SEARCH_ALIASES` support for V1 nodes - Include field in `/object_info` response - Add aliases to high-priority core nodes V1 usage: ```python class MyNode: SEARCH_ALIASES = ["alt name", "synonym"] ``` V3 usage: ```python io.Schema( node_id="MyNode", search_aliases=["alt name", "synonym"], ... ) ``` ## Related PRs - Frontend: Comfy-Org/ComfyUI_frontend#XXXX (draft - merge after this) - Docs: Comfy-Org/docs#XXXX (draft - merge after stable) * Propagate search_aliases through V3 Schema.get_v1_info to NodeInfoV1 * feat: add SEARCH_ALIASES for core nodes (#12016) Add search aliases to 22 core nodes in nodes.py to improve node discoverability: - Checkpoint/model loaders: CheckpointLoader, DiffusersLoader - Conditioning nodes: ConditioningAverage, ConditioningSetArea, ConditioningSetMask, ConditioningZeroOut - Style nodes: StyleModelApply - Image nodes: LoadImageMask, LoadImageOutput, ImageBatch, ImageInvert, ImagePadForOutpaint - Latent nodes: LoadLatent, SaveLatent, LatentBlend, LatentComposite, LatentCrop, LatentFlip, LatentFromBatch, LatentUpscale, LatentUpscaleBy, RepeatLatentBatch * feat: add SEARCH_ALIASES for image, mask, and string nodes (#12017) Add search aliases to nodes in comfy_extras for better discoverability: - nodes_mask.py: mask manipulation nodes - nodes_images.py: image processing nodes - nodes_post_processing.py: post-processing effect nodes - nodes_string.py: string manipulation nodes - nodes_compositing.py: compositing nodes - nodes_morphology.py: morphological operation nodes - nodes_latent.py: latent space nodes Uses search_aliases parameter in io.Schema() for v3 nodes. * feat: add SEARCH_ALIASES for audio and video nodes (#12018) Add search aliases to audio and video nodes for better discoverability: - nodes_audio.py: audio loading, saving, and processing nodes - nodes_video.py: video loading and processing nodes - nodes_wan.py: WAN model nodes Uses search_aliases parameter in io.Schema() for v3 nodes. * feat: add SEARCH_ALIASES for model and misc nodes (#12019) Add search aliases to model-related and miscellaneous nodes: - Model nodes: nodes_model_merging.py, nodes_model_advanced.py, nodes_lora_extract.py - Sampler nodes: nodes_custom_sampler.py, nodes_align_your_steps.py - Control nodes: nodes_controlnet.py, nodes_attention_multiply.py, nodes_hooks.py - Training nodes: nodes_train.py, nodes_dataset.py - Utility nodes: nodes_logic.py, nodes_canny.py, nodes_differential_diffusion.py - Architecture-specific: nodes_sd3.py, nodes_pixart.py, nodes_lumina2.py, nodes_kandinsky5.py, nodes_hidream.py, nodes_fresca.py, nodes_hunyuan3d.py - Media nodes: nodes_load_3d.py, nodes_webcam.py, nodes_preview_any.py, nodes_wanmove.py Uses search_aliases parameter in io.Schema() for v3 nodes, SEARCH_ALIASES class attribute for legacy nodes.
1 parent d7f3241 commit bbb8864

35 files changed

+152
-11
lines changed

comfy_extras/nodes_align_your_steps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class AlignYourStepsScheduler(io.ComfyNode):
2828
def define_schema(cls) -> io.Schema:
2929
return io.Schema(
3030
node_id="AlignYourStepsScheduler",
31+
search_aliases=["AYS scheduler"],
3132
category="sampling/custom_sampling/schedulers",
3233
inputs=[
3334
io.Combo.Input("model_type", options=["SD1", "SDXL", "SVD"]),

comfy_extras/nodes_attention_multiply.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class CLIPAttentionMultiply(io.ComfyNode):
7171
def define_schema(cls) -> io.Schema:
7272
return io.Schema(
7373
node_id="CLIPAttentionMultiply",
74+
search_aliases=["clip attention scale", "text encoder attention"],
7475
category="_for_testing/attention_experiments",
7576
inputs=[
7677
io.Clip.Input("clip"),

comfy_extras/nodes_audio.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class VAEEncodeAudio(IO.ComfyNode):
6969
def define_schema(cls):
7070
return IO.Schema(
7171
node_id="VAEEncodeAudio",
72+
search_aliases=["audio to latent"],
7273
display_name="VAE Encode Audio",
7374
category="latent/audio",
7475
inputs=[
@@ -97,6 +98,7 @@ class VAEDecodeAudio(IO.ComfyNode):
9798
def define_schema(cls):
9899
return IO.Schema(
99100
node_id="VAEDecodeAudio",
101+
search_aliases=["latent to audio"],
100102
display_name="VAE Decode Audio",
101103
category="latent/audio",
102104
inputs=[
@@ -122,6 +124,7 @@ class SaveAudio(IO.ComfyNode):
122124
def define_schema(cls):
123125
return IO.Schema(
124126
node_id="SaveAudio",
127+
search_aliases=["export flac"],
125128
display_name="Save Audio (FLAC)",
126129
category="audio",
127130
inputs=[
@@ -146,6 +149,7 @@ class SaveAudioMP3(IO.ComfyNode):
146149
def define_schema(cls):
147150
return IO.Schema(
148151
node_id="SaveAudioMP3",
152+
search_aliases=["export mp3"],
149153
display_name="Save Audio (MP3)",
150154
category="audio",
151155
inputs=[
@@ -173,6 +177,7 @@ class SaveAudioOpus(IO.ComfyNode):
173177
def define_schema(cls):
174178
return IO.Schema(
175179
node_id="SaveAudioOpus",
180+
search_aliases=["export opus"],
176181
display_name="Save Audio (Opus)",
177182
category="audio",
178183
inputs=[
@@ -200,6 +205,7 @@ class PreviewAudio(IO.ComfyNode):
200205
def define_schema(cls):
201206
return IO.Schema(
202207
node_id="PreviewAudio",
208+
search_aliases=["play audio"],
203209
display_name="Preview Audio",
204210
category="audio",
205211
inputs=[
@@ -259,6 +265,7 @@ def define_schema(cls):
259265
files = folder_paths.filter_files_content_types(os.listdir(input_dir), ["audio", "video"])
260266
return IO.Schema(
261267
node_id="LoadAudio",
268+
search_aliases=["import audio", "open audio", "audio file"],
262269
display_name="Load Audio",
263270
category="audio",
264271
inputs=[
@@ -296,6 +303,7 @@ class RecordAudio(IO.ComfyNode):
296303
def define_schema(cls):
297304
return IO.Schema(
298305
node_id="RecordAudio",
306+
search_aliases=["microphone input", "audio capture", "voice input"],
299307
display_name="Record Audio",
300308
category="audio",
301309
inputs=[
@@ -320,6 +328,7 @@ class TrimAudioDuration(IO.ComfyNode):
320328
def define_schema(cls):
321329
return IO.Schema(
322330
node_id="TrimAudioDuration",
331+
search_aliases=["cut audio", "audio clip", "shorten audio"],
323332
display_name="Trim Audio Duration",
324333
description="Trim audio tensor into chosen time range.",
325334
category="audio",
@@ -372,6 +381,7 @@ class SplitAudioChannels(IO.ComfyNode):
372381
def define_schema(cls):
373382
return IO.Schema(
374383
node_id="SplitAudioChannels",
384+
search_aliases=["stereo to mono"],
375385
display_name="Split Audio Channels",
376386
description="Separates the audio into left and right channels.",
377387
category="audio",
@@ -472,6 +482,7 @@ class AudioConcat(IO.ComfyNode):
472482
def define_schema(cls):
473483
return IO.Schema(
474484
node_id="AudioConcat",
485+
search_aliases=["join audio", "combine audio", "append audio"],
475486
display_name="Audio Concat",
476487
description="Concatenates the audio1 to audio2 in the specified direction.",
477488
category="audio",
@@ -519,6 +530,7 @@ class AudioMerge(IO.ComfyNode):
519530
def define_schema(cls):
520531
return IO.Schema(
521532
node_id="AudioMerge",
533+
search_aliases=["mix audio", "overlay audio", "layer audio"],
522534
display_name="Audio Merge",
523535
description="Combine two audio tracks by overlaying their waveforms.",
524536
category="audio",
@@ -579,6 +591,7 @@ class AudioAdjustVolume(IO.ComfyNode):
579591
def define_schema(cls):
580592
return IO.Schema(
581593
node_id="AudioAdjustVolume",
594+
search_aliases=["audio gain", "loudness", "audio level"],
582595
display_name="Audio Adjust Volume",
583596
category="audio",
584597
inputs=[
@@ -614,6 +627,7 @@ class EmptyAudio(IO.ComfyNode):
614627
def define_schema(cls):
615628
return IO.Schema(
616629
node_id="EmptyAudio",
630+
search_aliases=["blank audio"],
617631
display_name="Empty Audio",
618632
category="audio",
619633
inputs=[

comfy_extras/nodes_canny.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class Canny(io.ComfyNode):
1010
def define_schema(cls):
1111
return io.Schema(
1212
node_id="Canny",
13+
search_aliases=["edge detection", "outline", "contour detection", "line art"],
1314
category="image/preprocessors",
1415
inputs=[
1516
io.Image.Input("image"),

comfy_extras/nodes_compositing.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ class PorterDuffImageComposite(io.ComfyNode):
109109
def define_schema(cls):
110110
return io.Schema(
111111
node_id="PorterDuffImageComposite",
112+
search_aliases=["alpha composite", "blend modes", "layer blend", "transparency blend"],
112113
display_name="Porter-Duff Image Composite",
113114
category="mask/compositing",
114115
inputs=[
@@ -165,6 +166,7 @@ class SplitImageWithAlpha(io.ComfyNode):
165166
def define_schema(cls):
166167
return io.Schema(
167168
node_id="SplitImageWithAlpha",
169+
search_aliases=["extract alpha", "separate transparency", "remove alpha"],
168170
display_name="Split Image with Alpha",
169171
category="mask/compositing",
170172
inputs=[
@@ -188,6 +190,7 @@ class JoinImageWithAlpha(io.ComfyNode):
188190
def define_schema(cls):
189191
return io.Schema(
190192
node_id="JoinImageWithAlpha",
193+
search_aliases=["add transparency", "apply alpha", "composite alpha", "RGBA"],
191194
display_name="Join Image with Alpha",
192195
category="mask/compositing",
193196
inputs=[

comfy_extras/nodes_controlnet.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class ControlNetInpaintingAliMamaApply(io.ComfyNode):
3838
def define_schema(cls):
3939
return io.Schema(
4040
node_id="ControlNetInpaintingAliMamaApply",
41+
search_aliases=["masked controlnet"],
4142
category="conditioning/controlnet",
4243
inputs=[
4344
io.Conditioning.Input("positive"),

comfy_extras/nodes_custom_sampler.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ class ExtendIntermediateSigmas(io.ComfyNode):
297297
def define_schema(cls):
298298
return io.Schema(
299299
node_id="ExtendIntermediateSigmas",
300+
search_aliases=["interpolate sigmas"],
300301
category="sampling/custom_sampling/sigmas",
301302
inputs=[
302303
io.Sigmas.Input("sigmas"),
@@ -856,6 +857,7 @@ class DualCFGGuider(io.ComfyNode):
856857
def define_schema(cls):
857858
return io.Schema(
858859
node_id="DualCFGGuider",
860+
search_aliases=["dual prompt guidance"],
859861
category="sampling/custom_sampling/guiders",
860862
inputs=[
861863
io.Model.Input("model"),
@@ -883,6 +885,7 @@ class DisableNoise(io.ComfyNode):
883885
def define_schema(cls):
884886
return io.Schema(
885887
node_id="DisableNoise",
888+
search_aliases=["zero noise"],
886889
category="sampling/custom_sampling/noise",
887890
inputs=[],
888891
outputs=[io.Noise.Output()]
@@ -1019,6 +1022,7 @@ class ManualSigmas(io.ComfyNode):
10191022
def define_schema(cls):
10201023
return io.Schema(
10211024
node_id="ManualSigmas",
1025+
search_aliases=["custom noise schedule", "define sigmas"],
10221026
category="_for_testing/custom_sampling",
10231027
is_experimental=True,
10241028
inputs=[

comfy_extras/nodes_dataset.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,11 +1223,11 @@ def execute(cls, latents, conditioning):
12231223

12241224
class MakeTrainingDataset(io.ComfyNode):
12251225
"""Encode images with VAE and texts with CLIP to create a training dataset."""
1226-
12271226
@classmethod
12281227
def define_schema(cls):
12291228
return io.Schema(
12301229
node_id="MakeTrainingDataset",
1230+
search_aliases=["encode dataset"],
12311231
display_name="Make Training Dataset",
12321232
category="dataset",
12331233
is_experimental=True,
@@ -1309,11 +1309,11 @@ def execute(cls, images, vae, clip, texts=None):
13091309

13101310
class SaveTrainingDataset(io.ComfyNode):
13111311
"""Save encoded training dataset (latents + conditioning) to disk."""
1312-
13131312
@classmethod
13141313
def define_schema(cls):
13151314
return io.Schema(
13161315
node_id="SaveTrainingDataset",
1316+
search_aliases=["export training data"],
13171317
display_name="Save Training Dataset",
13181318
category="dataset",
13191319
is_experimental=True,
@@ -1410,11 +1410,11 @@ def execute(cls, latents, conditioning, folder_name, shard_size):
14101410

14111411
class LoadTrainingDataset(io.ComfyNode):
14121412
"""Load encoded training dataset from disk."""
1413-
14141413
@classmethod
14151414
def define_schema(cls):
14161415
return io.Schema(
14171416
node_id="LoadTrainingDataset",
1417+
search_aliases=["import dataset", "training data"],
14181418
display_name="Load Training Dataset",
14191419
category="dataset",
14201420
is_experimental=True,

comfy_extras/nodes_differential_diffusion.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class DifferentialDiffusion(io.ComfyNode):
1111
def define_schema(cls):
1212
return io.Schema(
1313
node_id="DifferentialDiffusion",
14+
search_aliases=["inpaint gradient", "variable denoise strength"],
1415
display_name="Differential Diffusion",
1516
category="_for_testing",
1617
inputs=[

comfy_extras/nodes_fresca.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class FreSca(io.ComfyNode):
5858
def define_schema(cls):
5959
return io.Schema(
6060
node_id="FreSca",
61+
search_aliases=["frequency guidance"],
6162
display_name="FreSca",
6263
category="_for_testing",
6364
description="Applies frequency-dependent scaling to the guidance",

0 commit comments

Comments
 (0)