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

# gemini-omni-1.2-flash-ext: генерация видео

>  - gemini-omni-1.2-flash-ext — универсальная модель генерации видео
- Поддерживает генерацию видео по тексту, по первому кадру, по первому и последнему кадрам, по нескольким референсным изображениям, а также редактирование и продление видео
- Разрешение 360p/720p/1080p/4k, длительность 3–15 секунд, посекундная тарификация
- Асинхронный API задач: сначала отправьте задачу, затем получите результат по ID задачи 

```bash cURL theme={null}
curl --request POST \
  --url https://api.apimart.ai/v1/videos/generations \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "gemini-omni-1.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "duration": 10,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
  }'
```

```python Python theme={null}
import requests

url = "https://api.apimart.ai/v1/videos/generations"

payload = {
    "model": "gemini-omni-1.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "duration": 10,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
}

headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript JavaScript theme={null}
const url = "https://api.apimart.ai/v1/videos/generations";

const payload = {
  model: "gemini-omni-1.2-flash-ext",
  prompt: "Aerial shot over a misty mountain lake at sunrise.",
  duration: 10,
  resolution: "1080p",
  aspect_ratio: "9:16"
};

const headers = {
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
};

fetch(url, {
  method: "POST",
  headers: headers,
  body: JSON.stringify(payload)
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error("Error:", error));
```

```go Go theme={null}
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    url := "https://api.apimart.ai/v1/videos/generations"

    payload := map[string]interface{}{
        "model":        "gemini-omni-1.2-flash-ext",
        "prompt":       "Aerial shot over a misty mountain lake at sunrise.",
        "duration":     10,
        "resolution":   "1080p",
        "aspect_ratio": "9:16",
    }

    jsonData, _ := json.Marshal(payload)

    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
    req.Header.Set("Authorization", "Bearer <token>")
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
```

```json 200 theme={null}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
    }
  ]
}
```

```json 400 theme={null}
{
  "error": {
    "code": 400,
    "message": "Недопустимые параметры запроса",
    "type": "invalid_request_error"
  }
}
```

```json 401 theme={null}
{
  "error": {
    "code": 401,
    "message": "Ошибка аутентификации. Проверьте свой API-ключ",
    "type": "authentication_error"
  }
}
```

```json 402 theme={null}
{
  "error": {
    "code": 402,
    "message": "Недостаточно средств на балансе. Пополните счёт и повторите попытку",
    "type": "payment_required"
  }
}
```

```json 429 theme={null}
{
  "error": {
    "code": 429,
    "message": "Слишком много запросов. Повторите попытку позже",
    "type": "rate_limit_error"
  }
}
```

## Аутентификация

**Authorization** `string` *required*

Все запросы требуют аутентификации по Bearer Token.

Получение API-ключа:

