creative-orchestrator
Верхнеуровневый дирижёр для производства статики. Принимает бриф «сделай 5 постеров для apparatus» и сам прогоняет всё: enrichment → variants → multi-aspect → авто-QA → доставка. Опционально втягивает метрики из Meta API и выдаёт отчёт о победителях.
Что делает простыми словами
Это video-orchestrator, но для постеров. Та же идея: ты не дёргаешь creative-poster напрямую и не пишешь bash-цикл по аспектам — ты говоришь «сделай 6 постеров под apparatus в 4:5 и 9:16», а orchestrator:
- Делает preflight — есть ли
brand.yaml, есть ли референсы, есть ли ключ Gemini - Обогащает бриф — если ты не передал offer/bullets, он сам подтягивает последний
textover_hookизgenerated_textsили зовёт copywriter - Взрывает варианты — N углов × M пресетов = матрица базовых 4:5 постеров (последовательно, с кулдауном 35с — Gemini любит 429)
- Multi-aspect outpaint — лучшие 4:5 раскатывает в 9:16 / 1:1 / 2:3
- Авто-QA — каждый постер прогоняет через Gemini Vision, который ставит score и список проблем
- Refinement loop — если score ниже порога, берёт
suggested_fixот QA и зовётrefine.py. До--max-refine-loopsпопыток - Доставка — сортирует по score, оставляет top-N, копирует в
posters/и опционально на Desktop - Опционально — после открутки в Meta тянет метрики по Graph API, складывает в
creative_performanceи выдаёт «winners report»
Три режима работы
| Режим | Что внутри | Когда |
|---|---|---|
| quick | Один-два постера с sensible defaults. Без QA-петли, без perf-импорта. Опц. multi-aspect. | «Покажи как выглядит» — быстрый прототип, draft перед клиентским ревью |
| run (full) | Variants × aspects + QA loop + refine-петля + top-N + delivery | Боевой батч: «отправь 8 креативов на тест в Meta» |
| perf-import | Meta Graph API insights → creative_performance → winners report по CPL/CTR |
После недели открутки — узнать какие шаблоны зашли, чтобы next batch шёл со seeded паттернами |
Команды
Preflight (всегда первый шаг внутри run)
python ~/.claude/skills/creative-orchestrator/scripts/run.py preflight \ --project apparatus # Проверяет: project.yaml, brand.yaml, хоть 1 reference в библиотеке, # GOOGLE_API_KEY в env, инициализирована ли creative_posters в director.db
Quick mode
python ~/.claude/skills/creative-orchestrator/scripts/run.py quick \ --project apparatus \ --offer "УВТ-кабинет под ключ" \ --bullets "5 протоколов; 2-летняя гарантия; 30-дневная окупаемость" \ --profits "доп. доход 2.4 млн ₸/мес" \ --reference references/ref_eswt_t9.jpg
Full run
python ~/.claude/skills/creative-orchestrator/scripts/run.py run \ --project apparatus \ --offer "..." --bullets "..." --profits "..." \ --reference references/ref_eswt_t9.jpg \ --variants 6 \ --explore-angles math,emotion,fear,curiosity,authority,benefit \ --aspects feed,story \ --qa-min-score 7 \ --auto-refine \ --max-refine-loops 2 \ --keep-top 3
Performance learning loop
# Шаг 1: импорт метрик из Meta (требует META_ACCESS_TOKEN в env) python ~/.claude/skills/creative-orchestrator/scripts/meta_perf.py import \ --account-id act_1234567890 \ --project apparatus \ --since 30d # Шаг 2: winners-отчёт python ~/.claude/skills/creative-orchestrator/scripts/run.py winners \ --project apparatus --metric cpl --top 5 # Шаг 3: следующий батч с учётом победивших паттернов python ~/.claude/skills/creative-orchestrator/scripts/run.py run \ --project apparatus --learn-from-winners
Внутренности
Скрипты
| Файл | Что делает |
|---|---|
scripts/run.py | Главный entrypoint. 4 подкоманды: preflight / quick / run / winners. Внутри — вызовы creative-poster/scripts/*.py в нужном порядке с обработкой ошибок и кулдаунами. |
scripts/meta_perf.py | Тянет insights через Meta Graph API. Подкоманда import — pull за период; матчит FB ad name → poster_id; складывает в creative_performance. |
Таблицы БД
| Таблица | Действие | Зачем |
|---|---|---|
creative_posters | Read/Write | Регистрация каждого сгенерированного постера + результат QA (qa_score, qa_notes) |
creative_performance | Write | Метрики из Meta: spend / impressions / clicks / leads / cpl / ctr / cpa, привязка к poster_id |
generated_texts | Read | Подтягивает последний textover_hook от copywriter если бриф не передан явно |
brand_library | Read | Берёт brand.yaml проекта для inject в каждый промпт |
Конфиг из project.yaml
В ~/video-projects/<project>/project.yaml orchestrator смотрит блок creative и опц. meta:
creative: default_aspects: [feed, story] # feed=4:5, story=9:16, square=1:1 default_variants: 6 qa_min_score: 7 max_refine_loops: 2 cooldown_seconds: 35 # пауза между Gemini вызовами для 429 keep_top: 3 desktop_drop: true # копировать ли финал на ~/Desktop meta: account_id: act_1234567890 # для perf-import # token берётся из env META_ACCESS_TOKEN
Стоимость одного полного прогона
Для дефолта --variants 6 --aspects feed,story --qa-min-score 7 --auto-refine:
| Шаг | Кол-во | Цена/шт | Итого |
|---|---|---|---|
| Базовые 4:5 через Gemini Image | 6 | $0.04 | $0.24 |
| Outpaint 4:5 → 9:16 | 6 | $0.08 | $0.48 |
| QA review (Gemini Flash Vision) | 12 | $0.001 | $0.012 |
| Refinement (в среднем 1.3 из 12) | ~1.3 | $0.04 | $0.05 |
| Итого: | ~$0.78 | ||
Perf-import через Meta Graph API бесплатный.
Output
~/video-projects/<project>/posters/ ← все сгенерированные постеры с meta ~/video-projects/<project>/out/posters/ ← top-N после QA, готовые к выгрузке ~/Desktop/<project>_drop/ ← опционально, копия для клиента
Каждый постер сопровождается preview-HTML с payload-сайдбаром (GR-1).
Gotchas и tips
cooldown_seconds ниже 30 — это гарантированно поймать rate-limit на середине батча и сорвать прогон.
--max-refine-loops 2 = максимум 2 попытки исправить. Если после 2 итераций score всё ещё ниже порога, постер всё равно регистрируется (с пометкой qa_failed) и не попадает в top-N для delivery.
creative-poster brand init или --from-project-yaml.
🎬 Примеры работы
Место в пайплайне
Orchestrator стоит над poster-скиллом так же, как video-orchestrator стоит над director. Это координационный слой: бриф снаружи → готовые постеры внутри.
Если ты дёргаешь скилл напрямую и хочешь ручной контроль над каждым промптом — иди в creative-poster. Если хочешь «сделай 5 креативов, я через 10 минут вернусь» — это сюда.