Timeout réseau sur un appel LLM. Tu retry. Mais le premier appel avait peut-être réussi côté serveur — tu viens de payer deux fois, et si le LLM déclenchait un tool send_email, le client a reçu deux mails. L'idempotence n'est pas un détail.

Où ça casse

Client call LLM + toolsend_email ✓ timeout Clientretry ! 2e email
Le timeout masque un succès. Le retry naïf rejoue l'effet de bord.

La parade : clé d'idempotence

Le client génère une clé unique par intention (pas par tentative) et l'envoie à chaque essai. Le serveur — ou ta couche métier — déduplique sur cette clé : si la clé a déjà été traitée, renvoyer le résultat mémorisé sans ré-exécuter.

  • Les APIs LLM sérieuses acceptent un header Idempotency-Key : l'utiliser systématiquement.
  • Pour les tools à effet de bord, stocker (idempotency_key → résultat) côté ta DB et vérifier avant d'agir.
  • La clé doit survivre au retry : la générer avant la boucle, pas dedans.

Règle simple : tout appel qui déclenche un paiement, un envoi, une écriture externe doit porter une clé d'idempotence. Le reste (lecture pure) s'en passe.