Перейдите на [страницу управления API-ключами](https://apimart.ai/keys), чтобы получить свой API-ключ.

При выполнении запросов добавляйте следующий заголовок:

```
Authorization: Bearer YOUR_API_KEY
```

## Параметры запроса

**model** `string` *required*

Название модели генерации видео. Всегда `gemini-omni-1.2-flash-ext`.

**prompt** `string` *required*

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

Пример: `"Aerial shot over a misty mountain lake at sunrise."`

> [!WARNING]
>
> `prompt` обязателен во всех режимах, включая первый кадр, несколько референсных изображений, редактирование и продление. Если он отсутствует, возвращается ошибка 400.

**duration** `integer` (default: 10)

Длительность видео в секундах. Должна быть целым числом.

* Генерация по тексту / по первому кадру / по нескольким изображениям: длительность результата, `3`–`15`
* По первому и последнему кадрам: длительность результата, `3`–`10`
* Продление (`extend`): длительность **добавляемого фрагмента**, `3`–`10`
* Редактирование (`edit`): передавать нельзя; длительность результата совпадает с исходным видео

Также поддерживается псевдоним `seconds`. Если переданы оба параметра, их значения должны совпадать.

> [!WARNING]
>
> Передача `duration` в режиме редактирования возвращает ошибку `video edit does not accept duration`.

**resolution** `string` (default: 720p)

Разрешение видео, без учёта регистра. Определяет цену за секунду.

Допустимые значения:

* `360p`
* `720p`
* `1080p`
* `4k` (также принимается `2160p`)

> [!WARNING]
>
> Любое другое разрешение возвращает ошибку 400.

**aspect\_ratio** `string` (default: 16:9)

Поддерживаются только `16:9` (горизонтальная ориентация, по умолчанию) и `9:16` (вертикальная ориентация); другие значения возвращают ошибку 400.

**omni\_reference\_task\_type** `string`

Тип задачи, определяющий, как используются исходные материалы.

Допустимые значения:

* `edit` - редактирование видео; используется вместе с `video_urls` или `extend_from_task_id`
* `extend` - продление видео с добавлением нового фрагмента в конец; используется вместе с `video_urls` или `extend_from_task_id`
* `reference` - генерация по нескольким референсным изображениям; используется вместе с `image_urls`
* `text_to_video` / `image_to_video` / `reference_to_video` - по тексту / по первому кадру / по референсным изображениям
* `auto` - определяется автоматически по входным данным; при наличии видео считается `edit`

Если видео не передаётся, параметр можно не указывать — режим определяется автоматически.

> [!WARNING]
>
> При передаче `video_urls` или `extend_from_task_id` тип задачи обязателен (`omni_reference_task_type` или совместимое поле `generation_type`); без него возвращается ошибка 400. Рекомендуется явно указывать `edit` или `extend`; `auto` обрабатывается как `edit`.

**generation\_type** `string`

Поле для совместимости, эквивалентное `omni_reference_task_type`. Допустимые значения: `frame` (то же, что `image_to_video`), `reference`, `edit`, `extend`.

> [!WARNING]
>
> `generation_type` и `omni_reference_task_type` нельзя передавать одновременно.

**image\_urls** `array\<url\>`

Массив референсных изображений (персонажи, товары, стили и т. п.), от 1 до 10 изображений.

Поддерживаются только общедоступные HTTP/HTTPS URL изображений. Локальные изображения сначала загрузите, чтобы получить публичный URL, и передайте его; Base64 Data URL сейчас не поддерживаются и возвращают ошибку 400.

Если передано только 1 изображение, способ его использования зависит от типа задачи:

* `omni_reference_task_type` не указан: используется как референсное изображение
* `omni_reference_task_type` равен `auto` или `image_to_video`: используется как первый кадр

Для генерации по первому кадру рекомендуется сразу использовать `first_frame_image`, а не полагаться на количество изображений.

> [!WARNING]
>
> `image_urls` нельзя передавать вместе с `first_frame_image` или `last_frame_image`, а изображения из `image_urls` никогда не считаются первым кадром; при редактировании и продлении изображения передавать также нельзя.

**first\_frame\_image** `string`

Изображение первого кадра: первый кадр сгенерированного видео будет этим изображением. Поддерживаются только общедоступные HTTP/HTTPS URL изображений; Base64 Data URL не поддерживаются.

При передаче вместе с `last_frame_image` выполняется генерация видео по первому и последнему кадрам.

**last\_frame\_image** `string`

Изображение последнего кадра для генерации по первому и последнему кадрам: видео переходит от первого кадра к этому изображению. Поддерживаются только общедоступные HTTP/HTTPS URL изображений; Base64 Data URL не поддерживаются.

В режиме первого и последнего кадров:

* `duration` поддерживает `3`–`10`; 10 секунд, если не указано
* нельзя передавать `system_prompt` и `negative_prompt`

> [!WARNING]
>
> `last_frame_image` необходимо передавать вместе с `first_frame_image`; при передаче только последнего кадра возвращается ошибка `last_frame_image requires first_frame_image`. Нельзя передавать вместе с `image_urls`.

**image\_with\_roles** `array\<object\>`

Массив изображений с ролями — эквивалентная форма записи `first_frame_image` / `last_frame_image` / `image_urls`.

**Элемент массива**

**url** `string` *required*

Общедоступный HTTP/HTTPS URL изображения. Base64 Data URL не поддерживаются.

**role** `string`

`first_frame` — первый кадр, `last_frame` — последний кадр (по 1 изображению); любые другие значения или пустая роль означают референсное изображение.

**video\_urls** `array\<url\>`

Массив видео для редактирования или продления; поддерживается только 1 видео. Вместо него можно использовать поле с одним значением `video_url` — передавайте только одно из них.

Поддерживаются только общедоступные HTTP/HTTPS URL видео. Формат MP4 / MOV / WebM, длительность не более 15 секунд, размер не более 64 MB.

> [!WARNING]
>
> При передаче `video_urls` тип задачи обязателен; рекомендуется указать `omni_reference_task_type` со значением `edit` или `extend` (`auto` обрабатывается как `edit`). Без него возвращается ошибка 400. Передача 2 и более видео возвращает ошибку 400.

**extend\_from\_task\_id** `string`

ID задачи на этой платформе (`task_01…`). Позволяет продолжить редактирование или продление одной из ваших ранее завершённых задач `gemini-omni-1.2-flash-ext` без повторной загрузки видео.

Условия использования:

* Задача принадлежит текущему аккаунту
* Модель задачи — `gemini-omni-1.2-flash-ext`
* Статус задачи — `completed`
* Канал, на котором была создана исходная задача, по-прежнему доступен; иначе возвращается 503 `source_channel_unavailable`
* Исходный результат не длиннее 15 секунд (относится и к редактированию, и к продлению); в режиме редактирования его длительность также должна определяться

Если канал недоступен или длительность исходного результата не удаётся определить, скачайте исходный результат и загрузите его через `video_urls`. Если исходный результат длиннее 15 секунд, перед загрузкой обрежьте его до 15 секунд.

> [!WARNING]
>
> `extend_from_task_id` нельзя передавать вместе с `video_urls`, и тип задачи обязателен; рекомендуется указать `omni_reference_task_type` со значением `edit` или `extend` (`auto` обрабатывается как `edit`).

**negative\_prompt** `string`

Содержимое, которое не должно появляться в видео.

Пример: `"people, cars, color"`

> [!WARNING]
>
> В режиме первого и последнего кадров нельзя передавать `negative_prompt`.

**system\_prompt** `string`

Системная инструкция, например фиксированный визуальный стиль или запрет текста в кадре. Должна быть строкой.

Пример: `"Render as a black-and-white silent film."`

> [!WARNING]
>
> В режиме первого и последнего кадров нельзя передавать `system_prompt`.

## Ответ

**code** `integer`

Код состояния ответа. Успешные запросы возвращают `200`.

**data** `array`

Возвращаемый массив задач.

**Элемент массива**

**status** `string`

Начальный статус задачи. После успешной отправки имеет значение `submitted`.

**task\_id** `string`

Уникальный идентификатор задачи для запроса её статуса и результата.

## Получение результата задачи

Генерация видео выполняется асинхронно. После отправки возвращается `task_id`; используйте API [Получение статуса задачи](https://docs.apimart.ai/ru/api-reference/tasks/status.md), чтобы узнать прогресс и результат.

```bash cURL theme={null}
curl --request GET \
  --url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
  --header 'Authorization: Bearer <token>'
```

Рекомендуется опрашивать статус каждые 5-10 секунд и установить тайм-аут клиента не менее 10 минут. Ориентировочное время генерации (с учётом очереди): около 46 секунд для 15-секундного видео 360p, около 99 секунд для 15 секунд 1080p и около 4-5 минут для 15 секунд 4k. Во время генерации прогресс может долго оставаться на 10% до завершения.

### Пример успешного результата

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "completed",
    "progress": 100,
    "actual_time": 99,
    "cost": 0.695,
    "result": {
      "videos": [
        {
          "url": ["https://cdn.example.com/videos/abc.mp4"]
        }
      ]
    }
  }
}
```

URL видео — `data.result.videos[0].url[0]`. `data.actual_time` — время выполнения задачи в секундах, а не длительность видео. Результат — MP4 (H.264, 24fps) с аудиодорожкой AAC и невидимым водяным знаком SynthID; в 4k аудиодорожка иногда отсутствует.

### Пример неудачного результата

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "failed",
    "progress": 100,
    "cost": 0,
    "error": {
      "code": "task_failed",
      "message": "content_rejected",
      "type": "task_failed"
    }
  }
}
```

