Jak stworzyłem ComfyUI Batch Image Timer Extended — historia od pomysłu do GitHuba

0 25 0 Share

Jak stworzyłem ComfyUI Batch Image Timer Extended — historia od pomysłu do GitHuba

Od historii dziesięciu czasów generowania do narzędzia z podglądem grafik, analityką, SQLite i monitoringiem GPU. Moja historia tworzenia noda ComfyUI przy wsparciu ChatGPT.

3 listopada 2026 · ComfyUI / Open Source


Wszystko zaczęło się od jednego pytania

Podczas codziennej pracy z ComfyUI często uruchamiałem generowanie kolejnych grafik i obserwowałem, jak wykonywany jest workflow. Interesował mnie jednak nie tylko sam efekt. Chciałem wiedzieć, ile czasu zajmuje stworzenie pojedynczej grafiki i czy kolejne generowania są szybsze, czy wolniejsze.

Brakowało mi wygodnego miejsca, w którym mógłbym zobaczyć kilka ostatnich czasów renderowania. Nie chciałem ręcznie przepisywać wyników do notatnika, otwierać osobnych narzędzi ani analizować logów. Wszystko powinno znajdować się bezpośrednio w nodzie na obszarze roboczym ComfyUI.

Początkowo miałem tylko jeden pomysł: historia dziesięciu ostatnich generowań. Nie przewidywałem jeszcze, że doprowadzi on do powstania osobnego projektu open source z bazą statystyk, galerią, monitorowaniem GPU i szeregiem narzędzi administracyjnych.

Inspiracja: oryginalny Batch Image Timer

Punktem wyjścia był otwartoźródłowy ComfyUI-Batch-Image-Timer autorstwa Hermana Kwana. Trafiłem także na dyskusję o tym dodatku w społeczności Stable Diffusion na Reddicie. Projekt przyciągnął moją uwagę siedmiosegmentowym zegarem LED, przypominającym wyświetlacze starszej elektroniki.

Oryginalny timer udostępniał pomiar czasu, kilka sposobów jego prezentacji oraz paletę kolorów wyświetlacza. Był dobrym fundamentem do eksperymentów, ale nie zawierał wszystkich informacji, które chciałem mieć pod ręką podczas generowania grafik.

Postanowiłem więc rozwijać istniejący projekt zamiast pisać podobny licznik od zera. Wersja Extended jest niezależnym rozwinięciem oryginalnego dodatku, a wymagane informacje licencyjne i oznaczenia autorstwa projektu źródłowego zostały zachowane.

Oryginalny siedmiosegmentowy licznik Batch Image Timer dla ComfyUI
Oryginalny Batch Image Timer Hermana Kwana — punkt wyjścia naszego projektu. Źródło: repozytorium autora na GitHubie.
© Original project: Herman Kwan — GitHub

Pierwszy krok: historia dziesięciu renderowań

Pierwsza modyfikacja była skromna. Pod zegarem miała pojawić się lista ostatnich dziesięciu zakończonych generowań, zawierająca godzinę wykonania i czas renderowania. Najnowsze generowanie trafiało na górę, a najstarsze wypadało z listy.

Z takim pomysłem rozpocząłem pracę z ChatGPT. Ja opisywałem potrzebną funkcję oraz wygląd interfejsu, a ChatGPT pomagał przygotowywać i poprawiać kod. Następnie instalowałem paczki w moim ComfyUI Portable, wykonywałem testy i wracałem z uwagami.

To nie było jedno polecenie, po którym powstał gotowy program. Każdy kolejny etap miał swoją próbę, weryfikację i często także poprawkę. Historia dziesięciu czasów okazała się początkiem znacznie większego projektu.

Pierwsze błędy instalacji i ważna lekcja o ComfyUI

Już przy pierwszych wersjach przekonałem się, że poprawny kod nie wystarcza, jeśli pliki znajdują się w niewłaściwych katalogach. Jeden z dodatkowych plików JavaScript umieściłem początkowo bezpośrednio w głównym folderze noda, chociaż powinien znaleźć się w katalogu web.

Początkowo node nie pojawiał się w wyszukiwarce ComfyUI. Trzeba było zainstalować pełne oryginalne rozszerzenie, a dopiero potem dodać naszą modyfikację. To nauczyło mnie, jak ważne są pliki __init__.py, moduły Pythona, rejestracja rozszerzenia i właściwa struktura katalogów.

Później pojawiła się druga, jeszcze ważniejsza lekcja: odświeżenie przeglądarki nie restartuje serwera ComfyUI. Zmiany w kodzie Pythona zaczynają działać dopiero po rzeczywistym ponownym uruchomieniu procesu ComfyUI.

