День 2. 16 апреля, 04:28–09:35. OpenRouter, Kling и MUAPI character_id

Пополнил

04:28. Пользователь пополнил Evolink, прислал две задачи: скачать Seedance prompting guide буквально (не пересказывать), и обновить movie_pipeline.md свежими данными.

Первая итерация провалилась — агент начал пересказывать гайд на русский. Пользователь:

«Ты чё делаешь, промтингай нужно скачать буквально по ссылке, а не пересказывать. Нахер ты его на русском переписываешь? Это тебе для контекста, а не мне читать, нужно 1 в 1»

Перекачал оригинал 1167 строк. Обновил docs/movie_pipeline.md:
- Шаг 6 (видео) переписан: формат промпта, @Image теги, timecodes, negatives, что работает / что нет.
- Реестр — Shot 2 (дверь с ботинком) + Shot 2a (дверь чистая) с точными промптами и алгоритмом mockup'а.
- Журнал: rembg, Evolink CDN-кеш, минимальные промпты, цензура.

SSL на Evolink → OpenRouter Seedance

v5 (усиленный промпт, 1-сек удар двери) — запуск упал на SSLError EOF. Пять попыток подряд — Evolink временно лежит. Переключился на OpenRouter Seedance (тоже версия 2.0, цена примерно равная).

Первый запуск — 413 Request Entity Too Large: char_bandit.jpg = 6336×2688, тяжело. Сжал до 1280px. Нашёл формат: endpoint /api/v1/videos, рефы через frame_images (first frame) + input_references (persona).

[missing] shot1_video_v5 — OpenRouter, 10с, $1.512
../archive/shot1_video_v5.mp4

Стоимость: $1.512 за 10с 720p. Evolink Standard ~$1.53, Fast ~$1.24.

«Видео очень неплохо, но есть одно но — дверь при открытии внезапно родила дырку. Могу из 2х генераций в давинчи родить что нужно масками. Есть смысл так делать или нужно дальше генерить?»

Агент ответил, что компоузинг в DaVinci правильнее перегенерации — 90% уже есть, а ре-ген $1.50 без гарантии, артефакт может уйти, а может появиться новый. В реальном кинопродакшне никто не генерит до идеала, composite это post-production territory.

«Бандит на себя не похож»

«А в этом видео какой полный промпт? Бандит на себя не похож — сейчас увеличил и увидел»

Агент показал промпт v5. Пользователь:

«В смысле блять. Ну читай заново prompting guide — где явные указания @image1 @image2? Какого хера. И конечно нужно не лист давать, а Front view из него. Сука, вот ты не показываешь мне промпты, а потом оказывается, что ты хуйню делаешь»

Две ошибки:
1. frame_images и input_referencesразные каналы в OpenRouter API. @Image1/@Image2 теги маппятся на позицию в одном списке, а агент раскидал по двум. Модель видела @Image2 в тексте, но реальный char_bandit ушёл как "general reference" — тег не привязался.
2. Дал полный лист 6336×2688 → после сжатия до 1280 лицо стало мелким, модель не смогла вытащить identity.

Gemini vision bbox

Агент попытался кропнуть front view из листа вручную — сначала зацепил боковой профиль, потом отрезал ноги.

«Пиздец, ща я фотошоп открою, сам сделаю, теперь ноги отрезал, пустота слева. А с тобой что не так? Нет такой-то модели или библиотеки, которая тебе чётко разметит картинку?»

Решение — Gemini vision через OpenRouter, один запрос "верни координаты front view фигуры":

bbox = {'x1': 46, 'y1': 53, 'x2': 218, 'y2': 918}  # масштаб 0-1000
scaled bbox: (291,142) → (1381,2467) = 1090×2325

Чистый front view: полный рост, обе руки, лицо крупно, фон серый. ~1 цент. Автокроп для любого character sheet из MUAPI.

«Смотри, я сам сделал, там лучше, чем твои вариант, только я jpg сохранил»

char_bandit_front

char_bandit_front

char_bandit_face

char_bandit_face

«Промпт ебаный»

«А ещё промпт ебаный, неконкретный. Что такое SHARP violent kick, door explodes inward with crash. Нужно же блять писать с ноги, дверь взрывается? Че блять, вот поэтому там щепки и летят и дырки. "Bandit from @Image2 appears in doorway, frozen" — тут что, он в сосульках должен появиться? Ты как-то очень образно все описываешь, а не конкретно, поясни почему?»

Что написал Что модель поняла Что надо было
door explodes inward дверь взрывается → щепки, дырки door swings open fast, hitting the wall
SHARP violent kick агрессия, разрушение a boot kicks the door from outside
frozen in place замороженный, лёд standing still, not moving
eyes fixed пристально смотрит (ОК) looking at the body

Агент пишет как сценарист — метафоры, эмоции. Модель читает буквально. Фиксируем: физические описания, не состояния или характеристики.

Возврат на Evolink. v6, v7

Запустил на OpenRouter с тремя ref'ами (scene + front + face), все в input_references по порядку. Ответ:

400 InputImageSensitiveContentDetected.PrivacyInformation
The request failed because the input image may contain real person

OpenRouter зарубил face как реального человека. Пользователь:

«А чё ты на OpenRouter переключился? Мы же его один раз протестили, поняли, что цена такая же, а ввод неудобный»

Вернулся на Evolink (SSL восстановился). v6: 10с, 3.8MB, три рефа. Бандит читается.

[missing] shot1_video_v6 — Evolink, 3 рефа
../archive/shot1_video_v6.mp4

«Как я и говорил — дверь не вылетает с ноги, а плавненько открывается. Думай как поправить в промпте»

Дал 2 секунды на удар ([00:03-00:05]) — модель растянула открывание. Сжал до 1 секунды + буквальная физика кадр-по-кадру.

«Хотя ща, ещё косячок заметил: в силу того, что бандит-реф цветной, то бандиту немного цвета добавило. Нужно сделать реф чб»

Конвертировал оба рефа в grayscale (переписал файлы прямо — потерял оригиналы, пришлось потом пользователя просить пересохранить).

v7content_policy_violation: "may violate third-party content rights". Ч/б face-реф стал слишком похож на реальную знаменитость (возможно Dean Norris). Добавил лёгкий шум на face — прошло.

[missing] shot1_video_v7 — чб рефы + шум
../archive/shot1_video_v7.mp4

v8 — утверждён

«1. Нет, дверь открывается плавно. Ещё нет паузы вначале, что ноги просто качаются.
2. Похож. 3. Цвет чб»

Агент убрал энергетику вместе с метафорами, и v7 потерял резкость удара. Решили объединить — энергетические слова для физики (boot hits hard, flies open, slams with loud bang), явная позиция двери (closed/open), @Image теги сохранены.

Пользователь заметил противоречие:

«"The hanging legs sway gently. Nothing moves" — что значит Nothing? Ты только написал что ноги болтаются. Может написать явно, что дверь закрыта?»

v8 — final merged-style:

[00:00-00:03] Heavy silence. Hanging legs on the left sway gently.
              The door on the right is closed. The room is still.
[00:03-00:04] The door is kicked open with force from outside,
              slamming against the wall with a loud bang.
[00:04-00:07] The man from @Image2 steps through. Hands at his sides,
              nothing in hands. Stops past the threshold.
[00:07-00:10] The man stands still, looking straight ahead at the hanging body.
              The legs still sway.
shot1_video_v8 — оригинал до переименования
params 720p · 10s · 21:9
prompt
Style: black and white 35mm film, high contrast, film grain.
Camera: static wide shot, no movement.

@Image1 as first frame and background.
@Image2 as character full body appearance reference.
@Image3 as character face reference.

[00:00-00:03] Shot 1 (static wide): Heavy silence. The hanging legs on the left sway gently. The door on the right is closed. The room is still.
[00:03-00:04] Shot 2 (static wide): The door is kicked open with force from outside, slamming against the wall with a loud bang.
[00:04-00:07] Shot 3 (static wide): The man from @Image2 steps in through the open doorway. Hands at his sides, nothing in hands. Stops past the threshold.
[00:07-00:10] Shot 4 (static wide): The man stands still, looking straight ahead at the hanging body. The legs still sway.

Avoid jitter. Avoid bent limbs. Avoid identity drift.
shot1_video_v8 → shot1_video_door_kick — ПРИНЯТ

«Вышло, дверь правда закрыта буквально секунду, но продлить это на посте не проблема. Зато всё остальное хорошо»

Переименован в shot1_video_door_kick.mp4. Итоговая формула промпта для Seedance: Style:/Duration:/Camera: префикс + явные роли @Image + timecodes + буквальная физика + negatives.

Kling O3 эксперимент

«Мы теперь играемся с другими моделями. Начнём с Kling. Вот prompting guide: github.com/aedev-tools/kling-3-prompting-skill»

Скачал гайд (210 строк). Нашёл подробнее на blog.fal.ai.

Ключевая фича Kling — Custom Element: создаёшь один раз char_bandit_front.jpg → получаешь element_id. Дальше <<<element_1>>> в промпте — модель знает персонажа изнутри, не угадывает по ref'у.

«Я бы перешёл на 16:9 вообще (исправь это везде, у тебя дефолты 21:9)»

Поменял дефолты в seedream_gen.py, seedance_video.py, flux_gen.py на 16:9.

Первые две попытки создать element — failed invalid_parameters. Причина: char_bandit_front.jpg был grayscale (агент ранее переписал). Kling требует цветное для распознавания лица.

Попытка перекропить из цветного листа через Gemini bbox для face — вернул лоб без подбородка. Gemini bbox надёжен для крупных фигур, но не для маленьких face-тумбнейлов.

«Чёт не работает твой bbox, почему?»

Пользователь пересохранил из Photoshop'а оба в цвете. Element создан за 15 секунд: element_id: 308282182539136.

Multi-shot — катастрофа

Kling принимает multi_shot: true + multi_prompt: [...] — нативные мульти-шоты с таймингами.

shot1_video_kling_v1 — multi_shot

«Главная жопа — Kling разбил видео на 3 кадра. В гайде есть способ этого избежать?»

«Извини, но какого хуя если у тебя был гайд, ты его не прочитал? Ты не знал, что у нас один кадр?»

Агент не перечитал гайд перед генерацией. Там прямо написано:
- Multi-Shot = разные камерные ракурсы со склейками (для раскадровки).
- Один непрерывный кадр = Image-to-Video с одним промптом и временной прогрессией (first → then → finally).
- Фраза-маркер в конце: "No scene cuts throughout, one continuous shot."

shot1_video_kling_v2 — без multi_shot

«Дверь вообще не с ноги выбита, а нежно открыта рукой. Бандит норм. Давай пробовать правки уже 1080, а то всё мыло»

1080p = 90 кредитов, осталось 34. 720p = 54, тоже не влезает. 5 сек без звука = 27 кредитов — влезает.

shot1_video_kling_v3 — 5с, boot smashes

«Ну лучше, но он рукой открыл, и вообще качество так себе. Думаю Kling просто в целом проигрывает Seedance»

Ответ агента: Seedance 2.0 от ByteDance (TikTok) vs Kling 3.0 O3 от Kuaishou (Kwai). Kling формально новее на пару месяцев, но у ByteDance гигантское преимущество по данным — весь TikTok как training data.

Seedance лучше по качеству и физике, Kling — почти вдвое дешевле и быстрее (72 vs 135 кредитов, 164 vs 320 секунд). Для быстрых итераций на посредственном качестве — Kling, для финалов — Seedance.

MUAPI character_id

«Character — это как раз для видео, то есть система есть. По картинке генеришь персонажа, можно айди передать в видео-генерацию»
«Может те листы персонажей, что я скачал, они не только для прямого использования, а больше для верификации, что меня устраивает, что он надумал и можно перегенерить персонажа. А Kling не говорит, что он там сгенерил»

Агент упустил ключевую вещь:
1. Seedance v8 бандит и так похож — identity через front+face refs работает.
2. seedance-2-character возвращает character_id, но в пайплайне мы его сохраняем и никуда не передаём в видео-генерацию. Баг.
3. Листы = верификация для человека. В генерацию идёт character_id, не картинки.

