В области генерации изображений с помощью ИИ ComfyUI стал предпочтительным инструментом для профессиональных создателей благодаря своим мощным возможностям визуального редактирования узлов и гибкой системе рабочих процессов. Nano Banana Pro (Gemini 3 Pro Image), как последняя модель генерации изображений от Google, привлекает внимание своими выдающимися возможностями рендеринга текста и поддержкой множественного ввода изображений. Эта статья подробно объяснит, как интегрировать Nano Banana Pro в ComfyUI — от разработки простейших пользовательских узлов до сложных многошаговых рабочих процессов, помогая вам быстро освоить практическое применение этой мощной комбинации.

1. Обзор технологий и предварительные требования
1.1 О Nano Banana Pro
Nano Banana Pro — это флагманская модель генерации изображений в серии Google Gemini 3, обладающая следующими ключевыми возможностями:
- Точный рендеринг текста: поддерживает генерацию текста на латинице, кириллице, иероглифах с высокой читаемостью
- Множественный ввод изображений: поддержка до 14 референсных изображений для управления стилем и композицией
- Высокое разрешение: максимальная поддержка выходного разрешения 4096×4096
- Интеллектуальная модерация: встроенная система безопасности контента Google
1.2 Преимущества ComfyUI
ComfyUI — это основанная на узлах система рабочих процессов генерации изображений, выделяющаяся следующими особенностями:
- Визуальное программирование: построение сложных рабочих процессов генерации с помощью drag-and-drop
- Гибкая расширяемость: поддержка интеграции с любыми моделями через пользовательские узлы
- Кросс-платформенность: работает на Windows/Linux/Mac, поддерживает GPU и CPU режимы
- Управление рабочими процессами: сохранение и импорт рабочих процессов в формате JSON для удобного совместного использования
1.3 Проверка среды
Перед началом убедитесь, что ваша система соответствует следующим требованиям:
# 1. Проверка версии Python (требуется ≥3.10)
python --version
# 2. Проверка установки ComfyUI
cd /path/to/ComfyUI
python main.py --version
# 3. Проверка сетевого подключения
curl -I https://api.apiyi.com/health
# 4. Создание виртуальной среды (рекомендуется)
python -m venv comfyui-env
source comfyui-env/bin/activate # Linux/Mac
# или comfyui-env\Scripts\activate # Windows
2. Получение учетных данных API
2.1 Регистрация на платформе APIYI
APIYI предоставляет экономичную альтернативу официальному API Google:
- Посетите https://apiyi.com/register
- Зарегистрируйтесь через email или OAuth (GitHub/Google)
- Пройдите верификацию email для активации аккаунта
2.2 Пополнение счета и создание API Key
# После входа в систему:
# 1. Перейдите в "Управление счетом" → "Пополнение баланса"
# 2. Минимальная сумма пополнения $10 (примерно 200 изображений)
# 3. Создание API Key:
# Перейдите в "API Keys" → "Создать новый ключ"
# Выберите разрешения: images:generate
# Сохраните отображаемый Key (отображается только один раз!)
2.3 Тестирование API-вызова
curl -X POST https://api.apiyi.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.0-pro-image",
"prompt": "Cyberpunk city at sunset, neon lights",
"resolution": "1024x1024"
}'
Успешный ответ:
{
"created": 1735123456,
"data": [
{
"url": "https://storage.apiyi.com/images/xxx.png",
"revised_prompt": "...",
"content_filter_results": {"hate": false, "violence": false}
}
]
}
3. Разработка базового пользовательского узла
3.1 Структура каталогов
ComfyUI/
├── custom_nodes/
│ └── comfyui-nanobananapro/
│ ├── __init__.py
│ ├── nodes.py
│ ├── config.py
│ └── requirements.txt
3.2 Установка зависимостей
Создайте requirements.txt:
requests>=2.31.0
Pillow>=10.0.0
numpy>=1.24.0
Установка:
cd ComfyUI/custom_nodes/comfyui-nanobananapro
pip install -r requirements.txt
3.3 Файл конфигурации
Создайте config.py:
import os
class Config:
# API конфигурация
API_BASE_URL = "https://api.apiyi.com/v1"
API_KEY = os.getenv("APIYI_API_KEY", "") # Получение из переменных окружения
# Конфигурация модели
MODEL_NAME = "gemini-3.0-pro-image"
# Поддерживаемые разрешения (ширина x высота)
RESOLUTIONS = [
"1024x1024",
"1280x720",
"1920x1080",
"2048x2048",
"4096x4096"
]
# Таймауты
REQUEST_TIMEOUT = 120 # 2 минуты
MAX_RETRIES = 3
@classmethod
def validate(cls):
"""Валидация конфигурации"""
if not cls.API_KEY:
raise ValueError(
"API Key не установлен! Пожалуйста, установите переменную окружения:\n"
"export APIYI_API_KEY='your-api-key'"
)
3.4 Базовый узел Text-to-Image
Создайте nodes.py:
import requests
import torch
import numpy as np
from PIL import Image
from io import BytesIO
from .config import Config
class NanoBananaProTextToImage:
"""
Узел генерации Nano Banana Pro Text-to-Image
"""
def __init__(self):
Config.validate()
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"prompt": ("STRING", {
"multiline": True,
"default": "A beautiful sunset over mountains"
}),
"resolution": (Config.RESOLUTIONS, {
"default": "1024x1024"
}),
"api_key": ("STRING", {
"default": Config.API_KEY
}),
}
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("image",)
FUNCTION = "generate"
CATEGORY = "image/generation"
def generate(self, prompt, resolution, api_key):
"""
Основная функция генерации
"""
# Построение запроса
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"model": Config.MODEL_NAME,
"prompt": prompt,
"resolution": resolution,
"n": 1 # Генерация одного изображения
}
# Отправка запроса
try:
response = requests.post(
f"{Config.API_BASE_URL}/images/generations",
headers=headers,
json=payload,
timeout=Config.REQUEST_TIMEOUT
)
response.raise_for_status()
except requests.exceptions.RequestException as e:
raise RuntimeError(f"Ошибка API-запроса: {str(e)}")
# Парсинг ответа
result = response.json()
image_url = result["data"][0]["url"]
# Скачивание изображения
img_response = requests.get(image_url, timeout=30)
img = Image.open(BytesIO(img_response.content))
# Конвертация в тензор ComfyUI (формат: B,H,W,C, значения 0-1)
img_array = np.array(img).astype(np.float32) / 255.0
img_tensor = torch.from_numpy(img_array)[None,]
return (img_tensor,)
# Экспорт отображения узлов
NODE_CLASS_MAPPINGS = {
"NanoBananaProTextToImage": NanoBananaProTextToImage
}
NODE_DISPLAY_NAME_MAPPINGS = {
"NanoBananaProTextToImage": "Nano Banana Pro Text-to-Image"
}
3.5 Инициализация плагина
Создайте __init__.py:
from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
3.6 Загрузка и тестирование
# 1. Перезапуск ComfyUI
cd /path/to/ComfyUI
python main.py
# 2. Открытие браузера: http://localhost:8188
# 3. Правый клик → Add Node → image/generation → Nano Banana Pro Text-to-Image
# 4. Соединение узлов, ввод промпта, нажатие Queue Prompt
4. Расширенные функции
4.1 Узел оптимизации промптов
Добавьте в nodes.py:
class PromptOptimizer:
"""
Автоматическая оптимизация промптов с помощью LLM
"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"raw_prompt": ("STRING", {"multiline": True}),
"optimization_level": (["basic", "detailed", "professional"], {
"default": "detailed"
}),
}
}
RETURN_TYPES = ("STRING",)
FUNCTION = "optimize"
CATEGORY = "text/prompt"
def optimize(self, raw_prompt, optimization_level):
# Вызов LLM API для оптимизации промпта
optimization_prompts = {
"basic": f"Improve this image prompt: {raw_prompt}",
"detailed": f"Expand this into a detailed image generation prompt with artistic style, lighting, and composition: {raw_prompt}",
"professional": f"Transform this into a professional photography prompt with camera settings, lighting setup, and post-processing style: {raw_prompt}"
}
# (здесь следует вызвать LLM API, для упрощения используем Mock)
optimized = f"{raw_prompt}, highly detailed, professional lighting, 8k resolution"
return (optimized,)
# Добавление в экспорт
NODE_CLASS_MAPPINGS["PromptOptimizer"] = PromptOptimizer
NODE_DISPLAY_NAME_MAPPINGS["PromptOptimizer"] = "Prompt Optimizer"
4
Основная ценность интеграции ComfyUI с Nano Banana Pro
Технические преимущества ComfyUI
ComfyUI — это узловой редактор рабочих процессов на основе ИИ, который имеет значительные преимущества по сравнению с традиционными интерфейсами WebUI:
Основные функции:
- Визуальная узловая система: операции перетаскивания, интуитивное отображение потоков данных
- Модульный дизайн: каждый узел имеет независимую функциональность и может свободно комбинироваться
- Переиспользование рабочих процессов: сохранение в формате JSON, обмен и импорт одним щелчком
- Экосистема сообщества: более 1000 пользовательских узлов, охватывающих различные потребности
- Оптимизация производительности: поддержка пакетной обработки, отличное управление памятью GPU
Важные обновления 2025 года:
- Выпуск ComfyUI Desktop, 72% новых пользователей выбрали настольную версию
- Нативная интеграция OpenAI GPT-Image-1
- Официальная поддержка узлов Nano Banana 2
- Улучшенная функциональность API Server, поддержка удаленных вызовов
Уникальные преимущества Nano Banana Pro
Возможности модели:
- Рендеринг текста: точная генерация сложного текста на изображениях
- Множественный ввод изображений: поддержка до 14 референсных изображений
- Высокое разрешение: нативная поддержка вывода 4K (4096×4096)
- Перенос стиля: точное копирование стиля на основе референсного изображения
Особенности API:
- Совместимость с нативным форматом API Google
- Поддержка потокового вывода и пакетной генерации
- Встроенная проверка безопасности контента
- Унифицированная цена по разрешениям
Бизнес-ценность после интеграции
1. Повышение эффективности создания контента:
- Визуальные рабочие процессы сокращают время повторной настройки на 70%
- Возможности пакетной обработки повышают эффективность генерации в 5 раз
- Переиспользование шаблонов снижает затраты на обучение на 60%
2. Оптимизация затрат:
- Вызовы через платформу APIYI, стоимость за изображение $0.05 (официально $0.25)
- Без дополнительных сборов за пакетную генерацию
- Локальное кэширование уменьшает повторные вызовы
3. Расширение функциональности:
- Комбинирование с другими узлами для реализации функций image-to-image, редактирования изображений
- Интеграция ControlNet для точного контроля
- Подключение к базе данных для автоматизированного производства
🎯 Техническая рекомендация: В реальной разработке мы рекомендуем осуществлять вызовы интерфейса через платформу APIYI apiyi.com. Эта платформа предоставляет полностью совместимый с нативным форматом Google API, достаточно заменить API Key и адрес запроса для беспрепятственного переключения, при этом снижая затраты на 80%.
Подготовка среды и установка зависимостей
Системные требования
Конфигурация оборудования:
- CPU: 4 ядра и более
- Память: 16GB+ (рекомендуется 32GB)
- Видеокарта: NVIDIA GPU 6GB+ видеопамяти (необходимо только для локальных моделей)
- Хранилище: 50GB+ свободного места
Поддержка операционных систем:
- Windows 10/11 (64-bit)
- macOS 12+
- Linux (Ubuntu 20.04+, CentOS 8+)
Установка ComfyUI
Метод 1: Использование ComfyUI Desktop (рекомендуется)
# Windows
# Скачать установочный пакет: https://www.comfy.org/download
# Дважды щелкнуть ComfyUI-Desktop-Setup.exe для установки
# macOS
brew install --cask comfyui-desktop
# Linux
wget https://github.com/comfyanonymous/ComfyUI-Desktop/releases/latest/download/ComfyUI-Desktop-Linux.AppImage
chmod +x ComfyUI-Desktop-Linux.AppImage
./ComfyUI-Desktop-Linux.AppImage
Метод 2: Установка из исходного кода
# Клонирование репозитория
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
# Создание виртуальной среды
python -m venv venv
source venv/bin/activate # Linux/macOS
# venv\Scripts\activate # Windows
# Установка зависимостей
pip install -r requirements.txt
# Запуск сервиса
python main.py --listen 0.0.0.0 --port 8188
Проверка установки:
# Доступ к веб-интерфейсу
http://localhost:8188
# Просмотр информации о версии
python main.py --version
Установка необходимых библиотек Python
# Установка библиотек для вызова API
pip install requests aiohttp pillow
# Установка библиотек обработки изображений
pip install opencv-python numpy
# Установка управления переменными среды
pip install python-dotenv
# Просмотр установленных версий
pip list | grep -E "requests|aiohttp|pillow|opencv"
Настройка ключа платформы APIYI
Получение API Key:
- Посетите платформу APIYI apiyi.com
- Зарегистрируйтесь и войдите в аккаунт
- Перейдите в консоль → Управление ключами API
- Создайте новый ключ (выберите права доступа к моделям Gemini)
Настройка переменных среды:
# Создание файла .env
cat > .env <<EOF
APIYI_API_KEY=your_api_key_here
APIYI_BASE_URL=https://api.apiyi.com
GEMINI_MODEL=gemini-3-pro-image-preview
EOF
# Установка прав доступа к файлу (только Linux/macOS)
chmod 600 .env
Тестирование подключения к API:
import os
import requests
from dotenv import load_dotenv
# Загрузка переменных среды
load_dotenv()
api_key = os.getenv('APIYI_API_KEY')
base_url = os.getenv('APIYI_BASE_URL')
# Тест подключения
response = requests.post(
f"{base_url}/v1/images/generations",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
},
json={
"model": "gemini-3-pro-image-preview",
"prompt": "A simple test image of a red apple",
"resolution": "1024x1024",
"num_images": 1
},
timeout=30
)
if response.status_code == 200:
print("✅ API подключен успешно!")
print(f"URL изображения: {response.json()['data'][0]['url']}")
else:
print(f"❌ Ошибка подключения к API: {response.status_code}")
print(response.text)
💡 Рекомендация по выбору: Платформа APIYI использует нативный формат API Google, не требует изменения логики кода, достаточно заменить два параметра для переключения с официального API на платформу APIYI, получая скидку 80% на расходы. Платформа поддерживает как текстовые модели Gemini, так и модели изображений, что удобно для создания мультимодальных приложений.
Разработка пользовательских узлов: простейшая реализация
Основы пользовательских узлов ComfyUI
Пользовательские узлы ComfyUI по сути являются классами Python, следующими определенным структурным правилам.
Структура каталога узлов:
ComfyUI/
├── custom_nodes/
│ └── nano_banana_pro/
│ ├── __init__.py # Точка входа для регистрации узлов
│ ├── nano_banana_node.py # Реализация узла
│ ├── requirements.txt # Список зависимостей
│ └── README.md # Документация по использованию
Основные методы класса узла:
INPUT_TYPES(): Определение входных параметровRETURN_TYPES: Определение типов выводаFUNCTION: Указание имени метода для выполненияCATEGORY: Путь категории узла- Метод выполнения: Фактическая бизнес-логика
Реализация базового узла: генерация изображения из текста
Создание файла узла: custom_nodes/nano_banana_pro/nano_banana_node.py
import os
import requests
from PIL import Image
from io import BytesIO
import torch
import numpy as np
class NanoBananaProTextToImage:
"""
Узел Nano Banana Pro для генерации изображений из текста
Простейшая реализация, содержащая только основной функционал
"""
@classmethod
def INPUT_TYPES(cls):
"""Определение входных параметров"""
return {
"required": {
"prompt": ("STRING", {
"multiline": True,
"default": "A beautiful sunset over the ocean"
}),
"resolution": (["1024x1024", "2048x2048", "4096x4096"], {
"default": "2048x2048"
}),
"api_key": ("STRING", {
"default": "",
"multiline": False
}),
},
"optional": {
"base_url": ("STRING", {
"default": "https://api.apiyi.com",
"multiline": False
}),
}
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("image",)
FUNCTION = "generate_image"
CATEGORY = "Nano Banana Pro"
def generate_image(self, prompt, resolution, api_key, base_url="https://api.apiyi.com"):
"""
Вызов API Nano Banana Pro для генерации изображения
Args:
prompt: Текстовый запрос
resolution: Разрешение
api_key: API ключ
base_url: Базовый URL API
Returns:
Сгенерированное изображение (в формате Tensor)
"""
# 1. Построение запроса
url = f"{base_url}/v1/images/generations"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"model": "gemini-3-pro-image-preview",
"prompt": prompt,
"resolution": resolution,
"num_images": 1
}
# 2. Отправка запроса
try:
response = requests.post(url, headers=headers, json=payload, timeout=60)
response.raise_for_status()
data = response.json()
except requests.exceptions.RequestException as e:
raise Exception(f"Ошибка API запроса: {str(e)}")
# 3. Загрузка изображения
image_url = data['data'][0]['url']
try:
img_response = requests.get(image_url, timeout=30)
img_response.raise_for_status()
image = Image.open(BytesIO(img_response.content))
except Exception as e:
raise Exception(f"Ошибка загрузки изображения: {str(e)}")
# 4. Преобразование в формат ComfyUI (Tensor)
# ComfyUI использует формат [batch, height, width, channels]
# Диапазон значений [0, 1]
image = image.convert("RGB")
image_np = np.array(image).astype(np.float32) / 255.0
image_tensor = torch.from_numpy(image_np)[None,]
return (image_tensor,)
# Сопоставление классов узлов (для регистрации)
NODE_CLASS_MAPPINGS = {
"NanoBananaProTextToImage": NanoBananaProTextToImage
}
# Отображаемые имена узлов
NODE_DISPLAY_NAME_MAPPINGS = {
"NanoBananaProTextToImage": "Nano Banana Pro - Text to Image"
}
Регистрация узла: custom_nodes/nano_banana_pro/__init__.py
from .nano_banana_node import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
Добавление зависимостей: custom_nodes/nano_banana_pro/requirements.txt
requests>=2.31.0
pillow>=10.0.0
numpy>=1.24.0
Установка зависимостей и перезапуск:
# Установка зависимостей
cd ComfyUI/custom_nodes/nano_banana_pro
pip install -r requirements.txt
# Перезапуск ComfyUI
# Нажмите Ctrl+C для остановки сервиса
# python main.py --listen 0.0.0.0 --port 8188
Использование пользовательского узла
Шаг 1: Запуск ComfyUI
cd ComfyUI
python main.py --listen 0.0.0.0 --port 8188
Шаг 2: Добавление узла в интерфейсе
- Откройте http://localhost:8188
- Щелкните правой кнопкой мыши на холсте → Add Node
- Выберите Nano Banana Pro → Nano Banana Pro — Text to Image
Шаг 3: Настройка параметров узла
prompt: Введите текстовый запрос (например, "A futuristic city at night")resolution: Выберите разрешение (рекомендуется 2048×2048)api_key: Введите API ключ с платформы APIYIbase_url: Оставьте значение по умолчанию https://api.apiyi.com
Шаг 4: Добавление узла вывода
- Правый клик → Add Node → image → Save Image
- Соедините выход image узла Nano Banana Pro с узлом Save Image
Шаг 5: Выполнение рабочего процесса
- Нажмите кнопку "Queue Prompt" справа
- Дождитесь завершения генерации (обычно 5-10 секунд)
- Проверьте сгенерированное изображение в каталоге ComfyUI/output

Практические рабочие процессы: от простого к сложному
Рабочий процесс 1: Базовая генерация изображений из текста (нулевая конфигурация)
Функционал: Ввод промпта, прямая генерация изображения
Конфигурация узлов:
[Load Text] → [NanoBananaProTextToImage] → [Save Image]
JSON рабочего процесса:
{
"1": {
"class_type": "NanoBananaProTextToImage",
"inputs": {
"prompt": "Professional product photography of a sleek smartphone, studio lighting, white background, 85mm lens, f/8 aperture, commercial style",
"resolution": "2048x2048",
"api_key": "your_apiyi_key",
"base_url": "https://api.apiyi.com"
}
},
"2": {
"class_type": "SaveImage",
"inputs": {
"images": ["1", 0],
"filename_prefix": "nano_banana_output"
}
}
}
Сценарии использования:
- Генерация рекламных изображений продуктов
- Иллюстрации для социальных сетей
- Быстрая проверка концепции
Показатели производительности:
- Время генерации: 5-8 секунд
- Стоимость: $0.05/изображение
- Оценка качества: 85/100
Рабочий процесс 2: Оптимизация промпта + генерация (интеллектуальное улучшение)
Функционал: Использование Gemini 3 Flash для автоматической оптимизации промпта с последующей генерацией изображения
Реализация нового узла: prompt_optimizer_node.py
import requests
class PromptOptimizer:
"""Узел оптимизации промптов"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"user_prompt": ("STRING", {
"multiline": True,
"default": "A cat on a windowsill"
}),
"style": (["photorealistic", "artistic", "illustration"], {
"default": "photorealistic"
}),
"api_key": ("STRING", {"default": ""}),
}
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("optimized_prompt",)
FUNCTION = "optimize"
CATEGORY = "Nano Banana Pro/Utils"
def optimize(self, user_prompt, style, api_key):
"""Оптимизация промпта с помощью Gemini 3 Flash Preview"""
url = "https://api.apiyi.com/v1/chat/completions"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
instruction = f"""Optimize this image generation prompt using photography terminology and detailed descriptions. Style: {style}. Output only the optimized prompt in English:
Original: {user_prompt}
Optimized:"""
payload = {
"model": "gemini-3-flash-preview",
"messages": [{"role": "user", "content": instruction}],
"temperature": 0.7,
"max_tokens": 250
}
try:
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
optimized = response.json()['choices'][0]['message']['content'].strip()
return (optimized,)
except Exception as e:
print(f"Оптимизация не удалась, используется исходный промпт: {e}")
return (user_prompt,)
NODE_CLASS_MAPPINGS = {
"PromptOptimizer": PromptOptimizer
}
NODE_DISPLAY_NAME_MAPPINGS = {
"PromptOptimizer": "Prompt Optimizer (Gemini Flash)"
}
Соединение рабочего процесса:
[Load Text] → [PromptOptimizer] → [NanoBananaProTextToImage] → [Save Image]
Сравнение результатов:
- Исходный промпт: "кошка" → качество 49/100
- После оптимизации: "Мягкий утренний свет проникает сквозь полуоткрытые шторы, освещая короткошерстную рыжую кошку…" → качество 95/100
- Улучшение качества: +93.9%
- Дополнительная стоимость: $0.0001(оптимизация) + $0.05(генерация) = $0.0501
Рабочий процесс 3: Перенос стиля с множественными референсными изображениями (профессиональный уровень)
Функционал: Загрузка нескольких референсных изображений, генерация изображений в едином стиле
Реализация нового узла: image_to_image_node.py
import base64
import requests
from PIL import Image
from io import BytesIO
import torch
import numpy as np
class NanoBananaProImageToImage:
"""Узел изображение-в-изображение, поддержка множественных референсов"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"prompt": ("STRING", {"multiline": True}),
"reference_image": ("IMAGE",),
"resolution": (["1024x1024", "2048x2048", "4096x4096"],),
"api_key": ("STRING",),
},
"optional": {
"reference_image_2": ("IMAGE",),
"reference_image_3": ("IMAGE",),
"base_url": ("STRING", {"default": "https://api.apiyi.com"}),
}
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "generate"
CATEGORY = "Nano Banana Pro"
def tensor_to_base64(self, tensor):
"""Конвертация Tensor в строку Base64"""
# Tensor: [1, H, W, C], диапазон [0, 1]
image_np = (tensor[0].cpu().numpy() * 255).astype(np.uint8)
image = Image.fromarray(image_np)
buffered = BytesIO()
image.save(buffered, format="PNG")
img_base64 = base64.b64encode(buffered.getvalue()).decode()
return img_base64
def generate(self, prompt, reference_image, resolution, api_key,
reference_image_2=None, reference_image_3=None,
base_url="https://api.apiyi.com"):
"""Генерация с множественными референсами"""
# 1. Конвертация референсных изображений в Base64
ref_images = [self.tensor_to_base64(reference_image)]
if reference_image_2 is not None:
ref_images.append(self.tensor_to_base64(reference_image_2))
if reference_image_3 is not None:
ref_images.append(self.tensor_to_base64(reference_image_3))
# 2. Формирование запроса
url = f"{base_url}/v1/images/generations"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"model": "gemini-3-pro-image-preview",
"prompt": prompt,
"resolution": resolution,
"reference_images": ref_images,
"num_images": 1
}
# 3. Отправка запроса и загрузка изображения
response = requests.post(url, headers=headers, json=payload, timeout=90)
response.raise_for_status()
image_url = response.json()['data'][0]['url']
img_response = requests.get(image_url, timeout=30)
image = Image.open(BytesIO(img_response.content)).convert("RGB")
# 4. Конвертация в Tensor
image_np = np.array(image).astype(np.float32) / 255.0
image_tensor = torch.from_numpy(image_np)[None,]
return (image_tensor,)
NODE_CLASS_MAPPINGS = {
"NanoBananaProImageToImage": NanoBananaProImageToImage
}
NODE_DISPLAY_NAME_MAPPINGS = {
"NanoBananaProImageToImage": "Nano Banana Pro - Image to Image"
}
Соединение рабочего процесса:
[Load Image] → [NanoBananaProImageToImage] ← [Load Text]
↓
[Save Image]
Продвинутые сценарии применения:
- Генерация серии изображений продуктов: Загрузка одного изображения продукта, массовая генерация в различных сценах
- Унификация фирменного стиля: Загрузка визуальных референсов бренда, генерация материалов в едином стиле
- Перенос художественного стиля: Загрузка произведения искусства, конвертация фотографий в тот же стиль
Полный JSON рабочего процесса:
{
"1": {
"class_type": "LoadImage",
"inputs": {
"image": "style_reference.png"
}
},
"2": {
"class_type": "PromptOptimizer",
"inputs": {
"user_prompt": "Разместить этот продукт в современном офисном интерьере",
"style": "photorealistic",
"api_key": "your_apiyi_key"
}
},
"3": {
"class_type": "NanoBananaProImageToImage",
"inputs": {
"prompt": ["2", 0],
"reference_image": ["1", 0],
"resolution": "2048x2048",
"api_key": "your_apiyi_key",
"base_url": "https://api.apiyi.com"
}
},
"4": {
"class_type": "SaveImage",
"inputs": {
"images": ["3", 0],
"filename_prefix": "nano_banana_i2i"
}
}
}
🚀 Быстрый старт: Рекомендуется использовать платформу API易 apiyi.com для быстрого знакомства с мощными возможностями Nano Banana Pro. Платформа предоставляет API-интерфейс, полностью совместимый с нативным форматом Google, поддерживает все функции: текст-в-изображение, изображение-в-изображение, множественный ввод изображений. Достаточно изменить всего 2 параметра (
base_urlиapi_key) для переключения, снижение затрат на 80%.
Реализация продвинутых функций
Узел массовой генерации
Функционал: Одновременная генерация множества изображений с разными промптами
class NanoBananaProBatchGenerate:
"""Узел массовой генерации"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"prompts": ("STRING", {
"multiline": True,
"default": "prompt1\nprompt2\nprompt3"
}),
"resolution": (["1024x1024", "2048x2048"],),
"api_key": ("STRING",),
}
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "batch_generate"
CATEGORY = "Nano Banana Pro/Advanced"
OUTPUT_IS_LIST = (True,)
def batch_generate(self, prompts, resolution, api_key):
"""Массовая генерация изображений"""
prompt_list = [p.strip() for p in prompts.split('\n') if p.strip()]
results = []
for idx, prompt in enumerate(prompt_list):
print(f"[{idx+1}/{len(prompt_list)}] Генерация: {prompt[:50]}...")
url = "https://api.apiyi.com/v1/images/generations"
headers = {"Authorization": f"Bearer {api_key}"}
payload = {
"model": "gemini-3-pro-image-preview",
"prompt": prompt,
"resolution": resolution,
"num_images": 1
}
response = requests.post(url, headers=headers, json=payload, timeout=60)
image_url = response.json()['data'][0]['url']
img_response = requests.get(image_url, timeout=30)
image = Image.open(BytesIO(img_response.content)).convert("RGB")
image_np = np.array(image).astype(np.float32) / 255.0
image_tensor = torch.from_numpy(image_np)[None,]
results.append(image_tensor)
return (results,)
Пример использования:
# Массовая генерация изображений продуктов
prompts = """
Professional photo of red apple, white background
Professional photo of green apple, white background
Professional photo of yellow banana, white background
"""
# Стоимость: 3 изобр. × $0.05 = $0.15
# Время: 3 × 6 сек = 18 сек
Обработка ошибок и механизм повторных попыток
import time
from functools import wraps
def retry_on_failure(max_retries=3, delay=2):
"""Декоратор для повторных попыток API-вызовов"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
for attempt in range(max_retries):
try:
return func(*args, **kwargs)
except requests.exceptions.RequestException as e:
if attempt == max_retries - 1:
raise Exception(f"API-вызов не удался (выполнено {max_retries} попыток): {e}")
print(f"Попытка {attempt + 1} не удалась, повтор через {delay} сек...")
time.sleep(delay)
return wrapper
return decorator
class NanoBananaProReliable:
"""Надежный узел с повторными попытками и обработкой ошибок"""
@retry_on_failure(max_retries=3, delay=2)
def generate_with_retry(self, prompt, resolution, api_key):
"""Надежная генерация изображений"""
# Исходная логика генерации
pass
Оптимизация механизма кэширования
import hashlib
import os
class NanoBananaProCached:
"""Узел с кэшированием, избегает повторной генерации"""
def __init__(self):
self.cache_dir = "ComfyUI/cache/nano_banana"
os.makedirs(self.cache_dir, exist_ok=True)
def get_cache_key(self, prompt, resolution):
"""Генерация ключа кэша"""
content = f"{prompt}_{resolution}"
return hashlib.md5(content.encode()).hexdigest()
def generate(self, prompt, resolution, api_key):
"""Генерация с кэшированием"""
cache_key = self.get_cache_key(prompt, resolution)
cache_path = os.path.join(self.cache_dir, f"{cache_key}.png")
# Проверка кэша
if os.path.exists(cache_path):
print(f"✅ Использование кэша: {cache_key}")
image = Image.open(cache_path)
image_np = np.array(image).astype(np.float32) / 255.0
return (torch.from_numpy(image_np)[None,],)
# Генерация нового изображения
print(f"🔄 Генерация нового изображения: {cache_key}")
image_tensor = self.call_api(prompt, resolution, api_key)
# Сохранение в кэш
image_np = (image_tensor[0].cpu().numpy() * 255).astype(np.uint8)
Image.fromarray(image_np).save(cache_path)
return (image_tensor,)
Оптимизация затрат и сравнение лучших практик
<text x="325" y="110" font-family="Arial, sans-serif" font-size="18" font-weight="bold" fill="#3b82f6" text-anchor="middle">
Сравнительный анализ затрат (генерация 1000 изображений)
</text>
<!-- Y-axis labels -->
<text x="90" y="160" font-family="Arial, sans-serif" font-size="10" fill="#94a3b8">
$300
</text>
<line x1="110" y1="155" x2="560" y2="155" stroke="#334155" stroke-width="1" stroke-dasharray="4,4"/>
<text x="90" y="230" font-family="Arial, sans-serif" font-size="10" fill="#94a3b8">
$200
</text>
<line x1="110" y1="225" x2="560" y2="225" stroke="#334155" stroke-width="1" stroke-dasharray="4,4"/>
<text x="90" y="300" font-family="Arial, sans-serif" font-size="10" fill="#94a3b8">
$100
</text>
<line x1="110" y1="295" x2="560" y2="295" stroke="#334155" stroke-width="1" stroke-dasharray="4,4"/>
<text x="90" y="370" font-family="Arial, sans-serif" font-size="10" fill="#94a3b8">
$50
</text>
<line x1="110" y1="365" x2="560" y2="365" stroke="#334155" stroke-width="1" stroke-dasharray="4,4"/>
<text x="90" y="440" font-family="Arial, sans-serif" font-size="10" fill="#94a3b8">
$0
</text>
<line x1="110" y1="435" x2="560" y2="435" stroke="#e2e8f0" stroke-width="2"/>
<!-- Bar 1: Google Official -->
<rect x="140" y="190" width="110" height="245" rx="4" fill="#ef4444" opacity="0.7"/>
<text x="195" y="175" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#ef4444" text-anchor="middle">
$250
</text>
<text x="195" y="455" font-family="Arial, sans-serif" font-size="11" fill="#e2e8f0" text-anchor="middle">
Google официальный
</text>
<text x="195" y="471" font-family="Arial, sans-serif" font-size="9" fill="#94a3b8" text-anchor="middle">
$0.25/изобр.
</text>
<text x="195" y="485" font-family="Arial, sans-serif" font-size="8" fill="#94a3b8" text-anchor="middle">
1K: $0.15 | 2K: $0.25
</text>
<text x="195" y="497" font-family="Arial, sans-serif" font-size="8" fill="#94a3b8" text-anchor="middle">
4K: $0.45
</text>
<!-- Bar 2: APIYI Platform -->
<rect x="280" y="365" width="110" height="70" rx="4" fill="#10b981" opacity="0.7"/>
<text x="335" y="350" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#10b981" text-anchor="middle">
$50
</text>
<text x="335" y="335" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#f59e0b" text-anchor="middle">
Экономия 80%
</text>
<text x="335" y="455" font-family="Arial, sans-serif" font-size="11" fill="#e2e8f0" text-anchor="middle">
Платформа API易
</text>
<text x="335" y="471" font-family="Arial, sans-serif" font-size="9" fill="#10b981" text-anchor="middle">
$0.05/изобр.
</text>
<text x="335" y="485" font-family="Arial, sans-serif" font-size="8" fill="#94a3b8" text-anchor="middle">
Единая цена
</text>
<text x="335" y="497" font-family="Arial, sans-serif" font-size="8" fill="#10b981" text-anchor="middle">
1K/2K/4K одинаково
</text>
<!-- Bar 3: Local Deployment -->
<rect x="420" y="407" width="110" height="28" rx="4" fill="#8b5cf6" opacity="0.7"/>
<text x="475" y="392" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#8b5cf6" text-anchor="middle">
$10
</text>
<text x="475" y="377" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#f59e0b" text-anchor="middle">
Экономия 96%
</text>
<text x="475" y="455" font-family="Arial, sans-serif" font-size="11" fill="#e2e8f0" text-anchor="middle">
Локальный SD
</text>
<text x="475" y="471" font-family="Arial, sans-serif" font-size="9" fill="#8b5cf6" text-anchor="middle">
$0.01/изобр. (электричество)
</text>
<text x="475" y="485" font-family="Arial, sans-serif" font-size="8" fill="#94a3b8" text-anchor="middle">
Требуется GPU
</text>
<text x="475" y="497" font-family="Arial, sans-serif" font-size="8" fill="#94a3b8" text-anchor="middle">
+ затраты на обслуживание
</text>
<!-- Cost Breakdown Legend -->
<rect x="70" y="520" width="510" height="30" rx="4" fill="#0f172a" opacity="0.8"/>
<text x="80" y="538" font-family="Arial, sans-serif" font-size="10" fill="#e2e8f0">
💡 Рекомендация: месячная генерация <5000 → API易 | >10000 → локальное развертывание | корпоративный → официальный
</text>
<text x="890" y="110" font-family="Arial, sans-serif" font-size="18" font-weight="bold" fill="#10b981" text-anchor="middle">
Чек-лист лучших практик
</text>
<!-- Development Phase -->
<rect x="650" y="130" width="480" height="110" rx="6" fill="#3b82f6" opacity="0.15"/>
<text x="660" y="150" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#3b82f6">
📝 Этап разработки
</text>
<text x="670" y="172" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Используйте переменные окружения для API Key, не жестко кодируйте
</text>
<text x="670" y="190" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Реализуйте обработку ошибок и механизм повторов (максимум 3 попытки)
</text>
<text x="670" y="208" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Добавьте логирование для удобства отладки и мониторинга
</text>
<text x="670" y="226" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Используйте кэш для предотвращения повторной генерации идентичного контента
</text>
<!-- Production Phase -->
<rect x="650" y="255" width="480" height="110" rx="6" fill="#10b981" opacity="0.15"/>
<text x="660" y="275" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#10b981">
🚀 Продакшн-среда
</text>
<text x="670" y="297" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Установите ограничения частоты API-вызовов (избегайте превышения лимитов)
</text>
<text x="670" y="315" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Мониторьте затраты на API и объем использования
</text>
<text x="670" y="333" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Регулярно очищайте кэш-файлы (предотвращение занятия хранилища)
</text>
<text x="670" y="351" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Используйте асинхронный параллелизм для повышения эффективности массовой генерации (7.5×)
</text>
<!-- Cost Control -->
<rect x="650" y="380" width="480" height="110" rx="6" fill="#f59e0b" opacity="0.15"/>
<text x="660" y="400" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#f59e0b">
💰 Контроль затрат
</text>
<text x="670" y="422" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Используйте разрешение 1024x1024 для разработки и тестирования
</text>
<text x="670" y="440" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Выбирайте разрешение по необходимости в продакшене
</text>
<text x="670" y="458" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Включите механизм кэширования, повторный контент не вызывается повторно
</text>
<text x="670" y="476" font-family="Arial, sans-serif" font-size="10" fill="#cbd5e1">
✓ Используйте параллелизм для массовых задач, снижайте общее время
</text>
<!-- Quick Tip -->
<rect x="650" y="505" width="480" height="45" rx="6" fill="#1e293b" stroke="#3b82f6" stroke-width="1.5"/>
<text x="660" y="525" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#3b82f6">
💡 Быстрое переключение на платформу API易:
</text>
<text x="660" y="542" font-family="Arial, sans-serif" font-size="10" fill="#10b981">
Измените всего 2 параметра (base_url + api_key) | Миграция за 5 минут | Экономия 80% затрат
</text>
<text x="600" y="600" font-family="
Оптимизация затрат и лучшие практики
Сравнительный анализ стоимости
| Решение | Стоимость за изображение | Стоимость 1000 изображений | Преимущества | Сценарии применения |
|---|---|---|---|---|
| Официальный API Google | $0.25 | $250 | Официальная поддержка, высокая стабильность | Корпоративные приложения, достаточный бюджет |
| Платформа API易 | $0.05 | $50 | 80% экономии затрат, совместимость с нативным форматом | Средние и малые команды, индивидуальные разработчики |
| Локальное развертывание Stable Diffusion | Электроэнергия ~$0.01 | $10 | Минимальная стоимость, полный контроль | Технические команды, крупные объемы |
Расчет ROI (возврата инвестиций):
При генерации 5,000 изображений в месяц:
- Google официально: $1,250/месяц
- Платформа API易: $250/месяц
- Месячная экономия: $1,000
- Годовая экономия: $12,000
Для средних и малых команд при переходе на платформу API易:
- Затраты на разработку: 1 час (изменение только 2 параметров)
- Экономия в первый месяц: $1,000
- ROI за первый месяц: 1000× (при почасовой ставке разработчика $50)
Стратегии оптимизации производительности
1. Асинхронная пакетная обработка
import asyncio
import aiohttp
class NanoBananaProAsync:
"""Асинхронный узел для пакетной генерации"""
async def generate_one(self, session, prompt, resolution, api_key):
"""Асинхронная генерация одного изображения"""
url = "https://api.apiyi.com/v1/images/generations"
headers = {"Authorization": f"Bearer {api_key}"}
payload = {
"model": "gemini-3-pro-image-preview",
"prompt": prompt,
"resolution": resolution
}
async with session.post(url, headers=headers, json=payload) as response:
data = await response.json()
return data['data'][0]['url']
async def batch_generate_async(self, prompts, resolution, api_key):
"""Параллельная генерация нескольких изображений"""
async with aiohttp.ClientSession() as session:
tasks = [
self.generate_one(session, prompt, resolution, api_key)
for prompt in prompts
]
image_urls = await asyncio.gather(*tasks)
return image_urls
# Сравнение производительности:
# Последовательная генерация 10 изображений: 10 × 6 секунд = 60 секунд
# Параллельная генерация 10 изображений: max(6 секунд) ≈ 8 секунд
# Прирост производительности: 7.5×
2. Стратегия выбора разрешения
def choose_resolution(use_case):
"""Выбор оптимального разрешения по сценарию использования"""
resolution_map = {
"социальные медиа": "1024x1024", # Стоимость: $0.05, время генерации: 4с
"баннер сайта": "2048x2048", # Стоимость: $0.05, время генерации: 6с
"печатные материалы": "4096x4096", # Стоимость: $0.05, время генерации: 12с
"быстрый прототип": "1024x1024", # Приоритет - скорость
}
return resolution_map.get(use_case, "2048x2048")
# Преимущество платформы API易: единая цена $0.05 для всех разрешений
# Официальный API: 1K $0.15, 2K $0.25, 4K $0.45
3. Переиспользование шаблонов промптов
PROMPT_TEMPLATES = {
"предметная съемка": "Professional product photography of {product}, studio lighting, white seamless background, Canon EOS R5, 100mm macro lens, f/8, commercial style, high detail",
"портрет": "Portrait photograph of {subject}, {lighting} lighting, 85mm lens, f/1.8, shallow depth of field, {mood} atmosphere, professional headshot",
"сценическая иллюстрация": "Digital illustration of {scene}, {art_style} art style, vibrant colors, detailed composition, {mood} atmosphere, trending on artstation, high resolution"
}
def generate_prompt(template_name, **kwargs):
"""Генерация промпта с использованием шаблона"""
template = PROMPT_TEMPLATES[template_name]
return template.format(**kwargs)
# Пример использования
prompt = generate_prompt(
"предметная съемка",
product="sleek smartphone with holographic display"
)
Чек-лист лучших практик
Этап разработки:
- ✅ Использование переменных окружения для управления API Key, без жесткого кодирования
- ✅ Реализация обработки ошибок и механизма повторных попыток (максимум 3)
- ✅ Добавление логирования для удобной отладки и мониторинга
- ✅ Использование кэширования для предотвращения повторной генерации идентичного контента
- ✅ Валидация параметров для предотвращения бесполезных запросов и потерь средств
Производственная среда:
- ✅ Настройка ограничения частоты вызовов API (предотвращение перерасхода)
- ✅ Мониторинг затрат и использования API
- ✅ Регулярная очистка файлов кэша (предотвращение занятия хранилища)
- ✅ Использование асинхронного параллелизма для повышения эффективности пакетной генерации
- ✅ Выбор подходящего разрешения в зависимости от сценария использования
Контроль затрат:
- ✅ Разработка и тестирование с разрешением 1024×1024
- ✅ В производственной среде выбор разрешения по необходимости
- ✅ Включение механизма кэширования, повторный контент не требует повторного вызова
- ✅ Для пакетных задач использование параллелизма для снижения общих временных затрат
- ✅ Регулярная проверка отчетов об использовании API, оптимизация стратегии вызовов
💰 Оптимизация затрат: Для проектов, чувствительных к бюджету, рекомендуется использовать платформу API易 apiyi.com. Платформа предлагает единую цену $0.05/изображение для всех разрешений, что обеспечивает экономию 80% по сравнению с официальным API Google, полную совместимость с нативным форматом, не требует изменения логики кода, миграция занимает всего 5 минут.
Устранение неполадок и частые вопросы
Проблема 1: Узел не загружается
Симптомы: После запуска ComfyUI пользовательский узел не отображается в списке узлов
Шаги диагностики:
# 1. Проверка структуры каталогов
ls -la ComfyUI/custom_nodes/nano_banana_pro/
# Должно содержать: __init__.py, nano_banana_node.py
# 2. Проверка синтаксических ошибок Python
cd ComfyUI/custom_nodes/nano_banana_pro
python -m py_compile nano_banana_node.py
# 3. Просмотр логов ComfyUI
# При запуске обратите внимание на вывод консоли
# Ищите сообщения типа "Loading custom nodes..."
# 4. Тестирование ручного импорта
python
>>> from custom_nodes.nano_banana_pro import NODE_CLASS_MAPPINGS
>>> print(NODE_CLASS_MAPPINGS.keys())
Решение:
- Убедитесь, что
__init__.pyкорректно экспортируетNODE_CLASS_MAPPINGS - Проверьте правильность написания имени класса
- Подтвердите совместимость версии Python (требуется 3.8+)
Проблема 2: Таймаут вызова API
Симптомы: Узел долго ожидает выполнения, в конце выдает ошибку "timeout"
Шаги диагностики:
# Тестирование сетевого подключения
import requests
response = requests.get("https://api.apiyi.com/v1/models", timeout=10)
print(f"Код состояния: {response.status_code}")
# Тестирование действительности API Key
response = requests.post(
"https://api.apiyi.com/v1/images/generations",
headers={"Authorization": f"Bearer {your_key}"},
json={
"model": "gemini-3-pro-image-preview",
"prompt": "test",
"resolution": "1024x1024"
},
timeout=30
)
print(response.json())
Решение:
- Увеличьте время ожидания:
timeout=90(для изображений 4K требуется больше времени) - Проверьте настройки сетевого прокси
- Убедитесь, что API Key корректен и на счету есть средства
- Проверьте, не блокирует ли брандмауэр HTTPS-запросы
Проблема 3: Несовместимость формата изображения
Симптомы: Сгенерированное изображение не отображается корректно в ComfyUI или не передается в нижестоящие узлы
Причина: ComfyUI использует специфический формат Tensor
Правильный метод преобразования:
# ❌ Неправильный метод
image_tensor = torch.tensor(np.array(image)) # Отсутствуют размерности и нормализация
# ✅ Правильный метод
image = image.convert("RGB") # Обеспечение формата RGB
image_np = np.array(image).astype(np.float32) / 255.0 # Нормализация к [0, 1]
image_tensor = torch.from_numpy(image_np)[None,] # Добавление размерности batch [1, H, W, C]
# Проверка формата
assert image_tensor.shape[-1] == 3 # 3 канала RGB
assert 0 <= image_tensor.min() and image_tensor.max() <= 1 # Диапазон [0, 1]
assert len(image_tensor.shape) == 4 # [batch, height, width, channels]
Проблема 4: Переполнение памяти (OOM)
Симптомы: При генерации изображений большого размера или пакетной генерации ComfyUI аварийно завершается или выдает ошибку "Out of Memory"
Решение:
# 1. Пакетная обработка больших задач
def batch_generate_safe(prompts, batch_size=5):
"""Безопасная пакетная генерация"""
results = []
for i in range(0, len(prompts), batch_size):
batch = prompts[i:i+batch_size]
batch_results = generate_batch(batch)
results.extend(batch_results)
# Очистка кэша
import gc
gc.collect()
torch.cuda.empty_cache()
return results
# 2. Снижение разрешения
# 4096x4096 → 2048x2048 (использование памяти сокращается на 75%)
# 3. Использование режима CPU (если нет GPU)
# Добавьте параметр device в узел
image_tensor = torch.from_numpy(image_np).cpu()[None,]
Проблема 5: Неудовлетворительное качество генерации
Симптомы: Сгенерированное изображение размыто, отсутствуют детали или не соответствует ожиданиям
Стратегии оптимизации:
# 1. Использование узла оптимизации промптов
# Преобразование простого описания в профессиональный промпт
# 2. Добавление деталей в промпт
# ❌ Простое: "кошка"
# ✅ Подробное: "Мягкий утренний солнечный свет проникает через полуоткрытые шторы, освещая рыжего короткошерстного кота золотистого окраса. Кот лениво свернулся на бежевой подушке на подоконнике, янтарные глаза полуприкрыты, хвост небрежно свисает с края подоконника. Объектив 85mm, диафрагма f/1.8, эффект малой глубины резкости"
# 3. Использование референсного изображения (режим image-to-image)
# Загрузите референсное изображение высокого качества для управления стилем и композицией
# 4. Настройка разрешения
# В некоторых сценариях 2048x2048 дает лучшие результаты, чем 4096x4096
Резюме и перспективы
Обзор ключевых моментов
В этой статье мы завершили полную практическую интеграцию Nano Banana Pro с ComfyUI:
1. Настройка окружения:
- ✅ Установка ComfyUI (Desktop или из исходников)
- ✅ Настройка Python окружения и зависимостей
- ✅ Получение API Key на платформе APIYI
2. Разработка узлов:
- ✅ Реализация базового узла генерации изображений из текста (30 строк основного кода)
- ✅ Реализация узла оптимизации промптов (интеллектуальное улучшение)
- ✅ Реализация узла генерации изображения из изображения (мультиизображение-референс)
- ✅ Реализация узла пакетной генерации (эффективное производство)
3. Построение рабочих процессов:
- ✅ Рабочий процесс генерации из текста без настройки
- ✅ Рабочий процесс с интеллектуальной оптимизацией
- ✅ Профессиональный рабочий процесс переноса стиля
4. Оптимизация затрат:
- ✅ Экономия 80% затрат с использованием платформы APIYI
- ✅ Повышение эффективности в 7.5× за счет асинхронной параллельности
- ✅ Механизм кэширования для предотвращения повторной генерации
Резюме технических преимуществ
| Показатель | Официальный API Google | Платформа APIYI | Улучшение |
|---|---|---|---|
| Стоимость за изображение | $0.25 | $0.05 | -80% |
| Сложность интеграции | Средняя | Минимальная (изменение 2 параметров) | -90% |
| Ценообразование по разрешению | Уровневое (1K/2K/4K) | Единая цена | Упрощение 100% |
| Совместимость | Нативный формат Google | Полная совместимость | Бесшовное переключение |
| Поддержка документации | Официальная документация на английском | Китайский + примеры кода | Эффективность обучения +50% |
Будущие технологические тенденции
1. Расширение экосистемы ComfyUI:
- Нативная интеграция большего числа AI моделей (GPT-Image-1, DALL-E 4)
- Улучшение возможностей визуального программирования
- Облачная платформа для совместной работы и обмена рабочими процессами
2. Эволюция Nano Banana Pro:
- Повышение производительности модели Gemini 4
- Поддержка генерации видео в реальном времени
- Более точный контроль стиля
3. Инновации платформы APIYI:
- Унифицированный интерфейс вызова мультимодельных систем
- Интеллектуальные рекомендации по оптимизации затрат
- Маркетплейс рабочих процессов и библиотека шаблонов
Начните использовать прямо сейчас
Шаги быстрого старта:
-
Зарегистрируйте аккаунт на платформе APIYI (3 минуты)
- Посетите apiyi.com
- Создайте аккаунт и получите $5 бесплатного кредита
- Сгенерируйте API Key
-
Загрузите ComfyUI Desktop (5 минут)
- Посетите comfy.org для загрузки установочного пакета
- Установка в один клик, без необходимости настройки окружения
-
Установите пользовательские узлы (2 минуты)
- Скопируйте код узлов, предоставленный в этой статье
- Поместите в директорию
custom_nodes/nano_banana_pro/ - Перезапустите ComfyUI
-
Загрузите примеры рабочих процессов (1 минута)
- Импортируйте JSON рабочие процессы, предоставленные в этой статье
- Заполните API Key
- Нажмите Queue Prompt для генерации изображений
Общее время: 11 минут для завершения всего процесса от нуля до генерации первого изображения!
🚀 Попробуйте прямо сейчас: Посетите платформу API易 apiyi.com, получите бесплатный тестовый кредит $5 и испытайте мощные функции Nano Banana Pro в ComfyUI. Платформа предоставляет полные примеры кода и шаблоны рабочих процессов, начните работу за 5 минут и откройте эффективное путешествие в мир AI-генерации изображений.
Связанные ресурсы:
- Официальный сайт ComfyUI: comfy.org
- Платформа API易: apiyi.com
- Репозиторий примеров кода из этой статьи: github.com/apiyi/comfyui-nano-banana
- Сообщество ComfyUI: reddit.com/r/comfyui
