Ilustración editorial para Reintentos, límites y duplicados en APIs de IA: cómo evitar que un fallo ejecute una acción dos veces
Imagen generada con gpt-image-2.5-sunburst para InferamaSource ↗
01

Le problème : une réponse perdue n’est pas une opération échouée

Dans une intégration avec une API d’IA, un timeout décrit généralement un fait limité : le client n’a pas reçu de réponse dans le délai configuré. Il ne permet pas, à lui seul, de conclure que le fournisseur n’a pas reçu la demande, ne l’a pas traitée ou n’a pas lancé une action ultérieure. La connexion peut être interrompue après l’acceptation de la requête par le serveur ; la réponse peut être perdue après la fin de l’opération ; et un processus local peut redémarrer alors que le résultat existe déjà en dehors de celui-ci.

Cette distinction devient plus importante lorsqu’une sortie de modèle déclenche des effets opérationnels. Répéter une génération de texte peut produire une réponse différente et consommer des ressources, mais ne modifie généralement pas un système métier. Répéter une instruction qui envoie un e-mail, crée une réservation, enregistre un paiement, modifie un dossier ou invoque un outil peut en revanche produire un effet dupliqué. La sûreté du flux ne doit pas dépendre du fait que le modèle renvoie le même texte ni de l’hypothèse qu’un unique appel réseau aboutira toujours.

La sémantique HTTP aide à circonscrire le problème : une requête idempotente est une requête dont l’effet prévu sur le serveur reste équivalent, même si elle est exécutée plusieurs fois. Cela ne signifie pas que chaque répétition est gratuite, que la réponse est identique ou qu’aucun journal supplémentaire n’est créé. Cela signifie que l’effet pertinent doit pouvoir être appliqué à plusieurs reprises sans changer le résultat final attendu. Dans les flux d’IA, cette propriété doit être vérifiée à la fois pour l’appel au fournisseur et, indépendamment, pour chaque système externe qui reçoit une action.

02

Un modèle mental : requête, opération logique, tentative, effet et confirmation

Il est utile de dissocier cinq concepts souvent confondus. L’opération logique est l’intention métier : par exemple, « produire une réponse structurée pour le dossier X » ou « envoyer une seule notification d’approbation ». La requête est un message concret envoyé à une API. Une tentative est chaque envoi de cette requête, y compris le premier et ses reprises. L’effet externe est le changement observable chez une destination : un message envoyé, une ligne créée ou un achat confirmé. La confirmation est l’élément de preuve permettant de marquer l’opération logique comme terminée, rejetée ou en attente de vérification.

Un même identifiant d’opération doit relier toutes les tentatives qui poursuivent une intention unique. Il doit être créé avant le premier appel et persisté hors de la mémoire du processus, afin de survivre aux pannes, aux déploiements et aux traitements en arrière-plan. N’utilisez pas comme seule identité un identifiant de requête renvoyé par un fournisseur : il peut ne pas exister en cas d’échec précoce et, même lorsqu’il existe, il identifie normalement une tentative, non l’intention métier entière.

En plus de l’identifiant d’opération, conservez une clé d’idempotence stable pour tout destinataire qui l’accepte. La clé doit être conservée lorsque vous répétez la même opération logique et changée lorsque l’intention change. Générer une nouvelle clé à chaque reprise annule la déduplication. Réutiliser une clé pour deux opérations différentes peut conduire à confondre une action légitime avec une répétition. Le journal doit enregistrer la relation entre l’opération, la tentative, la destination, la clé utilisée et le résultat observé.

Identités à ne pas confondre

ÉlémentPortéeRègle de conception
Identifiant d’opérationIntention métierIl est créé une fois et persiste jusqu’à la clôture de l’opération.
Identifiant de tentativeUne transmission préciseIl change à chaque appel ou reprise.
Clé d’idempotenceContrat avec un destinataireElle reste stable pour la même opération chez ce destinataire.
Identifiant de l’effetSystème de destinationIl est conservé lorsque la destination confirme le changement ou permet de le retrouver.
03

Classer le risque avant d’automatiser une reprise

Aucune politique unique ne convient à tous les appels. Classer une opération selon son risque de répétition oblige à déterminer ce qui doit être protégé. Les lectures ou consultations sans effet acceptent généralement les reprises si le coût et la charge sont maîtrisés. Une génération de texte sans effet externe peut être répétée, mais le résultat peut varier ; l’application doit donc décider si elle accepte une nouvelle sortie, conserve une sortie partielle ou présente le cas comme en attente.