Uproszczenie zegara: jeden Generation Time

Oryginalny zegar oferował kilka trybów, m.in. ETA, COMPUTE i TOTAL. Po serii testów uznałem, że nie potrzebuję trzech przełączanych pomiarów. Najważniejsza była dla mnie jedna liczba: czas ostatniego ukończonego wykonania workflow.

Zastąpiliśmy kilka trybów napisem GENERATION TIME. Zegar zaczął wyświetlać czas w formacie MM:SS:CC, czyli minuty, sekundy i setne sekundy. Zachowaliśmy charakterystyczne cyfry LED oraz możliwość wyboru koloru wyświetlacza.

Dodaliśmy również pasek postępu. Podczas samplingu potrafi pokazywać liczbę wykonanych kroków i ich procent, a w etapach, dla których ComfyUI nie udostępnia rzetelnego procentu, nie udaje dokładności. Po zakończeniu zadania wyświetla komunikat o ukończeniu generowania.

ComfyUI Batch Image Timer Extended z zegarem, historią generowań i statystykami
Wersja Extended podczas naszych testów: zegar LED, historia renderowań i statystyki. Zrzut przedstawia wcześniejszą wersję interfejsu.

Dlaczego usunąłem Total Images i wskaźnik 1/1?

Jednym z najbardziej mylących elementów oryginalnego dodatku było pole total_images oraz licznik w rodzaju 1/1. Wydawało się, że zmiana tej wartości powinna sterować liczbą generowanych obrazów. W rzeczywistości pole odnosiło się do oczekiwanych wykonań timera, a nie do ustawień generatora.

W typowym workflow liczbę obrazów w batchu ustalam na przykład w Empty Latent Image przez batch_size. Nie chciałem pamiętać o wpisywaniu tej samej liczby w dwóch miejscach. Dlatego całkowicie usunęliśmy ręczne Total Images.

Timer nie generuje obrazów i nie zmienia wielkości batcha. Mierzy jedno wykonanie workflow, natomiast statystyki próbują ustalić liczbę wynikowych plików na podstawie historii ComfyUI. Gdy niestandardowy node nie udostępnia odpowiednich metadanych, liczba obrazów może zostać oznaczona jako szacowana.

Od listy czasów do podglądu grafiki i promptu

Kolejny pomysł pojawił się naturalnie: skoro historia zna czas generowania, to dlaczego nie miałaby pokazać obrazu, który w tym czasie powstał? Dodaliśmy więc podgląd miniatury po najechaniu na wpis historii oraz odczyt dostępnego tekstu promptu.

Z czasem dołączyły również funkcje Load Workflow, Open in New Tab, otwierania obrazu i zapisywania pliku workflow JSON. W ten sposób zwykły stoper zmienił się w pomocnicze archiwum eksperymentów, do których mogę wrócić.

Te możliwości są zależne od zapisanych danych: miniatura wymaga dostępnego pliku wynikowego, a przywrócenie workflow — zachowanej kopii jego ustawień. Nie oznacza to, że każdy możliwy niestandardowy workflow da się odtworzyć bez ograniczeń.

Trwałe statystyki: sesja, dzień, tydzień i miesiąc

Następnie chciałem wiedzieć, ile grafik wygenerowałem podczas sesji, dzisiaj, w danym tygodniu i w całym miesiącu oraz ile czasu zajęły te operacje. Sama lista dziesięciu ostatnich czasów już mi nie wystarczała.

Powstała osobna sekcja GENERATION STATISTICS. Dane zaczęliśmy przechowywać w lokalnej bazie SQLite, aby nie znikały po zamknięciu przeglądarki, restarcie ComfyUI czy ponownym uruchomieniu komputera.

Zależało mi, żeby w wersji Portable baza znajdowała się w katalogu samego dodatku, np. ComfyUI/custom_nodes/ComfyUI-Batch-Image-Timer-Extended/data/rendering_statistics.sqlite3. Na serwerze zapis odbywa się analogicznie na maszynie obsługującej ComfyUI. Dzięki temu statystyki nie są uzależnione od jednej karty przeglądarki.

Kiedy statystyki zatrzymały się na pięciu obrazach

To był najbardziej pouczający błąd. Na ekranie Recent Generations widziałem już dziesięć renderowań, ale Generation Statistics nadal informowało, że wygenerowałem tylko pięć obrazów. Kolejne poprawnie zakończone generowania również nie zwiększały licznika.

