Pro API: генерация видео со звуком

Клип из промпта или анимация изображения, которое ты предоставляешь. Файл в формате MP4, со звуком, если ты об этом попросишь.

Создать видео

POST /videos

json
{ "prompt": "a woman in a white linen dress walks along a beach at sunset, wind in her hair, she turns and smiles at the camera",
  "width": 1080, "height": 1920, "audio": true }
ПолеТипПо умолчаниюЧто делает
promptstringобязательноеДействие, настроение, свет. Описывай движение.
width, heightint720 x 1280По умолчанию вертикальный. Смотри сетку цен ниже.
qualitystringmax: режим Ультра (самый детальный рендер), см. Режим Ультра.
consistencystringstandardenhanced: усиленная согласованность, более стабильное движение, лица и фон на протяжении всего времени, до 721 кадра за кадр (30 с при 24 fps, 24 с при 30), расширения включены. Только в режиме Качество. См. Усиленная согласованность.
modestringltx25ltx25: движок 2.5 (звук, автоматическая длительность, 1080p, конечный кадр). turbo: отключён 11 октября 2026 года; запрос turbo рендерится в Качество 480p (та же ориентация, та же длина, не более 241 кадра, фиксированная длина), по цене Качество 480p.
duration_autobooltrueДвижок определяет длину из промпта, до 20 с при 24 fps (16 с при 30, 8 с при 60: ограничение считается в кадрах, см. fps), а length тогда игнорируется. Установи false для фиксированной длины, заданной через length. При consistency enhanced выше 30 fps длина всегда фиксированная (иначе fps_requires_fixed_duration).
lengthint121Длина в кадрах при частоте fps, всегда вида 8n+1; длительность равна (length - 1) / fps. Максимум 481 (721 при consistency enhanced). При 24 fps: 73 (3 с), 121 (5 с), 241 (10 с), 361 (15 с), 481 (20 с; 721, то есть 30 с, в enhanced). При 30: 241 (8 с), 481 (16 с; 721, 24 с). При 60: 241 (4 с), 481 (8 с; 721, 12 с). Используется для фиксированной длины (duration_auto установлен в false); игнорируется при автоматической длительности.
fpsint30Частота кадров в кадрах в секунду: 24, 30 или 60. По умолчанию 30, рекомендуемая настройка (чёткое движение); 60: самая плавная; 24: кинематографическая. 50, только с consistency enhanced, даёт лёгкое замедление (примерно 0,83x: движок задаёт движение как при 60 и воспроизводит при 50). length считается в кадрах при этой частоте. Цена не меняется (фиксированная за клип); максимальная длина меняется, так как считается в кадрах. Расширение сохраняет частоту кадров предыдущего клипа, а последовательность, частоту первого кадра. Частота, которую режим не поддерживает: invalid_fps, где перечислены допустимые.
audioboolfalseЗвук, генерируемый вместе с изображением (атмосфера, голос). Удваивает цену клипа (см. Форматы и цена).
imagestringНачальный кадр в base64: видео анимирует это изображение.
end_imagestringКонечный кадр в base64, вместе с image: клип переходит от одного к другому (только движок 2.5). Переход выдаётся в запрошенном размере от 480p до 1080p и оплачивается как клип этого формата.
keyframesarrayКлючевые кадры (режим Качество): от 1 до 4 объектов { "image": base64, "at": seconds, "strength": 0.1 to 1 (1 by default) }. Клип показывает каждое изображение в нужный момент, например персонажа в середине кадра, который начинается и заканчивается на пустой локации. Длина становится фиксированной (length, duration_auto принудительно false); 0 < at < length, не менее 0,5 с между двумя ключевыми кадрами; точность около трети секунды. Работает с image и end_image. Не в Ультра и не в Multi-Ref; в расширении только с consistency enhanced (см. Усиленная согласованность). Та же цена, что и у клипа того же формата.
lora, lora_strengthstring, numberОбученный персонаж на аккаунте (name из GET /loras) и его сила (от 0 до 1).
lora2, lora2_strengthstring, numberВторой персонаж.
multirefobjectДобавь от 1 до 4 персонажей (12 в Ультра) из GET /characters, а также сохранённые объекты, животных и локацию из GET /subjects, вызываемых через @Имя в промпте, см. Multi-Ref Видео.
seedintслучайныйСид рендера, от 0 до 4294967295. Одинаковый seed, тот же промпт, то же изображение и те же настройки (формат, длина, звук, режим) дают один и тот же клип с незначительными отличиями при смене видеокарты. При автоматической длительности иначе выбранная длина меняет клип: для точного воспроизведения установи duration_auto в false и укажи length.
stepsintдвижокОставь пустым.

Частота кадров по умолчанию: 30 fps. Раньше клипы рендерились при 24 fps. Без fps клип той же length будет короче, чем прежде (241 кадр: 8 с вместо 10 с). Отправь "fps": 24, чтобы сохранить прежнее поведение.

Ответ:

json
{ "jobId": "...", "seed": 908172, "cost": 30 }

Стоимость рассчитывается и объявляется при отправке, до любого списания. seed тоже возвращается, независимо от того, задал ли ты его или он был выбран случайно.

Форматы и цена

Видео тарифицируется по формату как фиксированная ставка независимо от его длины. База: 5 кредитов.

