Kling 3.0 API
Одной моделью делает и ролик по описанию, и ролик из присланного изображения. Соотношение сторон 16:9, 9:16, 1:1, на вход до 2 изображений, описание до 20 000 символов. Модель Kuaishou.
Принимает текстовое описание и возвращает готовый ролик. Разрешение 720p, 1080p, соотношение сторон 1:1, 9:16, 16:9, описание до 2 500 символов. Модель Kuaishou.
Принимает изображение и оживляет его, возвращая ролик. Разрешение 720p, 1080p, на вход до 2 изображений, описание до 2 500 символов. Модель Kuaishou.
Kling 3.0 API работает в России без VPN: один API ключ GEN202, оплата рублями с российской карты, цена до 10% ниже официальной.
Цена: за секунду, 720p — от 15.12 кр. (7,56 ₽ · $0.0756), 1080p — от 20.16 кр. (10,08 ₽ · $0.1008), 4K — 75.6 кр. (37,8 ₽ · $0.378).
Цена: за секунду, 720p — 20.16 кр. (10,08 ₽ · $0.1008), 1080p — 25.2 кр. (12,6 ₽ · $0.126).
Цена: за секунду, 720p — 20.16 кр. (10,08 ₽ · $0.1008), 1080p — 25.2 кр. (12,6 ₽ · $0.126).
кр. — кредиты, покупаются за рубли.
работает
работает
работает
Песочница
Ещё настройки
Многокадрового режима в песочнице нет. В нём ролик собирается из списка кадров: у каждого своё описание и своя длительность, до пяти кадров, каждый от одной до двенадцати секунд. Список задаётся структурой, а форма структуры не собирает, поэтому режим доступен только при вызове через API — как его передать, написано ниже, в разделе про вызов.
Поля multi_prompt, kling_elements задаются структурой и доступны только через API.
Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.
{ "model": "kling/3-0-video", "input": { "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет", "sound": false, "aspect_ratio": "16:9", "duration": 3 } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-0-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 15.12
}
}
{ "model": "kling/3-turbo-text-to-video", "input": { "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет", "duration": 3, "aspect_ratio": "1:1", "resolution": "720p" } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-turbo-text-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 20.16
}
}
{ "model": "kling/3-turbo-image-to-video", "input": { "prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый", "image_urls": [ "https://gen202.com/assets/sample-nano-banana-2.jpg" ], "duration": 3, "resolution": "720p" } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-turbo-image-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 20.16
}
}
Цена Kling 3.0
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| without audio-720P | $0.084 −10% | 15.12 кр. $0.07567,56 ₽ |
| without audio-1080P | $0.112 −10% | 20.16 кр. $0.100810,08 ₽ |
| with audio-720P | $0.126 −10% | 22.68 кр. $0.113411,34 ₽ |
| with audio-1080P | $0.168 −10% | 30.24 кр. $0.151215,12 ₽ |
| 4K | $0.42 −10% | 75.6 кр. $0.37837,8 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 720P | $0.112 −10% | 20.16 кр. $0.100810,08 ₽ |
| 1080P | $0.14 −10% | 25.2 кр. $0.12612,6 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 720P | $0.112 −10% | 20.16 кр. $0.100810,08 ₽ |
| 1080P | $0.14 −10% | 25.2 кр. $0.12612,6 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
На время работы шлюз удерживает ставку выбранного разрешения, умноженную на запрошенную длительность; больше 1134 кредита по этой модели он не удержит ни при каком запросе (duration до 15 с). Разница между удержанием и фактическим расходом возвращается на баланс тем же запросом состояния, который увидел итог.
Вызов через API
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете. На один ключ шлюз пропускает
30 постановок задачи и 300
запросов состояния в минуту.
Поля запроса
Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне
перечисления возвращают 422 и кредитов не тратят.
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-0-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 20 000 символов |
| sound | да или нет | обязательное | true или false |
| image_urls | список ссылок | опц. | до 2 ссылок на изображение |
| duration | целое число | опц. | целое от 3 до 15 |
| aspect_ratio | значение из списка | опц. | 16:9 · 9:16 · 1:1 |
| mode | значение из списка | опц. | std · pro · 4K |
| multi_shots | да или нет | опц. |
true или false
· без него шлюз подставит false
|
| multi_prompt | структура | опц. | структура по документации поставщика, проверяется у него |
| kling_elements | структура | опц. | структура по документации поставщика, проверяется у него |
Один план или несколько. Поле multi_shots выбирает, как модель снимает ролик. Оно булево, и маршрут отказывает, если его не прислать вовсе, — поэтому шлюз подставляет false, обычный ролик одним планом.
При multi_shots: false ролик снимается по описанию из поля prompt, принимаются две картинки: первая — начальный кадр, вторая — конечный. Звук включается полем sound.
При multi_shots: true описание из prompt не действует: сцены задаются списком multi_prompt, до пяти кадров, у каждого своё описание и длительность от одной до двенадцати секунд, не длиннее пятисот знаков. Картинка принимается одна и служит начальным кадром, а звук в этом режиме включается сам.
В обоих режимах в описании можно сослаться на образец через @имя, а сами образцы перечислить в kling_elements: от двух до четырёх картинок либо один ролик на образец, не больше трёх образцов на ролик.
Ссылка на изображение принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.
Ответ
Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где
code повторяет HTTP-статус, а полезное лежит в
data. Тот же конверт приходит и при отказе — разбирать две формы ответа
не нужно.
/api/v1/jobs/createTask
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась. |
/api/v1/jobs/recordInfo
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи — тот же, что вернул createTask. |
| data.model | строка | Имя модели в том виде, в каком его прислал клиент. |
| data.state | строка | Состояние задачи: waiting, queuing, generating, success или fail. |
| data.param | строка | Параметры, с которыми задача создана, — строкой JSON внутри JSON. |
| data.resultJson | строка | Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка. |
| data.failCode | строка | Код неудачи из таблицы ниже. У остальных задач — пустая строка. |
| data.failMsg | строка | Причина неудачи словами. Иначе пустая строка. |
| data.costTime | число | Сколько задача заняла, миллисекунды. Пока не завершилась — null. |
| data.completeTime | число | Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null. |
| data.createTime | число | Когда создана, миллисекунды эпохи Unix. |
| data.updateTime | число | Когда состояние менялось в последний раз, миллисекунды эпохи Unix. |
| data.creditsConsumed | число | Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной. |
Состояния задачи
Состояние лежит в поле state ответа
/api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо
повторить примерно через 3 секунды — чаще спрашивать нечего, столько же
ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.
| state | Что происходит |
|---|---|
| waiting | Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена. |
| queuing | Поставщик задачу принял и поставил в свою очередь. |
| generating | Генерация идёт. |
| success | Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано. |
| fail | Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком. |
Опрос не бывает бесконечным: задача на видео живёт не дольше 60
минут, после чего шлюз закрывает её сам состоянием fail и возвращает
удержанные кредиты целиком. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Результата нет дольше крайнего срока задачи (60 минут для видео). |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл,
который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние
success.
Отказы
Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не
дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.
| Код | Адрес | Когда |
|---|---|---|
| 400 | /api/v1/jobs/createTask | Тело запроса — не разбираемый JSON. |
| 401 | /api/v1/jobs/createTask | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 402 | /api/v1/jobs/createTask | Свободных кредитов меньше, чем удерживается под задачу. |
| 403 | /api/v1/jobs/createTask | Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте. |
| 413 | /api/v1/jobs/createTask | Тело запроса больше 512 КиБ. |
| 415 | /api/v1/jobs/createTask | Тело отправлено не как application/json или заголовок Content-Type не передан. |
| 422 | /api/v1/jobs/createTask | Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте. |
| 500 | /api/v1/jobs/createTask | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
| 401 | /api/v1/jobs/recordInfo | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 404 | /api/v1/jobs/recordInfo | Задачи с таким номером нет или она создана другим аккаунтом. |
| 422 | /api/v1/jobs/recordInfo | Параметр taskId не передан. |
| 429 | /api/v1/jobs/recordInfo | Больше 300 запросов в минуту на один ключ. |
| 500 | /api/v1/jobs/recordInfo | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-0-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"sound": false,
"aspect_ratio": "16:9",
"duration": 3
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-0-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"sound": False,
"aspect_ratio": "16:9",
"duration": 3
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете. На один ключ шлюз пропускает
30 постановок задачи и 300
запросов состояния в минуту.
Поля запроса
Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне
перечисления возвращают 422 и кредитов не тратят.
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-turbo-text-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 2 500 символов |
| duration | целое число | обязательное | целое от 3 до 15 |
| aspect_ratio | значение из списка | обязательное | 1:1 · 9:16 · 16:9 |
| resolution | значение из списка | опц. | 720p · 1080p |
Ответ
Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где
code повторяет HTTP-статус, а полезное лежит в
data. Тот же конверт приходит и при отказе — разбирать две формы ответа
не нужно.
/api/v1/jobs/createTask
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась. |
/api/v1/jobs/recordInfo
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи — тот же, что вернул createTask. |
| data.model | строка | Имя модели в том виде, в каком его прислал клиент. |
| data.state | строка | Состояние задачи: waiting, queuing, generating, success или fail. |
| data.param | строка | Параметры, с которыми задача создана, — строкой JSON внутри JSON. |
| data.resultJson | строка | Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка. |
| data.failCode | строка | Код неудачи из таблицы ниже. У остальных задач — пустая строка. |
| data.failMsg | строка | Причина неудачи словами. Иначе пустая строка. |
| data.costTime | число | Сколько задача заняла, миллисекунды. Пока не завершилась — null. |
| data.completeTime | число | Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null. |
| data.createTime | число | Когда создана, миллисекунды эпохи Unix. |
| data.updateTime | число | Когда состояние менялось в последний раз, миллисекунды эпохи Unix. |
| data.creditsConsumed | число | Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной. |
Состояния задачи
Состояние лежит в поле state ответа
/api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо
повторить примерно через 3 секунды — чаще спрашивать нечего, столько же
ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.
| state | Что происходит |
|---|---|
| waiting | Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена. |
| queuing | Поставщик задачу принял и поставил в свою очередь. |
| generating | Генерация идёт. |
| success | Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано. |
| fail | Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком. |
Опрос не бывает бесконечным: задача на видео живёт не дольше 60
минут, после чего шлюз закрывает её сам состоянием fail и возвращает
удержанные кредиты целиком. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Результата нет дольше крайнего срока задачи (60 минут для видео). |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл,
который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние
success.
Отказы
Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не
дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.
| Код | Адрес | Когда |
|---|---|---|
| 400 | /api/v1/jobs/createTask | Тело запроса — не разбираемый JSON. |
| 401 | /api/v1/jobs/createTask | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 402 | /api/v1/jobs/createTask | Свободных кредитов меньше, чем удерживается под задачу. |
| 403 | /api/v1/jobs/createTask | Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте. |
| 413 | /api/v1/jobs/createTask | Тело запроса больше 512 КиБ. |
| 415 | /api/v1/jobs/createTask | Тело отправлено не как application/json или заголовок Content-Type не передан. |
| 422 | /api/v1/jobs/createTask | Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте. |
| 500 | /api/v1/jobs/createTask | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
| 401 | /api/v1/jobs/recordInfo | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 404 | /api/v1/jobs/recordInfo | Задачи с таким номером нет или она создана другим аккаунтом. |
| 422 | /api/v1/jobs/recordInfo | Параметр taskId не передан. |
| 429 | /api/v1/jobs/recordInfo | Больше 300 запросов в минуту на один ключ. |
| 500 | /api/v1/jobs/recordInfo | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-turbo-text-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"duration": 3,
"aspect_ratio": "1:1",
"resolution": "720p"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-turbo-text-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"duration": 3,
"aspect_ratio": "1:1",
"resolution": "720p"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете. На один ключ шлюз пропускает
30 постановок задачи и 300
запросов состояния в минуту.
Поля запроса
Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне
перечисления возвращают 422 и кредитов не тратят.
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-turbo-image-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 2 500 символов |
| image_urls | список ссылок | обязательное | от 1 до 2 ссылок на изображение |
| duration | целое число | обязательное | целое от 3 до 15 |
| resolution | значение из списка | опц. | 720p · 1080p |
Ссылка на изображение принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.
Ответ
Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где
code повторяет HTTP-статус, а полезное лежит в
data. Тот же конверт приходит и при отказе — разбирать две формы ответа
не нужно.
/api/v1/jobs/createTask
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась. |
/api/v1/jobs/recordInfo
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи — тот же, что вернул createTask. |
| data.model | строка | Имя модели в том виде, в каком его прислал клиент. |
| data.state | строка | Состояние задачи: waiting, queuing, generating, success или fail. |
| data.param | строка | Параметры, с которыми задача создана, — строкой JSON внутри JSON. |
| data.resultJson | строка | Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка. |
| data.failCode | строка | Код неудачи из таблицы ниже. У остальных задач — пустая строка. |
| data.failMsg | строка | Причина неудачи словами. Иначе пустая строка. |
| data.costTime | число | Сколько задача заняла, миллисекунды. Пока не завершилась — null. |
| data.completeTime | число | Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null. |
| data.createTime | число | Когда создана, миллисекунды эпохи Unix. |
| data.updateTime | число | Когда состояние менялось в последний раз, миллисекунды эпохи Unix. |
| data.creditsConsumed | число | Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной. |
Состояния задачи
Состояние лежит в поле state ответа
/api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо
повторить примерно через 3 секунды — чаще спрашивать нечего, столько же
ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.
| state | Что происходит |
|---|---|
| waiting | Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена. |
| queuing | Поставщик задачу принял и поставил в свою очередь. |
| generating | Генерация идёт. |
| success | Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано. |
| fail | Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком. |
Опрос не бывает бесконечным: задача на видео живёт не дольше 60
минут, после чего шлюз закрывает её сам состоянием fail и возвращает
удержанные кредиты целиком. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Результата нет дольше крайнего срока задачи (60 минут для видео). |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл,
который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние
success.
Отказы
Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не
дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.
| Код | Адрес | Когда |
|---|---|---|
| 400 | /api/v1/jobs/createTask | Тело запроса — не разбираемый JSON. |
| 401 | /api/v1/jobs/createTask | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 402 | /api/v1/jobs/createTask | Свободных кредитов меньше, чем удерживается под задачу. |
| 403 | /api/v1/jobs/createTask | Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте. |
| 413 | /api/v1/jobs/createTask | Тело запроса больше 512 КиБ. |
| 415 | /api/v1/jobs/createTask | Тело отправлено не как application/json или заголовок Content-Type не передан. |
| 422 | /api/v1/jobs/createTask | Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте. |
| 500 | /api/v1/jobs/createTask | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
| 401 | /api/v1/jobs/recordInfo | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 404 | /api/v1/jobs/recordInfo | Задачи с таким номером нет или она создана другим аккаунтом. |
| 422 | /api/v1/jobs/recordInfo | Параметр taskId не передан. |
| 429 | /api/v1/jobs/recordInfo | Больше 300 запросов в минуту на один ключ. |
| 500 | /api/v1/jobs/recordInfo | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-turbo-image-to-video",
"input": {
"prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый",
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-2.jpg"
],
"duration": 3,
"resolution": "720p"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-turbo-image-to-video",
"input": {
"prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый",
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-2.jpg"
],
"duration": 3,
"resolution": "720p"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Заменить в нём нужно два значения: свой ключ и ссылку на изображение — в примере стоит образец с нашего сайта.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Остальные модели этого семейства и их поля — в разделе документации Видео.
Что делает нейросеть Kling 3.0
Kling 3.0 — линейка видеомоделей Kuaishou, объявленная 5 февраля 2026 года в составе серии Kling AI 3.0. Модель снимает ролик с родным звуком по описанию и по присланному кадру, а стоит секунда у GEN202 от 7,56 ₽ до 37,8 ₽: цену задают разрешение и включённый звук.
Kling 3.0 вызывается под одним именем и делает обе работы сразу: видео из текста и видео из изображения. Кадр для второй передаётся ссылкой, и список image_urls берёт до 2 ссылок.
Kling 3.0 Turbo стоит на этой же странице двумя отдельными режимами, и в поле model у них разные имена: kling/3-turbo-text-to-video и kling/3-turbo-image-to-video.
Родной звук включается флагом sound, а ролик со звуком и без него стоит в таблице цен порознь: строки на то и другое разные.
Кадры многокадрового ролика и закреплённые элементы приходят своими полями — multi_prompt и kling_elements, а остальные поля перечислены в разделе «Kling».
Как пользоваться Kling 3.0 бесплатно и можно ли её скачать
У Kling 3.0 платят по расходу: с баланса уходит ставка за каждую секунду готового ролика, а поднимают её разрешение и звук. Новому счёту при первом входе начисляют приветственные кредиты, и они идут в счёт первого ролика. Ежемесячного платежа нет, а задача, закончившаяся отказом, возвращает удержание на баланс целиком.
Сама модель работает на стороне Kuaishou и запускается по сети, поэтому у себя разворачивать нечего. Через нас забирают результат: готовый ролик из песочницы приходит файлом mp4.
Официальный сайт Kling 3.0 принадлежит Kuaishou, а мы — независимый продавец доступа к его моделям. Имена полей и допустимые значения при этом взяты у разработчика: их видно в таблице выше.
Тем, кому код не нужен, та же модель открыта в браузере: порядок разобран на странице как пользоваться Kling в России.
Порядок работы одинаков у всех трёх режимов страницы, и меняются в нём только значения полей.
- Соберите описание кадра. Поле prompt принимает сцену целиком: героя, его действие, обстановку вокруг и движение камеры.
- Приложите исходный кадр. Ссылку на картинку кладут в поле image_urls, и тогда ролик отталкивается от неё, а не сочиняется с нуля.
- Выберите разрешение и длительность. Разрешение у Kling 3.0 выбирает поле mode, у Kling 3.0 Turbo — поле resolution, а секунды ставят в duration.
- Решите, нужен ли родной звук. Флаг sound добавляет к картинке звуковую дорожку, и от него же зависит строка цены.
- Разложите рассказ по кадрам. Флаг multi_shots отдаёт переходы между планами модели, а поле multi_prompt описывает каждый план по отдельности.
Чем Kling 3.0 Turbo отличается от Kling 3.0
Разницу между двумя моделями Kuaishou свёл в свою таблицу возможностей, и видна она прямо в полях запроса.
| Что | Kling 3.0 | Kling 3.0 Turbo |
|---|---|---|
| Разрешения | поле mode: std, pro и 4K | поле resolution: 720p и 1080p |
| Кадры на входе | первый и последний | первый |
| Закрепление элементов | поле kling_elements | — |
| Перенос движения с готового ролика | есть | — |
| Многокадровый рассказ | есть | есть |
| Родной звук | есть | есть |
| Обязательные поля | prompt и sound | Kling 3.0 Turbo text-to-video — prompt, duration и aspect_ratio; Kling 3.0 Turbo image-to-video — prompt, image_urls и duration |
Многокадровый рассказ и родной звук Kuaishou называет общими для обеих моделей, а 4K, последний кадр и закрепление элементов оставил за Kling 3.0.
Выпуски Kling: даты у Kuaishou и куда они ведут
Серия собрана из двух веток, и номер версии сам по себе порядка не задаёт: выпуск 2.6 вырос в VIDEO 3.0, а выпуск O1 — в VIDEO 3.0 Omni. В таблице — имя у Kuaishou, дата его объявления, что изменилось и страница модели у нас.
| Имя у Kuaishou | Дата по анонсу | Что изменилось | Наш адрес |
|---|---|---|---|
| KLING VIDEO 2.6 | 16 декабря 2025 | Впервые появился родной звук: голос, шумы и фон за одну генерацию | — |
| Kling VIDEO 3.0 | 5 февраля 2026 | Прибавились разметка планов, образец-элемент у стартового кадра и свободная длительность до 15 секунд | эта страница, kling/3-0-video |
| Kling VIDEO 3.0 Omni | 5 февраля 2026 | Та же серия под рассказ из нескольких кадров, с разбором раскадровки по полям | карточка Kling O3 |
| Kling VIDEO 3.0 Motion Control | 4 марта 2026 | Отдельная работа: движение и мимика переносятся с присланного ролика | карточка Kling 3.0 Motion Control |
| Родное 4K для серии 3.0 | 23 апреля 2026 | Старшее разрешение 4K у моделей серии | выбирается полем mode на этой странице |
| Kling 3.0 Turbo | 17 июня 2026 | В серии 3.0 появился режим Turbo; вместе с ним обновлена правка видео в Kling 3.0 Omni | эта страница, kling/3-turbo-text-to-video и kling/3-turbo-image-to-video |
Про предыдущий выпуск Kuaishou писал так: «Previously, KLING's video models could only generate "silent visuals". Creators had to manually find voiceovers, add sound effects, and adjust the pace—an overly complex process that made it hard to achieve true immersion». Перевод наш: «Раньше видеомодели KLING умели делать только "немую картинку". Автору приходилось вручную искать озвучку, добавлять шумы и подгонять темп — слишком сложный порядок работы, из-за которого трудно было добиться настоящего погружения». Страница — руководство Kling по выпуску VIDEO 2.6.
Что прибавилось в нынешнем выпуске, Kuaishou свёл в таблицу возможностей: у VIDEO 2.6 отмечены «Text-to-Video», «Image-to-Video», «Start & End Frames-to-Video» и «Native Audio», а у VIDEO 3.0 к ним добавлены «Multi-Shot», «Start Frame + Element Reference», «Multi-Character Coreference (3+)», «15s Output Duration» и «Flexible Duration». Перевод наш: текст в видео, картинка в видео, первый и последний кадр в видео и родной звук — против них же плюс разметка планов, образец-элемент у стартового кадра, перекличка трёх и более героев, пятнадцатисекундная длительность и свободный её выбор. Таблица — в руководстве Kling по модели VIDEO 3.0.
О выходе Kling 3.0 Turbo Kuaishou объявил 17 июня 2026 года: «Kling 3.0 Turbo is now live, along with upgraded video editing in Kling 3.0 Omni». Перевод наш: «Kling 3.0 Turbo уже работает, а вместе с ним обновлена правка видео в Kling 3.0 Omni». Перенос движения отмечен там же 4 марта 2026 года: «Kling VIDEO 3.0 Motion Control: Major Launch!» — «Kling VIDEO 3.0 Motion Control: большой запуск». Страница — история выпусков Kling AI. Чем Kling 3.0 Turbo отличается от Kling 3.0, разобрано таблицей выше.
Какой длины и в каком разрешении выходит ролик Kling 3.0
Ролик выходит от 3 до 15 секунд, и этот диапазон общий для Kling 3.0 и для обоих режимов Turbo.
Разрешение у Kling 3.0 выбирают режимом: Kling 3.0 pro — это 1080p, std — 720p, а 4K назван прямо. У Turbo выбор из двух: 720p и 1080p.
Форм кадра у Kling 3.0 3: 16:9, 9:16, 1:1.
Что Kuaishou говорит о модели Kling 3.0
Чем Kuaishou считает этот выпуск, сказано подзаголовком руководства: «VIDEO 3.0: Native Audio Upgrade, Enhanced Element Consistency, and Support for Multi-Shot Narratives». Перевод наш: «VIDEO 3.0: обновлённый родной звук, более сильное постоянство элементов и поддержка рассказа из нескольких планов». Страница — руководство Kling по модели VIDEO 3.0.
Как включается разметка планов, там же расписано по переключателям: «In VIDEO 3.0, multi-shot video generation can be triggered through two modes: "Multi-Shot" and "Custom Multi-Shot". When "Multi-Shot" is enabled, the model automatically plans the shot transitions, and this switch is a prerequisite for enabling "Custom Multi-Shot". When "Multi-Shot" is disabled, the model will default to generating a single-shot video». Перевод наш: «В VIDEO 3.0 съёмка несколькими планами включается двумя способами: обычной разметкой и своей. При обычной модель сама планирует переходы между планами, и она же — обязательное условие для своей разметки. При выключенной разметке модель по умолчанию делает ролик из одного плана». В запросе к GEN202 этим двум способам отвечают поля multi_shots и multi_prompt.
Про закреплённый элемент то же руководство VIDEO 3.0 говорит: «Elements can be created in two ways: 1) Upload/record a character video, and the system will automatically extract the character's appearance and native voice tone, with options to keep the original or replace with a custom tone; 2) Upload 2-4 reference images of the element». Перевод наш: «Элемент заводится двумя способами: первый — загрузить или записать ролик с героем, и система сама вынет из него внешность и родной тембр, который можно оставить или заменить; второй — загрузить от 2 до 4 картинок с элементом».
Длительность Kuaishou описывает так: «The new model generates up to 15 seconds of continuous video, with a flexible duration ranging from 3 to 15 seconds. This is not just about longer output, but unlocking more narrative possibilities». Перевод наш: «Новая модель делает до 15 секунд непрерывного видео со свободной длительностью от 3 до 15 секунд. Дело не только в длине, а в том, что открывается больше возможностей для рассказа». Тот же диапазон стоит в форме GEN202 — от 3 до 15 секунд.
Зачем нужно закрепление, Kuaishou объясняет на странице возможности Video 3.0: «Maintain perfect character consistency and object stability across frames, ensuring a reliable visual identity even with complex camera movements. Our AI video model locks subjects to prevent flickering». Перевод наш: «Удерживайте постоянство героя и устойчивость предметов от кадра к кадру, сохраняя узнаваемый облик даже при сложном движении камеры. Модель закрепляет героев, чтобы они не мерцали».
Всю серию Kuaishou описывает на своей главной странице так: «Built on a fully upgraded architecture, VIDEO 3.0 and VIDEO 3.0 Omni natively support deep multimodal instruction parsing and cross-task integration, redefining the narrative logic of light and sound». Перевод наш: «На полностью обновлённом устройстве VIDEO 3.0 и VIDEO 3.0 Omni изначально разбирают многомодальные указания и совмещают задачи между собой, заново определяя, как связаны изображение и звук в рассказе».
Счёт у Kuaishou идёт посекундно: «The video service fees are charged per second, with different rates for each mode». Перевод наш: «Плата за услугу берётся посекундно, и ставка у каждого режима своя». Свою ставку он называет в кредитах кабинета Kling AI и показывает на примере: «Example 2: Generating a 5-second 3.0 No Native Audio 720p video costs 30 Credits» — перевод наш: «Пример 2: пятисекундный ролик 3.0 без родного звука в 720p стоит 30 кредитов». Столбец «Официальная» в таблице цен выше показывает долларовую цену доступа к этой модели по API — $0.084 за секунду у младшего варианта.
Цитаты приведены по страницам Kling AI на 15 сентября 2026 года.
Что Kuaishou оставил за Kling 3.0: последний кадр, 4K и перенос движения
Последний кадр на входе принимает Kling 3.0: ролик можно вести от первого кадра к последнему. У Kling 3.0 Turbo на входе один кадр — первый.
Родное 4K объявлено для Kling 3.0, и работы, где оно есть, — это видео из текста и видео из изображения.
Перенос движения и мимики с готового ролика делает соседняя модель серии — Kling 3.0 Motion Control.
Что показали независимые проверки Kling 3.0
Kling 3.0 проверяют слепым сравнением на LMArena: человеку показывают два ролика без имён моделей и просят выбрать лучший, из этих выборов складывается оценка. В арене «картинка в видео» у строки kling-v3-pro стоит 1355 с допуском 6 при 199 238 голосах. У прошлых выпусков линейки оценки ниже: kling-2.6-pro — 1294 с допуском 8 при 202 157 голосах, kling-2.5-turbo-1080p — 1276 с допуском 13 при 3 796, kling-v2.1-master — 1235 с допуском 8 при 29 824. Числа на 21 сентября 2026 года, таблица — арена «картинка в видео» на LMArena.
От предыдущего выпуска Kling 3.0 отделяет 61 пункт при допуске 6 и 8: границы двух оценок не пересекаются, а голосов у каждой строки около двухсот тысяч. В слепом сравнении ролики Kling 3.0 выбирали чаще, чем ролики любого прошлого выпуска Kling.
Вторая проверка со стороны — научная работа «Talker-T2AV: Joint Talking Audio-Video Generation with Autoregressive Diffusion Modeling», выложенная на arXiv в апреле 2026 года. Kling 3 она называет среди ведущих систем, которые делают звук и картинку вместе: «Leading commercial systems such as Sora 2 (OpenAI, 2025), Veo 3 (Google DeepMind, 2025), Kling 3 (Kuaishou Technology, 2026), and Seedance 2.0 (ByteDance Seed Team, 2026) have all adopted joint audio-video generation as a core capability, producing cinematic clips with tightly synchronized dialogue, sound effects, and visual motion». Перевод наш: «Ведущие рыночные системы — Sora 2, Veo 3, Kling 3 и Seedance 2.0 — все взяли совместное создание звука и картинки как основную способность и выдают кинематографичные ролики с точно совпадающими репликами, звуковыми эффектами и движением». Работа — препринт Talker-T2AV на arXiv.
Что чаще всего идёт не так в Kling 3.0 и как это обходят
Ниже — то, что видно на съёмке и о чём документация молчит: места, где ролик выходит не тем, и обходы, которые для них нашли.
Наблюдения о Kling 3.0 взяты из разборов с живыми прогонами: Theoretically Media, 4 февраля 2026, Atomic Gains, 5 февраля 2026, King Charles Tv, 9 февраля 2026, Oprelia AI, 10 февраля 2026, Digital Master Tools, 14 февраля 2026, VideoSmile, 22 февраля 2026, Curious Refuge, 26 февраля 2026.
- К концу длинного ролика речь расходится с губами: герой замолкает раньше, чем договорил. Реплики поэтому ставят в начало, а последние планы делают без слов.
- Много реплик в одном описании модель старается уместить целиком и торопится. Разговор надёжнее разложить по нескольким коротким планам.
- Модель договаривает за автора: в кадре появляются лишний человек, лишняя сцена или надпись, которых не просили. Иногда герой заговаривает сам собой — тогда в описании прямо пишут, что он молчит.
- Закреплённый элемент и многокадровый рассказ спорят между собой: элемент держит облик героя, а заказанная смена планов при этом выполняется не вся.
- Подробное описание, собранное чат-ботом, модель понимает слишком буквально: от слова «стоит» герой замирает совсем. Короткое описание одного действия срабатывает точнее.
- Движение камеры уходит не туда: вместо камеры едет предмет или кадр начинает мелко трястись. Помогает прямое указание, что предмет остаётся на месте.
- Когда заданы и первый кадр, и последний, действие между ними выполняется хуже. Тот же замысел выходит лучше с одного кадра и многокадрового режима.
- На общем плане лицо героя расползается, а люди на дальнем плане движутся одинаково и дёргано. Крупность плана поэтому выбирают под лицо, а массовку оставляют спокойной.
- Звук сцены иногда не сходится с картинкой: за закрытой дверью слышна улица. Такой ролик переснимают, а не правят описанием.
- Годный ролик редко выходит с первой попытки. Сломавшийся план переснимают отдельно или вырезают при монтаже, а не переделывают всё целиком.
Общий порядок из этого складывается такой: одно действие на план, короткое описание и проверка замысла на низком разрешении, где секунда стоит меньше.
GEN202 — сервис доступа к моделям с оплатой рублями, и рубли в таблице выше — цены GEN202: у Kuaishou счёт идёт в кредитах его кабинета. Как устроен счёт и сколько стоит кредит, разобрано на странице цен.