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/o3-photo', methods=['POST'])
def handle_webhook():
data = request.json
if data['status'] == 'completed':
print(f"Image ready: {data['image_url']}")
else:
print(f"Generation failed: {data['message']}")
return jsonify({'status': 'received'}), 200
Передайте URL webhook
Укажите URL вашего webhook при создании задачи.curl -X POST https://platform.runblob.io/v1/kling/o3-photo/generate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A futuristic cyberpunk city",
"img_resolution": "4k",
"callback_url": "https://your-app.com/webhook/o3-photo"
}'
Обработайте уведомления
Ваш эндпоинт получит мгновенное уведомление по готовности задачи.
Структура payload
Отправляется при успешной генерации.{
"generation_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"image_url": "https://cdn.example.com/images/550e8400.png",
"model": "kling_o3_photo",
"message": null
}
Всегда "completed" при успехе
Прямая ссылка для скачивания изображения
Отправляется при ошибке генерации с конкретным кодом.{
"generation_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "failed",
"image_url": null,
"model": "kling_o3_photo",
"message": "CONTENT_POLICY_VIOLATION"
}
Всегда "failed" при ошибке
Всегда null при неудачной задаче
Отправляется при превышении лимита в 15 минут.{
"generation_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "failed",
"image_url": null,
"model": "kling_o3_photo",
"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/o3-photo', methods=['POST'])
def o3_photo_webhook():
try:
data = request.json
generation_id = data.get('generation_id')
if data.get('status') == 'completed':
image_url = data.get('image_url')
logging.info(f"Image ready for {generation_id}: {image_url}")
# Process successful generation
process_image(generation_id, image_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_image(generation_id, image_url):
# Your image processing logic here
pass
def handle_failure(generation_id, error_code):
# Your error handling logic here
pass
Важно: всегда быстро возвращайте код 200, чтобы подтвердить получение. Тяжёлую обработку выполняйте асинхронно.