Escribir un nodo básico
Requisitos previos
- Una instalación de ComfyUI en funcionamiento. Para desarrollo, recomendamos instalar ComfyUI manualmente.
- Una instalación de comfy-cli en funcionamiento.
Configurar el entorno
Definir el nodo
Agrega el siguiente código al final desrc/nodes.py:
src/nodes.py
La estructura básica de un nodo personalizado se describe en detalle aquí.
CATEGORY,
que especifica en qué parte del menú de agregar nuevo nodo se ubicará el nodo personalizado,
INPUT_TYPES, que es un método de clase que define qué entradas recibirá el nodo
(consulta más adelante los detalles del diccionario que devuelve),
RETURN_TYPES, que define qué salidas producirá el nodo, y FUNCTION, el nombre
de la función que se llamará cuando se ejecute el nodo.
La función principal
La función principal,choose_image, recibe argumentos con nombre tal como se definen en INPUT_TYPES y
devuelve una tuple tal como se define en RETURN_TYPES. Como trabajamos con imágenes, que internamente
se almacenan como torch.Tensor,
torch.Tensor con forma [B,H,W,C],
donde B es el tamaño del lote y C es el número de canales: 3, para RGB. Si iteramos sobre ese
tensor, obtendremos una serie de B tensores con forma [H,W,C]. El método .flatten() lo convierte
en un tensor unidimensional de longitud H*W*C, torch.mean() toma la media y .item()
convierte un tensor de un solo valor en un float de Python.
images[brightest]devolverá un tensor con forma[H,W,C].unsqueezese usa para insertar una dimensión (de longitud 1), en este caso, en la dimensión cero, y obtener[B,H,W,C]conB=1: una sola imagen.- en
return (result,), la coma final es esencial para asegurar que devuelves una tupla.
Registrar el nodo
Para que Comfy reconozca el nuevo nodo, debe estar disponible a nivel del paquete. Modifica la variableNODE_CLASS_MAPPINGS al final de src/nodes.py. Debes reiniciar ComfyUI para ver los cambios.
src/nodes.py
Para una explicación detallada de cómo ComfyUI descubre y carga los nodos personalizados, consulta la documentación del ciclo de vida de los nodos.
Añadir algunas opciones
Ese nodo quizá sea un poco aburrido, así que podríamos añadir algunas opciones: un widget que te permita elegir la imagen más brillante, o la más roja, la más azul o la más verde. Edita tuINPUT_TYPES para que quede así:
R de los píxeles dividido por la media de los tres colores. Así:
Ajustar la interfaz
Quizá queramos algo de retroalimentación visual, así que enviemos un pequeño mensaje de texto para que se muestre.Enviar un mensaje desde el servidor
Esto requiere agregar dos líneas al código Python:choose_image, agrega una línea para enviar un mensaje al front end (send_sync recibe un tipo de mensaje, que debe ser único, y un diccionario)
Escribir una extensión de cliente
Para agregar algo de JavaScript al cliente, crea un subdirectorio,web/js, en el directorio de tu nodo personalizado y modifica el final de __init__.py para informarle a Comfy sobre él exportando WEB_DIRECTORY:
.js en el subdirectorio web/js, así que crea image_selector/web/js/imageSelector.js con el código a continuación. (Para más información, consulta client side coding).
setup(). Esto lee el diccionario que enviamos (que se almacena en event.detail).
Detén el servidor de Comfy, inícialo de nuevo, recarga la página web y ejecuta tu flujo de trabajo.
El ejemplo completo
El ejemplo completo está disponible aquí. Puedes descargar el archivo JSON del flujo de trabajo de ejemplo o verlo a continuación: