2026-05-31 · ai-targetolog · deep dive #2

Creative Pipeline: 6 углублений по выделенным блокам

Расширение первого ресёрча на темы, которые Тимур отметил как важные: JSON-prompting как система, Performance Scoring без миллионов данных, что внутри Brand QA Pass, контр-моат против AdCreative.ai, editable формат через Figma/Canva/Recraft и финальная развилка моделей.

01 · Архитектурный сдвиг

JSON-prompting не как формат, а как система

Главная ошибка вокруг JSON-prompting'а — думать что это просто «вместо предложения пишем словарь». На самом деле это spec-driven generation pipeline: пять связанных слоёв, где промпт — финальный артефакт, а не вход.

Жаргон: JSON — машинно-читаемый формат данных (как Excel-таблица, но в текстовом виде с парами «ключ: значение»). Spec-driven — подход когда мы сначала описываем «что должно получиться» структурой, потом движок исполняет.

Зачем вообще переходить с free-form промпта на JSON?

Free-form: «сгенерируй красивый баннер кофе на тёмном фоне с тёплым освещением и крупным заголовком "−30% сегодня"».

JSON-spec: разложить это на 8 типизированных полей, каждое — отдельная ручка.

БенефитЧто даёт практически
ВоспроизводимостьТот же spec → близкий к идентичному креатив. Клиент захотел «как тот вариант, но другой текст» — меняем 1 поле.
A/B вариантыВместо реролла («сгенерируй ещё раз») — мутируем 1 ключ. 12 вариантов «hook position: top → center → bottom» собираются автоматом.
КэшированиеХэш JSON-spec'а → cache-hit. На повторных задачах ничего не генерим заново.
Аудит до генерацииLLM-судья проверяет spec на брифовое соответствие до того как мы потратим $0.135 на Nano Banana.
КомпозицияReusable блоки: «brand_block для клиента X» + «niche_block для ниши Y» + «format_block 9:16» → собирается готовый spec.

Пять слоёв системы

Это и есть «не просто JSON, а система которая формирует JSON на основе вводных данных» — то, на что Тимур указал.

┌──────────────────────────────────────────────────────────┐ │ СЛОЙ 1 · INPUTS (что мы знаем о задаче) │ │ │ │ • Brief Intake Wizard ──► CreativeBrief (Pydantic) │ │ • Brand Ingestion ──────► BrandKit (palette/voice/font) │ │ • Niche Library ────────► NicheProps (фиксы по нише) │ │ • Format Spec ──────────► Size / Aspect / Platform │ └────────────────────────┬─────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────┐ │ СЛОЙ 2 · SPEC AGENTS (LLM собирает spec по слотам) │ │ │ │ • Concept agent → 5 направлений по brief × brand │ │ • Layout agent → раскладка элементов в формат │ │ • Color agent → palette из brand + mood │ │ • Hook agent → 3-5 hook вариантов из offer │ │ • Composer → склеивает в CreativeSpec[] │ └────────────────────────┬─────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────┐ │ СЛОЙ 3 · COMPILER (spec → prompt под конкретную модель) │ │ │ │ • render_nano_banana(spec) → prompt+seed │ │ • render_gpt_image(spec) → prompt+style │ │ • render_recraft(spec) → vector instructions │ └────────────────────────┬─────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────┐ │ СЛОЙ 4 · GENERATOR (вызов модели) │ │ │ │ • Higgsfield MCP (primary) — Nano Banana Pro │ │ • OpenAI API — gpt-image-2 │ │ • Picsart MCP — fallback / vector │ └────────────────────────┬─────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────┐ │ СЛОЙ 5 · VARIANT ENGINE (мутация для A/B) │ │ │ │ mutate(spec, "hook.position", "center") → spec' │ │ mutate(spec, "color.accent", "#F59E0B") → spec'' │ │ → автогенерация N вариантов из 1 baseline │ └──────────────────────────────────────────────────────────┘

Пример CreativeSpec

Так выглядит финальный объект, который рождается из слоёв 1-2 и идёт в компилятор:

