aisplice

Riferimento API

Task asincroni

I job di immagini, video e musica condividono un unico ciclo di vita durevole: invia una volta, salva task_id, osserva uno stato finale, poi recupera il risultato. Crea un unico esecutore di task e scegli solo la famiglia di endpoint per ciascun modello.

#Un solo ciclo di vita per ogni modello asincrono

  1. 1

    Invia una sola volta

    Usa una Idempotency-Key univoca e salva subito la risposta.

    POST /v1/{capability}
  2. 2

    Salva task_id

    Salvalo prima che il worker confermi il job.

    task_id
  3. 3

    Polling o webhook

    Confronta status senza distinguere maiuscole e minuscole e fermati a uno stato finale.

    GET /{task_id}
  4. 4

    Recupera e salva il risultato

    Chiama /content dopo il successo e salva l'URL della piattaforma restituito.

    GET /{task_id}/content

#Famiglie di endpoint

FunzionalitàInvioPollingContenuto
Immagine/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
Musica/v1/music/generations/v1/music/tasks/{task_id}/v1/music/tasks/{task_id}/content

#Valori di stato

Un ciclo di vita, due vocabolari di trasmissione. I task di immagini, musica e 3D usano i termini dei task OpenAI; i video e ogni payload dei webhook usano i termini dei video OpenAI. Un controllo di stato scritto per una famiglia non corrisponde mai, senza avvisi, nell'altra — questa tabella è la mappatura.

Ciclo di vitaImmagine · musica · 3DVideo · webhookFinaleSignificato
NOT_STARTprocessingqueuednoAccettato dal gateway, non ancora passato a un canale.
SUBMITTEDqueuedqueuednoInviato upstream e confermato dal fornitore.
QUEUEDqueuedqueuednoIn attesa nella coda del fornitore.
IN_PROGRESSprocessingin_progressnoGenerazione in corso. progress contiene una percentuale come stringa, per esempio "60%".
SUCCESSsucceededcompletedsìCompletato. Recupera il risultato da /content.
FAILUREfailedfailedsìFallito definitivamente. fail_reason spiega il motivo; la quota riservata viene rimborsata.
UNKNOWNunknownunknownnoIl fornitore ha smesso di riportare uno stato che il gateway sappia mappare. Continua il polling con una scadenza, poi riconcilia — non trattarlo né come successo né come errore.

Confronta con l'insieme degli stati finali, mai con “non in esecuzione”

Considera succeeded / completed e failed gli unici punti di arresto, e tutto il resto — compresa una parola che questa tabella non elenca — come ancora in esecuzione. Possono comparire nuovi stati intermedi; nuovi stati finali sarebbero una modifica incompatibile e non arriveranno.

UNKNOWN non è un errore

Un task può restare in UNKNOWN quando il fornitore smette di riportare uno stato che il gateway sappia mappare. Interrogalo con una scadenza e passa il caso a una persona o a un job di riconciliazione — trattarlo come errore fa pagare due volte il nuovo tentativo, trattarlo come successo consegna un risultato vuoto.

#Ciclo di polling sicuro

Fermati sulle parole finali della famiglia che stai interrogando, mantieni una scadenza in tempo reale per tutto il resto e applica un backoff, così un task bloccato non può trasformarsi in un ciclo frenetico.

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)

Riprendi dopo i riavvii

Salva task_id, famiglia di endpoint, modello, data di creazione e il tuo identificativo di business. Un worker riavviato può continuare il polling senza inviare e pagare un secondo task.

#Conservazione dei risultati

Recupera /content solo dopo il successo. Salva l'URL della piattaforma restituito nel tuo record di business e scarica una copia privata quando i tuoi requisiti di conservazione richiedono uno storage indipendente.

Non hai ancora risolto?

Inviaci l'ID richiesta o il messaggio di errore e verificheremo.