Синтаксис: @character:557fcc62-b59b-45e7-8965-1d6fae091889 в тексте промпта.

Создал character для бандита через MUAPI: char_bandit_front.jpg + char_bandit_face.jpg → character_id 557fcc62-b59b-45e7-8965-1d6fae091889 + sheet_url для верификации.

«Так а теперь ведь не нужно давать реф бандита, может прокатит»

Умно. Без face-реф'а в картинках OpenRouter не зарубит на privacy. @character:ID идёт только текстом:

shot1_video_or_chartest — OR + @character:ID

«Рандомный мужик )»

Значит @character:ID работает только через MUAPI напрямую, не через OpenRouter/Evolink. У MUAPI свои endpoints: seedance-v2.0-i2v, seedance-v2.0-t2v, seedance-2.0-omni-reference.

Попытки через MUAPI — upload на cdn.muapi.ai таймаутится из РФ, прямая подача URL Evolink тоже не прошла, плюс у MUAPI 0 кредитов.

«А можешь поискать, существует вообще character_id в официальном Seedance или это MUAPI придумали?»

Фича MUAPI, не официальный ByteDance API. Официальный Seedance 2.0 (BytePlus) имеет только T2V/I2V/Reference-to-Video с до 9 image refs, но persistent character identity нет. MUAPI надстроил поверх.

«Принимаем как рабочий результат»

Реорганизация: scripts/movie_experiment/

«Создай папку scripts/movie_experiment, туда перенеси всё, что мы в корень лишнего напихали. Создай там свой гит-репо. В основном репо добавь в gitignore»

53 файла перенесены, отдельный git-репо, .gitignore обновлён.

«А архив куда делся?»

Архив влил в корень при переносе. Пользователь уточнил структуру:

«Скрипты в src, архив в archive, утверждённое в approved, рабочая папка для того, над чем работаем»

Итог:

scripts/movie_experiment/
├── src/          # flux_gen.py, seedream_gen.py, seedance_video.py, banana_gen.py, wavespeed_gen.py
├── approved/     # m1_priton_v7_max.png, shot1_pinata_corpse.png, shot1_door_closed.png, shot1_door_with_foot.png, shot1_video_door_kick.mp4
├── archive/      # 34 файла — старые версии, тесты
├── docs/         # movie_pipeline.md, seedance_prompting_guide.md, kling_prompting_guide.md
└── (корень)      # текущие рабочие файлы

Четыре коммита: initial → docs → reorganize → cleanup.

Skill и "обманщик"

«Можешь на себя это установить и сказать, полезное ли? github.com/nidhinjs/prompt-master. Прям ставить пока не надо. 1) можешь ли поставить 2) полезное ли»

Агент ответил "не могу, это Claude.ai Skill через веб-интерфейс".

«Обманщик ты. https://code.claude.com/docs/en/skills — вот написано, что в папку ставишь в проекте и всё»

Действительно — .claude/skills/<name>/SKILL.md и Claude Code подхватит автоматически. Ставить не стали — гайды по конкретным моделям (Seedance, Kling) точнее общего промпт-оптимизатора.

Кадр на окно

«Давай дальше играть с экспериментом, мне нужен кадр на ноги в сторону окна в контровом свете. Выходит, носки будут налево — деталь ног»

Первая попытка: Seedream 5.0-lite на Evolink с M1 как ref → ноги не вертикально, кадр средний вместо детали:

shot_legs_backlight — Seedream + M1 ref

shot_legs_backlight — Seedream + M1 ref

Flux параллельно — ноги вообще на подоконнике:

shot_legs_backlight_flux — Flux, ноги на подоконнике

shot_legs_backlight_flux — Flux, ноги на подоконнике
params flux · flux.2-max · 16:9
prompt
Detail shot, close-up of hanging legs and shoes in silhouette. Camera looks toward a large window. Strong backlight from the window, bright overexposed light behind the legs, creating a dark silhouette of the legs and shoes against the bright window. Toes of the shoes point to the left. The legs hang motionless in mid-air. Old apartment with faded floral wallpaper visible. Black and white 35mm film, high contrast, deep blacks, visible grain. Only legs from mid-thigh to shoes visible, no face, no upper body.

