AI-дизайнер как цифровой сотрудник
AI-дизайнер автоматизирует создание визуального контента: баннеры, обложки, иллюстрации к статьям, посты для соцсетей, рекламные макеты. Производительность: 50–500 изображений в день против 5–20 у человека.
Стек инструментов
| Задача | Инструмент | API |
|---|---|---|
| Иллюстрации, концепт-арт | Stable Diffusion SDXL | ComfyUI API |
| Фотореалистичные баннеры | FLUX.1 Dev | Replicate API |
| Брендированные изображения | DALL-E 3 | OpenAI API |
| Редактирование фото | SD Inpainting | ComfyUI API |
| Векторные иконки | Midjourney + vectorization | REST |
Автоматизация через ComfyUI API
import httpx
import json
import uuid
class AIDesignerAgent:
def __init__(self, comfyui_url: str = "http://localhost:8188"):
self.base_url = comfyui_url
async def generate_banner(
self,
prompt: str,
brand_colors: list[str],
width: int = 1200,
height: int = 628, # OG-image размер
style: str = "modern corporate"
) -> bytes:
workflow = self.build_sdxl_workflow(
prompt=f"{prompt}, {style}, brand colors {' '.join(brand_colors)}, professional design",
negative_prompt="low quality, blurry, text errors, watermark",
width=width,
height=height
)
client_id = str(uuid.uuid4())
async with httpx.AsyncClient() as client:
response = await client.post(
f"{self.base_url}/prompt",
json={"prompt": workflow, "client_id": client_id}
)
prompt_id = response.json()["prompt_id"]
return await self.wait_for_result(client_id, prompt_id)
def build_sdxl_workflow(self, prompt: str, negative_prompt: str, width: int, height: int) -> dict:
return {
"4": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "sd_xl_base_1.0.safetensors"}},
"6": {"class_type": "CLIPTextEncode", "inputs": {"text": prompt, "clip": ["4", 1]}},
"7": {"class_type": "CLIPTextEncode", "inputs": {"text": negative_prompt, "clip": ["4", 1]}},
"5": {"class_type": "EmptyLatentImage", "inputs": {"width": width, "height": height, "batch_size": 1}},
"3": {"class_type": "KSampler", "inputs": {
"model": ["4", 0], "positive": ["6", 0], "negative": ["7", 0],
"latent_image": ["5", 0], "seed": 42, "steps": 30, "cfg": 7.5,
"sampler_name": "euler", "scheduler": "normal", "denoise": 1.0
}},
"8": {"class_type": "VAEDecode", "inputs": {"samples": ["3", 0], "vae": ["4", 2]}},
"9": {"class_type": "SaveImage", "inputs": {"images": ["8", 0], "filename_prefix": "banner"}}
}
Брендированная генерация (LoRA)
async def generate_with_brand_lora(
prompt: str,
lora_path: str, # обученная LoRA на брендовых изображениях
lora_strength: float = 0.8
) -> bytes:
"""Генерация в стиле конкретного бренда через LoRA"""
workflow = self.build_lora_workflow(prompt, lora_path, lora_strength)
return await self.run_workflow(workflow)
Обучение LoRA для бренда: 20–50 изображений в фирменном стиле, 500–2000 шагов, 30–60 минут на GPU.
Массовая генерация для e-commerce
async def generate_product_images(
products: list[dict],
background_style: str = "white studio"
) -> list[dict]:
"""Генерируем изображения для каталога товаров"""
results = []
for product in products:
prompt = f"{product['name']}, {product['category']}, {background_style}, commercial photography style"
image = await self.generate_banner(
prompt=prompt,
brand_colors=[],
width=800,
height=800
)
results.append({
"product_id": product["id"],
"image": image,
"prompt_used": prompt
})
return results
Пост-обработка
from PIL import Image
import io
def add_brand_overlay(
image_bytes: bytes,
logo_path: str,
watermark_text: str = None
) -> bytes:
img = Image.open(io.BytesIO(image_bytes)).convert("RGBA")
logo = Image.open(logo_path).convert("RGBA")
# Масштабируем логотип до 15% ширины изображения
logo_width = img.width // 7
logo_height = int(logo.height * (logo_width / logo.width))
logo = logo.resize((logo_width, logo_height), Image.LANCZOS)
# Размещаем в нижнем правом углу
position = (img.width - logo_width - 20, img.height - logo_height - 20)
img.paste(logo, position, logo)
output = io.BytesIO()
img.save(output, format="PNG")
return output.getvalue()
Сроки: настройка AI-дизайнера с базовыми форматами (баннеры, посты) — 1–2 недели. Обучение LoRA на бренд + интеграция с CMS — дополнительно 1–2 недели.







