aisplice

API-Referenz

Asynchrone Tasks

Bild-, Video- und Musik-Jobs teilen einen dauerhaften Lebenszyklus: einmal einreichen, task_id speichern, einen Endzustand abwarten, dann das Ergebnis abrufen. Bauen Sie einen Task-Runner und wählen Sie pro Modell nur die Endpunktfamilie.

#Ein Lebenszyklus für alle asynchronen Modelle

  1. 1

    Einmal einreichen

    Verwenden Sie einen eindeutigen Idempotency-Key und speichern Sie die Antwort sofort.

    POST /v1/{capability}
  2. 2

    task_id speichern

    Speichern Sie sie, bevor der Worker den Job bestätigt.

    task_id
  3. 3

    Abfragen oder Webhook empfangen

    Vergleichen Sie status ohne Berücksichtigung der Groß-/Kleinschreibung und stoppen Sie bei einem Endzustand.

    GET /{task_id}
  4. 4

    Ergebnis abrufen und speichern

    Rufen Sie nach Erfolg /content auf und speichern Sie die zurückgegebene Plattform-URL.

    GET /{task_id}/content

#Endpunktfamilien

FähigkeitEinreichenAbfragenInhalt
Bild/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
Musik/v1/music/generations/v1/music/tasks/{task_id}/v1/music/tasks/{task_id}/content

#Statuswerte

Ein Lebenszyklus, zwei Wire-Vokabulare. Bild-, Musik- und 3D-Tasks melden die Task-Begriffe von OpenAI; Videos und alle Webhook-Payloads melden die Video-Begriffe von OpenAI. Eine Statusprüfung, die für eine Familie geschrieben wurde, greift in der anderen stillschweigend nie — diese Tabelle ist die Zuordnung.

LebenszyklusBild · Musik · 3DVideo · WebhookEndzustandBedeutung
NOT_STARTprocessingqueuedneinVom Gateway angenommen, noch keinem Kanal übergeben.
SUBMITTEDqueuedqueuedneinAn den Upstream gesendet und vom Anbieter bestätigt.
QUEUEDqueuedqueuedneinWartet in der Warteschlange des Anbieters.
IN_PROGRESSprocessingin_progressneinWird gerendert. progress enthält einen Prozentwert als String, z. B. "60%".
SUCCESSsucceededcompletedjaAbgeschlossen. Rufen Sie das Ergebnis über /content ab.
FAILUREfailedfailedjaEndgültig fehlgeschlagen. fail_reason nennt den Grund; das reservierte Kontingent wird erstattet.
UNKNOWNunknownunknownneinDer Anbieter meldet keinen Status mehr, den das Gateway zuordnen kann. Fragen Sie mit einer Frist weiter ab und gleichen Sie dann ab — werten Sie es weder als Erfolg noch als Fehlschlag.

Auf die Menge der Endzustände prüfen, nie auf „läuft nicht“

Behandeln Sie succeeded / completed und failed als einzige Haltepunkte und alles andere — auch ein Wort, das diese Tabelle nicht aufführt — als noch laufend. Neue Zwischenzustände können hinzukommen; neue Endzustände wären eine Breaking Change und kommen nicht.

UNKNOWN ist kein Fehlschlag

Ein Task kann in UNKNOWN verharren, wenn der Anbieter keinen Status mehr meldet, den das Gateway zuordnen kann. Fragen Sie ihn mit einer Frist ab und eskalieren Sie an einen Menschen oder einen Abgleich-Job — als Fehlschlag gewertet, wird die Wiederholung doppelt berechnet; als Erfolg gewertet, wird ein leeres Ergebnis ausgeliefert.

#Sichere Abfrageschleife

Stoppen Sie bei den Endzustandswörtern der Familie, die Sie abfragen, setzen Sie für alles andere eine feste Zeitgrenze, und nutzen Sie Backoff, damit ein hängender Task nicht zur Endlosschleife wird.

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)

Nach Neustarts fortsetzen

Speichern Sie task_id, Endpunktfamilie, Modell, Erstellungszeit und Ihre eigene Geschäftskennung. Ein neu gestarteter Worker kann weiter abfragen, ohne einen zweiten Task einzureichen und zu bezahlen.

#Aufbewahrung der Ergebnisse

Rufen Sie /content erst nach Erfolg ab. Speichern Sie die zurückgegebene Plattform-URL in Ihrem Geschäftsdatensatz und laden Sie eine eigene Kopie herunter, wenn Ihre Aufbewahrungsanforderungen unabhängigen Speicher verlangen.

Immer noch nicht gelöst?

Senden Sie uns die Anfrage-ID oder die Fehlermeldung, und wir sehen uns das an.