> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Seedance сообщает, что первый/последний кадр нельзя смешивать с референсными медиа

> Seedance возвращает ошибку 400 (содержимое первого/последнего кадра нельзя совмещать с референсными медиа), даже если вы не включали режим первого/последнего кадра. В запросе у изображения не указана роль (role), поэтому оно воспринимается как первый кадр, а первый кадр не может использоваться вместе с референсным видео. Чаще всего это происходит со сторонними инструментами, отправляющими запросы через универсальный эндпоинт /v2/videos/generations. На этой странице показано, как переключиться на нативный эндпоинт, задать role и передавать референсные видео.

## Краткий ответ

**Seedance считывает только `role` каждого элемента в запросе.** Он не видит, какие переключатели вы выбрали в своем инструменте, и не читает для этого ваш prompt. Изображение без `role` обрабатывается как первый кадр (image-to-video). Добавьте к этому референсное видео, и запрос превратится в «первый кадр + референсный медиафайл», что отклоняется провайдером.

Обычно при отправке возвращается ошибка 400. Задача не создается, и тарификация не производится:

```text theme={null}
The parameter `content` specified in the request is not valid:
first/last frame content cannot be mixed with reference media content.
```

**Решение**: отправляйте запрос через нативный эндпоинт Seedance `POST /seedance/api/v3/contents/generations/tasks`, укажите `"role": "reference_image"` для изображений и `"role": "reference_video"` для видео, а видео передавайте в виде публичного URL, который провайдер сможет скачать напрямую, либо зарегистрируйте его в библиотеке ассетов и ссылайтесь на него как на `asset://`.

## Реальный пример

Клиент использовал собственный локальный инструмент для творчества. Он передал изображение одного персонажа и одно видео, отметил флажок «omni reference», оставил флажок «first/last frame» неотмеченным и даже написал в prompt: «image 1 is not the first frame, do not use first/last frame mode». Тем не менее каждый запуск завершался приведенной выше ошибкой.

Мы перехватили исходный запрос на стороне шлюза (Base64 изображения сокращен):

```json theme={null}
{
  "model": "doubao-seedance-2-0-260128",
  "prompt": "Replace the person in video 1 with the character in image 1 ... (image 1 is not the first frame) ... do not use first/last frame mode",
  "duration": 14,
  "ratio": "9:16",
  "resolution": "720p",
  "images": ["data:image/jpeg;base64,/9j/4AAQ..."],
  "videos": ["/assets/input/ai_ref_xxxx.mp4"]
}
```

У запроса две проблемы. Любой из них достаточно, чтобы привести к сбою:

| Проблема                                    | Пояснение                                                                                                                                                                                                                                                                                                                                                                                                              |
| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **У изображения нет `role`**                | Запрос был отправлен к общему эндпоинту видео `/v2/videos/generations`, в котором есть только массивы `images` и `videos` и нет поля, позволяющего указать «это референсное изображение». По правилам одиночное изображение считается первым кадром, что конфликтует с референсным видео. Переключатель «omni reference» в инструменте так и не попал в запрос, а текст prompt никак не влияет на валидацию параметров |
| **Видео представляет собой локальный путь** | `/assets/input/ai_ref_xxxx.mp4` — это путь внутри инструмента на компьютере самого клиента. Серверы провайдера не имеют к нему доступа, поэтому даже при исправлении проблемы с первым кадром видео так и не дошло бы до модели                                                                                                                                                                                        |

В консоли браузера клиента также отображалось `415 Unsupported Media Type` для того же mp4, поступавшее от собственного локального эндпоинта предпросмотра инструмента (`/api/media-preview/...` на `localhost`). Инструмент не смог преобразовать видео в пригодный для использования адрес и передал локальный путь в запрос как есть.

## Не отправляйте запросы для Seedance через универсальные эндпоинты для видео

`/v2/videos/generations` (а также `/v1/videos`, `/v1/video/generations`) — это универсальные эндпоинты шлюза для видео. Их поля представляют собой общее подмножество параметров нескольких видеомоделей, и **они не могут выразить режимы ввода Seedance**:

* **Отсутствует `role`**: они не могут различить первый кадр, первый/последний кадр и мультимодальный референс, поэтому одно изображение и одно видео всегда интерпретируются как «первый кадр + референс»
* **Разрешение передается не полностью**: в наших тестах при запросе 2.5 с разрешением 480p результат был в 720p, а для серии 2.0 при запросе 1080p результат также составил 720p, при этом тарификация рассчитывается по фактически сгенерированному разрешению
* **Параметры, уникальные для 2.5** (`omni_reference_task_type`, `output_format` и так далее), не имеют соответствующего поля

Поэтому для Seedance **всегда используйте нативные эндпоинты**:

| Шаг                   | Эндпоинт                                               |
| --------------------- | ------------------------------------------------------ |
| Отправка задачи       | `POST /seedance/api/v3/contents/generations/tasks`     |
| Запрос статуса задачи | `GET /seedance/api/v3/contents/generations/tasks/{id}` |