Sprawdzaliśmy wtedy zarówno sposób zbierania danych z historii serwera, jak i zgodność między plikami JavaScript i Python. Przy jednej z aktualizacji ComfyUI nadal wymagał usuniętego wcześniej pola total_images, ponieważ odpowiedni plik backendu nie został poprawnie zaktualizowany.

Przełom nastąpił po naprawie kodu i pełnym restarcie serwera ComfyUI. Po następnym generowaniu licznik zwiększył się z pięciu do sześciu. To przypomniało mi, że każdy nowy pomysł trzeba jeszcze zweryfikować w realnym środowisku, a nie wyłącznie na podstawie testów kodu.

Render Performance: szybkie porównanie czasów

Kiedy baza zaczęła zbierać dane, dodaliśmy wykres RENDER PERFORMANCE — LAST 12 RUNS. Każdy słupek oznacza jedno zakończone wykonanie, a jego wysokość odpowiada długości renderowania. Zielony słupek wyróżnia najnowszy wynik, niebieskie — wcześniejsze.

Dzięki temu łatwo zauważyć, że kolejne uruchomienie trwało wyraźnie dłużej niż poprzednie. Później pojawiły się również interaktywne szczegóły, porównywanie generowań, kalendarz aktywności i funkcja ponownego sprawdzania statystyk.

Taki wykres trzeba jednak interpretować rozsądnie. Różne modele, rozdzielczości, samplery i liczby kroków mogą powodować różne czasy. Sam wyższy słupek nie oznacza jeszcze, że komputer nagle pracuje wolniej.

GPU, VRAM i miejsce zajmowane przez obrazy

Po części czasowej przyszła kolej na sprzęt. Chciałem widzieć, co podczas generowania dzieje się z kartą graficzną: jakie jest jej obciążenie, ile zajęto pamięci VRAM oraz jaka jest temperatura GPU, o ile sterownik udostępnia takie dane.

Powstał osobny, opcjonalny GPU & VRAM MONITOR. Dodałem też statystyki rozmiaru zapisanych plików oraz możliwość sprawdzenia zajętości katalogu output. Zależało mi przy tym, żeby odczyty sprzętowe były możliwie lekkie i nie stanowiły dodatkowego obciążenia renderowania.

W ustawieniach rozdzieliliśmy dwie funkcje: Show GPU & VRAM Monitor steruje widocznością panelu, a Enable GPU Monitoring rzeczywiście włącza lub wyłącza zbieranie pomiarów. Nie każdy chce mieć monitor sprzętowy stale na ekranie.

Sygnał dźwiękowy, który początkowo milczał

Dodałem też powiadomienie dźwiękowe po zakończeniu renderowania. W teorii to drobiazg, ale podczas długiego generowania jest bardzo praktyczny — mogę pracować w innej aplikacji i wrócić, kiedy ComfyUI zakończy zadanie.

Pierwszy test nie wypadł idealnie: włączyłem sygnał w ustawieniach, a po wygenerowaniu grafiki niczego nie usłyszałem. Okazało się, że odtwarzanie dźwięku było niepotrzebnie powiązane z ustawieniem powiadomień systemowych.

Rozdzieliliśmy te mechanizmy, dodaliśmy regulację głośności i przycisk TEST SOUND. Pozostało oczywiście ograniczenie typowe dla przeglądarek: automatyczne odtwarzanie może wymagać wcześniejszej interakcji użytkownika ze stroną.

Trzy sekcje i osobny panel narzędzi

W pewnym momencie node zaczął robić się coraz dłuższy. Miał już zegar, historię, statystyki, wykresy, monitorowanie sprzętu i wiele dodatkowych okien. Nie chciałem, żeby wszystkie elementy konkurowały o uwagę.

Uporządkowaliśmy więc interfejs. Główne części pozostały czytelne, GPU otrzymało własną, zwijaną sekcję, a u dołu powstał moduł TOOLS & PANELS z przyciskami SETTINGS, FAILURES, ANALYTICS i MONITOR.

Również ustawienia podzieliliśmy tematycznie. Oprócz zwykłych opcji widoku pojawiły się narzędzia importu i eksportu danych, diagnostyki, kopii bezpieczeństwa oraz testowania stanu systemu. Rozbudowa miała nie utrudniać podstawowego zadania: sprawdzania czasu generowania.

Jak to zostało zbudowane od strony technicznej?

Za projektem stoją przede wszystkim trzy elementy. Python obsługuje część serwerową, komunikację z ComfyUI i zbieranie danych. JavaScript rysuje interfejs noda, zegar LED, wykresy i okna pop-up. SQLite zachowuje statystyki pomiędzy kolejnymi uruchomieniami.

