Anleitungen

Lebenszyklus von Batch-Jobs

Sync vs. async, Job-Zustände, Teilergebnisse und Webhooks

Batch-Endpunkte (/batch/distill, /batch/extract) sind asynchron. Ein Job durchläuft eine kleine Zustandsmaschine; die Zustände zu verstehen hilft dir bei der Wahl zwischen Polling und Webhooks und beim Umgang mit Teilfehlern.

Sync vs. async

Sync (/distill, /extract)Async (/batch/distill, /batch/extract)
URLs pro Anfrage1bis zu 100
AntwortVollständiges Ergebnis im HTTP-BodyJob-ID; Ergebnisse separat abrufen
LatenzEine Anfrage, ein WartenEinreichen → Polling oder Webhook → Abruf
Am besten fürEchtzeit-UX, Agent-Tools, Ad-hoc-LookupsGeplante Jobs, RAG-Ingestion, Monitoring
FehlermodusEine schlechte URL bringt den Aufruf zum ScheiternEine schlechte URL bringt ihre Zeile zum Scheitern, der Job läuft weiter
Kosten für ConcurrencyEin Slot pro AufrufEin Slot für den ganzen Batch

Im Zweifelsfall: einzelne URL → sync; viele URLs oder ohne Eile → async.

Job-Zustände

StatusBedeutung
PENDINGJob angenommen, in der Warteschlange
PROCESSINGMindestens eine URL wird verarbeitet
COMPLETEDAlle URLs haben einen terminalen Zustand erreicht (Erfolg oder Fehler)
FAILEDFataler Job-Level-Fehler (selten — meist scheitert eine URL, nicht der ganze Job)
CANCELLEDVom Nutzer per DELETE initiierte Stornierung

Ein URL-Fehler bringt den Job nicht zum Scheitern. Jedes Element in results[] trägt seinen eigenen status: PENDING, PROCESSING, SUCCEEDED oder FAILED. Der Job wechselt zu COMPLETED, sobald jede Zeile einen terminalen Zustand erreicht hat.

Polling vs. Webhooks

Job-GrößeEmpfohlenWarum
< 10 URLsAlle 5–10 s pollenWebhook-Overhead lohnt die Verkabelung nicht
10–100 URLsWebhookPolling verbrennt ~60 Round-Trips bei einem 5-Minuten-Job
> 100 URLs (mehrere Batches)WebhookJeder Batch feuert einmal beim Abschluss

Siehe Webhooks für Payload-Form, Signatur-Verifikation (HMAC-SHA256) und Wiederholungsverhalten.

Teilergebnisse

GET /batch/distill/{id} funktioniert, während der Job noch PROCESSING ist — du bekommst, was bisher fertig ist. Nützlich für Dashboards, die Zeilen streamen, sobald sie fertig sind.

import httpx, time

API = "https://openapi.thunderbit.com/openapi/v1"
H = {"Authorization": "Bearer YOUR_API_KEY"}

job = httpx.post(f"{API}/batch/distill", headers=H,
                 json={"urls": urls}).json()
batch_id = job["data"]["id"]

while True:
    body = httpx.get(f"{API}/batch/distill/{batch_id}", headers=H).json()["data"]
    fresh = [r for r in body["results"] if r["status"] == "SUCCEEDED"]
    yield_to_dashboard(fresh)
    if body["status"] in ("COMPLETED", "FAILED", "CANCELLED"):
        break
    time.sleep(5)

Stornierung

DELETE /batch/distill/{id} (oder /batch/extract/{id}) funktioniert nur bei PENDING- oder PROCESSING-Jobs. Sobald ein Job einen terminalen Zustand erreicht, bleibt er dort. Bereits verarbeitete URLs in einem stornierten Job bleiben abrechenbar; in-flight URLs, die nicht fertig waren, nicht.