Documentation Index
Fetch the complete documentation index at: https://docs.runblob.io/llms.txt
Use this file to discover all available pages before exploring further.
Webhooks доставляют мгновенные уведомления о завершении, ошибке или таймауте генерации. Без polling!
Руководство по настройке
Создайте webhook-эндпоинт
Поднимите HTTPS-эндпоинт, принимающий POST-запросы.from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhook/o1-video', methods=['POST'])
def handle_webhook():
data = request.json
if data['status'] == 'completed':
print(f"Video ready: {data['video_url']}")
else:
print(f"Generation failed: {data.get('message')}")
return jsonify({'status': 'received'}), 200
Передайте URL webhook
Укажите URL вашего webhook при создании задачи.curl -X POST https://platform.runblob.io/v1/kling/o1-video/generate -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" -d '{
"prompt": "Epic cinematic scene",
"duration": "10",
"aspect_ratio": "16:9",
"callback_url": "https://your-app.com/webhook/o1-video"
}'
Обработайте уведомления
Ваш эндпоинт получит мгновенное уведомление по готовности задачи.
Структура payload
Отправляется при успешной генерации.{
"generation_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"video_url": "https://cdn.example.com/videos/abc123.mp4",
"model": "kling_o1_video",
"message": null
}
Всегда "completed" при успехе
Прямая ссылка для скачивания видео
Использованная модель: "kling_o1_video"
Отправляется при ошибке генерации с конкретным кодом.{
"generation_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "failed",
"video_url": null,
"model": "kling_o1_video",
"message": "CONTENT_POLICY_VIOLATION"
}
Всегда "failed" при ошибке
Всегда null при неудачной задаче
Отправляется при превышении лимита в 15 минут.{
"generation_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "failed",
"video_url": null,
"model": "kling_o1_video",
"message": "TIMEOUT"
}
Кредиты автоматически возвращаются при таймауте.
Возможности надёжности
Политика повторов: до 5 попыток с интервалом 30 секундСтратегия задержки: линейнаяОбработка отказа: после 5 попыток webhook помечается как failed
Тайм-аут запроса: 30 секундТайм-аут соединения: 10 секундРекомендация: быстро отвечайте кодом 200
HTTPS обязателен: URL webhook должен использовать HTTPSIP allowlist: рассмотрите ограничение по IP RunBlobВалидация: всегда проверяйте generation_id
Примеры реализации
from flask import Flask, request, jsonify
import logging
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
@app.route('/webhook/o1-video', methods=['POST'])
def kling_video_webhook():
try:
data = request.json
generation_id = data.get('generation_id')
status = data.get('status')
if status == 'completed':
video_url = data.get('video_url')
logging.info(f"Video ready for {generation_id}: {video_url}")
# Process successful generation
process_video(generation_id, video_url)
else:
error_code = data.get('message')
logging.error(f"Generation failed for {generation_id}: {error_code}")
# Handle failure
handle_failure(generation_id, error_code)
return jsonify({'status': 'received'}), 200
except Exception as e:
logging.error(f"Webhook error: {str(e)}")
return jsonify({'error': 'Internal error'}), 500
def process_video(generation_id, video_url):
# Your video processing logic here
pass
def handle_failure(generation_id, error_code):
# Your error handling logic here
pass
Важно: всегда быстро возвращайте код 200, чтобы подтвердить получение. Тяжёлую обработку выполняйте асинхронно.