[Bug] Fix converted widget compression on export (#3354)

This commit is contained in:
Chenlei Hu
2025-04-08 20:20:19 -04:00
committed by GitHub
parent fa132e4106
commit e9a98161ca
3 changed files with 113 additions and 7 deletions

View File

@@ -6,6 +6,8 @@ import type {
ComfyWorkflowJSON
} from '@/schemas/comfyWorkflowSchema'
import { compressWidgetInputSlots } from './litegraphUtil'
/**
* Converts the current graph workflow for sending to the API.
* Note: Node widgets are updated before serialization to prepare queueing.
@@ -38,12 +40,7 @@ export const graphToPrompt = async (
}
}
// Remove all unconnected widget input slots
for (const node of workflow.nodes) {
node.inputs = node.inputs?.filter(
(input) => !(input.widget && input.link === null)
)
}
compressWidgetInputSlots(workflow)
const output: ComfyApiWorkflow = {}
// Process nodes in order of execution

View File

@@ -1,5 +1,6 @@
import type { ColorOption, LGraph } from '@comfyorg/litegraph'
import { LGraphGroup, LGraphNode, isColorable } from '@comfyorg/litegraph'
import type { ISerialisedGraph } from '@comfyorg/litegraph/dist/types/serialisation'
import type {
IComboWidget,
IWidget
@@ -144,3 +145,26 @@ export function fixLinkInputSlots(graph: LGraph) {
}
}
}
/**
* Compress widget input slots by removing all unconnected widget input slots.
* This should match the serialization format of legacy widget conversion.
*
* @param graph - The graph to compress widget input slots for.
*/
export function compressWidgetInputSlots(graph: ISerialisedGraph) {
for (const node of graph.nodes) {
node.inputs = node.inputs?.filter(
(input) => !(input.widget && input.link === null)
)
for (const [inputIndex, input] of node.inputs?.entries() ?? []) {
if (input.link) {
const link = graph.links.find((link) => link[0] === input.link)
if (link) {
link[4] = inputIndex
}
}
}
}
}