Фиксированная ставка умножается на 2 при 720p и на 3 при 1080p, а звук удваивает цену. Коэффициенты применяются к базовой ставке, а не друг к другу: 1080p со звуком стоит 5 x 3 x 2 = 30 кредитов. До 481 кадра, то есть 20 с при 24 fps, длина ничего не меняет (5 с или 20 с, та же ставка). Свыше 481 кадра (до 721, только с consistency enhanced, фиксированная длина) цена формата удваивается. Частота кадров (fps) не меняет цену, но уровни считаются в кадрах: при 30 fps обычная цена действует до 16 с; при 60, до 8 с (12 с по двойной цене в enhanced).

Одно исключение: в Качестве 480p без звука стоит 2 кредитов, независимо от длины (с 11 октября 2026 года). Multi-Ref и усиленная согласованность сохраняют фиксированную ставку формата, 5 кредитов.

ФорматКороткая сторонаПримеры размеровБез звукаСо звуком
480p480480 x 832, 832 x 4802 (5 в Multi-Ref и усиленной согласованности)10
720p720720 x 1280, 1280 x 7201020
1080p10801080 x 1920, 1920 x 10801530

Размер, который ты получаешь. Движок работает в кратных 32 и в два этапа, поэтому файл выходит 768 x 1280 (или 1280 x 768) для 720p и 1088 x 1920 (или 1920 x 1088) для 1080p. 480p остаётся 480 x 832 (или 832 x 480), кроме режима усиленной согласованности. Это важно, если ты склеиваешь или накладываешь наши рендеры.

Режим turbo был отключён 11 октября 2026 года: запрос turbo рендерится в Качество 480p и оплачивается соответственно (2 кредитов без звука, 10 со звуком).

Узнай цену до отправки

POST /videos/quote принимает то же тело, что и POST /videos, и выполняет те же расчёты, но ничего не создаётся: нет рендера, не резервируются кредиты, не расходуется квота. Вызывай его перед подтверждением, особенно при работе агента в рамках бюджета.

json
{ "cost": 30, "mode": "ltx25", "format": "1080p", "audio": true, "fps": 30, "duration_auto": true,
  "seconds_max": 16, "detail": "flat 5 x 3 (1080p) x 2 (sound) = 30" }

detail поясняет расчёт; fps: использованная частота кадров, а seconds_max: длина в секундах при этой частоте. С "consistency": "enhanced" запрос принимает фиксированную длину до 721 кадра и применяет ставку свыше 481 кадра (x 2 (over 20 s) в detail при 24 fps, x 2 (over 481 frames) при другой частоте). Тот же маршрут существует для изображений, POST /images/quote, который всегда отвечает { "cost": 1, ... }: изображение всегда стоит 1 кредит.

Для клипа Ультра с посекундной оплатой смета указывает оплачиваемую длительность в seconds, а detail расписывает цену за секунду.

Опрос, загрузка, отмена

Те же маршруты, что и для изображений, в разделе /videos.

  • GET /videos/{jobId}: pending / completed / failed, те же поля. Расширение с усиленной согласованностью может завершиться как failed с "error": "extension_not_applied" (движок не подхватил конец предыдущего клипа): ничего не списывается, отправь заново.
  • GET /videos/{jobId}/file: MP4 (Content-Type: video/mp4).
  • POST /videos/{jobId}/cancel: отменяет, ничего не списывается.

В Ультра с посекундной оплатой рендер, который уже рассчитывается, больше не останавливается: отмена отвечает 409 render_in_progress, и клип доставляется и оплачивается. Клип, который движок отклоняет на выходе, завершается как failed, с фразой в detail и кодом движка в reason: ничего не списывается.

Видео занимает от 1 до 5 минут, дольше при холодном старте движка. Опрашивай каждые 3 секунды и скачивай сразу после получения статуса completed: файл не архивируется.

Несколько кадров в одном клипе

Один промпт может содержать несколько кадров с жёсткими склейками, всего до 20 секунд при 24 fps (16 с при 30, по умолчанию). Описывай их по порядку: Shot 1: <framing>, <action>. Cut to Shot 2: .... Повторяй в каждом кадре всё, что должно оставаться неизменным (персонаж, одежда, место, свет), и заканчивай одной строкой общего настроения.

Не указывай тайм-коды: оставь duration_auto включённым, и движок сам определит длину (до 20 с при 24 fps, 16 с при 30) и место склейки. Лучше всего работают два-четыре кадра на клип.

text
A cinematic sequence of three shots, same woman, same place, same lighting throughout.
Shot 1: Wide shot, night, light rain on a narrow Paris street with glowing café windows. A woman in a long beige trench coat walks toward the camera under a transparent umbrella, wet cobblestones reflecting warm yellow streetlights.
Cut to Shot 2: Close-up on her face under the umbrella, raindrops on the plastic, warm café light on her cheek, she smiles softly.
Cut to Shot 3: Medium shot from inside the café through the rainy window, she pushes the door open and steps in, warm light spilling onto the wet pavement.
Calm, melancholic, romantic mood.

Несколько кадров в одном клипе или последовательность? Они делают разные вещи:

Несколько кадров в одном клипеПоследовательность (расширения)
Между кадрамиЖёсткие склейкиБез склейки: каждый кадр продолжает движение
ДлинаМаксимум 20 с при 24 fps (16 с при 30)Длиннее
РендерыОдинПо одному на кадр
ЦенаОдин клипПо одному клипу за кадр

Расширить клип

Клип можно расширить: следующий кадр продолжает движение предыдущего без остановки на стыке. Он направляется примерно по последней секунде предыдущего клипа, а не по одному стоп-кадру. Добавь в POST /videos:

