My Nodes für ComfyUI

Nodes make the world go brrr.

Für ComfyUI habe ich mir eigene Nodes gebaut.

Sie kümmern sich vor allem um Text: Prompts auswählen, Bausteine zusammensetzen, Varianten erzeugen und Informationen zusammen mit den fertigen Bildern speichern.

Der Grund dafür ist einfach: Sobald aus einem einzelnen Prompt eine Serie wird, wird Textverwaltung schnell wichtiger als der eigentliche Prompt.

Eigene Erweiterungen · in Weiterentwicklung

  • Python
  • JavaScript
  • ComfyUI
  • JSON

Vom Einzelprompt zur Bildserie

Für Bildserien möchte ich Motiv, Stil und Variation getrennt bearbeiten können.

Ein Motiv soll manchmal feststehen, manchmal der Reihe nach durch eine Liste laufen und manchmal zufällig ausgewählt werden. Dafür gibt es Prompt Blocks, Prompt Compose und eine Wildcard-Engine.

Wildcards sind kleine Ausdrücke, die beim Ausführen durch eine Auswahl ersetzt werden.

Prompt Block kümmert sich um die Auswahl eines Textes. Prompt Compose setzt mehrere benannte Textbausteine wieder zusammen.

So lassen sich Motiv, Stil, Licht oder andere Bestandteile getrennt halten und trotzdem gemeinsam an das Modell schicken.

Beispiel: Motive gezielt durchgehen

In Prompt Block stehen mehrere Motive, getrennt durch Leerzeilen.

Mit ::0 kann ich einen Eintrag deaktivieren, ohne ihn zu löschen.

Im Modus Sequential werden im folgenden Beispiel Burg und Dorf abwechselnd ausgewählt. Der Ritter wird übersprungen.

So kann ein Motiv aus einer laufenden Serie raus, ohne dass ich den Text dafür wegwerfen muss.

Für eine zufällige Auswahl funktionieren die Zahlen als Gewichtung. Bei ::3 und ::2 entfallen drei von fünf Auswahlen auf die Burg und zwei auf das Dorf.

Die Gewichtung beeinflusst nur die Auswahl des Textes. Sie hat nichts mit der Gewichtung eines Motivs im Bildmodell zu tun.

Eine Burg im Nebel.::3

Ein Ritter im Wald.::0

Ein verlassenes Dorf.::2

Beispiel: Textbausteine verbinden

Prompt Compose erkennt Platzhalter wie ${subject} und ${style} und erzeugt daraus eigene Texteingänge.

Das Motiv kann aus einem Prompt Block kommen, der Stil aus einem anderen Node.

Wildcards können zusätzlich direkt im Text stehen:

${subject}

Bildstil: ${style}.

Licht: {weiches Morgenlicht|diffuses Abendlicht}.

Damit bleiben Motiv, Stil und Variation unabhängig voneinander editierbar.

Auch die Textauswahl lässt sich reproduzieren. Mit gleichem Seed, gleichen Eingaben und gleichem Zufallsschlüssel kommt wieder die gleiche Auswahl heraus.

Standardmäßig ändern neue Nodes ihren Seed nach jedem Lauf. Für direkte Vergleiche kann ich ihn auf Fixed stellen.

Das macht den Prompt reproduzierbar. Das Bild selbst kann sich natürlich trotzdem ändern, wenn Modell, Sampler oder andere Einstellungen wechseln.

Metadaten mit dem Bild speichern

Neben den Text-Nodes gibt es Hilfen für JSON, Dateinamen und Bildausgabe.

Mit Save Image with Custom Metadata kann ich eigene Informationen direkt im PNG speichern, zum Beispiel Projektname, Motivkennung oder Bearbeitungsstand.

{
  "project": "Dorf im Nebel",
  "motif_id": "village-03",
  "review_status": "Auswahl"
}

Die Informationen bleiben damit bei der Bilddatei und können später wieder ausgelesen werden.

Der Node hängt die eigenen Daten an ComfyUIs PNG-Metadaten. Eigene Schlüssel sollten deshalb nicht mit bereits vorhandenen Prompt- oder Workflow-Schlüsseln kollidieren.

Entwicklung und Einsatz

Die eigentliche Verarbeitung ist in Python geschrieben. Für die Oberfläche der Nodes kommt JavaScript dazu.

Dazu gehören dynamische Texteingänge, gespeicherte Prompt-Seiten und Hilfetexte direkt im Node.

Ein Offline-Guide mit Beispielen zur Auswahl, Gewichtung und Syntax ist ebenfalls dabei.

Die Nodes laufen in meiner lokalen ComfyUI-Umgebung und werden dort auch benutzt. Tests decken unter anderem Textsyntax, Variablen, Einstellungen sowie das Speichern und Laden der Nodes ab.

Einige Dinge kann man automatisiert testen. Ob ein Node im ComfyUI-Canvas vernünftig zu bedienen ist, muss man trotzdem noch selbst ausprobieren.

Das Paket wird weiterentwickelt. Im Moment arbeite ich vor allem an der gemeinsamen Textverarbeitung der Nodes.