diff --git a/src/lib/litegraph/src/LGraph.ts b/src/lib/litegraph/src/LGraph.ts index 105bb9ff8..93a8fee64 100644 --- a/src/lib/litegraph/src/LGraph.ts +++ b/src/lib/litegraph/src/LGraph.ts @@ -2657,6 +2657,8 @@ export class Subgraph /** The display name of the subgraph. */ name: string = 'Unnamed Subgraph' + /** Optional description shown as tooltip when hovering over the subgraph node. */ + description?: string readonly inputNode = new SubgraphInputNode(this) readonly outputNode = new SubgraphOutputNode(this) @@ -2707,9 +2709,10 @@ export class Subgraph | (ISerialisedGraph & ExportedSubgraph) | (SerialisableGraph & ExportedSubgraph) ): void { - const { name, inputs, outputs, widgets } = data + const { name, description, inputs, outputs, widgets } = data this.name = name + this.description = description if (inputs) { this.inputs.length = 0 for (const input of inputs) { @@ -2920,6 +2923,7 @@ export class Subgraph revision: this.revision, config: this.config, name: this.name, + ...(this.description && { description: this.description }), inputNode: this.inputNode.asSerialisable(), outputNode: this.outputNode.asSerialisable(), inputs: this.inputs.map((x) => x.asSerialisable()), diff --git a/src/lib/litegraph/src/subgraph/SubgraphSerialization.test.ts b/src/lib/litegraph/src/subgraph/SubgraphSerialization.test.ts index f773fe63d..c2546bf12 100644 --- a/src/lib/litegraph/src/subgraph/SubgraphSerialization.test.ts +++ b/src/lib/litegraph/src/subgraph/SubgraphSerialization.test.ts @@ -76,7 +76,6 @@ describe.skip('SubgraphSerialization - Basic Serialization', () => { // Verify core properties expect(restored.id).toBe(original.id) expect(restored.name).toBe(original.name) - // @ts-expect-error description property not in type definition expect(restored.description).toBe(original.description) // Verify I/O structure diff --git a/src/lib/litegraph/src/types/serialisation.ts b/src/lib/litegraph/src/types/serialisation.ts index f34e9fcf8..ad7b76b84 100644 --- a/src/lib/litegraph/src/types/serialisation.ts +++ b/src/lib/litegraph/src/types/serialisation.ts @@ -139,6 +139,8 @@ export interface ExportedSubgraph extends SerialisableGraph { name: string /** Optional category for organizing subgraph blueprints in the node library. */ category?: string + /** Optional description shown as tooltip when hovering over the subgraph node. */ + description?: string inputNode: ExportedSubgraphIONode outputNode: ExportedSubgraphIONode /** Ordered list of inputs to the subgraph itself. Similar to a reroute, with the input side in the graph, and the output side in the subgraph. */ diff --git a/src/platform/workflow/validation/schemas/workflowSchema.ts b/src/platform/workflow/validation/schemas/workflowSchema.ts index 0db21b8c8..a6a6ee4ff 100644 --- a/src/platform/workflow/validation/schemas/workflowSchema.ts +++ b/src/platform/workflow/validation/schemas/workflowSchema.ts @@ -396,6 +396,8 @@ interface SubgraphDefinitionBase< id: string revision: number name: string + /** Optional description shown as tooltip when hovering over the subgraph node. */ + description?: string category?: string /** Custom metadata for the subgraph (description, searchAliases, etc.) */ extra?: T extends ComfyWorkflow1BaseInput @@ -432,6 +434,8 @@ const zSubgraphDefinition = zComfyWorkflow1 id: z.string().uuid(), revision: z.number(), name: z.string(), + /** Optional description shown as tooltip when hovering over the subgraph node. */ + description: z.string().optional(), category: z.string().optional(), inputNode: zExportedSubgraphIONode, outputNode: zExportedSubgraphIONode, diff --git a/src/services/subgraphService.ts b/src/services/subgraphService.ts index 3a9f1f7c7..068d3ed37 100644 --- a/src/services/subgraphService.ts +++ b/src/services/subgraphService.ts @@ -49,7 +49,7 @@ export const useSubgraphService = () => { output_tooltips: [], name: id, display_name: name, - description: `Subgraph node for ${name}`, + description: exportedSubgraph.description || `Subgraph node for ${name}`, category: 'subgraph', output_node: false, python_module: 'nodes'