Tareas asíncronas

Toda solicitud de generación de vídeo de Seedance 2.0 es asíncrona. El envío devuelve un ID de tarea inmediatamente, y la generación real ocurre en segundo plano. Puedes:

  1. Polling — llama periódicamente al endpoint de esta página para comprobar el progreso
  2. Webhook — pasa un callback_url al enviar la solicitud; el sistema te entrega el resultado en tu URL. Consulta Webhooks.

Consultar el estado de una tarea

GET https://api.evolink.ai/v1/tasks/{task_id}

Parámetros de ruta

ParámetroTipoObligatorioDescripción
task_idstringID de tarea devuelto por el endpoint de generación

Ejemplo con cURL

curl https://api.evolink.ai/v1/tasks/task-unified-1774857405-abc123 \
  -H "Authorization: Bearer YOUR_API_KEY"

Ciclo de vida de la tarea

pending  →  processing  →  completed
                      ↘    failed
                      ↘    cancelled
EstadoSignificado
pendingTarea creada y en cola, aún no iniciada
processingEn generación; progress se actualiza continuamente
completedGeneración finalizada; el array results contiene la URL del vídeo
failedLa generación ha fallado; no se factura
cancelledLa tarea fue cancelada bajo petición

Ejemplos de respuesta

Pendiente (recién enviada)

{
    "id": "task-unified-1774857405-abc123",
    "object": "video.generation.task",
    "created": 1774857405,
    "model": "seedance-2.0-text-to-video",
    "status": "pending",
    "progress": 0,
    "type": "video",
    "task_info": {
        "can_cancel": true,
        "estimated_time": 165,
        "video_duration": 5
    },
    "usage": {
        "billing_rule": "per_second",
        "credits_reserved": 50,
        "user_group": "default"
    }
}

En proceso (generando)

{
    "id": "task-unified-1774857405-abc123",
    "object": "video.generation.task",
    "created": 1774857405,
    "model": "seedance-2.0-text-to-video",
    "status": "processing",
    "progress": 65,
    "type": "video",
    "task_info": {
        "can_cancel": true
    }
}

Completada

{
    "id": "task-unified-1774857405-abc123",
    "object": "video.generation.task",
    "created": 1774857405,
    "model": "seedance-2.0-text-to-video",
    "status": "completed",
    "progress": 100,
    "results": [
        "https://cdn.example.com/videos/task-unified-1774857405-abc123.mp4"
    ],
    "type": "video",
    "task_info": {
        "can_cancel": false
    }
}

Las URLs de vídeo son válidas durante 24 horas. Descárgalas a tu propio almacenamiento de objetos (OSS / S3 / R2) antes de que caduquen.

Fallida

{
    "id": "task-unified-1774857405-abc123",
    "object": "video.generation.task",
    "created": 1774857405,
    "model": "seedance-2.0-text-to-video",
    "status": "failed",
    "progress": 0,
    "type": "video",
    "task_info": {
        "can_cancel": false
    }
}

Las tareas fallidas no se facturan.

Campos de la respuesta

CampoTipoDescripción
idstringID de la tarea
objectstringSiempre video.generation.task
createdintegerTimestamp Unix de creación de la tarea
modelstringEl ID del modelo realmente usado (coincide con el envío)
statusstringEstado actual — consulta la tabla del ciclo de vida
progressintegerPorcentaje de 0 a 100
resultsarray<string>Solo presente en el estado completed; contiene las URLs del vídeo
typestringTipo de salida, siempre video
task_info.can_cancelbooleanSi todavía se puede llamar al endpoint de cancelación
task_info.estimated_timeintegerSegundos estimados restantes
task_info.video_durationintegerDuración solicitada del vídeo en segundos
usage.billing_rulestringSiempre per_second
usage.credits_reservednumberCréditos reservados
usage.user_groupstringGrupo de usuario

Buenas prácticas de polling

  • Un intervalo de 5 segundos es un buen equilibrio entre frecuencia de sondeo y latencia de respuesta
  • Los vídeos cortos (4–6 segundos) suelen completarse en 1–3 minutos; los vídeos largos o las tareas multimodales complejas tardan más
  • Las pipelines de producción deberían preferir webhooks al polling. callback_url reduce el número de solicitudes y el coste
  • No trates progress como un ETA exacto: es un indicador de progreso; el modelo avanza a ritmos distintos en cada etapa

Ejemplo completo en Python

import os
import time
import requests

API_KEY = os.environ["EVOLINK_API_KEY"]
headers = {"Authorization": f"Bearer {API_KEY}"}

# Submit task
response = requests.post(
    "https://api.evolink.ai/v1/videos/generations",
    headers={**headers, "Content-Type": "application/json"},
    json={
        "model": "seedance-2.0-text-to-video",
        "prompt": "Rainy streets of Tokyo at night, neon reflections on wet asphalt",
        "duration": 6,
        "quality": "720p"
    }
)
task_id = response.json()["id"]

# Poll for status
while True:
    result = requests.get(
        f"https://api.evolink.ai/v1/tasks/{task_id}",
        headers=headers
    ).json()

    status = result["status"]
    print(f"[{status}] progress={result.get('progress', 0)}%")

    if status == "completed":
        print(f"Video URL: {result['results'][0]}")
        break
    if status in ("failed", "cancelled"):
        print(f"Task ended with status: {status}")
        break

    time.sleep(5)

Relacionado