comfyanonymous/ComfyUI), файл чекпойнта Stable Diffusion в формате .safetensors, браузер, терминалhttp://127.0.0.1:8188 с веб-интерфейсом и HTTP API (/prompt, /history, /view), к которому можно обращаться из своего кода
git и python3 в PATH. Проверка: git --version и python3 --version печатают версии без ошибок.8188 (порт по умолчанию у ComfyUI).Чек-лист перед стартом:
python3 --version работает в терминалеgit --version работаетnvidia-smi показывает видеокарту (если она есть).safetensors с чекпойнтом8188 ничем не занятЕсли вы ещё не запускали локальные модели и хотите сначала понять общую логику «модель на своём компьютере», начните с материала Как запустить ИИ-модель локально на своём компьютере: гайд для начинающих.
Что сделать: склонировать репозиторий, создать виртуальное окружение и поставить зависимости.
Зачем: виртуальное окружение (venv) — отдельная папка с библиотеками Python, чтобы версии torch и прочих пакетов для ComfyUI не конфликтовали с другими вашими проектами.
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
Пример: после source venv/bin/activate приглашение терминала начинается с (venv), например (venv) user@host:~/ComfyUI$. Это признак, что вы внутри окружения.
Как проверить: убедиться, что PyTorch встал и видит GPU.
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
Ожидаемый вывод: строка с версией и True на машине с NVIDIA (False, если GPU нет или драйвер не установлен). Почему это работает: requirements.txt тянет PyTorch, а torch.cuda.is_available() реально опрашивает драйвер, а не просто читает конфиг.

Что сделать: положить чекпойнт в папку моделей и запустить сервер.
Зачем: ComfyUI — это графовый редактор: ноды (узлы) соединяются в схему «текст → латентное представление → изображение». Файл модели должен лежать в конкретном каталоге, иначе нода Load Checkpoint его не увидит. Латентное представление — сжатая версия картинки, в которой диффузионная модель работает быстрее, чем с пикселями.
cp ~/Downloads/<ваш-чекпойнт>.safetensors models/checkpoints/
python main.py --listen 127.0.0.1 --port 8188
<ваш-чекпойнт> замените на имя скачанного файла. Флаг --listen 127.0.0.1 означает «слушать только локально» — снаружи машины сервер недоступен, это безопасный вариант по умолчанию.
Пример: в логе появляется строка вида Starting server и адрес с портом 8188; в браузере по http://127.0.0.1:8188 открывается тёмный холст с нодами по умолчанию.
Как проверить: в интерфейсе найти ноду Load Checkpoint и раскрыть выпадающий список — в нём должен быть ваш файл. Если списка нет — модель не попала в models/checkpoints/; перезапустите сервер, он сканирует папку при старте.

Что сделать: собрать простую схему в интерфейсе, выгрузить её в API-формате и отправить на сервер HTTP-запросом.
Зачем: веб-интерфейс и API используют один и тот же движок. Схема, сохранённая через пункт меню сохранения в API-формате (кнопка сохранения в меню интерфейса, точное название пункта сверьте с документацией ComfyUI), — это JSON, который принимает эндпоинт POST /prompt.
import json, time, urllib.request, urllib.parse
SERVER = "http://127.0.0.1:8188"
with open("workflow_api.json", encoding="utf-8") as f:
workflow = json.load(f)
req = urllib.request.Request(
f"{SERVER}/prompt",
data=json.dumps({"prompt": workflow}).encode(),
headers={"Content-Type": "application/json"},
)
resp = json.load(urllib.request.urlopen(req))
prompt_id = resp["prompt_id"]
print("prompt_id:", prompt_id)
while True:
hist = json.load(urllib.request.urlopen(f"{SERVER}/history/{prompt_id}"))
if prompt_id in hist:
break
time.sleep(1)
for node_id, out in hist[prompt_id]["outputs"].items():
for img in out.get("images", []):
q = urllib.parse.urlencode({"filename": img["filename"],
"subfolder": img["subfolder"],
"type": img["type"]})
print("file:", f"{SERVER}/view?{q}")
Пример: первый ответ сервера выглядит как {"prompt_id": "...", "number": 0, "node_errors": {}}. Пустой node_errors — схема валидна. Скрипт печатает prompt_id: и затем ссылку вида http://127.0.0.1:8188/view?filename=ComfyUI_00001_.png&subfolder=&type=output.
Как проверить: открыть напечатанный URL в браузере — должна отобразиться сгенерированная картинка. Файл также лежит в ComfyUI/output/. Почему это работает: /prompt ставит задачу в очередь и возвращает идентификатор, /history/{id} отдаёт результат по завершении, /view раздаёт файл из выходного каталога.
Проблема. Сервер падает сразу после старта с ошибкой про torch
ModuleNotFoundError: No module named 'torch'main.py запущен другим интерпретатором Python (например, системным, а не из venv).source venv/bin/activate
which python # Windows: where python
pip install -r requirements.txt
python main.py
Путь в выводе which python должен заканчиваться на ComfyUI/venv/bin/python.
Проблема. Генерация прерывается на середине
torch.cuda.OutOfMemoryError: CUDA out of memory.python main.py --listen 127.0.0.1 --port 8188 --lowvram
Проблема. Сервер не стартует, порт занят
OSError: [Errno 98] Address already in use8188 уже висит другой процесс — часто забытый предыдущий запуск ComfyUI.ss -ltnp | grep 8188
kill <PID>
python main.py --listen 127.0.0.1 --port 8189 # и обновить SERVER в скрипте
Вы получили локальный сервер ComfyUI с веб-интерфейсом и HTTP API, который принимает JSON-схему через /prompt и возвращает готовые файлы через /history и /view. Дальше имеет смысл обернуть вызовы из Шага 3 в свою функцию или сервис, добавить очередь запросов и логирование времени генерации.
Нужна ли обязательно видеокарта NVIDIA?
Нет, ComfyUI запускается и на CPU, но генерация будет заметно медленнее. Способы запуска на CPU и поддерживаемые флаги сверьте с документацией ComfyUI.
Где брать чекпойнты Stable Diffusion?
В каталогах открытых весов; подходят файлы формата .safetensors, которые кладутся в ComfyUI/models/checkpoints/. Обзор открытых моделей — в подборке гайдов по открытым весам.
Можно ли обращаться к серверу с другой машины в сети?
Технически да — запуск с --listen 0.0.0.0. Но тогда сервер доступен всем в сети без пароля, поэтому ставьте его за reverse proxy с аутентификацией; конкретные настройки сверьте с документацией.
Чем API отличается от веб-интерфейса?
Ничем по результату: это один процесс и один движок. Интерфейс просто рисует граф, а API принимает тот же граф как JSON и возвращает пути к файлам.