Аналоги Runway: как перенести задачу в другой API — это заполнить одну карту переноса для трёх документированных сервисов. Учебная задача: короткий ролик из текстового описания, неподвижная камера, синий чайник на столе, без надписей и людей. Ниже — modelID, канал запроса, место для taskID и финального URL по каждому API.
Три API и их modelID
Runway в официальном руководстве для разработчиков описывает модель gen4.5: генерация видео из изображения идёт через POST /v1/image_to_video с обязательным полем promptImage, а текст-в-видео — через POST /v1/text_to_video без картинки. Это два разных эндпоинта, и смешивать их не нужно: у каждого свой набор обязательных полей.
Luma Agents в актуальном руководстве по генерации видео использует модель ray-3.2. Запрос уходит на POST https://agents.lumalabs.ai/v1/generations, обязательные поля — model, type, prompt, а параметры вывода лежат во вложенном объекте video. Старый Ray2 SDK для этой задачи не подходит: текущий гайд описывает именно ray-3.2.
MiniMax в документации по генерации видео предлагает модель MiniMax-H3. Запрос уходит на POST https://api.minimax.io/v2/video_generation, а вход собирается из массива content[], где каждый элемент различается по type — текст, изображение, видео или аудио.
| Сервис | modelID | Канал запроса |
|---|---|---|
| Runway | gen4.5 | POST /v1/text_to_video или POST /v1/image_to_video |
| Luma Agents | ray-3.2 | POST https://agents.lumalabs.ai/v1/generations |
| MiniMax | MiniMax-H3 | POST https://api.minimax.io/v2/video_generation |
Три разных владельца — три разных контракта. Ключ одного аккаунта не подходит остальным, и переносить поля между схемами нельзя.
Где задаётся изображение или описание
У Runway текст-в-видео описан полем promptText в запросе на POST /v1/text_to_video. Для режима с картинкой в официальном руководстве показан POST /v1/image_to_video, где promptImage обязателен, а в качестве значения принимается URL изображения или строка base64 в виде data URI. Тот же гайд приводит пример с моделью gen4_image, где референсы передаются массивом referenceImages с полями uri и tag, а в promptText на них ссылаются через синтаксис at-mention.
У Luma Agents описание задаётся полем prompt верхнего уровня, а исходное изображение — через video.start_frame, video.end_frame или оба сразу. Руководство описывает формат ImageRef: публично доступный url, inline base64 с media_type или file_id из Files API. Для мультиключевого режима используются параллельные массивы keyframes и keyframe_indexes.
У MiniMax текст и картинка лежат в одном массиве content[]. Элемент с type: text несёт описание, элемент с type: image_url и role: first_frame задаёт первый кадр, а role: last_frame — последний. Документация отмечает: без изображения, видео и аудио на входе режим становится текстом-в-видео.
Где возвращается taskID и финальный URL
Runway: создание задачи возвращает идентификатор, а статус читается через GET /v1/tasks/{id}. В официальном SDK-типе TaskRetrieveResponse успешный терминальный статус — SUCCEEDED, и в нём есть поле output — массив URL. Финальный адрес берётся как первый элемент output[0].
Luma Agents: успешный submit возвращает HTTP 201 с полем id верхнего уровня. Статус читается через GET /v1/generations/{id} до completed или failed. На завершении каждая запись в output несёт presigned url на MP4.
MiniMax: создание задачи возвращает task_id. Статус читается через GET /v2/query/video_generation/{task_id}, а при status: succeeded ответ напрямую содержит task.content.url — ссылку на скачивание.
| Сервис | Где taskID | Где финальный URL |
|---|---|---|
| Runway | ответ на создание задачи | output[0] при SUCCEEDED |
| Luma Agents | id в ответе 201 |
presigned url в output |
| MiniMax | task_id в ответе |
task.content.url при succeeded |
Срок жизни временной ссылки
У Runway официальный SDK-тип TaskRetrieveResponse описывает поле output как массив URL, которые истекают в течение 24–48 часов, и советует повторно запросить задачу, чтобы получить свежие адреса. Скачивать результат нужно в своё хранилище.
У Luma Agents руководство прямо указывает: presigned URL истекает через 1 час. Повторный GET /v1/generations/{id} выдаёт новый адрес, а идентификатор генерации не истекает — его сохраняют, если позже планируется редактирование, продление или смена кадра.
У MiniMax в документации по генерации видео срок жизни ссылки на скачивание не указан. В карте переноса это поле помечается как unknown, и решение о хранении принимается с учётом этого пробела: результат лучше скачать сразу после успешного статуса.
Если исход POST неизвестен
Ситуация: запрос на создание задачи ушёл, а ответ не пришёл — таймаут, обрыв связи, ошибка сети. Правило одно: сначала попытаться прочитать идентификатор задачи, и только потом принимать решение о повторе.
Порядок действий при неизвестном исходе POST:
- Проверить, вернул ли ответ идентификатор. У Runway это идентификатор задачи, у Luma Agents —
idиз ответа 201, у MiniMax —task_id. - Если идентификатор есть — читать существующую задачу через GET-эндпоинт провайдера. Это не создаёт новую генерацию.
- Если идентификатора нет — не выдумывать его. Сверить консоль аккаунта, список задач и документацию провайдера.
- Зафиксировать исход записи как
unknownи не повторять оплаченный запрос автоматически.
GET-проверка безопасна: она возвращает состояние уже созданной задачи и не запускает новую генерацию. Автоматический повтор POST при неизвестном исходе рискует создать вторую задачу и второе списание.
UI и API — разные поверхности
Интерфейсы Runway, Luma и MiniMax и их API — разные поверхности с разными контрактами. Поле, которое видно в веб-форме, не обязано совпадать по имени и типу с полем в JSON-запросе, а поведение кнопки в интерфейсе не описывает поведение эндпоинта.
SDK у трёх сервисов тоже разные. Runway публикует SDK для Node и Python с методами вида client.textToVideo.create и client.imageToVideo.create. Luma Agents показывает примеры на Python, TypeScript, Go и cURL. MiniMax в документации приводит Python-пример с библиотекой requests и собственными функциями для создания задачи, опроса статуса и скачивания файла.
Единого кода, который одинаково работал бы со всеми тремя API, нет. Перенос задачи означает перенос контракта: те же смысловые шаги — submit, poll, download — но с другими именами полей, эндпоинтами и типами значений.
Типы полей: duration и не только
Ключевое расхождение — тип поля длительности. У Luma Agents в руководстве по ray-3.2 video.duration передаётся строкой "5s". Числовое значение 5 не соответствует этому полю. Значение по умолчанию — "5s", второе допустимое — "10s", и оно не поддерживается вместе с hdr, start_frame или end_frame.
У Runway в примерах официального руководства duration — целое число: duration: 5. У MiniMax в документации по генерации видео duration тоже целое число, и оно принимает только целые значения в диапазоне 4–15 секунд.
Копировать поле duration из одного API в другой нельзя: строка "5s" у Luma и число 5 у Runway и MiniMax — разные типы, и подстановка неверного типа приведёт к ошибке валидации. То же касается схем идентификаторов, статусов и сроков жизни ссылок: для них нужно сопоставить назначение и допустимые значения в каждой схеме API.
Карта переноса одной задачи
Ниже — заполненная карта для учебной задачи: неподвижная камера, синий чайник на столе, без надписей и людей. Это пример структуры запроса; генерацию редакция не выполняла.
| Поле | Runway | Luma Agents | MiniMax |
|---|---|---|---|
| modelID | gen4.5 | ray-3.2 | MiniMax-H3 |
| Канал | POST /v1/text_to_video |
POST /v1/generations |
POST /v2/video_generation |
| Описание | promptText |
prompt |
content[], type: text |
| Изображение | promptImage на /v1/image_to_video |
video.start_frame |
role: first_frame |
| taskID | ответ на создание | id в ответе 201 |
task_id |
| Статус | GET /v1/tasks/{id} |
GET /v1/generations/{id} |
GET /v2/query/video_generation/{task_id} |
| Финальный URL | output[0] |
presigned url в output |
task.content.url |
| TTL ссылки | 24–48 часов | 1 час | unknown |
| duration | число 5 | строка "5s" |
число 5 |
Промпт для учебной задачи, который можно скопировать и вставить:
A plain blue teapot on a wooden table. Static camera. No text, no people, no extra objects.
Для этой текстовой задачи используйте отдельное тело запроса каждого API. В примерах ниже заполнены поля, показанные в документации; авторизацию настройте по инструкции соответствующего провайдера.
Runway, POST /v1/text_to_video:
{
"model": "gen4.5",
"promptText": "A plain blue teapot on a wooden table. Static camera. No text, no people, no extra objects.",
"ratio": "1280:720",
"duration": 5
}
Luma Agents, POST /v1/generations:
{
"model": "ray-3.2",
"type": "video",
"prompt": "A plain blue teapot on a wooden table. Static camera. No text, no people, no extra objects.",
"aspect_ratio": "16:9",
"video": {
"resolution": "720p",
"duration": "5s"
}
}
MiniMax, POST /v2/video_generation:
{
"model": "MiniMax-H3",
"content": [
{
"type": "text",
"text": "A plain blue teapot on a wooden table. Static camera. No text, no people, no extra objects."
}
],
"duration": 5,
"resolution": "2K",
"ratio": "16:9"
}
В готовом промпте заменяйте название предмета, описание фона и движение камеры обычным текстом. Настройки разрешения у сервисов различаются; одинаковое описание не гарантирует одинаковый видеорезультат.
Частые вопросы
Чем заменить Runway, если нужен другой API?
Три документированных варианта: Runway gen4.5, Luma Agents ray-3.2 и MiniMax-H3. Каждый работает через свой эндпоинт и свой modelID. Выбор зависит от того, какой контракт подходит вашей задаче.
Как перенести задачу, не запустив её дважды?
Сначала прочитать идентификатор задачи из ответа. Если ответ не пришёл, сверить консоль и список задач, зафиксировать исход как unknown и не повторять POST автоматически. GET-проверка не создаёт новую генерацию.
Почему duration у Luma — строка, а у других число?
В руководстве по ray-3.2 video.duration принимает значения "5s" и "10s" как строки. У Runway и MiniMax в примерах это целое число. Копировать поле между API нельзя — типы разные.
Сколько живёт ссылка на результат?
У Runway официальный SDK-тип указывает 24–48 часов, у Luma Agents presigned URL истекает через 1 час. У MiniMax срок в документации не указан, поэтому в карте стоит unknown. Результат лучше скачать сразу.
Можно ли использовать один SDK для всех трёх API?
Нет. Runway публикует SDK для Node и Python, Luma показывает примеры на Python, TypeScript, Go и cURL, MiniMax приводит Python-пример с requests. Для каждого API нужен свой запрос с соответствующими полями. Общим остаётся описание задачи и критериев приёмки.