Попытка extreme close-up — Flux зацензурил "dead man hanging", Seedream сделал, но ботинки стоят на полу:

shot_legs_v2_seedream — стоят на полу, не висят

shot_legs_v2_seedream — стоят на полу, не висят

Плюс отдельно Flux без M1 — просто кадр в сторону окна:

m2_window_backlight — первая попытка Flux без M1-ref

m2_window_backlight — первая попытка Flux без M1-ref
params flux · flux.2-max · 16:9
prompt
Extreme close-up detail shot inside an old Stalinka apartment. Camera at low angle, looking toward a large bright window. Strong backlight from the window, overexposed white light flooding through dirty lace curtains. Faded floral wallpaper on both sides. Old herringbone parquet floor in the bottom of the frame. The window fills most of the background with bright blown-out light. Dust particles visible in the light beams. Empty room, no people, no objects in the foreground. Black and white 35mm film, high contrast, deep blacks, visible grain.

«Нет, это хуйня полная, это 100% не та же комната, это просто некий кадр в сторону окна в том же стиле. У нас вообще 2 окна так-то. А ты помнишь промпт и модель, которым удалось сделать кадр на дверь?»

Точно — для двери использовали Seedream 5.0-lite + M1 как ref с минимальным промптом. Тот же подход для окна.

«Подожди, а почему ты Флюксу не дал М1?»

Тупанул. Flux тоже поддерживает --ref. С M1 → m2_window_flux.png:

m2_window_flux — Flux с M1 как ref

m2_window_flux — Flux с M1 как ref

«Флюкс неплох, но кадр слишком общий, он захватил аж 2 окна. А Флюкс умеет улучшать качество? У меня есть идея делать ракурсы при помощи Marble»

Marble — World Labs (Fei-Fei Li). Одна картинка → 3D Gaussian Splatting мир → свободная навигация камерой → экспорт ракурса. Идея: M1 → Marble → геометрически правильный кадр (мыльный) → img2img через Seedream → детализация с сохранением композиции.

m2_window_tight — одно окно, Flux с M1

m2_window_tight — одно окно, Flux с M1
params flux · flux.2-max · 16:9
prompt
Same room as in the reference image. Tight close-up framing on one window only (the left window of the two). Camera low angle looking up toward the window. Strong backlight, bright overexposed light flooding through the dirty lace curtain. The same faded floral wallpaper visible on both sides of the window frame. Herringbone parquet floor at the bottom edge. Dust particles in the light beams. Empty room, no people. Same black and white cinematic style as reference.

«Оно съело подоконник и окно слишком низко к полу»

m2_window_tight_v2 — подоконник+радиатор

m2_window_tight_v2 — подоконник+радиатор
params flux · flux.2-max · 16:9
prompt
Same room as in the reference image. Tight close-up of one window on the left wall. The window is tall, full-height from floor almost to ceiling, with a visible windowsill at waist height and a radiator below it. Dirty lace curtains hang from above. Strong backlight, bright overexposed light through the curtains. The same faded floral wallpaper visible on both sides of the window. Herringbone parquet floor at the bottom. Camera at eye level looking straight at the window. Empty room, no people. Same black and white cinematic style as reference.

Подоконник на месте, радиатор под ним, стена видна, но контровой слабее.

«А как увидеть контровой свет? Как раз Флюкс логично сделал — окно яркое, а всё остальное потемнело, как раз потому что свет в лицо ослепляет. Лучей видно быть не может, они сбоку видны. Я думаю нужно в эту генерацию добавлять ноги как-то. У нас бокового ракурса ботинок нужны ноги ниже колена — деталь прям»

Правильная физика: контровой ослепляет, лучей нет, Flux сделал корректно.

Pose-ref для ног под 90°

body_ref фронтальный, а камера теперь смотрит сбоку — нужен профильный вид ног. Сидрим упал на insufficient_quota (0.7 кредитов). Flux без слов про смерть не зацензурит. body_ref как ref для стиля ботинок.

body_ref_side_legs — одна нога стоит на полу