Если вы используете сторонний инструмент, проверьте, поддерживает ли его канал для Seedance «нативный» формат или формат «Volcengine Ark». Инструмент, который работает только с универсальным API для видео, не может выполнять задачи с референсным видео.

## Правильный способ: задавайте role для каждого элемента

```python theme={null}
import os, requests

BASE = "https://api.apiyi.com/seedance/api/v3/contents/generations/tasks"
headers = {"Authorization": f"Bearer {os.environ['APIYI_API_KEY']}"}

body = {
    "model": "doubao-seedance-2-0-260128",
    "content": [
        {"type": "text", "text": "Replace the person in @video1 with the character in @image1, keeping the motion, expressions and background music unchanged"},
        {"type": "image_url", "image_url": {"url": "https://cdn.example.com/character.png"},
         "role": "reference_image"},
        {"type": "video_url", "video_url": {"url": "https://cdn.example.com/source.mp4"},
         "role": "reference_video"},
    ],
    "resolution": "720p",
    "ratio": "9:16",
    "duration": 10,
}

r = requests.post(BASE, headers=headers, json=body, timeout=60)
print(r.status_code, r.json())   # on success: {"id": "cgt-..."}, then poll with that id
```

Ключевые моменты:

* **Три режима ввода взаимоисключающи**: первый/последний кадр (2 изображения, `first_frame` / `last_frame`), первый кадр (1 изображение) и мультимодальный референс (`reference_image` / `reference_video` / `reference_audio`). Как только появляется референсное видео или референсное аудио, каждое изображение должно быть `reference_image`
* **Отсутствие `role` означает первый кадр**: одно изображение без `role` эквивалентно `first_frame`
* В prompt ссылайтесь на элементы в том порядке, в котором они были переданы, например `@image1` и `@video1`
* Лимиты на референсы: до 9 изображений + 3 видео + 3 аудиоклипа для серии 2.0 и до 30 изображений + 10 видео + 10 аудиоклипов для 2.5

## Как передать референсное видео

Провайдер скачивает ваши медиафайлы **на свои серверы**, поэтому видео должно находиться по адресу, к которому у провайдера есть прямой доступ.

| Способ                                                           | Работает?           | Примечания                                                                                                                                                                                                                                                                   |
| ---------------------------------------------------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Публичный прямой URL** (рекомендуется)                         | ✅                   | Разместите его в объектном хранилище или CDN (OSS, S3, R2, TOS и т. д.) без необходимости авторизации, cookie или дополнительных заголовков и сохраняйте доступным до завершения задачи                                                                                      |
| **Asset ID** `asset://...`                                       | ✅                   | Используйте его, когда одно и то же видео используется повторно или когда в нем присутствуют реальные люди. Ассеты должны быть в формате mp4 / mov, длительностью 2–15 секунд и размером менее 50 МБ. См. [Библиотека ассетов](/ru/api-capabilities/seedance2/asset-library) |
| **Base64**                                                       | ⚠️ Не рекомендуется | Видео на порядок больше изображений, и встраивание видео в тело запроса — самый простой способ получить тайм-аут при отправке. См. [Рабочий процесс Asset-First](/ru/api-capabilities/seedance2/asset-first-workflow)                                                        |
| Путь на вашем компьютере (`/assets/...`, `C:\...`, `file://...`) | ❌                   | Провайдер не может читать файлы на вашем компьютере                                                                                                                                                                                                                          |
| Адрес в частной сети (`localhost`, `127.0.0.1`, `192.168.x.x`)   | ❌                   | То же, что и выше                                                                                                                                                                                                                                                            |
| Ссылка, требующая авторизации для скачивания                     | ❌                   | Провайдер не передает вашу сессию авторизации при скачивании                                                                                                                                                                                                                 |

Перед отправкой вы можете проверить ссылку с любого компьютера с доступом в интернет (замените `<URL>` на ссылку на ваше видео):

```bash theme={null}
curl -s -o /dev/null -w 'code=%{http_code} type=%{content_type} size=%{size_download}\n' '<URL>'
```

Вы должны увидеть `code=200`, `type` со значением `video/mp4` или `video/quicktime` и `size`, соответствующий исходному файлу. HTML-страница, тело JSON или любой код 4xx означают, что провайдер не сможет использовать эту ссылку. Инструкцию по полной проверке ссылок на изображения см. в руководстве [Ссылка на изображение открывается, но возникает ошибка](/ru/faq/seedance-image-url-invalid-format).

## Связанная документация

<CardGroup cols={2}>
  <Card title="API генерации видео" icon="video" href="/ru/api-capabilities/seedance2/video-generation">
    Нативный эндпоинт, а также структура контента и значения ролей для каждого режима ввода
  </Card>

  <Card title="Рабочий процесс с приоритетом ассетов" icon="gauge" href="/ru/api-capabilities/seedance2/asset-first-workflow">
    Почему референсные видео не следует передавать в формате Base64 и как регистрировать ассеты
  </Card>
</CardGroup>