{
  "meta": {
    "client": "dental_almaty_smile",
    "campaign": "summer_promo_2026",
    "format": "1:1",
    "size_px": [1080, 1080],
    "platform": "meta_ads_feed"
  },
  "composition": {
    "layout": "product_centered",
    "focal_point": "top_third",
    "subject_size_pct": 70,
    "grid": "asymmetric_3col"
  },
  "subject": {
    "type": "dental_service_demo",
    "props": ["clean_white_teeth", "calm_patient_smile"],
    "environment": "modern_clinic_soft_blur",
    "forbidden": ["dental_tools_visible", "blood", "surgery_imagery"]
  },
  "color": {
    "primary": "#0F4C81",
    "accent": "#7DD3FC",
    "background_mood": "warm_neutral",
    "palette_locked": true
  },
  "lighting": {
    "direction": "soft_top_left",
    "contrast": "medium",
    "mood": "clean_premium_clinical"
  },
  "hook": {
    "text": "Чистка зубов −40% до 30 июня",
    "position": "top_left",
    "weight": "bold_high",
    "style": "editorial_sans",
    "language": "ru"
  },
  "cta": {
    "text": "Записаться",
    "style": "button_pill_accent",
    "position": "bottom_right"
  },
  "brand": {
    "logo_zone": "bottom_left_80x80",
    "palette_enforce": true,
    "voice": "expert_warm_local"
  },
  "niche": {
    "id": "dental_clinic",
    "props_locked": ["smile", "clean_teeth", "modern_chair"]
  },
  "render": {
    "model": "nano_banana_pro",
    "seed": 42,
    "steps": 28,
    "guidance": 7.5
  }
}

Как этот JSON становится промптом

Слой 3 (компилятор) — это просто функция-renderer на Python. Берёт spec и собирает строку. Чтобы вы видели как это устроено:

# pseudo-Python (упрощённо)
def render_nano_banana(spec):
    prompt = (
        f"Photo-realistic {spec.subject.type} creative, "
        f"{spec.composition.layout} with {spec.composition.subject_size_pct}% subject, "
        f"{spec.lighting.direction} lighting, {spec.lighting.mood} mood. "
        f"Color palette: {spec.color.primary} primary, {spec.color.accent} accent, "
        f"{spec.color.background_mood} background. "
        f"Subject props: {', '.join(spec.subject.props)}. "
        f"Environment: {spec.subject.environment}. "
        f"AVOID: {', '.join(spec.subject.forbidden)}. "
        f"Render bold Russian text '{spec.hook.text}' in top-left, "
        f"{spec.hook.style} style, white color with subtle shadow. "
        f"CTA button '{spec.cta.text}' in {spec.cta.position}, "
        f"accent color pill shape. "
        f"Brand logo placeholder in {spec.brand.logo_zone}. "
        f"Format: square 1080x1080, marketing feed creative."
    )
    return prompt
Ключевая мысль Компилятор знает как разговаривать с конкретной моделью. У Nano Banana Pro формулировки одни, у gpt-image-2 другие. Spec — model-agnostic, prompt — model-specific. Это даёт нам свободу менять модели без переписывания вводных.

Variant engine — превращение 1 spec'а в 12 креативов

Это слой 5. Один baseline spec — много вариантов через mutation одного-двух полей. Пример A/B плана для одного клиента:

ВариантЧто меняетсяГипотеза
V1 (baseline)контроль
V2hook.position = "center"hook по центру сильнее на скролле
V3hook.text = "Запишитесь сегодня"action-led hook → CTR
V4color.accent = "#F59E0B"тёплый accent → внимание
V5composition.subject_size_pct = 50больше воздуха → premium feel
V6subject.environment = "soft_studio_white"чище → trust

Каждый вариант — это 1 mutation + 1 generation. Раньше это была ручная prompt-инженерия на каждый кейс. Теперь — функция.

Реализация — стек

  • Pydantic (Python) — типизированные схемы CreativeBrief / CreativeSpec / BrandKit / NicheProps
  • Claude tool_use — каждый «spec agent» (слой 2) вызывается с tool-schema → возвращает структурированный JSON
  • JSON Schema — валидация spec на каждом переходе слоя
  • Higgsfield MCP / OpenAI SDK — генерация (слой 4)
  • SQLite + spec hash — кэширование generated результатов
Эффект × 5 скорость генерации (нет ручной prompt engineering) · 80% reproducibility · × 3 объём вариантов с того же brief.
02 · Без 500 тысяч креативов

Performance Scoring loop — light version с нулевыми данными

Тимур правильно подметил: ждать 500-1000 креативов чтобы начать ML — это слишком медленно. Я перестроил подход в 4 уровня зрелости, где Level 0 запускается прямо сегодня с нулём собственных данных. ML появляется только на Level 3 — и не как обязательный этап.

Главный сдвиг мышления

Performance Scoring ≠ «обучить свою модель на данных». Performance Scoring = «иметь систему обратной связи, которая улучшает следующее поколение креативов». Это можно делать на разных носителях — LLM-судья, человеческий feedback log, simple regression. ML — не обязательная финальная форма.