body_ref_side_legs — одна нога стоит на полу
params flux · flux.2-max · 16:9
prompt
Side profile view of the same man's lower legs and shoes as shown in the reference image, but viewed from the exact side (profile). Dark business suit trousers, same black leather dress shoes as in reference. The legs hang straight down vertically, motionless, toes pointing to the left. Only visible from mid-calf to shoes, nothing above. Plain neutral grey background. Black and white photograph, high contrast.

«Одна нога, стоит на полу. Нужны две ноги в воздухе»

body_ref_side_legs_v2 — две ноги, профиль, в воздухе

body_ref_side_legs_v2 — две ноги, профиль, в воздухе
params flux · flux.2-max · 16:9
prompt
Side profile view of TWO legs in dark business suit trousers and the same black leather dress shoes as in the reference. Both legs hang vertically in mid-air, feet NOT touching any surface, clear empty space below the shoes. Legs viewed from the exact side in perfect profile, toes pointing to the left. Only visible from mid-calf to shoes. Plain neutral grey background. No shadow, no floor. Black and white photograph, high contrast.

«V2 ничего, но 1) носки не чисто вбок, а немного вниз (ступни расслаблены). 2) свет боковой, а не контровой»

body_ref_side_legs_v3 — расслаблены, контровой с rim light

body_ref_side_legs_v3 — расслаблены, контровой с rim light
params flux · flux.2-max · 16:9
prompt
Side profile view of two legs in dark business suit trousers and the same black leather dress shoes as in the reference. Both legs hang vertically in mid-air, feet relaxed and drooping slightly downward (toes pointing down-left, not horizontal). Legs viewed from the exact side in profile. Strong backlight from directly behind the legs — bright rim light outlining the edges of the trousers and shoes, the front of the legs facing camera is dark. Only visible from mid-calf to shoes. Plain neutral dark background. No floor, no shadow. Black and white photograph, high contrast.

«Лучше, но свет нужен прям совсем контровой, а тут боковой контровой. И ноги должны перекрывать частично друг друга»

body_ref_side_legs_v4 — перекрытие, чистый контровой

body_ref_side_legs_v4 — перекрытие, чистый контровой
params flux · flux.2-max · 16:9
prompt
Side profile view of two legs in dark business suit trousers and black leather dress shoes matching the reference. Both legs hang vertically in mid-air, feet relaxed, toes drooping slightly down. Both legs are parallel and overlap each other in profile — the near leg partially covers the far leg, only one shoe toe visible in front. Light comes from DIRECTLY BEHIND the legs (pure backlight, no side component). The entire front surface of the legs is completely dark, only a thin bright rim of light traces the outer edge contour of the legs. Silhouette-like, very dark front. Mid-calf to shoes only. Dark background. Black and white, high contrast.

«Перекрывают, но ступни под 90°, свет это не свет, просто обводка белая»

body_ref_side_legs_v5 — мягкий свет, перекрытие

body_ref_side_legs_v5 — мягкий свет, перекрытие
params flux · flux.2-max · 16:9
prompt
Side profile view of two legs in dark business suit trousers and black leather dress shoes matching the reference. Both legs hang vertically in mid-air, parallel, overlapping in profile. Feet are completely relaxed and limp — toes drooping down at about 30 degrees below horizontal, like a dead weight. The front of the legs facing camera is dark. Subtle natural backlight creates a soft glow along the edges, NOT a sharp white outline. Mid-calf to shoes only. Dark background. Black and white photograph, high contrast, 35mm grain.

«Не, кстати хорошо, если сможешь фон отрезать хорошо, то вполне себе пойдут на окно»

rembg → body_ref_side_legs_v5_cut.png. Вставил на m2_window_tight_v2:

m2_legs_mockup — mockup с ногами на фоне окна (сборку пользователь потом переделал в Photoshop)

m2_legs_mockup — mockup с ногами на фоне окна (сборку пользователь потом переделал в Photoshop)

«Я в фотошопе сам наклеил ноги на окно, тот же файл»

«Сидрим 4.5 списан»

Evolink ещё пуст. Попробовали Flux edit на OR — проигнорировал mockup, нарисовал сидящего мужика. Flux не следует layout'у так, как Seedream.

