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
Invia una sola volta
Usa una Idempotency-Key univoca e salva subito la risposta.
POST /v1/{capability} - 2
Salva task_id
Salvalo prima che il worker confermi il job.
task_id - 3
Polling o webhook
Confronta status senza distinguere maiuscole e minuscole e fermati a uno stato finale.
GET /{task_id} - 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à | Invio | Polling | Contenuto |
|---|---|---|---|
| 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 vita | Immagine · musica · 3D | Video · webhook | Finale | Significato |
|---|---|---|---|---|
| NOT_START | processing | queued | no | Accettato dal gateway, non ancora passato a un canale. |
| SUBMITTED | queued | queued | no | Inviato upstream e confermato dal fornitore. |
| QUEUED | queued | queued | no | In attesa nella coda del fornitore. |
| IN_PROGRESS | processing | in_progress | no | Generazione in corso. progress contiene una percentuale come stringa, per esempio "60%". |
| SUCCESS | succeeded | completed | sì | Completato. Recupera il risultato da /content. |
| FAILURE | failed | failed | sì | Fallito definitivamente. fail_reason spiega il motivo; la quota riservata viene rimborsata. |
| UNKNOWN | unknown | unknown | no | Il 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”
UNKNOWN non è un errore
#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.
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
#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.