ПолеТипПо умолчаниюЧто делает
extend_job_idstringКлип для расширения: рендер с твоей лицензии, взятый вскоре после завершения.
extend_framesint25Сколько кадров с конца клипа направляет следующий кадр: 9, 17, 25, 33, 41 или 49 (25, примерно 1 с при 24 fps).
extend_videostringВместо extend_job_id: конец клипа, который у тебя есть, в виде base64 MP4 ровно из extend_frames кадров, не более 8 МБ.

Расширенный кадр сохраняет разрешение предыдущего клипа: width и height игнорируются с extend_job_id, а с extend_video размер считывается из отправленного файла. Он содержит только новые кадры, так что кадры, выложенные подряд, образуют одно непрерывное видео. Он сохраняет частоту кадров предыдущего клипа: не указывай fps (он берётся оттуда) или указывай ту же; иная будет отклонена (extend_fps_mismatch). length: это новая продолжительность кадра (121 = ещё 5 с при 24 fps), и она точная: автоматическая длительность не применяется к расширению. Расширение стоит как клип.

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

Звук продолжается на стыке. При audio: true, когда конец предыдущего клипа содержит звуковую дорожку, новый кадр подхватывает этот звук вместо создания нового. С extend_job_id отрезанный конец сохраняет звук клипа; с extend_video отправь конец вместе со звуком. Без звуковой дорожки в этом конце, в усиленной согласованности и в Ультра, звук начинается заново с кадра: используй одну и ту же атмосферу в каждом промпте, чтобы стык был как можно менее заметен на слух.

Расширяй клип вскоре после его завершения. Позже он у нас уже недоступен (clip_unavailable), и ты отправляешь его конец самостоятельно в extend_video.

Расширить план Ультра вперёд или назад

План, отрендеренный в Ультра посекундно, тоже расширяется в Ультра, вперёд или назад; любой другой клип расширяется, как описано выше. Отправь POST /videos с "quality": "max" и:

ПолеТипПо умолчаниюЧто делает
extend_job_idstringПлан Ультра для расширения, отрендеренный твоей лицензией менее 24 часов назад.
extend_upload_idstringВместо него, для более старого плана: идентификатор, который возвращает POST /extensions (ниже), после загрузки его исходного файла.
extend_directionstringforwardforward рендерит продолжение; backward рендерит моменты непосредственно перед планом, чтобы поставить их перед ним.
  • Рендер содержит только новую часть, длиной с клип Ультра (length / fps, 5 с при автоматической длительности). Он берёт разрешение плана (width и height игнорируются) и стыкуется с его последним кадром (forward) или с первым (backward).
  • Без начального изображения, референсов (multiref), движения и усиленной согласованности. backward не входит в последовательность, которая ставит свои планы один за другим.
  • Цена: новая часть по цене Ультра за секунду, плюс за каждую секунду расширяемого плана 2 кредитов в 480p, 5 в 720p и 13 в 1080p (ultra.extend_per_second в GET /pricing). Эти секунды округляются вверх до целой секунды (с точностью до 0,1 с) и считаются при 24 кадрах в секунду: план с более высокой частотой кадров считается пропорционально (2 с при 60 fps считаются как 5 с). POST /videos/quote с теми же полями возвращает extend_seconds и точную цену.
  • План старше 24 часов: загрузи его исходный файл в том виде, в каком его выдал GET /videos/{jobId}/file. POST /extensions с { "size": <байты> } возвращает upload_id, upload_url, headers и expires_in (900 с); отправь файл через PUT upload_url ровно с этими headers, затем передай extend_upload_id в течение 2 часов. Одна загрузка служит для одного рендера: MP4 от 4 до 30 с, не более 60 МБ и 1080p. Перед рендером каждое видео, отправляемое в режим Ultra (движение или видео для продления), проверяется, и при отказе ничего не списывается (400 input_video_out_of_limits): от 24 до 60 кадров в секунду, соотношение ширины и высоты от 0,4 до 2,5 и на один рендер не более 30 с и 10 файлов для видео и опорных звуков вместе. Для реалистичного лица перекодированный или смонтированный файл отклоняется (400 engine_refused): проходит только оригинал. Видео, которое отрендерил не режим Ультра (например, рендер другого режима), не продлевается в Ультра, если на нём реалистичное лицо (400 extension_real_face, ничего не списывается): продли его в режиме Качество или переделай план в Ультра.

Усиленная согласованность

С "consistency": "enhanced" клип рендерится по отдельной дорожке, которая сохраняет движение, лица и фон более стабильными на протяжении времени. Она поддерживает до 721 кадра за кадр, то есть 30 с при 24 fps и 24 с при 30 (length, фиксированная длина) и предназначена в основном для длинных видео:

  • Первый кадр: обычный клип (промпт, начальный кадр, keyframes, end_image), до 721 кадра.
  • Расширение: extend_job_id (или extend_video) как в Расширить клип, с той же consistency. length по-прежнему является новой продолжительностью (до 721, то есть ещё 30 с при 24 fps). Расширение с усиленной согласованностью также принимает keyframes, где at отсчитывается от первого нового кадра, и конечный кадр end_image, устанавливаемый на последний кадр кадра: например, начальный кадр первого кадра, чтобы длинное видео зациклилось.

Только режим Качество (mode ltx25, без quality: "max"), до 1080p, не в Multi-Ref (400 consistency_mode). Цена: фиксированная ставка формата (480p без звука: 5 кредитов) до 481 нового кадра (20 с при 24 fps), удваивается сверх (см. сетку цен выше). Частоты кадров: 24, 30, 50 или 60. Выше 30 длина фиксированная (иначе fps_requires_fixed_duration); 50 даёт лёгкое замедление (см. fps). Рендер занимает больше времени, чем у стандартного клипа, а начало может ожидать более мощной видеокарты (длинные кадры). Последовательность сохраняет одинаковую consistency для всех своих кадров. Размер доставки: такой же, как в Качестве при 720p и 1080p; при 480p короткая сторона выходит 448 (448 x 832, 832 x 448, 448 x 448), так как эта дорожка работает в кратных 64.

