Engagement des tâches et relance
Pourquoi une génération acceptée ne peut pas être annulée et comment relancer sans risque les tâches échouées ou expirées.
Une fois createTask accepté, la tâche de génération est engagée et ne peut plus être annulée. Cette règle s’applique en queued comme en running : une génération commencée ne peut pas être arrêtée de façon fiable. SpicyAPI ne propose donc jamais une action locale qui annoncerait une annulation alors que le travail, et son coût, continuent.
Les tâches acceptées sont irréversibles
Vérifiez le modèle, les entrées et le montant estimé avant l’envoi. Fermer le navigateur, quitter la page ou supprimer une clé API n’arrête pas une tâche acceptée.
Relancer une tâche terminée
Une relance exécute de nouveau une tâche terminée sans succès : elle crée une nouvelle tâche avec le même modèle, la même valeur input et la même URL de callback, sans vous obliger à renvoyer le corps de la requête originale. La nouvelle tâche est facturée comme toute autre : son montant estimé est réservé à l’acceptation et elle n’est facturée que si elle réussit.
POST /api/v1/jobs/retrycurl -X POST https://api.spicyapi.ai/api/v1/jobs/retry \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: retry-order-8814-1" \
-d '{"taskId":"job_01k3m8x9q2z4v7n5p6r8s0t1w3"}'Remplacez le taskId d’exemple par l’ID de votre tâche échouée. Envoyez toujours un Idempotency-Key avec retry, par exemple retry-<sourceTaskId>-1 : sans cette clé, un double clic ou une nouvelle tentative réseau crée deux tâches facturables.
Seules les tâches failed et expired doivent être relancées. Les anciennes traces canceled restent lisibles et peuvent aussi être relancées par rétrocompatibilité, mais aucune nouvelle tâche ne peut atteindre cet état par une action utilisateur. En cas de succès, l’opération crée une nouvelle tâche en attente et renvoie HTTP 200, et non 202 comme createTask, avec code: 200 :
{
"code": 200,
"msg": "success",
"data": {
"taskId": "job_01k3mnewtask",
"sourceTaskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"state": "queued",
"estimatedCost": "0.08",
"deadlineAt": "2026-08-28T10:12:04Z"
},
"request_id": "req_01k3mretry"
}Interrogez le nouveau taskId ou attendez son résultat, pas celui de la source ; voir Tâches asynchrones.
- La tâche source reste terminée et inchangée.
- Le
sourceTaskIdde la nouvelle tâche pointe vers la source pour conserver l’historique des relances. - Le schéma, le tarif, les permissions et le solde actuels sont vérifiés de nouveau. Une relance est une nouvelle tâche : elle revient en file d’attente et est traitée indépendamment de sa source.
- La nouvelle tâche envoie son callback à la même
callBackUrlque la source et garde la durée de conservation de celle-ci ; un en-têteX-Spicy-Retentionenvoyé àretryest ignoré. - Une relance réutilise exactement l’
inputde la source. Les fichiers de référence envoyés à SpicyAPI, y compris les petites images Base64 stockées comme fichiers envoyés, durent un jour. Ensuite, une relance renvoie400: envoyez de nouveau le fichier et créez une tâche aveccreateTask. Idempotency-Keyest limité à la tâche source et à l’action de relance. Répéter la même clé pour la même source renvoie la même nouvelle tâche au lieu d’en créer une autre.
Quand une relance est refusée
Aucun montant n’est réservé ni facturé lorsque retry renvoie une erreur.
| Réponse | Motif | Action |
|---|---|---|
404 | La tâche source n’existe pas ou a été créée avec une autre clé API | Relancez avec la clé qui l’a créée |
409 | La source est succeeded (une nouvelle génération exige createTask), est encore queued ou running, ou sa facturation n’est pas encore définitive | Attendez qu’elle soit failed ou expired avec settled: true ; pour une autre génération, utilisez createTask |
409 | L’entrée de la source n’est plus stockée : sa durée de conservation du prompt a expiré ou vous avez détruit son contenu | Renvoyez la requête originale avec createTask |
400 | Un fichier de référence envoyé a expiré ou l’URL de callback enregistrée sur la source n’est plus valide | Renvoyez le fichier ou utilisez une callBackUrl valide, puis envoyez la requête avec createTask |
402 | Solde insuffisant ou plafond de dépenses atteint | Voir Facturation |
Une erreur réseau n’est pas une tâche échouée
Si la connexion de createTask se coupe avant la réception de la réponse, renvoyez createTask avec son Idempotency-Key original. Utilisez retry uniquement lorsqu’une tâche existante a un état terminal confirmé.
États et possibilités de relance
| État actuel | Ce que vous pouvez faire |
|---|---|
queued / running | Attendre le résultat terminal ; la tâche ne peut pas être annulée |
succeeded | Lire ou télécharger le résultat ; créer une tâche pour une autre génération |
failed / expired | Relancer pour créer une tâche facturée séparément |
ancienne trace canceled | Lire la trace ou la relancer ; aucune nouvelle annulation utilisateur n’est disponible |
Avant une relance, examinez errorCode. rate_limited, upstream_unavailable et upstream_failed justifient une nouvelle tentative ; timeout et generation_failed peuvent échouer à nouveau de la même façon. Pour invalid_request, unsupported_combination et content_rejected, la même entrée échouera à nouveau. Pour invalid_asset, le fichier de référence doit être renvoyé : modifiez l’entrée et utilisez plutôt createTask. Voir Codes d’échec des tâches.
Contrat Spicy Schema
Enveloppe de requête, champs canoniques, schéma de formulaire, cycle asynchrone, erreurs, stockage des résultats et compatibilité.
Dépannage et reprise
Trouvez votre symptôme, comprenez sa cause et ce qu’il faut faire — paiements, 401 et 403, solde et limites, modèles indisponibles, tâches échouées ou bloquées, téléversements, callbacks et flux.

