Domina la expansión de nodos de Comfy para devolver nuevos subgrafos en tus nodos personalizados de backend. Conoce los requisitos de GraphBuilder y las técnicas de caché.
Normalmente, cuando se ejecuta un nodo, esa función de ejecución devuelve inmediatamente los resultados de salida de ese nodo. La “expansión de nodos” es una técnica relativamente avanzada que permite que los nodos devuelvan un nuevo subgrafo de nodos que deben ocupar su lugar en el gráfico. Esta técnica es la que permite que los Nodos personalizados implementen bucles.
Aunque este mismo nodo antes se podía implementar llamando manualmente a las partes internas de ComfyUI, usar la expansión significa que cada subnodo se almacenará en caché por separado (así que si cambias model2, no tienes que volver a cargar model1).
Para realizar la expansión de nodos, un nodo debe devolver un diccionario con las siguientes claves:
result: una tupla con las salidas del nodo. Puede ser una mezcla de valores finalizados (como los que devolverías desde un nodo normal) y salidas de nodos.
expand: el gráfico finalizado sobre el que se realiza la expansión. Consulta a continuación si no usas GraphBuilder.
El formato que espera la clave expand es el mismo que el del formato de API de ComfyUI. Los siguientes requisitos los gestiona GraphBuilder, pero debes gestionarlos manualmente si decides prescindir de él:
Los IDs de nodo deben ser únicos en todo el gráfico. (Esto incluye entre varias ejecuciones del mismo nodo debido al uso de listas.)
Los IDs de nodo deben ser deterministas y consistentes entre varias ejecuciones del gráfico (incluidas las ejecuciones parciales debidas al almacenamiento en caché).
Incluso si no quieres usar GraphBuilder para construir realmente el gráfico (por ejemplo, porque cargas el json sin procesar del gráfico desde un archivo), puedes usar la función GraphBuilder.alloc_prefix() para generar un prefijo y comfy.graph_utils.add_graph_prefix para corregir gráficos existentes de modo que cumplan estos requisitos.
Aunque puedes pasar entradas no literales a los nodos dentro del subgrafo (como tensores de torch), esto puede inhibir el almacenamiento en caché dentro del subgrafo. Cuando sea posible, deberías pasar conexiones a los objetos del subgrafo en lugar del nodo en sí. (Puedes declarar una entrada como rawLink dentro de los Parámetros adicionales de la entrada para hacerlo fácilmente.)