Некоторые промпты пока не поддерживаются. Для них один кадр не более 20 с (15 с с end_image, при фиксированной длине) рендерится в стандартной согласованности по той же цене. Сверх этого (length выше 481 при duration_auto: false или выше 361 с end_image), в расширении или в последовательности запрос отклоняется с 400 consistency_explicit: укороти кадр или запроси consistency: "standard".

Длинное видео (последовательности)

Клип длится максимум 481 кадр, то есть 20 с при 24 fps (721 с усиленной согласованностью, 30 с при 24 fps). Для более длинных последовательность записывает каждый кадр по мере завершения его рендера, затем объединяет их в один MP4 без перекодирования. Одна минута, например, это 3 кадра по 20 с или 2 кадра по 30 с при усиленной согласованности при 24 fps.

  1. POST /sequences открывает последовательность и отвечает { "sequence_id": "seq_...", ... }.
  2. POST /videos с "sequence_id": "seq_..." для каждого кадра: первый как обычно, следующие с extend_job_id, установленным на предыдущий кадр. Каждый кадр записывается в последовательность в порядке отправки сразу после того, как GET /videos/{jobId} фиксирует его завершение.
  3. POST /sequences/{id}/export после завершения последнего кадра. Отвечает seconds, resolution и file_url.
  4. GET /sequences/{id}/file: собранное видео (MP4).

Дополнительно: GET /sequences/{id} возвращает состояние (записанные или ещё ожидаемые кадры), POST /sequences/{id}/clips с { "job_id": "..." } записывает рендер вручную, а DELETE /sequences/{id} удаляет последовательность немедленно.

Правила. Все кадры имеют одинаковое разрешение (расширения его сохраняют) и одинаковый выбор звука: все со звуком или все без, одинаковую consistency и одинаковую частоту кадров (fps): первый кадр их устанавливает, а кадр, который отличается, отклоняется (409 consistency_mismatch, 409 sequence_fps_mismatch; 422 encoding_mismatch для кадра, записанного вручную). Кадр без fps берёт частоту последовательности. Максимум 30 кадров на последовательность и 5 последовательностей в работе на лицензию.

Что мы храним и как долго. Кадры последовательности в работе удаляются через 30 минут после добавления последнего, а собранное видео через 24 часа после экспорта. Затем всё исчезает.

Экспорт папки проекта

Папка проекта собирает в одном ZIP всё, что нужно, чтобы продолжить работу над видео в другом месте или автоматизировать её: кадры, их референсы, монтаж и манифест, по которому каждый кадр можно отрендерить заново. Она бесплатна: ничего не рендерится.

  • POST /videos/{jobId}/export: один рендер POST /videos (отдельный кадр, Multi-Ref, продление).
  • POST /sequences/{id}/project: все кадры последовательности, один за другим.
  • Необязательное тело, те же варианты, что в окне экспорта приложения:
    • include_media (по умолчанию true): видео кадров и их подписанные оригиналы. false: никакого видео (ни клипа, ни оригинала, ни фильма); кадры сохраняют текст, настройки и референсы ("state": "expired"), а манифест содержит videos_included: false.
    • include_references (по умолчанию true): ракурсы персонажей и изображения элементов, в references/. false: ни один не копируется; их имена, @упоминания, id и отпечатки остаются в манифесте (references_included: false).
    • exclude_references: референсы, которые не нужно копировать, по одному, по id (character_id, subject_id), имени или @упоминанию, например ["@Parc", "chr_..."] (не более 200). Манифест содержит references_included: "partial" и "included": false у каждого исключённого (false, если исключены все). Элемент, который не указывает ни на один референс экспорта: 400 unknown_reference.
    • include_film (только последовательность, по умолчанию false): фильм уже собранной последовательности; требует include_media (иначе 400 invalid_export_options, как и параметр, который не является булевым, или exclude_references, который не является списком строк).
    • manifest_only: true: только манифест, без ZIP.

Ответ: { "manifest": { ... }, "file_url": "...", "export_id": "exp_...", "expires_at": "...", "bytes": n }, а GET /exports/{id}/file скачивает ZIP. Один экспорт одновременно на лицензию (409 export_in_progress), не более 2 ГБ (413 export_too_large: экспортируй кадры по одному).

ФайлСодержимое
tendre-project.jsonМанифест (схема tendre.project/1, ключи на английском). Для каждого кадра: его состояние, введённый промпт (prompt) и отправленный в движок (prompt_sent), настройки, seed, стоимость, продление (extends, direction), референсы, связанные со своими файлами, и api_request, тело POST /videos, которое рендерит кадр заново (null, если изображение было отправлено только в base64); в начале references_included: true в ZIP (файлы референсов лежат в references/), false при manifest_only (референсы без файлов: files пуст, только отпечатки sha256); манифест без этого поля (прежние экспорты) читается как true. Папка, экспортированная приложением, где клиент выбирает референсы по одному, несёт true, false или "partial", и каждый референс может нести included (если его нет: как в начале, false, если там false, иначе true); невключённый референс сохраняет имя, @упоминание, id и описание, с пустым files. project.settings содержит настройки первого кадра (quality, width, height, fps, audio, output_format "mp4") и settings_from_shot, id этого кадра. Папка, экспортированная приложением, может содержать блок app, зарезервированный для приложения: игнорируй его
shots/NN/clip.mp4Рендер каждого кадра, пока он есть на сервере; shots/NN/original.mp4 или .mov: подписанный файл движка, байт в байт, если он ещё существует
references/Ракурсы персонажей и изображения использованных локаций, объектов, животных, стилей и нарядов
timeline.otio, timeline.fcpxmlМонтаж (OpenTimelineIO; FCPXML для Final Cut Pro и DaVinci Resolve), медиа по пути относительно папки
film.mp4Собранное видео последовательности, только с include_film: true и если она уже собрана (POST /sequences/{id}/export); иначе assembled в манифесте равно null

