Перейти к содержимому

Задачи и статусы

NexusAPI работает только асинхронно. Любой /generate сразу возвращает task_id со статусом pending, а результат становится доступен через polling или webhook через несколько секунд (изображение) или минут (видео).

Это сознательное решение: HTTP-таймауты на 10-минутном veo-extend не имеют смысла, а одна async-модель проще, чем dual-mode endpoint.

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

POST /generate
┌────────┐ воркер берёт задачу из очереди
│ pending│ ────────────────────────────────┐
└────────┘ ▼
┌──────────────┐
│ processing │
└──────────────┘
┌──────────────┐ ←─── провайдер вернул результат
│ completed │
└──────────────┘
┌──────────────┐
│ failed │ ←─── провайдер вернул ошибку, рефанд на ключ
└──────────────┘
СтатусЧто это значит
pendingЗадача создана, лежит в очереди RabbitMQ. Воркер ещё не взял её в работу.
processingВоркер взял задачу, делает запрос в провайдера (Veo, Kling, и т.д.) и ждёт результата.
completedПровайдер вернул результат — он в result. URL-ы файлов в S3 живут постоянно.
failedПровайдер вернул ошибку или превышены ретраи. Сумма списания возвращена на ключ. error содержит человекочитаемое описание.

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

Вариант 1: Polling

Простейший подход — опрашивать GET /tasks/{task_id} периодически.

import time, requests
while True:
r = requests.get(
f"https://nexusapi.dev/tasks/{task_id}",
headers={"Authorization": f"Bearer {KEY}"},
).json()
if r["status"] in ("completed", "failed"):
break
time.sleep(3)

Вариант 2: Webhook (рекомендуется)

Передай webhook_url в params — мы сами POST’нем туда, когда задача завершится. Никакого polling’а, никакой нагрузки на твой ключ rate-limit’ом.

Подробнее — на странице Webhooks.

Структура ответа

GET /tasks/{task_id} возвращает:

{
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"result": {
"video_url": "https://s3.amazonaws.com/.../result.mp4",
"duration": 8
},
"error": null,
"created_at": "2026-05-30T12:34:56Z"
}

При failed:

{
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "failed",
"result": null,
"error": "Provider rejected prompt: contains restricted content",
"created_at": "2026-05-30T12:34:56Z"
}

Содержимое result зависит от модели — у видео там video_url, у изображений image_url/images. Конкретный формат для каждой модели смотри в каталоге.

Идемпотентность

Сейчас каждый POST /generate создаёт новую задачу. Если твой backend ретраит запрос (например, при таймауте), может создаться дубль. Поддержка Idempotency-Key заголовка для предотвращения дублей — в ближайшем релизе.

Сколько ждать

Ориентировочное время выполнения от создания до completed:

Тип задачиТипичное время
Изображение (Nano-Banana, GPT-Image)10-30 секунд
Изображение (Sora-Image)30-60 секунд
Видео 5-8с (Veo fast, Kling fast)1-3 минуты
Видео 8с+ (Veo quality, Kling pro)3-8 минут
Видео extend (Veo-extend)10-15 минут

Это типичные значения. В пиковую нагрузку или при сбое primary-провайдера и переключении на fallback время может увеличиться в 1.5-2 раза.