Veo: имя модели и поля запроса
Veo вызывается не через createTask, а своими двумя адресами — теми же,
что у поставщика: код, написанный под его generate и
record-info, работает со шлюзом сменой адреса и ключа.
Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние, а
когда ролик готов — ссылку на файл. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете.
Уровни Veo
Уровень ставится в поле model; без него шлюз подставит
veo/3-fast. Ролик, кадр и длительность у всех трёх задаются
одинаково — разница в цене и качестве, цены на уровни — в
каталоге.
Поля запроса
Поля лежат в корне тела запроса, а не внутри input. Обязателен один
prompt: остальные шлюз подставит сам — теми значениями, что названы в
столбце пояснения, и счёт посчитает по ним же.
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | не длиннее 20 000 символов · Описание ролика. Пустое — отказ 422 до обращения к поставщику. |
| imageUrls | список ссылок | опц. | до 3 ссылок на изображение · Картинки на входе. Адрес проверяется теми же правилами, что у остальных моделей: схема, длина и запрет ходить внутрь чужой сети — отказ 422 до обращения к поставщику. |
| model | значение из списка | опц. | veo/3, veo/3-fast, veo/3-lite · Уровень модели. Без него шлюз подставит veo/3-fast; написание поставщика (veo3_fast) принимается наравне с нашим. |
| generationType | значение из списка | опц. | TEXT_2_VIDEO, FIRST_AND_LAST_FRAMES_2_VIDEO, REFERENCE_2_VIDEO · Что делать с картинками на входе: развернуть ролик вокруг одной, взять две как первый и последний кадр или до трёх как образцы. Сочетание с уровнем и длительностью проверяет поставщик. |
| aspect_ratio | значение из списка | опц. | 16:9, 9:16, Auto · Форма кадра. Имя пишется через подчёркивание — так оно записано у поставщика. Не прислано — поле не уходит вовсе, кадр выбирает поставщик. |
| resolution | значение из списка | опц. | 720p, 1080p, 4k · Разрешение ролика. Без него шлюз подставит 720p. |
| duration | число из списка | опц. | 4, 6, 8 секунд · Длительность ролика в секундах — по ней считается цена. Без неё шлюз подставит 8. |
| enableTranslation | да или нет | опц. | true или false · Флаг поставщика. Не прислан — шлюз его не отправляет. |
| watermark | текст | опц. | не длиннее 20 000 символов · Водяной знак. Предела длины поставщик не называет — стоит наш общий потолок. |
| callBackUrl | текст | опц. | полный адрес http или https · Адрес, на который шлюз постучится, когда ролик будет готов или отказан. Тело — то же, что отдаёт запрос состояния. |
Значение вне списка шлюз отклоняет до обращения к поставщику ответом
422, и кредитов это не стоит. Поля, которых нет в таблице, он молча
отбрасывает.
Как узнать готовность
Поля state у Veo нет: состояние приходит числом
successFlag — 0 работает,
1 готово (ссылка на файл в response),
2 и 3 отказ, причина в
errorMessage. Расчёт закрывается тем же запросом состояния:
списание при готовности и возврат при отказе происходят в тот самый
record-info, который увидел итог. Пока вы не спросили, кредиты
остаются удержанными.
Счёт идёт за секунду видео и известен до запуска целиком — ровно эта сумма удерживается на время
работы, и неудачный ролик не стоит ничего.
Сочетание, которого нет в продаже (veo/3-lite в 4k), шлюз
отклоняет ответом 422, а не считает по выдуманной.
Пример вызова
Показан весь путь: постановка задачи, ожидание с паузой в 3 секунды и ссылка на готовый ролик. Подставить остаётся только свой ключ.
# 1. Поставить задачу — в ответе её номер
TASK=$(curl -s https://api.gen202.com/api/v1/veo/generate \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"prompt": "рыжий кот идёт по подоконнику, мягкий свет",
"model": "veo/3-fast",
"resolution": "720p",
"duration": 8
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока successFlag не перестанет быть 0
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/veo/record-info?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
FLAG=$(echo "$RECORD" | jq -r '.data.successFlag')
[ "$FLAG" != "0" ] && break
sleep 3
done
# 3. Забрать ссылку: 1 — готово, 2 и 3 — отказ
echo "$RECORD" | jq -r '.data.response.resultUrls[0] // .data.errorMessage'
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе её номер
created = requests.post(
"https://api.gen202.com/api/v1/veo/generate",
headers=headers,
json={
"prompt": "рыжий кот идёт по подоконнику, мягкий свет",
"model": "veo/3-fast",
"resolution": "720p",
"duration": 8,
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока successFlag не перестанет быть 0
while True:
record = requests.get(
"https://api.gen202.com/api/v1/veo/record-info",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if record["successFlag"] != 0:
break
time.sleep(3)
# 3. Забрать ссылку. Разбор здесь один: у Veo response — объект, а не строка
if record["successFlag"] != 1:
raise SystemExit("отказ: " + str(record.get("errorMessage")))
print(record["response"]["resultUrls"][0])
Ответ, когда ролик готов
Конверт тот же, что у задач, а внутри — ответ поставщика как есть. Ссылка лежит объектом, а не
строкой JSON внутри JSON: разбирать её вторым разбором, как
resultJson обычных задач, не нужно.
{
"code": 200,
"msg": "success",
"data": {
"successFlag": 1,
"response": { "resultUrls": ["https://file.example/result.mp4"] },
"errorMessage": null
}
}
Отказы
Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null} — тот же
конверт, что у задач. Ролик, не дошедший до результата, не тарифицируется: удержанные кредиты
возвращаются целиком.
| Код | Адрес | Когда |
|---|---|---|
| 401 | /api/v1/veo/generate | Ни ключа в заголовке Authorization, ни входа по сессии; либо ключ неверный или отключён. |
| 402 | /api/v1/veo/generate | Свободных кредитов меньше, чем стоит запрошенный ролик. Цена Veo известна до вызова целиком, и удерживается ровно она. |
| 422 | /api/v1/veo/generate | Пустой prompt; значение model, resolution или duration вне списка; ссылка в imageUrls не прошла проверку адреса; сочетание уровня и разрешения, которого нет в продаже. Сюда же попадает запрос по сессии, назвавший чужой или отключённый ключ учёта. |
| 502 | /api/v1/veo/generate | Поставщик не ответил или ответил ошибкой. Задача не создаётся, удержание снимается целиком. |
| 503 | /api/v1/veo/generate | Поставщик перегружен или отбил запрос по своему лимиту. Удержание снимается, повторить можно через несколько секунд — срок назван в заголовке Retry-After. |
| 401 | /api/v1/veo/record-info | Ни ключа в заголовке Authorization, ни входа по сессии; либо ключ неверный или отключён. |
| 404 | /api/v1/veo/record-info | Задачи с таким номером нет или она создана другим аккаунтом. |
| 502 | /api/v1/veo/record-info | Состояние узнать не удалось: поставщик не ответил или ответил ошибкой. Списание при этом не производится: расчёт закрывается по состоянию задачи, а оно осталось неизвестным. |
| 503 | /api/v1/veo/record-info | Поставщик перегружен. Повторить опрос можно через несколько секунд — срок назван в заголовке Retry-After; удержание остаётся на месте. |
Подробнее: отказы — как устроен конверт отказа у остальных маршрутов; баланс и расход — как спросить списание по ключу.
Общее для всех моделей: Как устроена задача — чем отправить и как дождаться · Формат ответа — где в ответе ссылка на файл · Отказы — что означает отказ