Что мы храним и как долго. Для каждого принятого POST /videos сервер хранит карточку рендера без единого изображения или видео: текст, настройки, идентификаторы (изображение, отправленное в base64, оставляет только свой отпечаток). Она удаляется через 24 часа после отправки; после этого экспорт отвечает 404 unknown_export. ZIP удаляется через 45 минут после первого скачивания и не позднее чем через 2 часа после создания. Кадр, которого на сервере уже нет, выходит с "state": "expired", без файла, но с текстом, настройками и референсами: агент может отрендерить его заново через api_request.

Последовательность. Сборка удаляет кадры один за другим. Чтобы получить и кадры, и фильм, экспортируй проект до сборки, затем собери и экспортируй снова с { "include_film": true }: фильм добавится, а кадры тогда выйдут как expired.

Режим Ультра

Режим Ультра даёт самый детальный рендер видео. Добавь "quality": "max" в POST /videos (с mode ltx25, значением по умолчанию). Он оплачивается посекундно или по фиксированной цене с LoRA или при расширении клипа, отрендеренного не посекундно; расширение плана Ультра, вперёд или назад, оплачивается посекундно. POST /videos/quote даёт точную цену твоего запроса.

Посекундно

Клип оплачивается посекундно в зависимости от разрешения, звук включён:

РазрешениеЦена
480p4 кредитов в секунду
720p8 кредитов в секунду
1080p20 кредитов в секунду
  • Длительность: от 4 до 30 с при 24 кадрах в секунду, известна до рендера: 5 с при автоматической длительности (duration_auto, по умолчанию), иначе length / fps (24, если fps не указан), с округлением до секунды.
  • Формат: запрошенный, в ближайшем соотношении сторон; 480p рендерится в 480p. Выше 1080p: resolution_outside_ultra.
  • Начальное изображение (image): возможно. Движок может отклонить текст или изображение при отправке: 400 engine_refused, причина в detail, код в code; ничего не списывается.
  • Без сида: seed игнорируется, и ответ его не содержит.
  • Отмена: свободна, пока рендер ждёт своей очереди; после начала расчёта 409 render_in_progress, и клип доставляется и оплачивается.
  • В Ультра нет конечного изображения, ключевых кадров и усиленной согласованности.

По фиксированной цене

С LoRA или при расширении клипа, отрендеренного не посекундно, Ультра рендерится полной видеомоделью по фиксированной цене:

Запрошенный форматДоставленный размерФиксированная цена за клип
480p или 720pКак в таблице выше при 720p (1280 x 768), запрос 480p рендерится в 720p40 кредитов
1080pКак в таблице выше (1920 x 1088)60 кредитов

Цена фиксированная за формат: звук и длина ничего не меняют. Ультра начинается с 720p: запрос 480p рендерится и тарифицируется в 720p. POST /videos/quote даёт точную цену. Максимум: 1080p (1920 x 1088) в любом режиме, 4K больше не предлагается. Больший размер отклоняется (ultra_4k_unavailable с quality: "max", resolution_above_quality без него).

  • Длина: максимум 481 кадр, как у любого клипа (20 с при 24 fps, 16 с при 30, 8 с при 60). Расширения и длинные видео работают и в Ультра. Расширение сохраняет размер продолжаемого клипа, а ниже 720p тарифицируется по цене 720p.
  • Время: несколько минут для клипа 5 с, дольше для клипа 20 с. Начало может ожидать освобождения мощной видеокарты.
  • Нет перехода (end_image) в Ультра (ultra_incompatible).
  • Нет ключевых кадров (keyframes) в Ультра (keyframes_mode).
  • LoRA персонажа с твоего аккаунта применяется в Ультра так же, как в обычном режиме.

Multi-Ref Видео

Клип, в котором играют от 1 до 4 персонажей (до 12 в Ультра), каждый узнаваемый, на необязательной локации, с сохранёнными объектами, животными и сохранённой локацией, когда это нужно. Персонажи берутся из GET /characters: созданные из одной фотографии через API или в приложении. Объекты, животные и локации берутся из GET /subjects. Добавь объект multiref в POST /videos (разрешение videos) и вызывай каждого персонажа через @Имя в промпте:

