Генерация видео ИИ
Создавайте видео по тексту и изображениям, отслеживайте прогресс и скачивайте MP4 через Videos API.
К обзору документацииПодключение и авторизация
Base URL: https://caheoai.com/v1
Authorization: Bearer $STALI_API_KEY
Задайте STALI_API_KEY в окружении. GET /v1/models проверяет авторизацию без создания видео.
read -r -s -p "STALI_API_KEY: " STALI_API_KEY
export STALI_API_KEY
printf '\n'
curl -fsS https://caheoai.com/v1/models -H "Authorization: Bearer ${STALI_API_KEY:?STALI_API_KEY}"Команды cURL рассчитаны на Bash; в Windows используйте настройку PowerShell. Замените примеры URL своими файлами, доступными провайдеру.
Создание видео оплачивается. Сохраните id из успешного ответа для отслеживания задания.
Возврат при сбое после выдачи id зависит от провайдера и сверки. Статус failed не подтверждает немедленный возврат на баланс.
Проверка, скачивание и отмена не создают новую генерацию. Успешная отмена не означает автоматический возврат списания.
Модели и возможности
| Модель | Vendor | Длительность (сек.) | Цена / видео | Макс. референсов | Соотношение сторон | Разрешение |
|---|---|---|---|---|---|---|
veo-3.1 | 4 / 6 / 8 | $0.1818 / $0.1818 / $0.1818 | 1–3 | 16:9, 9:16 | 720p / 1080p | |
google-omni-flash | 5 / 10 | $0.3636 / $0.3636 | 1–3 | 16:9, 9:16 | 720p | |
grok-imagine-video-1.5 | xAI | docsUpgrade.video.grokDuration | $0.4091 / $0.6818 / $1.02 | 1–3 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p / 1080p |
st1/seedance-2.0-1080p | ByteDance | 4–15 seconds (1s steps) | Default 5s = $4.48 | 0–10 | auto / 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | 1080p |
st1/seedance-2.0-720p | ByteDance | 4–15 seconds (1s steps) | Default 5s = $1.82 | 0–10 | auto / 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | 720p |
st1/seedance-2.0-fast-720p | ByteDance | 4–15 seconds (1s steps, Fast 720p) | Default 5s = $1.45 | 0–10 | auto / 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | 720p |
st1/seedance-2.5-1080p | ByteDance | 4–30 seconds (1s steps) | Default 5s = $6.80 | 0–10 | auto / 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | 1080p |
st1/seedance-2.5-720p | ByteDance | 4–30 seconds (1s steps) | Default 5s = $2.77 | 0–10 | auto / 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | 720p |
veo-3.1 accepts 4/6/8 seconds; google-omni-flash accepts 5/10; grok-imagine-video-1.5 accepts 6/10/15.
Поддержка изображений, размеров и разрешения зависит также от маршрута провайдера. Не все параметры подходят каждой модели.
veo-3.1 accepts only 4, 6 or 8. google-omni-flash accepts only 5 or 10. grok-imagine-video-1.5 accepts only 6, 10 or 15. Check seconds in the response.
Методы и параметры
POST /v1/videos — создать задание
Отправляйте application/json. Метод не принимает multipart/form-data; используйте URL или структуру JSON изображений, поддерживаемую моделью.
| Параметр | Требование | Использование |
|---|---|---|
model | Обязательно | ID доступной видеомодели; указывайте явно, не полагаясь на значение по умолчанию. |
prompt | Обязательно | Опишите объект, сцену, действие и движение камеры. |
seconds | Необязательно | Follow the model table. veo-3.1 defaults to 8s; google-omni-flash to 10s; grok-imagine-video-1.5 to 6s. |
aspect_ratio | Необязательно | For example 16:9 or 9:16 depending on the model. Keep it consistent with size. |
size | Необязательно | Размер, например 1280x720 или 720x1280. Допустимые размеры зависят от модели. |
images / input_reference | Необязательно | Начальный кадр или референсы через URL/JSON. Всё тело запроса не более 20 МБ; также действуют ограничения провайдера. |
reference_image_urls | Необязательно | reference_image_urls: reference images (reference mode; not locked as the first frame). |
omni_reference_task_type | Необязательно | omni_reference_task_type: set "reference" when using reference images with a fixed aspect_ratio. |
last_frame | Необязательно | End frame for veo-3.1 or grok-imagine-video-1.5, with the same input_reference. |
input_video | Необязательно | URL исходного MP4 для video-to-video в google-omni-flash. |
resolution | Необязательно | Some models support 720p or 1080p (default 720p). Others may ignore it or derive from size. |
generate_audio | Необязательно | Some video models may ignore generate_audio / reference_audios. |
GET /v1/videos/{id} — прогресс
Передавайте исходную модель в ?model=. Начните с интервала 10 секунд и увеличивайте его при 429. JSON ниже — пример, не реальный результат.
- queued: задание принято и ожидает.
- in_progress: провайдер выполняет задание.
- completed: результат можно скачать.
- failed: проверьте error и сохраните id для поддержки.
{
"id": "video_abc123",
"object": "video",
"model": "st1/seedance-2.0-720p",
"status": "completed",
"progress": 100,
"seconds": "10",
"size": "1280x720",
"error": null
}GET /v1/videos/{id}/content — скачать MP4
Скачивайте после completed с тем же API-ключом и ?model=; сохраняйте бинарный ответ как .mp4.
DELETE /v1/videos/{id} — запрос отмены
Отмена зависит от маршрута и состояния задачи; некоторые маршруты сейчас не поддерживают DELETE. Не считайте команду отмены гарантией возврата средств.
Цены по длительности
Цены рассчитаны по текущим настройкам этого сайта с применимыми корректировками. Проверьте перед генерацией.
Seedance duration pricing. Unit: VND per successful video. 4–15s or 4–30s is the supported duration range, not a flat package price. Choose seconds within the supported range; exact prices are listed below. Any fixed generation fee is already included.
st1/seedance-2.0-1080p
If seconds is omitted: 5s = $4.48.
| Duration / Seconds | Цена / видео |
|---|---|
| 4s | $3.58 |
| 5s | $4.48 |
| 6s | $5.38 |
| 7s | $6.27 |
| 8s | $7.17 |
| 9s | $8.06 |
| 10s | $8.96 |
| 11s | $9.86 |
| 12s | $10.75 |
| 13s | $11.65 |
| 14s | $12.54 |
| 15s | $13.44 |
st1/seedance-2.0-720p
If seconds is omitted: 5s = $1.82.
| Duration / Seconds | Цена / видео |
|---|---|
| 4s | $1.46 |
| 5s | $1.82 |
| 6s | $2.18 |
| 7s | $2.54 |
| 8s | $2.90 |
| 9s | $3.27 |
| 10s | $3.63 |
| 11s | $3.99 |
| 12s | $4.35 |
| 13s | $4.71 |
| 14s | $5.08 |
| 15s | $5.44 |
st1/seedance-2.0-fast-720p
If seconds is omitted: 5s = $1.45.
| Duration / Seconds | Цена / видео |
|---|---|
| 4s | $1.16 |
| 5s | $1.45 |
| 6s | $1.74 |
| 7s | $2.03 |
| 8s | $2.32 |
| 9s | $2.61 |
| 10s | $2.90 |
| 11s | $3.19 |
| 12s | $3.48 |
| 13s | $3.77 |
| 14s | $4.06 |
| 15s | $4.35 |
st1/seedance-2.5-1080p
If seconds is omitted: 5s = $6.80.
| Duration / Seconds | Цена / видео |
|---|---|
| 4s | $5.44 |
| 5s | $6.80 |
| 6s | $8.16 |
| 7s | $9.52 |
| 8s | $10.88 |
| 9s | $12.25 |
| 10s | $13.61 |
| 11s | $14.97 |
| 12s | $16.33 |
| 13s | $17.69 |
| 14s | $19.05 |
| 15s | $20.41 |
| 16s | $21.77 |
| 17s | $23.13 |
| 18s | $24.49 |
| 19s | $25.85 |
| 20s | $27.21 |
| 21s | $28.57 |
| 22s | $29.93 |
| 23s | $31.29 |
| 24s | $32.65 |
| 25s | $34.02 |
| 26s | $35.38 |
| 27s | $36.74 |
| 28s | $38.10 |
| 29s | $39.46 |
| 30s | $40.82 |
st1/seedance-2.5-720p
If seconds is omitted: 5s = $2.77.
| Duration / Seconds | Цена / видео |
|---|---|
| 4s | $2.22 |
| 5s | $2.77 |
| 6s | $3.33 |
| 7s | $3.88 |
| 8s | $4.43 |
| 9s | $4.99 |
| 10s | $5.54 |
| 11s | $6.09 |
| 12s | $6.65 |
| 13s | $7.20 |
| 14s | $7.75 |
| 15s | $8.30 |
| 16s | $8.86 |
| 17s | $9.41 |
| 18s | $9.96 |
| 19s | $10.52 |
| 20s | $11.07 |
| 21s | $11.62 |
| 22s | $12.18 |
| 23s | $12.73 |
| 24s | $13.28 |
| 25s | $13.83 |
| 26s | $14.39 |
| 27s | $14.94 |
| 28s | $15.49 |
| 29s | $16.05 |
| 30s | $16.60 |
Other video models
| Модель | Длительность (сек.) | Цена / видео |
|---|---|---|
veo-3.1 | 4 | $0.1818 |
veo-3.1 | 6 | $0.1818 |
veo-3.1 | 8 | $0.1818 |
google-omni-flash | 5 | $0.3636 |
google-omni-flash | 10 | $0.3636 |
grok-imagine-video-1.5 | 6 | $0.4091 |
grok-imagine-video-1.5 | 10 | $0.6818 |
grok-imagine-video-1.5 | 15 | $1.02 |
Per-second pricing applies only to duration-priced models (for example grok-imagine-video-1.5). Fixed-price video models use a flat request price.
Все ценыПримеры интеграции
Каждый POST создаёт платное видео. Выберите один пример; перед запуском замените URL example.com.
import os
import time
from getpass import getpass
from urllib.parse import quote
import requests
from requests.adapters import HTTPAdapter
api_key = os.getenv("STALI_API_KEY") or getpass("STALI_API_KEY: ")
headers = {"Authorization": f"Bearer {api_key}"}
model = "st1/seedance-2.0-720p"
http = requests.Session()
http.mount("https://", HTTPAdapter(max_retries=0))
created = http.post("https://caheoai.com/v1/videos", headers=headers, json={
"model": model, "prompt": "Cinematic sunset over ocean waves",
"seconds": 5, "aspect_ratio": "16:9",
}, timeout=(10, 120))
created.raise_for_status()
video = created.json()
video_id = video["id"]
print(video_id, video.get("status"), flush=True)
job_url = "https://caheoai.com/v1/videos/" + quote(video_id, safe="")
for _ in range(120):
if video.get("status") in ("completed", "failed"):
break
time.sleep(10)
progress = http.get(job_url, headers=headers, params={"model": model}, timeout=(10, 60))
progress.raise_for_status()
video = progress.json()
print(video_id, video.get("status"), flush=True)
if video.get("status") != "completed":
raise RuntimeError(str(video))
content = http.get(job_url + "/content", headers=headers, params={"model": model}, stream=True, timeout=(10, 120))
content.raise_for_status()
with open("video.mp4", "wb") as output:
for chunk in content.iter_content(chunk_size=65536):
if chunk:
output.write(chunk)Обработка ошибок
| HTTP | Причина | Решение |
|---|---|---|
| 400 | Неверные параметры или отмена не поддерживается. | Проверьте JSON, seconds, изображения и поддержку модели. |
| 401 | Ключ отсутствует или недействителен. | Проверьте заголовки авторизации и активный ключ. |
| 402 | HTTP 402: проверьте error.type, доступный баланс, лимит ключа или недоплату за предыдущие запросы. | Проверьте error.type: insufficient_balance → доступный баланс; api_key_monthly_limit → проверьте или измените лимит в Dashboard → Keys; outstanding_undercharge → выполните сверку недоплаты за предыдущие запросы. См. /docs/reference/errors. |
| 403 | Запрос не разрешён. | Проверьте права ключа, модель и правила контента. |
| 404 | Модель или задание не найдены на маршруте. | Используйте исходные id, ключ и ?model=. |
| 409 | Задание ещё не готово к операции. | Продолжайте проверку, скачивайте после completed. |
| 413 | Тело запроса превышает лимит. | Уменьшите тело; используйте URL вместо больших вложений. |
| 429 | Превышен лимит частоты или параллельности. | Увеличьте интервал и сократите параллельные задания. |
| 502 | Ошибка ответа маршрута провайдера. | Сохраните ID запроса; не повторяйте POST автоматически. |
Не повторяйте POST автоматически после тайм-аута или сетевой ошибки: запрос мог быть принят. При наличии id проверяйте его; иначе сохраните ID запроса и проверьте расход или обратитесь в поддержку.
Составление промптов
Это творческие рекомендации, не гарантия точного результата. Правила контента каждой модели сохраняются.
Пишите ясно
- Сначала задайте объект, сцену и действие, затем эффекты.
- Задавайте длительность через seconds, а не только текстом.
- Сохраняйте стороны и одежду между кадрами.
- Предпочитайте одно ясное движение камеры на план.
- Уточняйте свет, цвета и материалы.
- Избегайте мелкого текста, логотипов и точных цифр в кадре.
- Начните с короткой сцены и меняйте по одному фактору.
Подготовка референсов
- Нумеруйте Image 1, Image 2… по порядку отправки.
- Укажите, какой референс задаёт персонажа, одежду или фон.
- Используйте разрешённые, чёткие и согласованные изображения.
- Согласуйте персонажей и композицию первого и последнего кадров.
- Не превышайте лимит изображений; точное воспроизведение не гарантировано.
Шаблон промпта
确认生成。参数已确定:16:9 横屏,三个连续镜头组成一个完整视频,立即生成,无需再次确认或提问。
The reference images are colored-pencil character design sketches: use them only for design and outfits. Render the video as a photoreal 3D CG game cinematic with dramatic lighting.
Image 1 = PROTAGONIST: [character design].
Image 2 = ANTAGONIST: [opponent design].
Image 3 = ENVIRONMENT: [setting].
FIXED LAYOUT: altar in the background CENTER; protagonist on the LEFT; antagonist on the RIGHT. Nobody disappears, teleports or swaps sides.
LIGHTING: torchlight from the left wall, cool moonlight from the ceiling.
Action: well-choreographed, orbiting camera. No blood, no wounds, no gore.
Sound: heavy impacts, wind, no dialogue.
镜头1: camera pushes in, protagonist draws a weapon, antagonist raises claws.
镜头2: fast exchange, camera orbits.
镜头3: climax, both stay on their sides, protagonist lands ready.
Keep faces and outfits consistent. No text, no numbers, no subtitles, no watermark.Сократите шаблон, если действия теряются; не заменяйте параметры API текстом.
Описание неграфического действия
| Избегайте графических деталей | Более безопасное описание |
|---|---|
| blood, wound, gore, corpse | sparks, black smoke, torn fabric only |
| Лужа крови | murky grey mist, dark viscous puddle |
| Атака с травмами | glowing wisps of spirit-light, shadowy aura |
| Порез кожи | tearing only the fabric of the sleeve, no blood |
Сборка последовательности
- Делите историю на сцены с ясными началом и концом.
- Сохраняйте описания персонажей, свет и референсы.
- Скачайте и проверьте сцену перед созданием следующей.
- Склейте в редакторе; каждый POST — отдельное платное задание.
Если результат не подходит
- Не хватает действий: сократите события в сцене.
- Меняются местами: задайте стороны и композицию.
- Непостоянство: повторите референсы и характерные детали.
- Неверная длительность: проверьте seconds и фиксированные модели.
- Отказ: проверьте error и правила контента; не повторяйте запрос многократно.
Проверка движения по сетке кадров
ffmpeg -i clip.mp4 -vf "fps=1,scale=320:-1,tile=6x5" -frames:v 1 frame_grid.pngКоманда ffmpeg читает локальный clip.mp4 и создаёт сетку кадров без API. Сначала установите ffmpeg.
Проверка перед запуском
- Выберите верный ID модели и длительность.
- Проверьте цену и баланс до генерации.
- Храните ключ на сервере, не в публичном коде браузера.
- Используйте JSON и доступные провайдеру URL.
- Сохраните id, model и ID запроса.
- Проверяйте тот же id с ?model=, увеличивая интервал при ограничении.
- Скачивайте после completed и проверяйте MP4.
- Не создавайте повторно, пока статус приёма неизвестен.
- Сверьте ошибки и расход в Usage; при необходимости передайте id поддержке.