shot_legs_backlight_final — Flux, но нарисовал сидящего

shot_legs_backlight_final — Flux, но нарисовал сидящего
params flux · flux.2-flex · 16:9
prompt
Render this as one cinematic black and white photograph. The composition matches reference 2 — legs hanging in front of a bright window with backlight. The room style, wallpaper and atmosphere match reference 1. Blend the legs seamlessly into the room. Same 35mm film grain, high contrast, deep blacks.

Агент перепутал порядок рефов — Flux брал M1 как главный.

«Прости, а нахуя ты Флюксу дал первой картинкой общий кадр комнаты?»

Переставил — mockup первым, M1 вторым. Flux всё равно поставил на табуретку:

shot_legs_backlight_v2 — переставил рефы, но на табуретке

shot_legs_backlight_v2 — переставил рефы, но на табуретке
params flux · flux.2-flex · 16:9
prompt
Render this as one cinematic black and white photograph. Keep the exact composition from reference 1 — hanging legs in front of a bright window. Blend the legs seamlessly into the room. The room wallpaper and style match reference 2. Same 35mm film grain, high contrast.

Seedream 4.5 на OpenRouter (bytedance-seed/seedream-4.5) — композиция офигенная, но голые ноги и другое окно:

shot_legs_backlight_sd45 — 4.5 OR, не держит рефы

shot_legs_backlight_sd45 — 4.5 OR, не держит рефы
params banana · bytedance-seed/seedream-4.5 · openrouter · 16:9
prompt
Render this as one cinematic black and white photograph. The exact composition from reference 1 — legs hanging in front of a bright window with backlight. Blend the legs seamlessly into the window scene. Same 35mm film grain, high contrast, deep blacks.

«Вообще вариант с табуреткой хорош, надо только убрать табуретку»

Попытка убрать табуретку через Seedream 4.5 на OR — ноги фронтальные, комната другая:

shot_legs_no_stool — табуретка убрана, но сцена перевосстановлена

shot_legs_no_stool — табуретка убрана, но сцена перевосстановлена
params banana · bytedance-seed/seedream-4.5 · openrouter · 16:9
prompt
Same image as reference 1 but the wooden stool is removed. The shoes and legs hang freely in mid-air with empty space and floor below them. Everything else stays exactly the same — same window, same curtains, same wallpaper, same lighting, same framing.

«Ну сидрим хуй положил на позу и на саму комнату, ты явно криво его промптишь»

Правда: 4.5 переинтерпретирует рефы вместо следования layout'у, это отличие от 5.0-lite который на Evolink держит композицию.

«Ну так давай договоримся, что Сидрим 4.5 ты вообще не используешь, он так себе»

Списан. Остаётся только:
- Seedream 5.0-lite через Evolink (держит layout).
- Flux 2 Max через OpenRouter (для location shots без violence).

«Пополню»

Итог дня

За пять часов работы:
- shot1_video_door_kick.mp4 — первое утверждённое видео с бандитом, финал 10-сек сцены сессии 1.
- Формализована форма Seedance-промпта: Style:/Duration:/Camera: + @Image + timecodes + буквальная физика + negatives.
- Kling O3 протестирован: вдвое дешевле и быстрее Seedance, но качество ниже — для быстрых итераций или черновика, не для финалов.
- Найдена фича MUAPI — @character:ID для persistent identity. Работает только через MUAPI API напрямую, не прокидывается через OR/Evolink.
- Выяснено, что листы персонажей — для верификации человеком, идентичность в видео даёт character_id.
- Проект переехал в отдельный git-репо scripts/movie_experiment/ со структурой src/approved/archive/docs/.
- Gemini vision bbox встал как инструмент авто-кропа character sheet'ов (~1 цент за запрос).
- Правило для промптов: буквальные физические описания, не метафоры и не состояния.
- Seedream 4.5 списан — не держит рефы, используем только 5.0-lite через Evolink.
- Подготовлен pose-ref body_ref_side_legs_v5 — профильные висящие ноги с расслабленными ступнями. Ждём пополнения Evolink чтобы собрать shot2_legs_backlight.