Guides

Cycle de vie d'une tâche batch

Sync vs async, états de la tâche, résultats partiels et webhooks

Les endpoints batch (/batch/distill, /batch/extract) sont asynchrones. Une tâche traverse une petite machine à états ; comprendre ces états t'aide à choisir entre polling et Webhook, et à gérer les échecs partiels.

Sync vs async

Sync (/distill, /extract)Async (/batch/distill, /batch/extract)
URLs par requête1jusqu'à 100
RéponseRésultat complet dans le corps HTTPID de tâche ; résultats récupérés à part
LatenceUne requête, une attenteSoumettre → poll ou Webhook → fetch
Idéal pourUX temps réel, outillage d'agent, lookups ad hocTâches planifiées, ingestion RAG, monitoring
Mode d'échecUne URL en erreur fait échouer l'appelUne URL en erreur fait échouer sa ligne, la tâche continue
Coût en concurrenceUn slot par appelUn slot pour tout le batch

En cas de doute : une seule URL → sync ; beaucoup d'URLs ou pas pressé → async.

États de la tâche

StatusSignification
PENDINGTâche acceptée, en file
PROCESSINGAu moins une URL est en cours de traitement
COMPLETEDToutes les URLs ont atteint un état terminal (succès ou échec)
FAILEDErreur fatale au niveau de la tâche (rare — d'habitude une URL échoue, pas toute la tâche)
CANCELLEDAnnulation initiée par l'utilisateur via DELETE

L'échec d'une URL ne fait pas échouer la tâche. Chaque élément de results[] porte son propre status : PENDING, PROCESSING, SUCCEEDED ou FAILED. La tâche passe à COMPLETED une fois que chaque ligne a atteint un état terminal.

Polling vs Webhook

Taille de tâcheRecommandéPourquoi
< 10 URLsPoll toutes les 5–10 sL'overhead Webhook ne vaut pas le câblage
10–100 URLsWebhookLe polling brûle ~60 allers-retours sur une tâche de 5 minutes
> 100 URLs (plusieurs batches)WebhookChaque batch déclenche une fois à la fin

Voir Webhooks pour la forme du payload, la vérification de signature (HMAC-SHA256) et le comportement de réessai.

Résultats partiels

GET /batch/distill/{id} fonctionne pendant que la tâche est encore PROCESSING — tu obtiens tout ce qui est terminé jusqu'ici. Utile pour des dashboards qui streament les lignes au fil de leur complétion.

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)

Annulation

DELETE /batch/distill/{id} (ou /batch/extract/{id}) ne fonctionne que sur les tâches PENDING ou PROCESSING. Une fois qu'une tâche atteint un état terminal, elle y reste. Les URLs déjà traitées dans une tâche annulée restent facturables ; les URLs en vol qui n'avaient pas terminé ne le sont pas.