Une écriture idempotente peut être répétable si la destination garantit que la même clé représente la même opération. Une écriture compensable peut demander une annulation ultérieure, mais la compensation ne rend pas automatiquement la reprise sûre : elle peut elle aussi échouer, arriver trop tard ou avoir ses propres effets. Les actions irréversibles ou difficiles à vérifier exigent une barrière plus forte, telle qu’une confirmation humaine, une réservation préalable ou une consultation fiable du système de destination avant d’agir.

Cette classification doit s’appliquer à l’ensemble du flux, et pas seulement à l’appel du modèle. Un modèle peut correctement générer un appel d’outil alors que l’outil a été exécuté avant la perte de la réponse. La sortie textuelle ultérieure ne constitue pas une preuve suffisante que l’effet s’est produit exactement une fois. La couche qui exécute les outils doit enregistrer et dédupliquer l’action avec ses propres contrôles.

Matrice de décision pour les reprises

Type d’opérationRisque de répétitionPolitique initialePreuve de clôture
Génération de texte sans effetsRésultat différent et consommation supplémentaireReprise limitée si le délai le permetRéponse stockée ou état d’erreur définitif.
Sortie structuréeDonnées incomplètes ou format non valideCorriger la validation ou répéter selon le contrat ; ne pas supposer l’égalité du contenuSchéma validé et version du résultat enregistrée.
Appel d’outil en lectureCharge supplémentaire ou données variablesRéessayer avec des limites de concurrenceRéponse de l’outil et horodatage.
Écriture idempotenteDoublon si la déduplication est insuffisanteRéessayer seulement avec une clé stable et un journal persistantConfirmation ou consultation de la ressource créée.
Action externe irréversibleDouble effet ou effet non réparableNe pas réessayer automatiquement face à un état ambiguConfirmation non équivoque ou examen humain.
04

Concevoir l’idempotence à deux frontières

Dédupliquer un appel au fournisseur et dédupliquer un effet métier sont des problèmes liés, mais non équivalents. Même si une API de modèle accepte une clé d’idempotence, cette protection ne prouve pas qu’un outil downstream, un fournisseur d’e-mail ou un système de paiement a appliqué son effet une seule fois. De même, un outil idempotent n’élimine ni le coût ni la saturation causés par la répétition inutile d’une demande d’inférence.

La pratique la plus robuste consiste à établir deux frontières. À la première, le wrapper de l’API enregistre l’opération et associe les tentatives à une clé stable lorsque le contrat du fournisseur le permet. À la seconde, l’exécuteur d’actions externes utilise son propre identifiant d’effet et un magasin durable de déduplication. Avant l’exécution, il vérifie si une action terminée existe déjà pour cette opération ; si c’est le cas, il renvoie le résultat existant. Dans le cas contraire, il enregistre le démarrage de manière à permettre l’investigation après un redémarrage.

N’inventez pas de capacités de réconciliation que le contrat réel n’offre pas. Les sources disponibles décrivent des pratiques générales de reprise et la sémantique HTTP, mais ne documentent pas, pour chaque API d’IA, une consultation universelle de l’état d’une opération ni une clé d’idempotence applicable à tous les endpoints. Vérifiez la documentation contractuelle de l’endpoint concerné avant de dépendre de l’une de ces fonctions.

Flux minimal d’une opération avec effet

  1. 01Créer et persister l’identifiant d’opération avant tout appel distant.
  2. 02Enregistrer l’état initial, l’intention, la destination et la version des données pertinentes.
  3. 03Envoyer la tentative avec la même clé d’idempotence lorsque le destinataire l’accepte.
  4. 04Lorsqu’une confirmation valide arrive, enregistrer l’identifiant du résultat ou de l’effet et clôturer l’opération.
  5. 05En cas de timeout ou de déconnexion, marquer l’état comme ambigu ; ne pas créer une nouvelle opération.
  6. 06Consulter l’état disponible ou réconcilier avec la destination au moyen des preuves enregistrées.
  7. 07Réessayer uniquement si la politique du type d’opération l’autorise ; sinon, orienter vers une vérification.
05

Politique de reprise : budget, backoff et jitter

Une politique sûre fixe des limites avant qu’une erreur ne survienne. Elle doit définir quelles familles d’échecs sont candidates à une reprise, le nombre maximal de tentatives, une échéance globale pour l’opération, une attente maximale acceptable et un coût maximal toléré. Le seul nombre de tentatives ne suffit pas : cinq reprises peuvent dépasser le délai de l’utilisateur, épuiser un quota ou maintenir occupés des workers qui devraient libérer de la capacité.

