Аналог Seedance для перехода между первым и последним кадром строится на одном входе: две опорные картинки плюс текст, а на выходе получается один клип между ними. В BytePlus ModelArk кадры задаются двумя объектами image_url с ролями first_frame и last_frame. В Luma Agents ту же задачу решают video.start_frame и video.end_frame. Ниже — карта переноса одной задачи между двумя документированными API.
Что подаётся на вход и что получается на выходе
Задача формулируется одинаково у обоих владельцев API. В документации BytePlus ModelArk сценарий описан как image-to-video (first and last frames): на вход идёт изображение первого кадра, изображение последнего кадра и необязательный текстовый промпт, на выходе — один целевой ролик. Тот же вход описан в документации Luma Agents: изображение передаётся как video.start_frame, video.end_frame или оба сразу, а промпт описывает движение между ними.
Разница в том, как именно выражается «между». BytePlus принимает ровно две картинки в режиме first/last. Luma Agents принимает от одной до двух опорных картинок: допустим только первый кадр, только последний, оба или ни одного — при отсутствии обоих запрос уходит в чистый text-to-video.
У BytePlus текстовый промпт в сценарии first/last необязателен. Luma Agents требует промпт длиной от 1 до 6000 символов; он описывает движение между опорными кадрами. В документации Luma Agents промпт для двухкадрового примера сформулирован как поворот персонажа к камере с улыбкой, а параметры кадров идут отдельными полями. В документации BytePlus промпт описывает ожидаемое видео, а кадры передаются объектами image_url в списке content.
Практический вывод для читателя: одна и та же пара картинок переносится между API почти без изменений, меняется только способ адресации. Ниже — как это выглядит в каждом случае.
Опорные кадры в BytePlus: два image_url с role
В документации BytePlus ModelArk сценарий first/last требует двух объектов image_url, и поле role обязательно. Первому кадру присваивается first_frame, второму — last_frame. Оба объекта лежат в списке content рядом с текстовым элементом.
Поддерживаемые модели для этого сценария перечислены в документации: Dreamina Seedance 2.5, серия Dreamina Seedance 2.0, Seedance 1.5 pro и Seedance 1.0 pro. Для сценария с одним первым кадром достаточно одного объекта image_url с ролью first_frame либо с пустым role.
Требования к картинкам в документации заданы явно: форматы jpeg, png, webp, bmp, tiff, gif, а для Seedance 1.5 pro и новее — heic и heif; соотношение сторон в диапазоне от 0.4 до 2.5; ширина и высота от 300 до 6000 пикселей; одиночное изображение меньше 30 МБ; тело запроса не больше 64 МБ. Для больших файлов Base64 не рекомендуется.
Отдельная деталь, которую легко пропустить: первый и последний кадры могут быть идентичными. Такое поведение описано в документации; учитывайте его при подготовке кадров.
Схема запроса в нотации документации выглядит так:
{
"model": "seedance-1-5-pro-251215",
"content": [
{ "type": "text", "text": "The kitten is yawning at the camera." },
{ "type": "image_url", "image_url": { "url": "https://example.com/first.jpg" }, "role": "first_frame" },
{ "type": "image_url", "image_url": { "url": "https://example.com/last.jpg" }, "role": "last_frame" }
],
"resolution": "720p",
"ratio": "16:9",
"duration": 5
}
Адреса картинок здесь учебные. Подставьте свои публичные URL или Base64-строку в формате data:image/png;base64,... со строчным указанием формата.
Опорные кадры в Luma Agents: start_frame и end_frame
В документации Luma Agents опоры задаются внутри объекта video: start_frame — первый кадр, end_frame — последний. Оба поля принимают одну и ту же форму ImageRef, что и image_ref в запросах на изображения: публичный URL, встроенные base64-данные с media_type или file_id из Files API.
Модель для видео в документации указана одна — ray-3.2. Тип запроса — "video". Промпт обязателен, длина от 1 до 6000 символов; в рекомендациях документации — конкретика по субъекту, движению, движению камеры, свету и темпу.
Пример из документации в нотации Python:
generation = client.generations.create(
model="ray-3.2",
type="video",
prompt="The character turns to face the camera and smiles",
aspect_ratio="16:9",
video={
"resolution": "720p",
"duration": "5s",
"start_frame": {"url": "https://example.com/opening-frame.jpg"},
"end_frame": {"url": "https://example.com/closing-frame.jpg"},
},
)
Обратите внимание на тип duration: в Luma Agents это строка "5s", в BytePlus — целое число секунд. Это разные контракты, и переносить значение между ними без изменения типа нельзя.
Документация Luma Agents отдельно оговаривает: допустим любой из кадров, оба или ни одного; при отсутствии обоих запрос уходит в чистый text-to-video. Для крупных файлов рекомендуется хостируемый URL вместо встроенного base64.
Где контракты расходятся: BytePlus и omni reference
В документации BytePlus ModelArk прямо сказано: image-to-video (first frame), image-to-video (first and last frames) и omni reference-to-video — взаимно исключающиеся сценарии, и смешивать их нельзя. Если вы задали два image_url с ролями first_frame и last_frame, добавлять к ним референсные изображения, видео или аудио в том же запросе нельзя.
Документация описывает обходной путь: в omni reference-сценарии можно указать референсные изображения как первый и/или последний кадр в промпте и тем самым косвенно получить эффект «first/last + omni references». Но там же сказано, что для строгого совпадения первого и последнего кадров с заданными картинками следует использовать именно image-to-video (first and last frames) с ролями first_frame и last_frame.
Практический смысл: если задача — точный переход между двумя кадрами, выбирайте сценарий first/last без примесей. Если нужны референсы персонажа или стиля, это отдельный сценарий с другим контрактом и другой приёмкой.
Где контракты расходятся: Luma Agents и duration 10s
В документации Luma Agents сказано прямо: start_frame и end_frame не поддерживаются при duration: "10s". Тот же запрет продублирован в таблице валидации: video.duration принимает 5s или 10s, и 10s отклоняется при наличии hdr, start_frame или end_frame.
Multi-keyframe image-to-video — отдельный контракт. Он использует два параллельных массива: keyframes (от 1 до 64 опорных изображений) и keyframe_indexes (позиции в сетке выходных кадров). Индексы считаются в сетке duration × 24fps: для 5s это 0–120, для 10s — 0–240. Оба массива должны быть одинаковой длины, и передавать нужно либо оба, либо ни одного.
Документация подчёркивает взаимную исключимость: keyframes несовместим с start_frame, end_frame и loop. Одиночная опора в индексе 0 эквивалентна start_frame, поэтому одновременная передача обоих полей в одном запросе даёт ошибку 400.
Разница в возможностях описана в документации: multi-keyframe идёт через полный путь Ray 3.2 и снимает ограничения пары start/end — доступны произвольные позиции кадров, duration: "10s" и hdr: true.
Сводная таблица: одна задача в двух API
| Параметр | BytePlus ModelArk | Luma Agents |
|---|---|---|
| Поле первого кадра | image_url с role: "first_frame" |
video.start_frame |
| Поле последнего кадра | image_url с role: "last_frame" |
video.end_frame |
| Обязательность роли | Обязательна в сценарии first/last | Не применимо |
| Тип duration | Целое число секунд | Строка, например "5s" |
| Модель в примере | seedance-1-5-pro-251215 |
ray-3.2 |
| Смешивание с референсами | Взаимно исключается с omni reference | keyframes исключается с start_frame/end_frame |
| Ограничение по длине | Зависит от модели | 10s не поддерживается с start/end |
| Формат адреса картинки | URL, Base64, asset ID | URL, base64 с media_type, file_id |
Таблица показывает, что перенос задачи сводится к переименованию полей и смене типа duration. Логика «две картинки плюс промпт» сохраняется.
Учебный двухкадровый пример и условная проверка
Возьмём учебный пример. Кадр A: чайник слева на деревянном столе. Кадр B: тот же чайник справа, камера, свет и фон не меняются. Оба файла обозначены как учебные; редакция их не генерировала и не снимала.
Промпт для этого перехода:
Один непрерывный кадр: чайник плавно перемещается слева направо по столу, камера и свет не меняются, фон остаётся прежним.
В BytePlus этот пример разворачивается в два объекта image_url с ролями first_frame и last_frame плюс текстовый элемент в content. В Luma Agents те же картинки идут в video.start_frame и video.end_frame при duration: "5s".
План самостоятельной проверки; редакция этот эксперимент не выполняла: сверьте первый кадр клипа с кадром A, последний — с кадром B. Проверьте, что ручка и пропорции чайника не деформированы, а фон и свет не сменились. Если последний кадр обрезан или фон изменился, результат не принят — меняйте один вход за раз.
Отдельно про обрезку: в документации BytePlus сказано, что при несовпадении пропорций первого и последнего кадров первый кадр имеет приоритет, а последний автоматически обрезается под него. Для учебного примера это значит, что оба кадра стоит подготовить в одинаковом соотношении сторон заранее.
Что сохранить вместе с результатом
Положите рядом исходные кадры, точный запрос, идентификатор задачи и скачанный клип. Отдельно запишите, какое кадрирование применялось к последнему изображению. Такая карточка позволит отличить изменение входа от ошибки перехода при следующем запуске. Для повторного сравнения используйте те же файлы и ту же последовательность проверки; случайная смена исходника делает вывод о переносе непроверяемым.
Частые вопросы
Чем заменить Seedance для перехода между первым и последним кадром?
Документированный маршрут — Luma Agents с моделью ray-3.2: поля video.start_frame и video.end_frame решают ту же задачу, что сценарий first/last в BytePlus ModelArk. Оба API принимают две опорные картинки и возвращают один клип. У BytePlus промпт необязателен, Luma Agents требует текст длиной от 1 до 6000 символов. При переносе сверяйте имена полей, тип duration и ограничения модели.
Как задать первый и последний кадр в BytePlus?
В списке content размещаются два объекта image_url, и поле role обязательно: первому кадру присваивается first_frame, второму — last_frame. Рядом идёт текстовый элемент с промптом. Сценарий поддерживают Dreamina Seedance 2.5, серия 2.0, Seedance 1.5 pro и Seedance 1.0 pro.
Можно ли смешать first/last кадры с референсами в BytePlus?
В документации сказано, что сценарии first frame, first and last frames и omni reference-to-video взаимно исключаются и не смешиваются. Косвенный обходной путь — указать референсные изображения как первый и последний кадр в промпте, но для строгого совпадения с заданными картинками нужен именно сценарий first/last.
Почему Luma Agents не принимает start_frame при duration 10s?
Документация Luma Agents прямо указывает: start_frame и end_frame не поддерживаются при duration: "10s". Тот же запрет действует для hdr и loop. Для десятисекундного клипа с опорами используется multi-keyframe image-to-video — отдельный контракт с массивами keyframes и keyframe_indexes.
Что делать, если пропорции первого и последнего кадра разные?
В документации BytePlus сказано: первый кадр имеет приоритет, а последний автоматически обрезается под его пропорции. Подготовьте оба кадра в одинаковом соотношении сторон до отправки запроса. В Dreamina Seedance 2.5 сценарий first/last допускает только ratio: adaptive; серии 2.0, 1.5 pro и 1.0 разрешают также заданное соотношение сторон.
