Мой блог
Как превратить ComfyUI в API и собрать веб-приложение без кода
Интеграция генеративных нейросетей в практические рабочие процессы часто требует создания удобного интерфейса для конечных пользователей или удаленной команды. Практическое подключение ComfyUI в роли API через no-code сервис api2app позволяет быстро развернуть полноценный графический веб-интерфейс без написания программного кода и организовать безопасный удаленный доступ к локальной модели генерации изображений.
Такой подход избавляет от необходимости вручную настраивать сложную связку из фронтенд-библиотек и бэкенда. Достаточно экспортировать стандартный граф выполнения нейросети, настроить сетевой прокси с авторизацией и связать поля веб-страницы с входными и выходными параметрами генерации.


Подготовка рабочего процесса и экспорт API в ComfyUI
Первый этап настройки заключается в формировании пайплайна генерации. В качестве демонстрационного сценария используется шаблон рабочего процесса на базе модели Flux.2 [Klein] 4B, выполняющий преобразование текстового описания в графическое изображение. После проверки корректности работы узлов внутри стандартного интерфейса необходимо экспортировать схему в специальный формат для внешних интеграций.


Для этого в среде ComfyUI выполняется экспорт графа в режиме API, формирующий файл формата JSON. Содержимое этого файла содержит полную структуру связей между нодами, загрузчиками моделей, сэмплерами и текстовыми подсказками. В дальнейшем этот JSON будет служить телом POST-запросов, отправляемых внешними инструментами.


Локальное тестирование API и настройка безопасного прокси
Прежде чем приступать к сборке интерфейса, необходимо убедиться в доступности программного интерфейса ComfyUI для внешних вызовов. По умолчанию браузеры блокируют межсайтовые обращения, поэтому сервер генерации запускается с поддержкой CORS. Для тестирования ComfyUI запускается с флагом разрешения запросов от сервиса сборки интерфейса:

python main.py --enable-cors-header https://api2app.org
В панели конструктора api2app переходят в категорию конфигурации API и создают новое подключение. На вкладке необработанных данных формируется объект с ключом «prompt», в который помещается скопированный ранее JSON из ComfyUI. В качестве метода запроса выставляется POST, а адресом назначения указывается локальная точка входа http://127.0.0.1:8188/prompt. Пробный запуск в браузере должен вернуть идентификатор добавленной в очередь задачи.


Переход на comfy-api-proxy для внешнего доступа
Штатный программный интерфейс ComfyUI подходит преимущественно для локальной среды, но не предоставляет удобных механизмов защищенного разделения прав при открытии доступа из глобальной сети. Для безопасной публикации рекомендуется задействовать специализированный модуль comfy-api-proxy. Установка пакета выполняется стандартным пакетным менеджером:


pip install comfy-api-proxy
Запуск проксирующего слоя осуществляется с указанием секрета авторизации и CORS-заголовков:


comfy-api-proxy --enable-cors-header https://api2app.org --token=ВАШ_ТОКЕН
При использовании прокси меняется формат взаимодействия:

- Конечный адрес для создания задач принимает вид
http://127.0.0.1:8189/api/v2/jobs; - В теле POST-запроса ключ верхнего уровня «prompt» заменяется на «workflow»;
- В конфигурацию HTTP-заголовков добавляется обязательный параметр «Authorization», передающий настроенный токен доступа.
В браузере во время тестирования поле токена авторизации сохраняется открытым (без приватного режима), после чего конфигурация сохраняется в конструкторе.


Настройка эндпоинтов для проверки статуса и выдачи результата
Генерация изображений нейросетью — процесс асинхронный, поэтому клиентское приложение должно уметь отслеживать текущее состояние очереди. Для этого в конструкторе создается вторая конфигурация API:


- Метод: GET;
- Формат URL:
http://127.0.0.1:8189/api/v2/jobs/{идентификатор_задачи}; - Назначение: возврат текущего статуса обработки (queued, running, succeeded, error).
После завершения рендеринга сервер возвращает структуру с данными о готовом контенте, где содержится идентификатор ресурса (asset_id). Для скачивания или отображения финального файла создается третья конфигурация API с методом GET, направленная на адрес вида http://127.0.0.1:8189/api/v2/assets/{asset_id}/content. Все подготовленные эндпоинты переводятся в публичный или скрытый статус для связывания с интерфейсом.

Сборка графического интерфейса в no-code конструкторе
После подготовки сетевого уровня в разделе создания приложений api2app настраивается визуальная панель для конечного пользователя. На рабочий экран добавляются функциональные блоки:
- Многострочная текстовая область для ввода пользовательского описания (промпта);
- Кнопка инициации генерации;
- Индикатор «Прогресс операции» для отображения хода вычислений;
- Блок вывода графического контента (изображения);
- Два скрытых служебных поля для хранения промежуточных данных: идентификатора задачи и идентификатора файла.
Связывание событий ввода и вывода данных
Чтобы компоненты интерфейса обменивались данными с сервером ComfyUI, для каждого визуального и скрытого элемента настраиваются цепочки передачи переменных:
- Текстовая область: в действии ввода указывается поле JSON-структуры
Prompt.76.Inputs.Value, отвечающее за позитивный текстовый промпт узла генерации. - Кнопка запуска: настраивается на действие «Отправить» для первой API-конфигурации создания задачи.
- Скрытое поле идентификатора задачи: получает значение из ответа создания задачи (поле
id) и передает его в URL-параметр запроса проверки статуса задачи. Поскольку у статусного запроса нет отдельной кнопки, он запускается автоматически при обновлении значения поля. - Индикатор выполнения: привязывается к полному телу ответа статусного эндпоинта. В его параметрах указываются имена полей статуса (queued, running, succeeded, error), поле ID и ориентировочная длительность генерации в секундах (например, 35 секунд). Это обеспечивает периодический опрос сервера раз в 10 секунд и отрисовку плавной шкалы ожидания.
- Скрытое поле идентификатора файла: извлекает значение
outputs.0.idиз успешного ответа статуса и подставляет его в эндпоинт загрузки контента. - Блок изображения: принимает прямое значение контента из финального GET-запроса и рендерит сгенерированную картинку на экране.
Публикация и организация безопасного внешнего доступа
Готовое приложение переключается в публичный режим, после чего его функциональность проверяется напрямую в браузере: пользователь вводит текстовый запрос, активирует генерацию кнопкой, видит движение прогрессбара и получает сгенерированное нейросетью изображение.
Чтобы предоставить доступ к интерфейсу пользователям без прямого подключения к локальной сети, на хосте с ComfyUI поднимается обратный туннель к порту 8189 через специализированные туннельные утилиты. Полученный внешний публичный HTTPS-домен прописывается как базовый адрес во всех созданных конфигурациях API.
В целях безопасности для всех опубликованных подключений активируется режим «Сервер». В этом режиме реальные сетевые адреса локального компьютера скрыты от браузера пользователя, тело запросов может маскироваться, а заголовки авторизации с токенами переводятся в приватный статус. Дополнительно конструктор позволяет ограничить количество входящих запросов с одного IP-адреса в сутки, предотвращая перегрузку вычислительных мощностей видеокарты. При необходимости готовый веб-проект можно скачать для автономного развертывания на собственном сервере.