Les réponses de limitation de débit et les erreurs transitoires du serveur peuvent justifier une attente suivie d’une nouvelle tentative, à condition que l’opération soit répétable et qu’il reste du budget. La documentation d’OpenClaw indique que certains SDK fondés sur Stainless peuvent traiter comme réessayables les réponses 408, 409, 429 et celles de la famille 5xx. Cela décrit une politique de SDK dans ce contexte, non une règle universelle pour tout endpoint ou effet externe. Les erreurs qui signalent une requête invalide, une autorisation absente ou une condition métier ne se corrigent pas en répétant des données identiques ; elles imposent de corriger la cause ou d’arrêter le flux.

Utilisez un backoff exponentiel pour allonger progressivement l’intervalle, et du jitter pour éviter que de nombreux clients ne réessaient simultanément. AWS recommande le backoff exponentiel comme la variation aléatoire, ainsi que la limitation des reprises et la vérification de l’idempotence avant toute répétition. Si une réponse indique combien de temps attendre à l’aide d’un signal de reprise, respectez-le lorsqu’il est valide et compatible avec l’échéance de l’opération. Si l’attente dépasse le budget, consignez le motif du report ou de l’échec plutôt que d’attendre sans limite.

06

Limites de débit et saturation : une reprise est aussi une charge

Une erreur 429 indique que la capacité disponible ou la limite applicable ne permet pas de poursuivre à cet instant ; elle ne prouve pas qu’augmenter la pression résoudra le problème. Réessayer immédiatement peut transformer un incident limité en tempête de trafic. De plus, les tentatives échouées peuvent être comptabilisées dans les limites de débit ; une stratégie agressive peut donc retarder encore davantage les opérations valides.

Contrôlez la concurrence dans la file de travail, et pas uniquement au sein de chaque client. Définissez, lorsque cela est pertinent, des limites par fournisseur, modèle, identifiant d’accès et type d’opération. Réservez de la capacité pour réconcilier les états ambigus et pour les opérations prioritaires ; sinon, une vague de reprises peut empêcher le système d’établir ce qui s’est produit. Le budget doit inclure le temps d’attente en file, le temps de connexion, le temps de traitement et les attentes entre les tentatives.

Le guide d’OpenAI sur les erreurs 429 recommande un backoff exponentiel avec variation aléatoire lorsqu’aucune indication d’attente exploitable n’est présente, et conseille de limiter à la fois le nombre de reprises et le temps total qui leur est consacré. Il importe de distinguer une limitation transitoire d’autres problèmes de compte ou de quota qui ne se résolvent pas en attendant. La décision doit s’appuyer sur les informations de l’erreur et sur le contrat d’intégration, pas uniquement sur le code d’état.

07

États ambigus : réconcilier avant de répéter

L’état ambigu apparaît lorsqu’il n’existe pas de confirmation suffisante pour déterminer si l’effet s’est produit. Il doit être un état explicite et persistant, non une exception effacée au redémarrage d’un processus. Enregistrez au minimum l’identifiant d’opération, les données ou un résumé sûr de l’intention, les identifiants de tentative, les horodatages, la clé d’idempotence, la destination, la catégorie d’erreur et tout identifiant renvoyé avant la coupure.

La réconciliation suit une hiérarchie. Utilisez d’abord une consultation d’état ou un identifiant de ressource si le contrat du destinataire le fournit. Recherchez ensuite l’effet dans le système de destination selon un critère stable, tel que l’identifiant d’opération inclus dans les métadonnées. Si les preuves confirment l’effet, clôturez l’opération sans la répéter. Si elles prouvent qu’il n’a pas été appliqué, vous pouvez ouvrir une nouvelle tentative conformément à la politique. Si elles ne permettent pas de distinguer les deux cas, ne supposez pas l’absence d’effet : maintenez le cas en attente et escaladez-le lorsque le risque le justifie.

L’examen humain n’est pas un échec de conception ; c’est un contrôle de sécurité pour les opérations dont le coût d’un doublon dépasse le coût du délai. Les conditions d’escalade doivent être concrètes : débits financiers, communications irréversibles, modification de dossiers réglementés, incohérence entre sources, expiration de l’échéance ou absence de preuve fiable de déduplication.

Décision après un timeout survenant après l’envoi

  1. 01Marquer la tentative comme réponse inconnue et conserver toutes les preuves disponibles.
  2. 02Vérifier si le destinataire offre une consultation d’état, une récupération par clé ou un identifiant de ressource.
  3. 03Vérifier le système ayant reçu l’effet, et pas uniquement la couche de modèle ou d’agent.
  4. 04Clôturer comme terminée lorsqu’il existe une preuve suffisante de l’effet attendu.
  5. 05Ne réessayer que s’il existe une preuve de non-exécution ou une garantie d’idempotence applicable.
  6. 06Escalader si les preuves restent ambiguës et que l’effet pourrait être important ou irréversible.
