mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-05 13:10:24 +00:00
Add support for search aliases on subgraphs (#8608)
## Summary - add commands for setting search aliases and description when in subgraph - in future we can add these fields to the dialog when publishing a subgraph - map workflow extra metadata on save/load from from/to subgraph node to allow access via `canvas.subgraph.extra` ## Changes **What**: - new core commands for Comfy.Subgraph.SetSearchAliases & Comfy.Subgraph.SetDescription to be called when in a subgraph context - update Publish command to allow command metadata arg for name - update test executeCommand to allow passing metadata arg ## Review Focus - When saving a subgraph, the outer workflow "wrapper" is created at the point of publishing. So unlike a normal workflow `extra` property that is available at any point, for a subgraph this is not accessible. To workaround this, the `extra` property that exists on the inner subgraph node is copied to the top level on save, and restored on load so extra properties can be set via `canvas.subgraph.extra`. - I have kept the existing naming format matching `BlueprintDescription` for `BlueprintSearchAliases` but i'm not sure if the description was ever used before ## Screenshots https://github.com/user-attachments/assets/4d4df9c1-2281-4589-aa56-ab07cdecd353 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8608-Add-support-for-search-aliases-on-subgraphs-2fd6d73d365081d083caebd6befcacdd) by [Unito](https://www.unito.io) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Set subgraph search aliases (comma-separated) and descriptions; aliases enable discovery by alternative names. * Publish subgraphs using a provided name. * Node definitions now support search aliases so nodes can be found by alternate names. * UI strings added for entering descriptions and search aliases. * **Tests** * Added end-to-end and unit tests covering aliases, descriptions, search behavior, publishing, and persistence. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
@@ -171,8 +171,9 @@ export function useCoreCommands(): ComfyCommand[] {
|
||||
icon: 'pi pi-save',
|
||||
label: 'Publish Subgraph',
|
||||
menubarLabel: 'Publish',
|
||||
function: async () => {
|
||||
await useSubgraphStore().publishSubgraph()
|
||||
function: async (metadata?: Record<string, unknown>) => {
|
||||
const name = metadata?.name as string | undefined
|
||||
await useSubgraphStore().publishSubgraph(name)
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -1095,6 +1096,75 @@ export function useCoreCommands(): ComfyCommand[] {
|
||||
)
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'Comfy.Subgraph.SetDescription',
|
||||
icon: 'pi pi-pencil',
|
||||
label: 'Set Subgraph Description',
|
||||
versionAdded: '1.39.7',
|
||||
function: async (metadata?: Record<string, unknown>) => {
|
||||
const canvas = canvasStore.getCanvas()
|
||||
const subgraph = canvas.subgraph
|
||||
if (!subgraph) return
|
||||
|
||||
const extra = (subgraph.extra ??= {}) as Record<string, unknown>
|
||||
const currentDescription = (extra.BlueprintDescription as string) ?? ''
|
||||
|
||||
let description: string | null | undefined
|
||||
const rawDescription = metadata?.description
|
||||
if (rawDescription != null) {
|
||||
description =
|
||||
typeof rawDescription === 'string'
|
||||
? rawDescription
|
||||
: String(rawDescription)
|
||||
}
|
||||
description ??= await dialogService.prompt({
|
||||
title: t('g.description'),
|
||||
message: t('subgraphStore.enterDescription'),
|
||||
defaultValue: currentDescription
|
||||
})
|
||||
if (description === null) return
|
||||
|
||||
extra.BlueprintDescription = description.trim() || undefined
|
||||
workflowStore.activeWorkflow?.changeTracker?.checkState()
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'Comfy.Subgraph.SetSearchAliases',
|
||||
icon: 'pi pi-search',
|
||||
label: 'Set Subgraph Search Aliases',
|
||||
versionAdded: '1.39.7',
|
||||
function: async (metadata?: Record<string, unknown>) => {
|
||||
const canvas = canvasStore.getCanvas()
|
||||
const subgraph = canvas.subgraph
|
||||
if (!subgraph) return
|
||||
|
||||
const parseAliases = (value: unknown): string[] =>
|
||||
(Array.isArray(value) ? value.map(String) : String(value).split(','))
|
||||
.map((s) => s.trim())
|
||||
.filter(Boolean)
|
||||
|
||||
const extra = (subgraph.extra ??= {}) as Record<string, unknown>
|
||||
|
||||
let aliases: string[]
|
||||
const rawAliases = metadata?.aliases
|
||||
if (rawAliases == null) {
|
||||
const input = await dialogService.prompt({
|
||||
title: t('subgraphStore.searchAliases'),
|
||||
message: t('subgraphStore.enterSearchAliases'),
|
||||
defaultValue: parseAliases(extra.BlueprintSearchAliases ?? '').join(
|
||||
', '
|
||||
)
|
||||
})
|
||||
if (input === null) return
|
||||
aliases = parseAliases(input)
|
||||
} else {
|
||||
aliases = parseAliases(rawAliases)
|
||||
}
|
||||
|
||||
extra.BlueprintSearchAliases = aliases.length > 0 ? aliases : undefined
|
||||
workflowStore.activeWorkflow?.changeTracker?.checkState()
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'Comfy.Dev.ShowModelSelector',
|
||||
icon: 'pi pi-box',
|
||||
|
||||
Reference in New Issue
Block a user