Настройка рабочего процесса ComfyUI

Marinara Engine умеет отправлять запросы на изображения и видео на локальный сервер ComfyUI, а запросы на изображения – еще и на эндпоинт RunPod Serverless, на котором работает ComfyUI. Локальная модель изображений может обойтись встроенным базовым рабочим процессом Marinara. Для видео и продвинутых настроек изображений нужен ваш собственный рабочий процесс в формате API, то есть рабочий процесс, экспортированный из ComfyUI в формате JSON.

JSON, который вы вставляете в Marinara, – это снимок состояния. Живой связи с рабочим процессом, открытым в ComfyUI, Marinara не держит. Когда вы меняете рабочий процесс в ComfyUI, проверьте его, снова экспортируйте и замените JSON, сохраненный в Marinara.

Перед началом

Установите ComfyUI, добавьте контрольные точки (checkpoints) и собственные узлы, которые нужны рабочему процессу, и запустите сервер. Обычный локальный адрес – http://127.0.0.1:8188.

Если ComfyUI работает на другом компьютере домашней сети, его сервер должен слушать адрес, доступный приложению Marinara. Аккаунтам изображений дополнительно нужна строка IMAGE_LOCAL_URLS_ENABLED=true в файле .env приложения Marinara – см. Настройки сервера: справочник. Если подключиться все равно не удается, проверьте брандмауэр на том компьютере.

Локальная языковая модель и модель изображений могут не поместиться в память GPU одновременно, особенно на карте с 8 ГБ. Очередь изображений в Marinara не дает задачам изображений выполняться одновременно, но заставить две загруженные модели поместиться в одну и ту же память VRAM она не может. Если памяти не хватает, возьмите облачную языковую модель, запустите ComfyUI на другом устройстве или выгрузите одну модель перед работой с другой.