При сбое задачи средства возвращаются в полном объёме.

## Тарификация

Посекундная тарификация: стоимость = цена за секунду для выбранного разрешения × количество тарифицируемых секунд. Во всех режимах тарификация идёт по запрошенному уровню разрешения. Актуальные цены см. на [странице цен](https://apimart.ai/pricing).

| Режим | Тарифицируемые секунды |
| - | - |
| По тексту / по первому кадру / по нескольким изображениям | `duration`; 10 секунд, если не указано |
| По первому и последнему кадрам | `duration` (не более 10 секунд); 10 секунд, если не указано |
| Редактирование | Длительность исходного видео (вычитается допуск контейнера 0,15 секунды, затем округление вверх, минимум 1 секунда; например, 8,019 секунды — 8 секунд, 8,3 секунды — 9 секунд) |
| Продление | Добавляемые секунды `duration`; 10 секунд, если не указано. Исходное видео не тарифицируется |

## Сценарии использования

### Сценарий 1: Текст в видео

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Aerial shot over a misty mountain lake at sunrise.",
  "duration": 15,
  "resolution": "1080p",
  "aspect_ratio": "9:16"
}
```

### Сценарий 2: видео по первому кадру

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The camera slowly pushes in.",
  "duration": 6,
  "aspect_ratio": "9:16",
  "first_frame_image": "https://example.com/start.jpg"
}
```

### Сценарий 3: видео по первому и последнему кадрам

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The flower bud slowly opens into full bloom.",
  "duration": 8,
  "aspect_ratio": "16:9",
  "first_frame_image": "https://example.com/bud.jpg",
  "last_frame_image": "https://example.com/bloom.jpg"
}
```

В режиме первого и последнего кадров `duration` поддерживает 3–10 секунд (10 секунд, если не указано); `system_prompt` / `negative_prompt` передавать нельзя.

### Сценарий 4: несколько референсных изображений

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The cat bats at the ball of yarn.",
  "duration": 8,
  "image_urls": [
    "https://example.com/cat.png",
    "https://example.com/yarn.png"
  ]
}
```

### Сценарий 5: редактирование видео

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Make the violin invisible. Keep everything else the same.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "edit"
}
```

При редактировании не передавайте `duration`: длительность результата совпадает с исходным видео.

### Сценарий 6: продление видео

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Continue the scene: the dancer bows.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "extend",
  "duration": 4
}
```

### Сценарий 7: продление существующей задачи

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Extend this video: the camera pans across the mountains.",
  "extend_from_task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
  "omni_reference_task_type": "extend",
  "duration": 6
}
```

### Сценарий 8: системная инструкция и негативный промпт

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "A busy city street at noon.",
  "system_prompt": "Render as a black-and-white silent film.",
  "negative_prompt": "people, cars, color",
  "duration": 6
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.