API ComfyUI: запуск workflow и последовательная генерация

У ComfyUI уже есть API на сервере, где выполняется граф. Для автоматизации достаточно отправить workflow, дождаться истории конкретного задания и скачать изображения. Эта инструкция относится к вашему инстансу ComfyUI, а не к inference API платформы или облачному endpoint Comfy Cloud.

Подключитесь к нужному серверу

Примеры используют http://127.0.0.1:8188. Выполняйте их на GPU-инстансе либо на своём компьютере с открытым SSH-туннелем. Python-клиент не проходит авторизацию браузерного gateway. Если публичный URL возвращает страницу входа, используйте туннель: копировать cookie или открывать незащищённый порт не требуется.

Endpoint Назначение
GET /object_info Установленные типы узлов и доступные значения входов/моделей
POST /upload/image Загрузка исходного изображения
POST /prompt Проверка и постановка API-графа в очередь; ответ с prompt_id
GET /history/{prompt_id} Статус выполнения и метаданные результата конкретного задания
GET /view Скачивание по имени, подкаталогу и типу файла
GET /queue Просмотр очереди и выполняемых заданий при диагностике таймаута

Подготовьте API-формат

Скачайте Python-клиент и SDXL API JSON в один локальный каталог. Достаточно Python 3.10 или новее; используются только стандартные библиотеки. Для FLUX есть отдельный API JSON.

В API-графе ID узла соответствует объекту с class_type и inputs. Связь ["1", 0] выбирает выход с номером ноль у узла 1. Номер выхода — число, а не строка "MODEL". В JSON холста находятся nodes, links и координаты; такой файл не нужно отправлять в /prompt.

Если вы изменили граф в ComfyUI, используйте команду API-экспорта/сохранения. В некоторых версиях интерфейса сначала включаются developer options. Сохраните и UI-версию: API-экспорт не содержит расположения узлов на холсте.

Проверьте граф до постановки задания

python3 run-workflow.py sdxl-text-to-image.api.json --check

Команда только читает /object_info: проверяет наличие узлов, обязательные входы, типы связанных выходов и значения в списках моделей. Она не проверяет достаточность VRAM, содержимое весов, наличие входной картинки или качество результата. Если нужного чекпойнта нет в списке, клиент завершится до отправки задания.

Позитивный промпт находится в узле 2, имя установленного чекпойнта — в узле 1. Для графа с исходным изображением сначала загрузите файл:

curl --fail --show-error \
  -F 'image=@input.png' -F 'type=input' \
  http://127.0.0.1:8188/upload/image

Подставьте полученные name и subfolder в LoadImage.inputs.image; локальное имя не доказывает, что файл существует на сервере. Для inpainting проще создать маску в интерфейсе и экспортировать обновлённый API-граф.

Запустите небольшую последовательную серию

python3 run-workflow.py sdxl-text-to-image.api.json \
  --count 3 --timeout 900 --output-dir ./results

Клиент отправляет одно задание, ждёт завершения, сохраняет результат и только затем переходит к следующему. Между запусками увеличивается seed сэмплера; batch size latent не меняется, несколько заданий параллельно не запускаются. Для каждого успешного задания создаётся отдельный каталог с PNG и request.json, где сохранены отправленный граф и prompt ID.

У апскейлера нет сэмплера для изменения seed, поэтому его нужно запускать один раз на входной файл. Для обработки датасета явно связывайте каждый исходник с ID задания и каталогом результата, а не отправляйте один неизменённый граф много раз.

Ошибки и ограничения

HTTP-ошибка, отклонённый граф, ошибка выполнения, отсутствие сохранённых изображений и таймаут ожидания возвращают ненулевой код выхода и останавливают серию. Клиент не повторяет отправку автоматически: если ответ потерялся после принятия задания сервером, повтор может создать дубликат и потратить GPU-время.

Таймаут не отменяет серверное задание. Сохраните напечатанный prompt_id, проверьте очередь/историю и решите, ждать дальше или отменить задачу в ComfyUI. Скрипт не останавливает и не удаляет арендованный инстанс. После завершения генерации он может продолжать тарифицироваться — см. стоимость сессии.

Это учебные инструменты для небольших последовательных серий, без надёжной распределённой очереди и отдельного сервиса в приложении. Не публикуйте ключи и приватные промпты в JSON; request.json содержит текст задания. См. хранение и диагностику. Источник: официальные маршруты API ComfyUI.

Готовы запустить?

Запустить GPU-сервер