Создание подключения в приложении Marinara

  1. Нажмите Connections (подключения), затем Add (добавить). В окне Add account (добавить аккаунт) в разделе Images & video (изображения и видео) выберите ComfyUI для локального сервера или RunPod Serverless (ComfyUI) для эндпоинта RunPod.
  2. Для локального ComfyUI укажите его адрес (http://127.0.0.1:8188). Ключ API не нужен. Если поле ComfyUI workflow (optional) (рабочий процесс ComfyUI, необязательно) пустое, Marinara использует встроенный базовый рабочий процесс "текст в изображение".
  3. Для RunPod введите ключ API и RunPod endpoint ID (идентификатор эндпоинта RunPod). Собственный рабочий процесс здесь обязателен.
  4. Задайте Local image defaults (стандартные настройки локальных изображений) у модели изображений. Эти значения подставляются вместо соответствующих подстановок в вашем рабочем процессе.
  5. Вставьте рабочий процесс, сохраните и нажмите Test image (проверить изображение).

Если не получилось, см. Устранение неполадок.

Сборка и экспорт рабочего процесса

  1. Создайте в ComfyUI отдельный рабочий процесс для приложения Marinara.
  2. Как обычно, настройте и соедините контрольную точку, модели LoRA, VAE, кодировщики промпта, узлы латентного или входного изображения, сэмплер и выходные узлы.
  3. Поставьте рабочий процесс в очередь в ComfyUI и убедитесь, что изображение получается таким, как задумано.
  4. Добавьте выходной узел. Надежнее всего SaveImage, потому что готовые изображения и анимации Marinara читает из истории рабочих процессов ComfyUI.
  5. Сохраните редактируемый рабочий процесс под понятным именем, например Marinara_Workflow.
  6. Экспортируйте рабочий процесс в формате API. В зависимости от версии интерфейса ComfyUI это действие называется Save (API Format), Export (API) или Export to API. Если его не видно, включите в ComfyUI параметры для разработчиков (dev mode).
  7. Откройте полученный файл .json в текстовом редакторе.

Рабочий процесс в формате API отличается от обычного, из визуального редактора. Ключи верхнего уровня в нем – это идентификаторы узлов, и внутри каждого узла обычно есть class_type и inputs. Экспортируйте именно версию API: обычный файл рабочего процесса с визуальной раскладкой редактора вставлять не нужно.

Рабочие процессы для видео в ComfyUI

Добавьте аккаунт ComfyUI в разделе Images & video и откройте его модель видео. Вставьте рабочий процесс в формате API в обязательное поле ComfyUI workflow (optional). Модель WAN 2.2 и другие локальные графы для видео поддерживаются, если тот же рабочий процесс запускается в ComfyUI и сохраняет файл MP4 через выходной узел – например, через штатный узел SaveVideo.

В рабочих процессах для видео можно использовать такие подстановки, заключенные в кавычки:

ПодстановкаЗначение, которое подставляет Marinara
%prompt%Собранный промпт сцены или анимации.
%width%, %height%832×480 для 480p или 1280×720 для 720p, с обменом для 9:16.
%seed%Новое случайное 32-битное зерно.
%length%Длина клипа в кадрах при 16 fps.
%model%Значение Model из подключения, если оно задано.
%reference_image_name%Имя загруженного файла первого кадра для узла LoadImage ComfyUI.

Marinara ставит рабочий процесс в очередь через /prompt, опрашивает /history и скачивает файл MP4, указанный в выходных данных gifs или images. Действия "изображение в видео" передают %reference_image_name%, а проверки подключения только по тексту – нет. Поэтому оставьте этот вход необязательным, если один рабочий процесс должен работать в обоих случаях.

Локальный рендер WAN на GPU среднего уровня может занять больше 30 минут. Задачи ComfyUI для видео используют VIDEO_GEN_TIMEOUT_MS, а не COMFYUI_GEN_TIMEOUT, который относится только к изображениям. Если корректный рабочий процесс обрывается слишком рано, увеличьте тайм-аут для видео и перезапустите Marinara.

Добавление подстановок Marinara

Замените значения, которыми должно управлять приложение Marinara, на подстановки из списка ниже.

В подключении к локальному ComfyUI держите каждую подстановку внутри кавычек JSON. Marinara сначала разбирает рабочий процесс, а затем превращает точную числовую подстановку вида "%width%" в настоящее число. Поэтому файл остается корректным и для узлов, которым нужен числовой вход.

В подключении RunPod Serverless (ComfyUI) текстовые подстановки – "%prompt%", "%model%", "%sampler%" – остаются в кавычках, а числовые (%width%, %height%, %seed%, %steps%, %cfg%, %denoise%, %clip_skip%) пишутся без кавычек. Подстановка для RunPod происходит до того, как Marinara разберет рабочий процесс, поэтому вставленное число делает отправляемый JSON корректным. Редактор подключений может временно посчитать такой шаблон некорректным JSON, потому что токен без кавычек заменяется только в момент генерации. Сохранить шаблон это предупреждение не мешает.

Нужные части базового локального рабочего процесса API выглядят примерно так:

{
  "3": {
    "class_type": "KSampler",
    "inputs": {
      "seed": "%seed%",
      "steps": "%steps%",
      "cfg": "%cfg%",
      "sampler_name": "%sampler%",
      "scheduler": "%scheduler%",
      "denoise": "%denoise%"
    }
  },
  "5": {
    "class_type": "EmptyLatentImage",
    "inputs": {
      "width": "%width%",
      "height": "%height%",
      "batch_size": 1
    }
  },
  "6": {
    "class_type": "CLIPTextEncode",
    "inputs": {
      "text": "portrait, %prompt%, masterpiece"
    }
  },
  "7": {
    "class_type": "CLIPTextEncode",
    "inputs": {
      "text": "watermark, %negative_prompt%"
    }
  }
}

Это только фрагмент: связи между узлами и остальные входы из экспортированного файла сохраните. Подстановки промпта можно встроить в более длинную строку, чтобы добавить постоянные теги до или после него. Числовая подстановка обычно должна занимать все значение целиком. В копии рабочего процесса для RunPod уберите кавычки вокруг таких числовых токенов. Еще любую настройку можно оставить жестко прописанной, если менять ее стандартными значениями подключения Marinara не нужно.

ПодстановкаЗначение, которое подставляет Marinara
%prompt%Положительный промпт изображения. Если его нет, редактор подключений предупреждает об этом.
%negative_prompt%Отрицательный промпт изображения.
%width%, %height%Запрошенные размеры изображения.
%seed%Зерно из подключения; значение -1 дает новое случайное зерно.
%model%Модель, сохраненная в подключении. Укажите точное значение контрольной точки, которое ждет узел загрузки.
%steps%Число шагов сэмплирования.
%cfg%Масштаб CFG. Также принимаются %cfg_scale% и %scale%.
%sampler%Название сэмплера.
%scheduler%Название планировщика.
%denoise%Сила шумоподавления. Также принимается %denoising_strength%.
%clip_skip%Значение Clip Skip для совместимого узла.

Закончив правки, сохраните JSON, скопируйте файл целиком, вставьте его в поле ComfyUI workflow (optional) у модели изображений, сохраните и нажмите Test image.

Использование референсных изображений

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

Локальный ComfyUI: имена загруженных файлов для LoadImage

Для стандартного узла LoadImage в ComfyUI используйте подстановку с именем файла:

{
  "12": {
    "class_type": "LoadImage",
    "inputs": {
      "image": "%reference_image_name%",
      "upload": "image"
    }
  }
}

Marinara загружает референс в папку входных файлов ComfyUI и заменяет подстановку тем именем файла, которое вернул ComfyUI. Запись %reference_image_name% означает первое изображение. Если референсных входов несколько, подойдут подстановки от %reference_image_name_01% до %reference_image_name_04%.

Если рабочему процессу входное изображение нужно всегда, включите в Local image defaults параметр загрузки заглушки 1x1. Тогда при запросе без настоящего референса Marinara подставит крошечную картинку-заглушку.

Сырые данные изображения в base64

Для первого изображения в сыром base64 используйте %reference_image%, а для нумерованных входов – подстановки от %reference_image_01% до %reference_image_04%. Эти значения содержат данные base64 без префикса data:image/... и работают только с собственными узлами, которые принимают такой формат напрямую.

Рабочие процессы RunPod поддерживают подстановки с сырым base64. Подстановки с именами загруженных файлов предназначены для локального ComfyUI и через обработчик RunPod недоступны.

Отдельные рабочие процессы для персонажей

Для каждого персонажа, которому нужна особая контрольная точка, свой набор моделей LoRA, настройка ControlNet или своя раскладка референсных изображений, можно сделать отдельный экспортированный рабочий процесс и отдельное подключение для изображений в приложении Marinara. Выбирайте подходящую модель изображений везде, где этот персонаж или функция изображений дает такой выбор.

Так результаты могут получаться стабильнее, чем с одним универсальным рабочим процессом, но каждая модель по-прежнему хранит свою копию JSON. Изменив рабочий процесс персонажа в ComfyUI, повторите для этого подключения шаги с экспортом, правкой, копированием и вставкой.

Устранение неполадок

ПроблемаЧто проверить
Marinara сообщает о некорректном формате JSON рабочего процессаДля локального ComfyUI проверьте кавычки, запятые и скобки после добавления подстановок. Для RunPod без кавычек остаются только числовые подстановки; все текстовые подстановки и остальной шаблон по-прежнему требуют правильного синтаксиса JSON.
В узел попадает сам текст промпта или подстановкиПроверьте, что токен написан в точности как в списке и что вставлен только что экспортированный рабочий процесс в формате API.
Изображение игнорирует запрошенные размерыПоставьте %width% и %height% в узел латентного изображения или равнозначный узел размера, который действительно питает сэмплер.
ComfyUI не находит модельУкажите точное имя контрольной точки, которое ждет узел загрузки, либо жестко прописывайте контрольную точку в рабочем процессе вместо %model%.
ComfyUI сообщает об отсутствующем узле или входеУстановите те же пакеты собственных узлов, с которыми собирался рабочий процесс, и проверьте, что имена их входов не изменились.
Задача завершается, но Marinara не получает изображениеДобавьте подключенный выходной узел SaveImage и снова проверьте рабочий процесс прямо в ComfyUI.
Узел референсного изображения выдает ошибкуДля обычного локального узла LoadImage используйте подстановку вида %reference_image_name...%. Сырой base64 подходит только для узла, рассчитанного на него; проверьте также, что функция Marinara действительно передала референс.
Удаленный адрес ComfyUI или адрес в локальной сети заблокированДля подключений изображений включите IMAGE_LOCAL_URLS_ENABLED. Заставьте ComfyUI слушать сетевой интерфейс и проверьте брандмауэр хоста. Не выставляйте сервер ComfyUI без проверки доступа в публичный интернет.
Ошибка: Outbound response exceeded N bytesОтвет превысил заданный предел, который по умолчанию равен 30 MiB. Причиной могут быть встроенные метаданные рабочего процесса или референсного изображения. Выключите метаданные в ComfyUI или увеличьте IMAGE_GEN_MAX_RESPONSE_BYTES в файле .env приложения Marinara и перезапустите Marinara.
Долгая генерация изображения обрывается по тайм-аутуУвеличьте COMFYUI_GEN_TIMEOUT в файле .env приложения Marinara. Значение задается в секундах, по умолчанию 2400.
Долгая генерация видео обрывается по тайм-аутуУвеличьте VIDEO_GEN_TIMEOUT_MS в файле .env приложения Marinara. Значение задается в миллисекундах, по умолчанию 1800000 (30 минут).
Генерации не хватает памяти GPUУменьшите размеры изображения или модель, выгрузите локальную языковую модель, возьмите удаленную языковую модель или перенесите ComfyUI на другое устройство.

Смежные руководства