4 уровня зрелости

Level 0 · LLM-as-Judge (0 креативов нужно)

Берём Vision LLM (Claude/Gemini) и просим оценить каждый креатив до публикации по rubric'у. Vision-модели уже обучены на миллиардах изображений — они знают что такое хороший рекламный креатив, без нашего датасета.

Rubric (5 категорий × 10 баллов = 50 max):

КатегорияЧто проверяем
Hook clarityЧитается ли первая строчка с дистанции 30 см (≈ 375px mobile viewport)? Нет ли двусмысленности?
Subject prominenceПродукт/сервис занимает 50-80% визуального веса? Не теряется ли в фоне?
Brand fitПалитра, шрифт, тон — соответствует brand kit клиента?
Copy strengthCTA понятен и действенен? Не воды?
Niche relevanceАтрибуты ниши уместны? Не «беспородный» креатив?

Логика автоматизации:

  • Score < 35/50 → auto-reject + regenerate (с adjusted spec на failed категорию)
  • Score 35-42/50 → human review (Тимур или менеджер)
  • Score > 42/50 → ship to client
Почему это работает с нулём данных Vision LLM уже видели 100M+ рекламных креативов в обучении. Они не знают что зайдёт у конкретного клиента, но знают что «лого закрывает половину продукта» — плохо, «hook в 14px шрифте» — плохо, «3 разных шрифта на одной картинке» — плохо. Это 80% базовых ошибок отлавливаются без датасета.

Level 1 · Client feedback loop (30-100 креативов)

Каждому ship'нутому креативу клиент ставит простую оценку и 1-2 строчки feedback'а:

  • 🟢 Зашёл / 🟡 Пойдёт / 🔴 Не то
  • Свободный комментарий («hook слабый», «лого не там», «стиль не наш»)

LLM-категоризатор (Claude) парсит свободный текст в фиксированные категории: hook_weak, logo_misplaced, style_off, color_wrong и т.д. Из этого собирается signal — что мутировать в следующий запуск.

Pattern detection: Claude раз в неделю смотрит лог feedback'а по клиенту/нише и пишет короткий отчёт типа:

Пример output'а LLM-аналитика:
«У клиента dental_almaty_smile за 12 креативов: 4× жалоба на hook (слишком формальный) → нужен переход на разговорный тон. 2× жалоба на колорит «слишком холодный» → добавить warm accent (#F59E0B вместо #7DD3FC). 1× ошибка ниши (показан стоматологический инструмент несмотря на forbidden) → ужесточить prompt guard.»

Это уже работает без ML, без датасета, без data science. Это просто structured feedback log + LLM-summarizer.

Level 2 · Stats + LLM analysis (100-300 креативов)

На этом этапе появляются реальные performance-метрики (CTR, CPL, CPM) — клиент видит, какие креативы дают результат. Лог становится богаче:

{
  "creative_id": "c_2026_05_31_001",
  "client": "dental_almaty_smile",
  "spec": { ...полный CreativeSpec... },
  "performance": {
    "impressions": 12450,
    "clicks": 198,
    "ctr": 1.59,
    "cpl": 450,
    "cpm": 920
  },
  "feedback_human": "green",
  "qa_score": 44
}

Раз в 2 недели Claude анализирует датасет и выдаёт инсайты типа: «креативы с composition.subject_size_pct > 65 + hook.position = top у клиентов сегмента dental имеют средний CTR 1.8 vs 1.1 у остальных». Это становится default для будущих spec'ов.

Никакого XGBoost не нужно. Просто SQL + Claude analyst.

Level 3 · Per-client ML (300+ креативов, опционально)

Только тут запускаем XGBoost/LightGBM. И — важно — per-client, не глобально:

  • Features: 15-20 категориальных переменных из CreativeSpec
  • Target: CTR / CPL / conversion_rate
  • Модель уникальная для каждого клиента (или сегмента ниш)

Это уже defensible моат — у каждого клиента «их персональный CTR predictor», который ни один конкурент не повторит.

Главное Level 0 (LLM-as-Judge) и Level 1 (feedback loop) можно запустить на следующей неделе с 0 датасета. Они дают 70% ценности от полноценного Performance Scoring. Level 2-3 — это amplification, не предусловие.
03 · Что внутри Brand QA Pass

Brand-aware QA Pass — 5 проверок параллельно

QA Pass — это «taste-фильтр», который автоматически проверяет каждый креатив до того как он попадёт клиенту. 5 независимых проверок, каждая со своим detection-методом и pass/fail логикой. Реализация ~600 строк Python, без хитрого ML.

Архитектурно

Input: rendered_image.png + CreativeSpec │ ┌────────────┬────────────┬──┴─────────┬────────────┬────────────┐ ▼ ▼ ▼ ▼ ▼ ┌───────┐ ┌────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐ │ Slot │ │ Logo │ │ Color │ │ Typo & │ │ Brand │ │integr.│ │ zone │ │adherence│ │legibility│ │voice/sem │ └───┬───┘ └────┬───┘ └────┬────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ └────────────┴────────────┴────────────┴────────────┘ ▼ Aggregated QA Report (JSON) │ ┌───────────┼───────────┐ ▼ ▼ ▼ 5/5 pass 3-4/5 ≤ 2/5 │ │ │ ▼ ▼ ▼ SHIP HUMAN REVIEW REGEN spec + Тимур auto-mutate

Check 1 · Slot integrity

Что проверяем: продукт занимает правильную долю кадра, hook в верхней трети, CTA в нижней, нет overlap'а с logo zone.

Detection:

  • BiRefNet или SAM-2 (Segment Anything Model 2) — выделяет mask продукта
  • Считаем mask_area / total_area → реальный % площади
  • Y-координата bounding box центра → в какой трети находится

Validation:

  • Продукт занимает 50-80% площади (если spec говорит 70% — допуск ±10pp)
  • Hook центр на Y < H/3 (верхняя треть)
  • CTA центр на Y > 2H/3 (нижняя треть)
  • Расстояние между subject mask и logo bbox ≥ 16px

Output: pass/fail + heatmap визуализация занятых зон.

Check 2 · Logo zone validation

Что проверяем: логотип клиента находится в правильной safe-зоне, не искажён, не пересекается с продуктом.

Detection:

  • ORB feature matching (OpenCV) против brand logo template из BrandKit
  • Или CLIP embedding similarity (более robust к небольшим визуальным вариациям)

Validation:

  • Логотип найден (match score > 0.85)
  • Bounding box внутри pre-defined safe zone (например bottom_left_80x80)
  • Аспект логотипа сохранён (ratio diff < 5%)
  • Нет overlap с subject mask

Output: pass/fail + bbox + match score.

Check 3 · Color adherence

Что проверяем: доминирующая палитра креатива близка к brand palette.

Жаргон: L*a*b* (или CIELAB) — цветовая модель, где расстояние между двумя цветами соответствует тому, как человек ВИДИТ разницу. RGB этого не умеет — два цвета могут быть близки в RGB, но визуально совершенно разные. Pantone, Adobe и все профессиональные системы matching'а работают через L*a*b*.

Detection:

  • colorthief — извлекает 5 доминирующих цветов изображения
  • Конвертим RGB → L*a*b* через colorsys или scikit-image
  • Для каждого dominant color: считаем delta-E (CIEDE2000) до ближайшего brand kit цвета

Validation:

  • Топ-3 dominant colors: delta-E < 15 (близко, незаметно глазу)
  • Топ-5 dominant colors: delta-E < 25 (заметно, но в пределах brand-семьи)
  • Background tone mood (warm/cold/neutral) соответствует spec

Output: pass/fail + delta-E на каждый dominant.

Check 4 · Typography legibility

Что проверяем: весь текст читается, контраст соответствует WCAG, кириллица не «съехала».

Detection:

  • Tesseract OCR (или EasyOCR — лучше под кириллицу) распознаёт все text fragments
  • Для каждого fragment: bounding box + текст + confidence
  • Sample фона под текстом → расчёт контраста

Validation:

  • Все text fragments распознаны с confidence > 0.7
  • Контраст text/background ≥ 4.5:1 (WCAG AA)
  • Не обрезано (padding к edges ≥ 16px)
  • Кириллические символы присутствуют в Unicode ranges U+0400-04FF, U+0500-052F
  • Распознанный текст близок к hook.text из spec (Levenshtein distance < 3)

Output: pass/fail + per-block scores + распознанный текст.

Check 5 · Brand voice / semantic coherence

Что проверяем: общий tone креатива соответствует описанию бренда в BrandKit.

Detection: Vision LLM (Claude Sonnet 4.6 или Gemini 2.5 Flash).

Prompt:

Это рекламный креатив для бренда. Описание бренда:
{brand_kit.voice}

Соответствует ли этот креатив описанию бренда по таким аспектам:
- общий тон (formal/casual, premium/mass, warm/cold)
- стилистическая консистентность
- эмоциональное впечатление

Оцени по шкале 0-10 и кратко обоснуй (2-3 строки).

Validation: score ≥ 6/10 → pass.

Output: score + текстовый reasoning.

Реализация — конкретно

  • Python пакет brand_qa/ с 5 файлами-чекерами
  • Async выполнение через asyncio (5 checks параллельно → ~3-5 сек total)
  • Configuration через тот же CreativeSpec — пороги вшиты в spec.qa_thresholds (опционально override)
  • Output: structured QA report (JSON) + visual overlay PDF (для дебага/клиента)
Эффект QA Pass × 5 reduction в количестве «провальных» креативов которые попадают к клиенту · × 2 уверенность в auto-ship режиме · база для Performance Scoring (QA scores коррелируют с CTR).
04 · Контр-моат против AdCreative.ai

Как нам быть без 450M ads? Другая категория продукта.

Тимур правильно сказал: «нам не нужна такая мощная система, нам нужен уверенный твёрдый среднячок, но самое важное — креативы должны передавать суть бизнеса, ниши и оффера, быть релевантными». Это и есть наша другая категория. Не «AI знает что работает в рекламе» — а «AI знает специфику вашего бизнеса».

Перепозиционирование

AdCreative.ai

Позиция: «AI знает что работает».

Моат: 450M ads + $34B spend → CTR predictor.

Output: «оптимизированный для performance» (но универсальный — не учитывает специфику бренда глубоко).

Цена: от $29/мес до $599/мес enterprise.

Мы (Performante / ai-targetolog)

Позиция: «AI знает ваш бренд».

Моат: Brand Ingestion + Niche Library + LLM-as-Judge — собственная картография бренда клиента.

Output: «релевантный сути бизнеса» (даже если CTR не самый высокий — это brand-safe).

Цена: 19 990-49 990 ₽/мес SaaS + agency tier (с поддержкой).

3 пилона нашей релевантности

Пилон 1 · Brand Ingestion (точка дифференциации)

AdCreative.ai не имеет глубокого brand fingerprint. Мы — имеем.

Что внутри:

  • Клиент даёт URL (сайт / Instagram / lookbook)
  • Firecrawl crawl'ит публичные страницы (hero / about / services)
  • Vision LLM (Gemini 2.5 Pro) анализирует визуальную айдентику
  • Output — BrandKit JSON:
    • palette (5 цветов с HEX + role)
    • typography (font family classification: serif / sans / display)
    • voice tone (warm/cool, formal/casual, premium/mass)
    • signature elements (паттерны, иллюстрации, специфические композиции)
    • logo placement preference
    • forbidden patterns (что в брендбуке делать нельзя)

Этот BrandKit — переиспользуется во ВСЕХ последующих креативах клиента. Один раз ingested — N креативов из него собираются.

Пилон 2 · Niche Library (наш data asset)

Не 450M ads, но 50-100 ниш с глубокой spec'ой. Это и есть наш реальный proprietary актив — собранный руками + AI на проверенных примерах.

Каждая ниша имеет:

  • props_locked — обязательные визуальные атрибуты («smile, clean teeth» для стомы)
  • props_forbidden — что точно не показывать (dental tools, blood для стомы)
  • environment_defaults — типичные окружения (modern clinic / cosy restaurant / open office)
  • voice_archetypes — варианты tone (expert authoritative / warm local / premium minimalist)
  • hook_templates — проверенные структуры заголовков по нише
  • palette_recommendations — нишевые цветовые семьи

Старт: 10-15 priority niches (stomatology, beauty, restaurants, B2B SaaS, e-commerce, fitness, real estate, education, healthcare, legal). За месяц можно покрыть.

Пилон 3 · LLM-as-Judge QA (нулевые данные)

Описан выше в Performance Scoring Level 0. Vision LLM проверяет каждый креатив на 5 категорий, отсекает мусор автоматически. Это даёт «уверенный среднячок» который Тимур озвучил как минимальное требование.

Что мы НЕ обещаем (важно для позиционировки)

  • Не обещаем «AI предскажет winner» (нет данных для этого)
  • Не обещаем «+30% CTR гарантированно» (это маркетинговая ложь у конкурентов)
  • Не обещаем «replaceable креатив-команду» (мы инструмент для команды)

Что обещаем

  • Релевантный сути бизнеса креатив (через Brand Ingestion + Niche Library)
  • Brand-safe вывод (через QA Pass)
  • 5x скорость от ручной prompt-инженерии
  • Структурированные A/B варианты на каждый baseline
  • Per-client персонализация по мере накопления данных
Главный вывод по моату Мы играем в другую категорию. «AI-Relevant Creative», а не «AI-Optimized for CTR». Это позволяет стартовать сегодня без датасета — потому что Brand Ingestion + Niche Library работают сразу же.
05 · Editable формат

Recraft vs Figma MCP vs Canva MCP — что подходит

Тимур упомянул «Canvas MCP» и идею что мы сначала генерим монолитную картинку, потом переводим в editable. Я раскладываю 4 рабочих варианта. Скорее всего речь была про Canva (платформа дизайна), у которой есть официальный Dev MCP с 2026.

Вариант A · Recraft V4 (vector-native generation)

Что: модель которая сразу генерит SVG/vector, не raster.

Pro: infinitely scalable, чистая editable геометрия, отличная типографика, low file size.

Con: photo-realism слабее Nano Banana, не подходит для «фотографий» продукта.

Цена: ~$0.05 / image.

Доступ: Picsart GenAI MCP включает Recraft V4 / Recraft Lite.

Лучше для: typographic posters, abstract illustrations, simple geometric compositions, logo marks.

Подходит для отдельного SKU (vector tier — не основной).

Вариант B · Raster → SVG conversion (trace)

Что: генерим raster через Nano Banana, конвертим в SVG через Vector Magic / Inkscape Trace / Adobe Illustrator.

Pro: используем любую raster модель.

Con: photo content плохо конвертится — получается «комикс-trace», уродливо.

Не подходит — теряем качество photo-realism, ради чего и берём Nano Banana.

Вариант C · Figma + Figma MCP (наш фаворит)

Что: генерим raster (high quality фон через Nano Banana / gpt-image-2) → импортим в Figma как layer → поверх кладём text / logo / CTA как Figma-объекты (vector + editable).

Pro:

  • Visual remains high-quality raster (no compromise)
  • Text / logo / colors редактируются в Figma за секунды
  • Команда дизайна (если есть у клиента) уже в Figma
  • Export в любой формат (PNG, JPG, PDF, SVG layers)

Con:

  • 2 платформы в pipeline — overhead
  • Figma подписка нужна (от $15/seat/мес — для нас, не клиента)

MCP: figma-developer-mcp (open source, активный) — даёт Claude API для Figma file manipulation.

Workflow:

CreativeSpec ──► Nano Banana Pro ──► raster background │ ▼ Figma file (через MCP) │ ┌───────────────────────────┼───────────────────────────┐ ▼ ▼ ▼ text layers logo placement CTA button (editable Figma type) (Figma component) (Figma component) │ ▼ Export PNG / PDF / шаблон под клиента

Лучший hybrid — high quality фон + editable structure.

Вариант D · Canva + Canva Dev MCP (для клиента)

Что: аналогично Figma подходу, но через Canva. Клиент дорабатывает сам — Canva массовая платформа для маркетологов.

Pro:

  • Клиент УЖЕ в Canva (большая часть маркетологов малого бизнеса)
  • Canva выпустила официальный Canva Dev MCP в 2026
  • Export напрямую в Meta Ads / Instagram

Con:

  • Vendor lock-in (Canva меняет API/цены)
  • Шаблонная эстетика — Canva тащит свой visual language
  • Ограниченная типографика (нет custom font upload без Pro)

Подходит как опция handover — клиент нажимает «Edit in Canva», доделывает сам. Не как основной pipeline.

Вариант E · JSON-spec composer (BannerAgency-style)

Что: backend Python renderer (Pillow / cairo / Skia) собирает картинку из layers по spec'у. Каждый layer (background_image, text_layer, logo_layer, cta_button) описан в JSON.

Pro:

  • Каждый layer редактируется через spec edit
  • Не нужна Figma/Canva подписка
  • Полный контроль через код

Con:

  • Background всё равно raster (нужно генерить через Nano Banana отдельно)
  • Много backend кода для качественной типографики, тени, эффекты
  • Reinventing the wheel — Figma это уже всё умеет

Дополнительный layer поверх Figma подхода — для batch автоматизации (генерим N вариантов программно без открытия Figma).

Финальная рекомендация — multi-tier подход

TierЧто используемДля чего
T1 · PrimaryNano Banana Pro + gpt-image-2Photo-real generation — raster, high quality
T2 · EditableFigma + figma-developer-mcpPost-edit (text/logo/colors как Figma objects поверх raster)
T3 · VectorRecraft V4 (через Picsart MCP)Специфические SKU где нужен чистый vector (logos, illustrations)
T4 · Client handoverCanva Dev MCPОпция «Открыть в Canva и доработать самостоятельно»
T5 · Batch composerPython (Pillow + cairo)Программная сборка N вариантов из spec без UI
Что протестировать первым Подключить figma-developer-mcp на тестовом проекте, прогнать 3-5 creative циклов: spec → raster → Figma import → text/logo layers → export. Если flow ergonomic — это становится T2 default. Если ergonomic слабый — пробуем Canva Dev MCP как альтернативу.
06 · Финальные модели

Nano Banana Pro + gpt-image-2 — router-логика

Решение Тимура: работаем с двумя моделями, Qwen Image 2.0 отбрасываем (нет ресурса на третью A/B-линию). Это упрощает архитектуру и фокусирует тестирование.

Профиль каждой модели

Nano Banana Pro (Vertex / gemini-3-pro-image)

Сила: ~100% cyrillic accuracy, photo-real product, soft tones, brand-friendly mood, отличный seed reproducibility.

Слабость: sharp editorial типографика слабее, дороже (~$0.135 / image).

Sweet spot: photo-real ads, premium feel, длинные cyrillic hook'и, brand-consistent series.

gpt-image-2 (OpenAI)

Сила: sharp contrast, bold editorial typography, дешевле (~$0.08-0.12), хорош для редакционного стиля.

Слабость: ~92% cyrillic (изредка ₸→Т паттерн), менее «soft» в фотореалистичности.

Sweet spot: editorial креативы, infographics, bold typography hero, cost-sensitive batch.

Router-логика — функция в Compiler

В CreativeSpec compiler (Слой 3 из секции 01) добавляется функция model_router(spec) → model_name:

def model_router(spec) -> str:
    # Правило 1: длинный cyrillic hook (> 25 символов) → Nano Banana
    if spec.hook.language == "ru" and len(spec.hook.text) > 25:
        return "nano_banana_pro"

    # Правило 2: editorial / bold typography → gpt-image-2
    if spec.hook.style in ["bold_modern", "editorial_sans", "display_heavy"]:
        return "gpt_image_2"

    # Правило 3: photo-real product (high subject %) → Nano Banana
    if spec.composition.subject_size_pct >= 65 and spec.subject.type != "abstract":
        return "nano_banana_pro"

    # Правило 4: cost-sensitive batch → gpt-image-2
    if spec.meta.get("batch_size", 1) > 20:
        return "gpt_image_2"

    # Default: Nano Banana Pro (более brand-safe)
    return "nano_banana_pro"

Эти правила — стартовые. По мере накопления feedback (Performance Scoring Level 1+) — router обучается на реальных данных.

Сравнительная таблица use cases

Use caseМодельПочему
Cyrillic-heavy hook (длинный)Nano Banana Pro~100% cyrillic accuracy
Photo-real product demoNano Banana ProSoft tones, natural
Sharp editorial postergpt-image-2Лучше bold typography
Infographic / dashboardgpt-image-2Точнее линии и data viz
Brand-consistent seriesNano Banana ProBetter seed reproducibility
Cost-sensitive batch (50+)gpt-image-2Дешевле per image
Premium / luxury feelNano Banana ProSoft cinematic mood
Quick draft / wireframegpt-image-2Быстрее, дешевле для итераций
Что протестировать 20 cyrillic-промптов из реальных брифов клиентов прогнать на обеих моделях, оценить (1) cyrillic accuracy через OCR, (2) brand consistency через Vision LLM судью, (3) photo-real quality через PSNR/LPIPS на референсе. По результатам уточнить router rules.
07 · Как всё соединяется

Финальная карта pipeline

Все блоки которые мы обсудили — это один pipeline. Вот как они сложены в порядке выполнения.

┌──────────────────────────────────────────────────────────────────┐ │ ВХОД │ │ Клиент даёт: URL сайта + бриф на кампанию (offer, ЦА, формат) │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 1 · BRAND INGESTION (1 раз на клиента) │ │ Firecrawl crawl → Gemini Vision analysis → BrandKit (JSON) │ │ Кэшируется. Переиспользуется на ВСЕ креативы клиента. │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 2 · BRIEF INTAKE WIZARD │ │ Pydantic schema CreativeBrief + Claude tool_use диалог │ │ Output: validated CreativeBrief (JSON) │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 3 · NICHE LIBRARY LOOKUP │ │ По спецификации ниши берём props_locked / forbidden / palette │ │ Output: NicheProps (JSON) │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 4 · SPEC COMPOSITION (5 LLM-agents) │ │ Concept → Layout → Color → Hook → Composer │ │ Output: CreativeSpec[] (N вариантов baseline) │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 5 · MODEL ROUTING │ │ model_router(spec) → "nano_banana_pro" | "gpt_image_2" │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 6 · COMPILATION + GENERATION │ │ render_*(spec) → prompt → MCP/API call → raster image │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 7 · BRAND QA PASS (5 checks) │ │ Slot · Logo · Color · Typography · Voice │ │ → pass / human-review / regenerate │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 8 · LLM-AS-JUDGE SCORING (Level 0) │ │ Vision LLM rubric → 0-50 score → ship / review / reject │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 9 · FIGMA EDITABLE EXPORT (optional) │ │ figma-developer-mcp: import raster + add text/logo as layers │ │ Client может доработать в Figma │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 10 · VARIANT GENERATION (loop) │ │ Variant engine мутирует spec → возврат на Stage 5 │ └─────────────────────────────────┬────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ STAGE 11 · DELIVERY + FEEDBACK CAPTURE │ │ Output package клиенту + feedback form (🟢/🟡/🔴 + comment) │ │ Лог → SQLite (для Level 1+ Performance Scoring) │ └──────────────────────────────────────────────────────────────────┘
08 · Дорожная карта

30 дней · 3 спринта

Спринт 1 (1-7 дней) · Foundation

  • A/B router test: 20 cyrillic-промптов на Nano Banana Pro vs gpt-image-2 → router rules уточнены
  • Picsart GenAI MCP подключён в Claude Code (для Recraft V4 access)
  • Figma MCP подключён (figma-developer-mcp) + протестировано 3-5 циклов
  • Pydantic schemas: CreativeBrief, BrandKit, NicheProps, CreativeSpec — drafts готовы

Спринт 2 (8-21 день) · Core Modules

  • Brief Intake Wizard skill (Claude tool_use с CreativeBrief schema)
  • JSON-prompt system — Layer 3 Compiler + Layer 5 Variant Engine
  • Brand QA Pass — 5 checks реализованы как Python пакет
  • LLM-as-Judge скилл — Vision LLM с rubric, integrated в pipeline
  • Niche Library v1 — 5 priority niches задокументированы (stomatology / beauty / restaurants / SaaS B2B / e-commerce)

Спринт 3 (22-30 день) · Brand Layer + Feedback

  • Brand Ingestion service — Firecrawl + Gemini Vision → BrandKit JSON
  • Feedback capture flow — клиент получает форму 🟢/🟡/🔴 + comment, лог в SQLite
  • LLM weekly analyst — Claude парсит feedback log еженедельно, выдаёт patterns
  • Niche Library v2 — 10-15 niches
  • End-to-end demo — реальный клиент Performante прогоняется через полный pipeline
Контрольная точка после месяца Если pipeline даёт «уверенный среднячок» (Тимур озвучивал это как минимальный bar) на 3+ нишах с QA Pass scoring ≥ 42/50 — green light на продакшн. Дальше — Level 1-2 Performance Scoring через клиентский feedback.
09 · Следующие шаги

Что нужно от Тимура

Концепция собрана. Чтобы стартовать Спринт 1 — нужно три коротких «да» или «нет»:

  1. A/B router test (20 cyrillic prompts): Nano Banana Pro vs gpt-image-2 на реальных брифах. Стоимость ~$5-10. Срок 1-3 дня. Запустить?
  2. Подключить Picsart GenAI MCP + Figma MCP в Claude Code. Бесплатное подключение, оплата по использованию у Picsart. Подключаю?
  3. Создать план-файл projects/ai-targetolog/plans/2026-05-31-creative-pipeline.md с чекбоксами на 3 спринта. Это рабочий план для исполнения. Оформить?

Параллельно можно начать набрасывать Pydantic schemas (CreativeBrief / BrandKit / NicheProps / CreativeSpec) — это foundation, который не зависит от моделей и MCP.

Главный takeaway

JSON-prompting как система + LLM-as-Judge + Brand Ingestion + Niche Library — это та архитектура, которая даёт «уверенный среднячок с релевантностью бизнесу» без необходимости иметь 450 миллионов ads датасет. ML появляется опционально на Level 3, когда накопится 300+ креативов на клиента.

Источник первого ресёрча с 69 источниками: research-creative-pipeline-2026-05-31.md