json
{
  "prompt": "@Lea walks toward @Tom in a sunny kitchen and hands him a cup. Sound: footsteps, soft music.",
  "multiref": {
    "characters": [
      { "character_id": "chr_8f3a...", "name": "Lea", "description": "a 28 year old woman with long red hair" },
      { "character_id": "chr_21bc...", "name": "Tom", "description": "a 30 year old man", "strength": 1.2 }
    ],
    "background_b64": "<optional: an image of the location>",
    "background_description": "a sunny kitchen"
  },
  "width": 1088, "height": 1920,
  "audio": true
}
Поле multirefЧто делает
characters[].character_idПерсонаж из GET /characters
characters[].nameОдно слово (буквы, цифры, _), то, что пишется после @ в промпте
characters[].descriptionКраткое описание на английском; по умолчанию его kind
characters[].strengthВес сходства, от 0 до 2 (1 по умолчанию)
characters[].sheet_idНеобязательно: какой sheet использовать для персонажа с несколькими (по умолчанию самый новый)
characters[].voiceС "audio": true, characters[0] и characters[1]: character (по умолчанию) это голос из его профиля, если он онлайн (has_voice у персонажа), иначе голос, созданный моделью; generated запрашивает голос, созданный моделью. Ответ сообщает, какой использован (voices).
characters[].voice_b64Необязательно, только characters[0] и characters[1], с "audio": true: другой голос для персонажа, аудиофайл (WAV, MP3, OGG, FLAC) в base64, не более 4 МБ (достаточно короткого фрагмента), который имеет приоритет над голосом профиля
background_b64, background_descriptionНеобязательная локация: изображение и несколько слов на английском
  • Промпт на английском, один абзац в настоящем времени; Sound: для звука, реплики диалога в кавычках, exactly 2 people и позиции каждого, когда это важно, без отрицаний. Существо описывается тем, что оно есть. @Имя, не совпадающее ни с одним персонажем, будет отклонено (unknown_mention).
  • Форматы (width x height): портрет 480 x 832, 720 x 1280, 1088 x 1920; пейзаж 832 x 480, 1280 x 720, 1920 x 1088; квадрат 480 x 480, 720 x 720, 1088 x 1088. Нет 4K; 480p только в Качестве.
  • Режимы: Качество (по умолчанию) или Ультра (quality: "max"). Нет расширения и нет перехода.
  • Длина: автоматическая (duration_auto, по умолчанию) или фиксированная с duration_auto: false и length 121 (5 с), 241 (10 с) или 481 (20 с) при 24 fps; при другой частоте те же продолжительности в кадрах, максимум 481 (при 30: 145, 297, 481; при 60: 297, 481).
  • Частота кадров: fps 24, 30 (по умолчанию) или 60, как для любого клипа; length считается в кадрах при этой частоте, максимум 481 (16 с при 30, 8 с при 60).
  • Цена: цена клипа. В Качестве фиксированная цена формата из сетки выше, удвоенная со звуком; 480p без звука остаётся 5 кредитов (сниженная цена Качества не применяется к Multi-Ref). POST /videos/quote с "multiref": true даёт точную цену.
  • Сервер подбирает ракурсы под точный формат видео: отправляй персонажей как есть. Персонаж, у которого только один ракурс, рендерится с warnings limited_likeness в ответе: сходство ограничено (см. Ограниченное сходство).
  • Голоса профиля: со звуком characters[0] и characters[1] по умолчанию говорят голосом из своего профиля, если он онлайн (has_voice); voice generated позволяет модели создать голос. Ответ указывает голос каждого в voices (character_id, voice: character, custom или generated).
  • Голоса персонажей (voice_b64): модель заставляет персонажа говорить этим голосом, включая движение губ; сервер берёт первые 5 секунд. Максимум два голоса, для characters[0] и characters[1] (движок поддерживает 2 голоса). Упорядочи characters по диалогу: characters[0] говорит первым, characters[1] отвечает. Требуется звук ("audio": true), иначе voice_requires_audio; голос на другом персонаже: voice_slot; нечитаемый файл: unsupported_audio_format; более 4 МБ: audio_too_large. Используются только первые 5 секунд: отправляй короткий фрагмент. Всё тело запроса не должно превышать 30 МБ (иначе 413 без JSON-тела). Без доплаты.
  • Опрос, загрузка и отмена такие же, как для любого видео (см. Опрос, загрузка, отмена выше).

Сохранённые объекты, животные и локации. Ещё два поля multiref добавляют объекты, сохранённые из твоих собственных изображений:

Поле multirefЧто делает
subjects[]Объекты и животные (subject_id, затем необязательные name, description, strength). Они делят слоты с персонажами: не более 4 референсов всего; в Ультра до 30 изображений всего (см. ниже).
locationОдна сохранённая локация в качестве декорации (subject_id, затем необязательные name, description, strength): её изображения с собственной силой. Заменяет background_b64 (оба вместе: multiref_incompatible). Требует хотя бы одного персонажа, объекта или животного рядом.

name по умолчанию берётся как первое слово из названия объекта, и каждый @Имя в промпте сопоставляется как имя персонажа. Локация, переданная в subjects, или объект, переданный как location, будут отклонены (invalid_subject_type). Цена не меняется: это цена клипа. Объект используется с первыми 5 изображениями (в Ультра со всеми, не более 6).

json
"multiref": {
  "characters": [{ "character_id": "chr_8f3a...", "name": "Lea" }],
  "subjects": [{ "subject_id": "sub_1c2d...", "name": "Rex" }],
  "location": { "subject_id": "sub_9e8f...", "name": "Loft" }
},
"prompt": "@Lea throws a ball to @Rex across @Loft. Sound: barking, laughter."

В Ультра клип Multi-Ref следует правилам Ультра с посекундной оплатой: та же цена за секунду, звук включён, от 4 до 30 с при 24 кадрах в секунду (5 с при автоматической длительности), от 480p до 1080p, без сида.

  • Каждый персонаж передаётся со своей character sheet (или, если её нет, со всеми своими изображениями), и сервер собирает всё в одно изображение; каждый объект, животное или локация со всеми своими изображениями (не более 6).
  • Первый рендер персонажа готовит это изображение, что занимает на несколько десятков секунд больше: его jobId тогда начинается с sdp- и отслеживается как остальные.
  • Без голоса: voice_b64 и голос профиля игнорируются (warnings voice_ignored), а strength не действует.
  • Движок может отклонить референсное изображение (например, реальное лицо): рендер завершается как failed с причиной, и ничего не списывается.

