Генерация изображений и видео

Синхронные изображения, асинхронные видео и сохранение результата

Media API использует те же API-ключи, лимиты, PII-маскирование и учёт стоимости, что и текстовый шлюз. Для запуска нужна область gateway:write, а модель должна поддерживать соответствующий API surface — images или videos.

Allowlist API-ключа
models_allowlist: null и пустой список [] означают доступ ко всем моделям. Непустой список разрешает только перечисленные ID; иначе Media API вернёт 403.

Как найти подходящую модель

Публичный каталог можно фильтровать по API surface. Поля supported_parameters, media_capabilities и media_pricing показывают поддерживаемые параметры и схему цены.

bash
curl -s "https://api.kodikrouter.ru/v1/catalog/models?api_surfaces=images&limit=100" \
  | jq '.items[] | {id, supported_parameters, media_capabilities, media_pricing}'

Изображения: POST /v1/images/generations

Генерация изображения синхронная: соединение остаётся открытым, пока провайдер не вернёт результат. Ответ содержит base64 в data[].b64_json и блок usage. Сохраните base64 на клиенте как обычный файл.

OpenAI-совместимый путь
Для новых интеграций используйте /v1/images/generations. Старый /v1/images остаётся legacy-алиасом. Подробная настройка параметров приведена в гайде по изображениям.
bash
curl --fail-with-body -sS \
  -X POST https://api.kodikrouter.ru/v1/images/generations \
  -H "Authorization: Bearer $KODIK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: image-moscow-001" \
  -o image.json \
  -d '{
    "model": "qwen/qwen-image-3-pro",
    "prompt": "A cinematic view of Moscow at blue hour, photorealistic",
    "size": "1024x1024",
    "n": 1,
    "response_format": "b64_json"
  }'

jq -r '.data[0].b64_json' image.json | base64 --decode > generated.png

Параметры изображения

modelreq
string
ID image-модели из каталога
promptreq
string
Текстовое описание результата
response_format
"b64_json"
Формат OpenAI-совместимого ответа; URL-режим не поддерживается
n
integer 1…10
Количество изображений, если модель поддерживает
aspect_ratio
string
Соотношение сторон, например "16:9"
size / resolution
string
Размер или разрешение, например "1024x1024"
output_format
string
Формат результата, например "png" или "webp"
quality / background
string
Качество и фон — поддержка зависит от модели
seed
integer
Повторяемость результата в пределах возможностей провайдера
input_references
array
Референсные изображения для image-to-image, если поддерживаются
provider
object
Provider-specific настройки маршрутизации или генерации
Стриминг изображений пока не поддерживается
Не передавайте stream: true: шлюз вернёт 400. Используйте обычный синхронный запрос с достаточным timeout.

Пример ответа изображения

json
{
  "created": 0,
  "data": [
    {
      "b64_json": "iVBORw0KGgoAAA...",
      "media_type": "image/png"
    }
  ],
  "usage": {
    "prompt_tokens": 14,
    "completion_tokens": 7291,
    "total_tokens": 7305,
    "cost": 0.045
  }
}

Видео: POST /v1/videos

Видео создаётся асинхронно. Первый запрос возвращает 202 Accepted, локальный id задачи и polling_url. Опрашивайте этот URL до status: completed, затем скачайте бинарный файл через content_url.

bash
curl --fail-with-body -sS \
  -X POST https://api.kodikrouter.ru/v1/videos \
  -H "Authorization: Bearer $KODIK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: video-mountains-001" \
  -o video-job.json \
  -d '{
    "model": "bytedance/seedance-2.5",
    "prompt": "A slow aerial reveal of a mountain village at sunrise",
    "duration": 8,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "generate_audio": true
  }'

JOB_ID=$(jq -r '.id' video-job.json)

while true; do
  STATUS=$(curl --fail-with-body -sS \
    -H "Authorization: Bearer $KODIK_API_KEY" \
    "https://api.kodikrouter.ru/v1/videos/$JOB_ID" \
    | tee video-status.json | jq -r '.status')

  [ "$STATUS" = "completed" ] && break
  [ "$STATUS" = "failed" ] && { cat video-status.json; exit 1; }
  sleep 5
done

curl --fail-with-body -sS \
  -H "Authorization: Bearer $KODIK_API_KEY" \
  "https://api.kodikrouter.ru/v1/videos/$JOB_ID/content" \
  -o generated.mp4

Жизненный цикл video job

POST
/v1/videos

Создать задачу; возвращает 202, id и polling_url

GET
/v1/videos/{job_id}

Обновить статус задачи у провайдера

GET
/v1/videos/{job_id}/content

Получить бинарный файл после завершения

Параметры видео

modelreq
string
ID video-модели из каталога
promptreq
string
Описание сцены, движения и камеры
duration
integer
Длительность в секундах; доступные значения зависят от модели
resolution / size
string
Разрешение, например "720p", или provider-specific размер
aspect_ratio
string
Соотношение сторон, например "16:9"
generate_audio
boolean
Сгенерировать аудиодорожку, если модель поддерживает
frame_images
array
Начальный/конечный кадры, если поддерживаются
input_references
array
Изображения или другие референсы провайдера
seed
integer
Повторяемость результата в пределах возможностей провайдера
provider
object
Provider-specific параметры
Callbacks пока не поддерживаются
callback_url вернёт 400. Используйте polling. Запрос к /content до готовности вернёт 409.

Примеры ответов video job

json
{
  "id": "4599303b-52de-4ad4-9a13-2ff59df823ca",
  "polling_url": "/v1/videos/4599303b-52de-4ad4-9a13-2ff59df823ca",
  "status": "pending"
}

Где сохраняются файлы

  • Изображения: возвращаются inline как base64. KodikRouter не создаёт файл на сервере; декодируйте и сохраните его в своём приложении.
  • Видео: KodikRouter хранит metadata задачи и usage, но не копию видео. GET /content проксирует бинарный файл провайдера, поэтому клиент должен сохранить его самостоятельно.

Idempotency, тарификация и usage

Всегда отправляйте уникальный Idempotency-Key для логической генерации. Повтор с тем же ключом, организацией и API-ключом возвращает сохранённый ответ и не создаёт вторую платную задачу. Не переиспользуйте один idempotency key для другого prompt.

  • Изображение списывается после успешного синхронного ответа провайдера.
  • Видео списывается один раз при переходе задачи в completed, даже если статус опрашивается повторно.
  • Стоимость и request ID доступны в Dashboard и через usage API при наличии scope gateway:read.
  • Заголовки X-KodikRouter-Request-Id и X-KodikRouter-Provider помогают найти запрос в логах.

Основные ошибки

400Некорректный или неподдерживаемый параметр; stream/callback_url пока недоступны
401API-ключ отсутствует или недействителен
402Недостаточно средств для выполнения генерации
403Нет gateway:write или модель не входит в непустой allowlist
404Модель или video job не найдены; jobs изолированы по организации
409Видео ещё не готово для скачивания
429Превышен rate limit API-ключа
502Ошибка upstream-провайдера