Содержание
  1. Что подаётся на вход и что получается на выходе
  2. Опорные кадры в BytePlus: два image_url с role
  3. Опорные кадры в Luma Agents: start_frame и end_frame
  4. Где контракты расходятся: BytePlus и omni reference
  5. Где контракты расходятся: Luma Agents и duration 10s
  6. Сводная таблица: одна задача в двух API
  7. Учебный двухкадровый пример и условная проверка
  8. Что сохранить вместе с результатом
  9. Частые вопросы
Подборки и сравнения

Аналог Seedance: переход между первым и последним кадром

31 октября 2026 · 10 минут чтения

Аналог 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 не рекомендуется.

Отдельная деталь, которую легко пропустить: первый и последний кадры могут быть идентичными. Такое поведение описано в документации; учитывайте его при подготовке кадров.

Схема запроса в нотации документации выглядит так:

JSON11 строк
{
  "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:

PYTHON12 строк
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 разрешают также заданное соотношение сторон.

Читайте также

3 материала