Стили, наряды и движение. Только в Ультра (quality: "max"): ещё три поля multiref; в других режимах запрос отклоняется (multiref_ultra_only) и никогда не рендерится без них.

Поле multirefЧто делает
styles[]Сохранённые стили (subject_id, затем необязательные name, description): весь клип перенимает их визуальный облик (технику, свет, цвета, фактуры), но никогда их содержание.
outfits[]Сохранённые наряды (те же поля плюс worn_by), надетые так, как на их изображениях. worn_by (необязательно) это name одного из персонажей: оно добавляет "<Имя> wears <Наряд>." в начало сцены. Без него напиши это в промпте: @Lea wears @RedGown.
motionОдно видео движения от 4 до 30 с: { "motion_id": ... } (загруженное через POST /motions) или { "video_b64": ... } (MP4, MOV, WebM или MKV, не более 20 МБ) и необязательное description движения на английском. mode определяет, что клип из него перенимает: camera (по умолчанию) движение камеры, кадрирование и ритм; choreography движения тела, жесты и их ритм. Никогда человека или место из видео; цена одинакова в обоих режимах. Сервер приводит его примерно к 410 000 пикселей (856 × 482 при 16:9) и 24 кадрам в секунду, без звука; соотношение ширины и высоты от 0,4 до 2,5.
  • Не более 30 изображений в Ультра: персонажи, объекты, стили, наряды и локация вместе (multiref_too_many_images), из них не более 12 персонажей (сверх этого multiref_characters_required). Рекомендуется 8: от 9 до 12 рендер проходит с warnings many_characters, так как некоторые могут пропасть или смешаться. Стиль вне styles или наряд вне outfits отклоняется (invalid_subject_type).
  • Цена движения: 3 кредитов за секунду видео движения (с округлением вверх до секунды) сверх рендера, указано в GET /pricing (ultra.motion_per_second); POST /videos/quote с тем же multiref.motion возвращает motion_seconds и точную цену.
  • Прямая загрузка тяжёлого видео движения: POST /motions с { "size": <байты> } (не более 20 МБ) возвращает motion_id, upload_url, headers и expires_in (900 с); отправь файл через PUT upload_url ровно с этими headers, затем передай multiref.motion.motion_id в POST /videos в течение 2 часов. Один motion_id служит для одного рендера.
json
"quality": "max",
"multiref": {
  "characters": [{ "character_id": "chr_8f3a...", "name": "Lea" }],
  "styles": [{ "subject_id": "sub_a1b2..." }],
  "outfits": [{ "subject_id": "sub_c3d4...", "name": "RedGown", "worn_by": "Lea" }],
  "motion": { "motion_id": "4f0c2a9b1d7e6a35", "description": "a low tracking shot from the side" }
},
"prompt": "@Lea walks along a seaside promenade at sunset."

Коды ошибок стилей, нарядов и движения приведены в разделе Ограничения и ошибки.

С MCP-сервером агент делает всё это через tendre_multiref_video: задай сцену и назови персонажей, объекты, животных и локацию (subjects, location_id).

Face swap

Человек, снятый в твоём собственном видео, становится одним из твоих персонажей: лицо, волосы, тело и одежда (или только голова, см. part), при этом сохраняются жесты, губы и обстановка, а также голос, если у персонажа нет своего (см. voice). Это Face swap из приложения, на одном отрывке не более 20 с: один персонаж, без цепочек и переходов. Запрос: POST /faceswap (разрешение videos):

json
{
  "video_b64": "<the video in base64: MP4, MOV, WebM or MKV, 20 MB at most>",
  "character_id": "chr_8f3a...",
  "start": 2,
  "duration": 6,
  "scene": "@Lea wears a long red coat.",
  "zone": "normal",
  "likeness": 1
}
ПолеЧто делает
video_b64Видео, не более 20 МБ, с одним хорошо различимым человеком. Если превышает, сначала обрежь или сожми его, или используй MCP-инструмент tendre_face_swap, который принимает до 95 МБ.
character_id, sheet_idПерсонаж из GET /characters и его sheet, если их несколько (по умолчанию самый новый).
nameНеобязательно, не более 60 символов: имя персонажа, по умолчанию то, которое у него есть в GET /characters. Имя персонажа, созданного в приложении, появляется онлайн только после того, как приложение его отправит (приложение 0.9.1 и новее; иначе name равно null в GET /characters): укажи его, чтобы вызывать через @Имя в scene, иначе вызывай его Image 1.
start, durationОтрывок в секундах: с start (0 по умолчанию), в течение duration (по умолчанию до конца видео, не более 20 с).
sceneНеобязательно, на английском, не более 400 символов: что должно измениться или быть уточнено. Персонаж вызывается @Имя (первое слово его имени, см. name) или Image 1. Без сцены он двигается точно так же, как человек в кадре. Никогда не заставляй персонажа в ней говорить и не описывай его рот, взгляд или голову («says», «looks at the camera», «smiles»): он копирует их из видео, а указание заставляет его их выдумывать, с рассинхронизированными губами и повёрнутой головой. Описывай то, что меняется вокруг: одежду, аксессуар, свет.
descriptionНеобязательно, на английском, не более 360 символов: кто этот персонаж ("a 28 year old woman with long red hair, wearing a black leather jacket"). По умолчанию его kind и одежда.
partfull (по умолчанию): персонаж целиком. head: только голова (лицо и волосы); снятое тело, одежда и обстановка остаются. Персонаж тогда рендерится по трём портретам его character sheet, обрезанным до головы (heads_only в ответе); персонаж с одним или двумя ракурсами сохраняет их целиком. Описание по умолчанию называет только его kind, без одежды, а zone по умолчанию tight.
zoneПространство вокруг снятого силуэта, в котором может быть нарисован персонаж: tight (Узкая), normal (по умолчанию) или wide (Широкая: место для больших ушей, крыльев, широкого телосложения). С part head это пространство вокруг головы, по умолчанию tight.
likenessНасколько плотно персонаж придерживается своих ракурсов, от 0,5 до 2 (1 по умолчанию).
audiotrue по умолчанию: звук видео сохраняется, губы следуют за ним. false: видео без звука.
voicecharacter (по умолчанию): звук видео преобразуется в голос из профиля персонажа, если у него есть голос онлайн (has_voice в GET /characters), в том же рендере и без изменения темпа, поэтому губы остаются синхронными. Без голоса профиля остаётся снятый голос. original: сохранить снятый голос. Ответ сообщает, какой голос использован (voice: character, custom, original или none без звука).
voice_b64Необязательно, со звуком: другой голос для персонажа (WAV, MP3, OGG, FLAC, не более 2 МБ; используются первые 20 секунд), который имеет приоритет над голосом профиля. Звук видео преобразуется в этот голос без изменения темпа.
seedСид рендера, от 0 до 4294967295, для повторного рендера или вариаций.