08

Modèles pour les sorties structurées, les outils et les agents

Pour les sorties structurées, séparez la validation de l’exécution. Une réponse qui ne respecte pas le schéma ne doit pas alimenter directement un outil. Conservez la sortie reçue, validez les types, les champs obligatoires, les plages de valeurs et l’autorisation de l’action proposée. Si vous décidez de demander une nouvelle génération, traitez-la comme une nouvelle tentative de produire un plan, non comme une preuve qu’aucun outil n’a été exécuté auparavant.

Avec le tool calling, le contrôleur doit être l’autorité qui décide de l’exécution. Le modèle peut proposer un appel, mais le contrôleur doit attribuer l’identifiant d’opération, vérifier les permissions, dédupliquer lorsque cela convient des arguments sémantiquement équivalents et enregistrer le résultat. Si l’agent reprend après une panne, il doit récupérer le registre des outils déjà exécutés ; il ne doit pas déduire l’historique à partir du texte d’une conversation.

Pour les agents à étapes multiples, évitez de réessayer tout le flux composé comme une unité opaque. Ne réessayez des étapes individuelles que lorsque leurs limites et garanties sont connues. Une planification peut être régénérée ; une lecture peut être répétée avec un avertissement sur la variabilité des données ; une écriture doit être réconciliée ; et une action irréversible exige une barrière explicite. Cette conception réduit les doublons et améliore aussi l’auditabilité lorsque le système reçoit des résultats partiels.

09

Checklist de production et limites de ce guide

Avant d’activer des reprises automatiques, documentez pour chaque opération son responsable, sa destination, ses effets, le coût d’un doublon, sa clé d’idempotence, la preuve de confirmation, son échéance, son nombre maximal de tentatives et sa condition d’escalade. Testez les pannes à chaque frontière : avant l’envoi, pendant la transmission, après l’acceptation de la demande par la destination et avant la persistance locale de la réponse. Un test utile vérifie qu’un redémarrage du processus ne crée pas un second effet.

Examinez également l’architecture dans le contexte du centre d’apprentissage, de la documentation de sécurité, des critères de tarification et du glossaire de votre produit. La limite de reprises influe sur le coût et la latence ; la conservation des journaux influe sur la confidentialité ; et les identifiants utilisés pour réconcilier ou exécuter des outils doivent avoir les privilèges minimaux. Pour des modèles précis, tels que GPT-6 Astra, et pour les intégrations d’une organisation telle qu’OpenAI, la politique finale doit être adaptée au contrat et aux capacités effectivement documentées pour l’endpoint utilisé.

La règle de clôture est simple : ne déclarez pas le succès parce qu’une requête a été émise, et ne déclarez pas l’absence d’effet parce qu’aucune réponse n’a été reçue. Déclarez une opération résolue uniquement lorsque les preuves persistées permettent d’étayer son état. Lorsque ces preuves n’existent pas, la décision sûre peut être d’attendre, de réconcilier ou de demander une intervention humaine.

Checklist avant d’autoriser une reprise automatique

QuestionRéponse nécessaire
L’opération logique a-t-elle un identifiant persistant ?Oui, créé avant le premier envoi.
Le destinataire accepte-t-il une déduplication vérifiable ?Oui, au moyen d’une clé ou d’une consultation documentée ; sinon, une réconciliation est prévue.
L’effet externe dispose-t-il de sa propre protection ?Oui, indépendamment de l’appel au modèle.
Existe-t-il une limite de tentatives et une échéance globale ?Oui, avec un budget de temps et de coût.
Les états ambigus ont-ils un traitement ?Oui, avec des preuves, une consultation et une escalade définies.
Un redémarrage entre l’acceptation et la réponse a-t-il été testé ?Oui, et il ne produit pas un second effet.

Questions ouvertes

  • Les sources fournies ne documentent pas une clé d’idempotence ni une consultation d’état universelles pour toutes les API d’IA ; ces capacités doivent être vérifiées pour l’endpoint concerné.
  • Les catégories d’erreurs réessayables peuvent varier selon le fournisseur, le SDK, l’endpoint, l’identifiant d’accès et le type d’opération.
  • Une réponse 429 peut résulter de différentes limites ou conditions de compte ; le code seul ne détermine pas l’action correcte.
  • La possibilité de retrouver un effet externe après un timeout dépend du fait que le système de destination conserve et permette de consulter un identifiant stable.
10

Poursuivre l’exploration

10

Sources consultées

03

Corrections et transparence

Si vous repérez une information incorrecte ou obsolète, envoyez-nous la page et la source à vérifier.

Proposer une correction