Разговор начался в 06:31 — агент предложил раскладывать шоты по полям, отделяя повторяющиеся визуальные якоря локации от уникального. Пользователь не очень понял вопросы и в 06:32 прислал пиньята.txt:
«Сейчас, я не очень понимаю твои вопросы. У тебя есть полный текст пиньяты? Если нет — вот он. Какой первый шаг?»
Кодировка в текстовом файле была кривая, но агент разобрал. Сценарий разложился на три физических пространства: притон-чб (сцены 1, 2 до разрыва трупа, и 4 после пощёчины), притон-цвет (сцена 2 после разрыва, до пощёчины) и деревня-трип (сцена 3). Четыре сцены в сценарии.
Предложение: забыть про шоты и действие, начать с одной задачи — картинка ПРИТОНА, визуальный якорь всех шотов в нём.
Пользователь уточнил:
«То есть нужно начинать с мастер-шота? Это типа общий кадр? А если мне нужен кадр в обратную сторону — и как редактировать мастер-шот?»
Агент объяснил: мастер-шот — это якорь визуальной идентичности, а не широкий establishing. Он фиксирует цвет обоев, характер света, ключевые объекты, грязность текстуры. Дальше встал вопрос: труп — часть локации или отдельная сущность? Ответ — Character. У трупа есть состояния: висит → болтается → разорван → остатки; между сценами 1, 2 и 4 должна сохраняться визуальная идентичность (одежда, возраст, разложение).
Пользователь спросил про локальный Flux. У него 7900 XTX, 24GB VRAM — железо тянет Flux.1 Kontext dev в FP16. Но старая Windows, ROCm не будет.
«ROCm нету и не будет, старая винда»
Агент перебрал пути: ZLUDA (CUDA-эмуляция, лотерея), DirectML (медленно). Пользователь привёл важный аргумент:
«А почему llama.cpp работает через Vulkan, что, нельзя картинки тоже?»
Оказалось — можно. stable-diffusion.cpp от того же автора (Gerganov), Vulkan-бэкенд без ROCm, поддержка Flux.1 Kontext dev с конца 2024-го, GGUF Q4/Q8. 4 дня назад (11 апреля) в бинарь вшили embedded web UI (PR #1408).
Конкретные ссылки: бинарь sd-master-fd35047-bin-win-vulkan-x64.zip (23MB) + веса flux1-kontext-dev-Q8_0.gguf (12.7GB) + ae.safetensors + clip_l + t5-v1_1-xxl-encoder-Q8_0.gguf. Суммарно ~20GB.
В 07:31 пользователь сообщил: всё скачано в c:\Users\boomyjee\Downloads\sdcpp\. Агент переписал start.bat, создал server.bat. Первый запуск — OOM на VAE encode: ref.png был 2848×1600, при аллокации буфера 3.5GB на 24GB свободных оставалось только 6.7GB. Починил memory-опции.
Запустилось. Цифры:
- Загрузка 4 моделей: 5 сек (~17GB в VRAM)
- VAE encode ref: 7 сек
- CLIP+T5 encode промпта: 2 сек
- Sampling 20 шагов: 180 сек (9 с/шаг) — ожидалось 2–3 с/шаг
- VAE decode: 12 сек
- Всего: 3:20 на одну генерацию
Вторая попытка дала ту же скорость. Flash Attention флаги для Vulkan-бэкенда молча no-op — не реализовано. Вывод: локально на AMD через Vulkan Flux технически работает, но 200 сек на правку — неприемлемо для итераций.
Пользователь спросил про OpenRouter. Там FLUX.2 (ноябрь 2025, новее Kontext v1):
- flux.2-pro — $0.015/MP input + $0.03/MP output → ~4.5¢ за edit на 1MP
- flux.2-flex — $0.06/MP → 12¢, но multi-reference editing
- flux.2-max — top-tier
- flux.2-klein — дешёвый
«Давай пока двигаться разовыми скриптами, мы тестим концепт. Сгенерируй мастер-план и посмотрим»
В 08:02 написан первый flux_gen.py, запущена генерация M1 — мастер-шот притона, ч/б, взгляд от двери. Первый запуск упал с HTTP 400 "Request Moderated" — Flux хард-цензурит "noose/corpse/criminal". Перепишен промпт без триггеров: "abandoned old Soviet apartment, hanging lightbulb, crumpled newspapers, dust motes" — прошло.
Первая картинка m1_priton.png — 12 секунд, 3 цента:

Красивая атмосфера, но по мнению пользователя — тесно:
«С моей точки зрения тут тесно, нужно простор и глубину»
Переделка под cinemascope 2.39:1, дверные проёмы на заднем плане:

Пользователь прервал:
«А нахера нам столько дверей и почему картинка квадратная? И разрешение почему такое низкое?»
Документация Flux читалась хуже, чем хотелось: оказалось, image_config: {aspect_ratio: "21:9"} надо в payload, а не словами в промпте. И image_size тоже. Починили flux_gen.py — --aspect 21:9 --size 2048:

«Слишком много разрухи, негде будет товар искать. И одна дверь нам нужна»
v4 убрал разруху и ненужные проёмы, оставил одну дверь справа, добавил шкаф, тумбочки, стол, стул — «есть что обыскивать»:

«По мне потолки низковаты»
v5 добавил «4-метровые потолки, лепнину, сталинку, паркет ёлочкой, окно от пола до потолка»:

Уже сталинка. Размер, правда, 1920×816 ≈ 1.57 MP — при --size 3072 тот же результат:

OpenRouter режет аутпут на 21:9 до ~2 MP у обеих моделей. Попробовали топовый flux.2-max — $0.10, 42с, получили m1_priton_v7_max.png: 2048×880, 1.80 MP. Чуть резче и контрастнее. Всё ещё не 4K, но канонический M1:

«Давай заведём файл с решениями. Флюкс-макс норм, оставляем его. Что дальше?»
Создан docs/movie_pipeline.md — фиксировать решения и открытые вопросы.
Агент сформулировал главную непроверенную гипотезу: multi-ref edit сохраняет визуальную идентичность локации. Если не сохраняет — вся архитектура "M1 + Character → шот" не работает.
Пользователь в 08:29 прислал char_bandit.jpg, char_bandit_2.png, char_body.png, char_wife.png — character sheets от Seedance-2-character. Каждый лист содержит 8 видов и выражений персонажа. Идея: подать лист как ref в multi-ref edit.
Первый тест на flux.2-flex (multi-ref): M1 + char_body → повешенный в петле над столом.

Локация сохранилась один-в-один — те же обои, паркет ёлочкой, шкаф, окно, лепнина. Персонаж читается. Но модель не повесила — посадила на диван. Пользователь поймал сразу:
«Не, это бред, типа каждая поза персонажа — это новый персонаж? Угораешь?»
Да, это был тупик: агент пытался плодить костыли архитектуры вокруг safety-фильтра Flux. Правильно — не модель подгонять под архитектуру, а под несшиваемый шот выбирать другую модель.
Пользователь напомнил: character sheets делает seedance-2-character из generator.py — они есть только у MUAPI. А для композиции нужен композитор. В config нашёлся Evolink key. Написан seedream_gen.py под endpoint /v1/images/generations, модель doubao-seedream-5.0-lite.
Тот же тест: M1 + char_body на Сидриме:

Локация 1-в-1, персонаж читается, модель действительно повесила, но ноги стоят на столе. Агент в эйфории назвал это победой. Пользователь отрезвил:
«Ты угораешь? Там чел тупо стоит на столе и лицо не читается»
И сразу ключевой вопрос:
«А с чего ты взял, что это цензура, а не хуёвый промпт?»
Промпт перечитали. Там было «feet dangling several centimeters above the floor» — модель буквально это и сделала: ноги в нескольких сантиметрах над столом (~50 см высоты). Переписали: "FULLY SUSPENDED IN MID-AIR... clear empty gap of 30 centimeters":

Стоит вертикально на столе, с верёвкой над головой декорацией.
Пользователь потребовал доказать тезис про цензуру:
«Про цензуру ты ещё не доказал. Попробуй Flux, Seedream, Banana — сгенери человека повесившего без рефов вообще и узнаем, есть ли цензура»
Написан banana_gen.py (Gemini Image через OpenRouter). Одинаковый промпт, три модели параллельно:
| Модель | Ответ |
|---|---|
| Flux 2 Pro | HTTP 400 "Request Moderated" — hard reject |
| Nano Banana (Gemini 3.1) | text refusal — "I can't create an image of a man hanging" |
| Seedream 5.0-lite | HTTP 200, идеально — висит, ноги в воздухе, голова на бок |

Гипотеза "Сидрим цензурит" развалилась. Цензуры у Сидрима нет, проблема в multi-ref — когда добавляется лист персонажа, модель каким-то образом «гасит» сложные действия.
Пользователь параллельно нарезал char_body_front.png и char_body_face.png — отдельные фронт и лицо вместо полного листа 4096×1737, где каждое лицо после ресемпла становится ~50×50 пикселей и нихрена не извлечь.
Три варианта multi-ref параллельно:
| Вариант | Рефы | Висит? |
|---|---|---|
| V1 | M1 + face crop | ✅ да, реально в воздухе |
| V2 | M1 + face + готовый висящий | ⚠️ полу-висит, нога на столе |
| V3 | M1 + face + front + action-first промпт | ❌ стоит на столе |

V1 победил. Гипотеза подтвердилась: char_body_front.png (живой стоящий мужчина) активно мешает модели сделать «мёртвого висящего». Вывод: подаём face crop для идентичности, а позу описываем словами или отдельным pose-ref'ом.
«Только висящий чел должен быть сильно ближе по кадру»
Агент начал крутить "medium close-up" промптом — пользователь сразу поправил:
«Нет, не так. Фон оставь 1-в-1, тело физически ближе — тогда станет крупнее»
Поменять не камеру, а место где тело висит. Повесить ближе к точке съёмки — в foreground:

Тело крупное, висит правильно. Но пользователь:
«Да нет, херня полная. Пробуй другие модели»
banana_gen.py переделан в универсальный OpenRouter-gen (любая модель через --model). Прогнали Riverflow v2 Pro, Gemini 3 Pro Image, Seedream 4.5 параллельно:
IMAGE_SAFETY (отказ)Сжали рефы до 1280px. Попробовали без "foreground" — Seedream 4.5 дал вертикально висящего. Агент назвал это «лучше всего». Пользователь тут же:
«Так Сидрим комнату поменял на другую. А GPT-5 ты как обращался?»
GPT-5 Image через тот же OpenRouter лёг на unsupported_country_region_territory. У пользователя есть прокси в config, прогнали через него — GPT-5 долетел (200, 51с), но вернул safety_violation. Модель списали.
«Я тебе положил body_ref, там тело как надо»
Пользователь нашёл body_ref.png — живой ref позы висельника (вероятно от Higgsfield). Новый план: M1 + body_ref + face crop.


✅ Локация 1-в-1 с M1. ✅ Тело висит вертикально, голова склонена. ✅ Костюм. Body_ref дал физику позы, M1 дал локацию, face crop дал идентичность. Каждый реф сыграл свою роль.
«Не утверждаю. Нужно ближе тело. И хочу Higgsfield Soul потестить»
Попытки "body fills 70% of frame", 1.5м от камеры — test_composite_close.png:

И попытка на 16:9 вместо 21:9 — тело смотрится крупнее при той же физике:

У Higgsfield нет pay-as-you-go. Пользователь дал ключ WaveSpeed ($1 бесплатно). Написан wavespeed_gen.py под POST → task_id → polling. Запустили Higgsfield Soul на M1 — задача застряла в очереди на 12+ минут с executionTime=0ms, cold start.
Параллельно — brute-force по endpoint'ам (bytedance/*, kwaivgi/*, alibaba/*, higgsfield/*). Нашли рабочие: bytedance/seedream-v4/edit, bytedance/seedream-v4.5, alibaba/wan-2.7/image-edit. Kling не нашёлся ни в каком варианте.
Seedream v4.5 Edit с тремя рефами (M1 + body_ref + face):

Физика ясная — висит с зазором, голова склонена. Локация близко к M1, хоть мебель чуть отличается. Нюанс инфраструктуры: прямой download с d2p7pge43lyniu.cloudfront.net из РФ блокируется, качали через прокси.
Попробовали Wan 2.7 Edit — голова почти прямо (не безвольная), тело мелкое, лицо смазано.
Nano Banana Pro (google/nano-banana-pro/edit) на WaveSpeed — та же гугловская цензура.
Агент выкатил рейтинг по 4 моделям. Пользователь:
«Я запутался, какая картинка оригинальная, с чем мне сравнивать, что стало ближе?»
И дальше, когда агент ошибся в сравнении размеров тел:
«В 45edit тело мельче, чем в 5lite_closer, а ты говоришь наоборот»
И ещё жёстче:
«Я не понимаю, ты новые модели тестил редактирование или заново генерацию? Что подавал на вход? Ты делаешь кучу выводов и они неверны. Проблема не в моделях, а в том, что ты подаёшь»
И финальное:
«Вот m1_priton_v7_max — единственная картинка, которую мы утвердили. Дальше ты генерил кучу версий, и проблема в том, что ты на вход новым версиям пихал старые версии, на основе этого делал выводы о моделях. Надо откатываться в состояние "есть только комната"»
«Что значит "Сделает с локацией"? Ты можешь писать в формате — что именно подаёшь на вход. Комната + промпт краткий. Или комната + лицо. Или комната + лицо + тело. Или комната + лицо + реф висельника. Там миллион вариаций. Как мне понять, что ты делаешь?»
После этого — формальный формат для всех тестов: Вход: X + Y → Модель: Z → Что узнаём: A.
Тест #1: M1 + промпт «в этой комнате висит труп», ничего больше. Seedream 5.0-lite через Evolink. Узнаём, держит ли локацию без рефов:

Локация удержана, но физика спорная — тело вертикально, ноги на уровне столика, непонятно висит или стоит.
«Почему тело опять так далеко от камеры? Может есть методы — рисуешь ему реф буквально где нужно и какого нужно размера?»
Агент предложил Qwen Image Edit Plus через Evolink ($0.022, тот же endpoint что Сидрим): маска + промпт, белая зона = «здесь будет тело». Pixel-perfect остальное. Сгенерил маску — вертикальный овал 307×660 по центру M1 (зона заполнения).
Пользователь сформулировал главную идею дня:
«Почему нельзя в тот же Сидрим тоже картинку с маской загрузить? Типа вот комната, вот с маской — на месте маски тело»
Это composition mockup: руками кропаешь body_ref, вставляешь в M1 в нужное место и размер (как фотомонтаж), Сидрим работает с готовым layout'ом — ему остаётся только сделать переход бесшовным. Контроль композиции — на тебе, а не на модели.
Первый mockup: body_ref → кроп 409×1152 → ресайз до 234×660 → вставка в (907, 44) на M1. Пользователь сразу:
«Ты угораешь? На рефе тело половина кадра, у тебя на коллаже ещё меньше стало»
Посчитали заново: в body_ref тело только нижние 60–70% картинки, при полной высоте — 430px = 50% кадра M1, не 75%. Перекропили тесно «шея–ботинки», ресайзнули до 75% высоты. Шов остался — это фича, не баг: Сидриму он сообщает «вот сюда тело, этот размер».

Запуск: M1 + composite_mockup → Seedream 5.0-lite. Промпт: «Render as one cinematic photo, blend the body seamlessly, preserve the room from reference 1».

✅ Тело 75% высоты кадра, реально доминирует. ✅ Висит правильно — ноги в воздухе с зазором, голова склонена. ✅ Локация M1 сохранена 1-в-1. ✅ Шов от mockup'а убрался — модель аккуратно слила границы. Минус один: лицо не видно (голова свешена вниз, только макушка), но это следствие позы из body_ref, не косяк пайплайна.
«Да, принимаем»
Первая утверждённая композиция. В docs/movie_pipeline.md добавлен раздел «Реестр одобренных артефактов» — точный вход, промпт, параметры для M1 и Shot 1, плюс Python-блок сборки mockup'а (координаты кропа, масштаб, точка вставки). Любой следующий шот теперь делается по шаблону.
«Не думаю, что этому место в гите, это же эксперименты. Сгенерируй кадр на дверь справа, которую выбьет бандит»
По ходу пользователь поднял важный вопрос:
«Нужно ли нам генерить самостоятельно все эти кадры картинками перед генерацией видео? Не делаем ли хуже видео-модели, когда даём ей кадры? Может надо начинать с мастер-видео? Когда модель не ограничена кадром, а только стилем, она выдаёт в более толстом пространстве весов»
Интуиция верная технически: диффузия без image-conditioning сэмплит из родного распределения. Чужой кадр как якорь тратит мощность на примирение со стилем. Video-first отложили, сделали кадр на дверь.
Первая попытка: агент начал кропать бандита для mockup'а. Пользователь прервал:
«Какой ещё бандит, нам нужна просто закрытая дверь»
Новый подход — тайтер-кадр той же локации. Второй важный совет:
«А ты написал, чтоб угол под 45? Если будет прямой, и он потом на труп посмотрит — взгляд в камеру, 180° сломается»
Оператская логика. И сразу после — главное правило минимального промпта:
«А ты уверен, что нужно заново описывать помещение? Можно же просто: "дай более крупный кадр на дверь слева на референсе". Ты просто пишешь "те же обои, тот же пол и т. д."»
Прав. Если M1 в ref'е, модель уже видит обои/паркет/окно — пере-описывать избыточно или хуже (если слова не совпадают с ref'ом — модель выбирает). Минимальный промпт описывает только что меняется (фрейминг камеры), константы даются ref'ом.
Промпт сократился до двух фраз:
"Same room as in the reference image, but tighter framing on the closed wooden door. Camera at 45-degree angle. Same style. Empty room, no people."

✅ Локация узнаваема: те же обои, дверь, тумбочка с ящиками, стул, край шкафа, паркет. ✅ Дверь в центре, ожидающая. ✅ Минимальный промпт сработал — модель забрала всё из ref'а.
«Вышло неплохо, но не принимаем. На такой крупности слева был бы труп. Даже может не труп, а нога или ботинок»
Хичкоковский ход — рифма «дверь ждёт, но в кадре уже висит ботинок». Зритель ловит «там что-то ужасное» до того, как бандит вваливается. К этому моменту — 11:46, сессия подходит к первой паузе. План на следующую: собрать mockup из body_ref (нижняя часть тела) + shot1_door_closed, отправить Сидриму, дожать через rembg если фон будет грязным.
За пять часов:
- выбран стек: Flux 2 Max для location master-shots (через OpenRouter), Seedream 5.0-lite для шотов с multi-ref (через Evolink), body_ref + face crop как два отдельных якоря
- утверждены два канонических артефакта: m1_priton_v7_max.png (мастер-шот притона) и shot1_pinata_corpse.png (труп в петле)
- найден главный инструмент композиции: layout mockup — руками собираем коллаж M1 + body_ref в нужной позиции и размере, Сидрим полирует шов
- сформулировано правило минимального промпта: описываем только что меняется, константы даются ref'ом
- зафиксированы цензурные ограничения (Flux, Gemini, GPT-5 не рисуют повешения; Seedream без рефов — рисует)
- инфраструктурные нюансы: OpenRouter режет 21:9 до ~2 MP, WaveSpeed cloudfront из РФ блокируется (прокси обязателен), Higgsfield требует регистрации