Видео и голос вместе: не более 22 МБ, чтобы тело запроса не превысило 30 МБ (иначе 413 без JSON-тела).

  • Сервер подготавливает всё. Он вырезает отрывок, устанавливает рабочую частоту кадров (30 fps для источника при 29 fps и выше, включая 50 и 60, 24 ниже) и рабочий формат (кратные 128, короткая сторона 768, соотношение, ближайшее к твоему видео), и подбирает ракурсы персонажа под этот формат.
  • Что ты получаешь: это видео отрывка в рабочем формате, около одного мегапикселя (768 x 1408 для вертикального видео, например), с пропорциями твоего видео в пределах 5%. Полное разрешение и несколько персонажей подряд остаются эксклюзивными для десктопного приложения tendre.AI: оно вставляет персонажа обратно в оригинальное видео в полном разрешении и цепочкой добавляет несколько персонажей.
  • Цена: 6 кредитов за секунду подготовленного отрывка (seconds в ответе), округлённых до следующего кредита. Ответ содержит jobId, seed, cost и подготовленный отрывок (width, height, length, fps, seconds, audio, voice, views, part). Персонаж только с одним ракурсом рендерится с warnings limited_likeness.
  • Нет котировки: ни POST /videos/quote, ни tendre_quote от MCP не знают Face swap. Чтобы рассчитать цену до отправки, прочитай grid.body_swap из GET /pricing: секунды отрывка x per_block_720p (цена блока) / block_seconds (длина блока), округлённые до следующего кредита.
  • Некоторые сцены рендерятся по трём портретам персонажа, обрезанным до головы (heads_only в ответе), и одежда из его ракурсов больше не навязывается: сцена решает.
  • Face swap считается использованием персонажа и откладывает его удаление, как и Multi-Ref.
  • Опрос, загрузка и отмена такие же, как для любого видео (см. Опрос, загрузка, отмена выше): GET /videos/{jobId}, GET /videos/{jobId}/file, POST /videos/{jobId}/cancel.
  • Собственные ошибки: video_required, video_too_large, unreadable_video, invalid_start, passage_too_short, invalid_duration, invalid_zone, invalid_likeness, invalid_scene, invalid_description, invalid_character_name, invalid_part, invalid_voice_choice, character_required, unknown_character, audio_too_large (голос более 2 МБ), face_swap_too_large (отрывок всё ещё слишком тяжёлый после подготовки: укороти duration), server_busy (два видео уже готовятся: повтори после Retry-After, 20 с), face_swap_unavailable и face_swap_price_missing (Face swap закрыт или без цены: повтори позже). Что означает каждая: Ограничения и ошибки.
  • Твоё видео проходит через наши серверы при подготовке, затем поступает на видеокарту для рендера, как любое исходное изображение.

Используй только видео людей, давших своё согласие: это правило условий использования.

С MCP-сервером агент делает всё это через tendre_face_swap.

Windows · Mac · облако или локально

Генерируй приватно. Уже сегодня вечером.

Скачай tendre.AI бесплатно и генерируй без ограничений, приватно, на своём собственном GPU.

OS Windows 10/11GPU NVIDIA 8ГБ+VRAM 12ГБ рекомендуетсяДиск 20ГБ

Mac: Apple silicon (M1 или новее), macOS 13 или новее. Intel Mac не поддерживаются.

Для локальной генерации изображений на Mac нужен M4 с 24 ГБ памяти, либо M2 или M3 Pro, Max или Ultra с 24 ГБ. Если у тебя устройство послабее, всё работает онлайн через кредиты. Ретушь и видео на Mac пока тоже работают только онлайн.

Всё о tendre.AI для Mac

Нет видеокарты NVIDIA? Начни на 100% в облаке: 5 бесплатных изображений и 1 бесплатное видео каждый день. Карта NVIDIA (от 8 ГБ) открывает безлимитную локальную генерацию.