Wykorzystaliśmy również dostępne mechanizmy historii wykonania ComfyUI, identyfikatory zadań i podgląd zapisanych obrazów. Przy okazji trzeba było uwzględnić różnice między pojedynczym wykonaniem a batchem kilku plików, możliwe braki metadanych i ryzyko podwójnego zliczenia.

Kolejną częścią projektu były kopie bazy, migracje między wersjami oraz zabezpieczenia dostępu do plików. Właśnie przy tych mniej efektownych elementach przekonałem się, że użyteczne narzędzie to nie tylko wygląd, ale przede wszystkim przewidywalne działanie.

Moja współpraca z ChatGPT — pomysł, kod, test i poprawka

Przez cały projekt współpracowałem z ChatGPT. Jego rola obejmowała analizę kodu, tworzenie kolejnych modyfikacji, przygotowywanie paczek ZIP, tłumaczenie komunikatów błędów i proponowanie technicznych rozwiązań.

Ja decydowałem o kierunku rozwoju, wyglądzie i potrzebnych funkcjach. Następnie instalowałem kolejne wydania we własnym ComfyUI Portable i sprawdzałem zachowanie noda podczas prawdziwych generowań. Kiedy coś nie działało, wracałem ze zrzutem ekranu albo logiem.

W ten sposób projekt nie powstał jednym kliknięciem. Rozwijaliśmy go iteracyjnie, a kilka problemów — zwłaszcza ze statystykami i powiadomieniami — pokazało, że weryfikacja w działającym programie jest równie ważna jak samo przygotowanie kodu.

Od pierwszych poprawek do wersji Extended 1.9.2

Pierwsze wersje dotyczyły przede wszystkim historii ostatnich czasów. Później dodaliśmy podgląd grafik i promptów, zapisywanie workflow, trwałe statystyki, wydajnościowe wykresy i monitorowanie sprzętu. Następne aktualizacje rozwijały narzędzia administracyjne i porządkowały interfejs.

Przyjąłem zasadę, że każda funkcja powinna rozwiązywać konkretny problem, który zauważyłem podczas pracy. Część rozwiązań została też uproszczona lub usunięta, kiedy okazała się zbędna. Tak było choćby z przełączaniem ETA / COMPUTE / TOTAL oraz ręcznym Total Images.

Po kolejnych iteracjach uznałem, że v1.9.2 to dobry moment, by zamknąć pierwszy duży etap rozwoju i przygotować publiczną wersję.

Od prywatnego noda do GitHuba

Ostatnim etapem było stworzenie własnego publicznego repozytorium ComfyUI-Batch-Image-Timer-Extended. Przygotowałem README, instrukcję instalacji, dokumentację, historię zmian, licencję i osobną paczkę ZIP do instalacji w ComfyUI.

Ponieważ Extended jest rozwinięciem wcześniejszego oprogramowania, zachowałem licencję MIT oraz należne uznanie autorstwa Hermana Kwana. Wersję Extended opublikowałem jako niezależne rozwinięcie projektu źródłowego.

3 listopada 2026 roku opublikowałem pierwsze publiczne wydanie v1.9.2 na GitHubie. To był symboliczny koniec pierwszego etapu i jednocześnie początek możliwości dzielenia się narzędziem z innymi użytkownikami ComfyUI.

Czego nauczył mnie ten projekt?

Najbardziej zaskakuje mnie to, jak mały był pierwotny pomysł. Chciałem tylko zobaczyć dziesięć ostatnich czasów generowania. Ostatecznie powstał rozbudowany monitor renderowania z galerią, statystykami, wykresami, monitoringiem GPU, backupami i narzędziami diagnostycznymi.

Nie oznacza to, że rozwój i testowanie są zakończone na zawsze. Kolejne wydania ComfyUI, różne modele i niestandardowe nody mogą ujawnić nowe przypadki do obsługi. Dla mnie priorytetem pozostaje teraz stabilność i poprawność zapisanych danych.

Ta historia pokazała mi, że rozwijanie narzędzi open source może zaczynać się od bardzo osobistej potrzeby. A połączenie własnych pomysłów, praktycznych testów i wsparcia AI pozwala doprowadzić niewielką modyfikację do postaci użytecznego, publicznego projektu.

Tekst opisuje proces powstawania rozszerzenia i rzeczywiste doświadczenia z testów. Źródłowy projekt Hermana Kwana zachowuje własne oznaczenia autorstwa i licencję MIT.

Share

Share this article

Facebook X LinkedIn WhatsApp Pinterest

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *