Referencia de la API

Tareas asíncronas

Los trabajos de imagen, video y música comparten un ciclo de vida duradero: envía una vez, guarda task_id, observa un estado final y luego obtén el resultado. Crea un único ejecutor de tareas y elige solo la familia de endpoints de cada modelo.

#Un ciclo de vida para todos los modelos asíncronos

  1. 1

    Envía una sola vez

    Usa una Idempotency-Key única y guarda la respuesta de inmediato.

    POST /v1/{capability}
  2. 2

    Guarda task_id

    Guárdalo antes de que el worker confirme el trabajo.

    task_id
  3. 3

    Consulta o recibe el webhook

    Compara status sin distinguir mayúsculas y minúsculas, y detente en un estado final.

    GET /{task_id}
  4. 4

    Obtén y guarda el resultado

    Llama a /content tras el éxito y guarda la URL de la plataforma devuelta.

    GET /{task_id}/content

#Familias de endpoints

CapacidadEnviarConsultarContenido
Imagen/v1/images/tasks/v1/images/tasks/{task_id}/v1/images/tasks/{task_id}/content
Video/v1/videos/v1/videos/{task_id}/v1/videos/{task_id}/content
Música/v1/music/generations/v1/music/tasks/{task_id}/v1/music/tasks/{task_id}/content

#Valores de estado

Un ciclo de vida, dos vocabularios de API. Las tareas de imagen, música y 3D usan los términos de tareas de OpenAI; los videos y todos los payloads de webhook usan los términos de video de OpenAI. Una comprobación de estado escrita para una familia nunca coincide en la otra, sin avisar — esta tabla es la correspondencia.

Ciclo de vidaImagen · música · 3DVideo · webhookFinalSignificado
NOT_STARTprocessingqueuednoAceptada por el gateway, aún no entregada a un canal.
SUBMITTEDqueuedqueuednoEnviada upstream y confirmada por el proveedor.
QUEUEDqueuedqueuednoEsperando en la cola del proveedor.
IN_PROGRESSprocessingin_progressnoRenderizando. progress contiene un porcentaje en texto, como "60%".
SUCCESSsucceededcompletedsíTerminada. Obtén el resultado en /content.
FAILUREfailedfailedsíFalló definitivamente. fail_reason explica el motivo; la cuota reservada se reembolsa.
UNKNOWNunknownunknownnoEl proveedor dejó de informar un estado que el gateway pueda mapear. Sigue consultando con un plazo límite y luego concilia — no lo trates como éxito ni como fallo.

Compara con el conjunto de estados finales, nunca con “no está en ejecución”

Trata succeeded / completed y failed como los únicos puntos de parada, y todo lo demás — incluida una palabra que esta tabla no recoge — como aún en ejecución. Pueden aparecer nuevos estados intermedios; los nuevos estados finales serían un cambio incompatible y no aparecerán.

UNKNOWN no es un fallo

Una tarea puede quedarse en UNKNOWN cuando el proveedor deja de informar un estado que el gateway pueda mapear. Consúltala con un plazo límite y escala a una persona o a un proceso de conciliación — tratarla como fallo cobra dos veces el reintento; tratarla como éxito entrega un resultado vacío.

#Bucle de consulta seguro

Detente en los términos finales de la familia que estás consultando, mantén un plazo de tiempo real para todo lo demás y aplica backoff para que una tarea atascada no se convierta en un bucle intensivo.

poll.py
import time, requests

# The two vocabularies. Pick the one that matches the endpoint you poll.
TASK_DONE, TASK_FAILED = {"succeeded"}, {"failed"}      # images / music / 3D
VIDEO_DONE, VIDEO_FAILED = {"completed"}, {"failed"}    # videos + webhooks
DEADLINE_SECONDS = 15 * 60

def wait_for_image_task(task_id, api_key):
    started = time.monotonic()
    delay = 2
    while True:
        response = requests.get(
            f"https://www.aisplice.store/v1/images/tasks/{task_id}",
            headers={"Authorization": f"Bearer {api_key}"},
            timeout=30,
        )
        response.raise_for_status()
        task = response.json()
        status = task.get("status", "")

        if status in TASK_DONE:
            return task
        if status in TASK_FAILED:
            raise RuntimeError((task.get("error") or {}).get("message", "task failed"))

        # queued / processing / unknown all mean "not finished". Wait — but
        # never forever: hand an overdue task to reconciliation.
        if time.monotonic() - started > DEADLINE_SECONDS:
            raise TimeoutError(f"task {task_id} still {status} after the deadline")

        time.sleep(delay)
        delay = min(delay * 1.5, 15)

Reanudar tras reinicios

Guarda task_id, la familia de endpoints, el modelo, la hora de creación y tu propio identificador de negocio. Un worker reiniciado puede seguir consultando sin enviar ni pagar una segunda tarea.

#Retención de resultados

Llama a /content solo después del éxito. Los archivos de resultado se guardan 3 días después de que termina la tarea; después /content responde 410 con el código media_expired. Descarga una copia en esos 3 días si necesitas conservarla.

¿Sigues con el problema?

Envíanos el ID de solicitud o el mensaje de error y lo revisaremos.