Comment réduire les erreurs 429 dans les charges de travail d'agents : patterns de routage, retry et failover
guide

Comment réduire les erreurs 429 dans les charges de travail d'agents : patterns de routage, retry et failover

EvoLink Team
EvoLink Team
Product Team
25 mars 2026
12 min de lecture
Si vos agents rencontrent constamment des 429 Too Many Requests, le problème ne vient généralement pas du fait que votre équipe « utilise mal l'IA ». Le problème est que le trafic des agents est en rafales et que la plupart des limites des fournisseurs sont encore appliquées sur des buckets de rate limit partagés.
Au 25 mars 2026, les documentations officielles d'OpenAI, Anthropic et Google expriment toutes le même point fondamental de différentes manières :
  • les limites sont réelles
  • les limites s'appliquent au-dessus du niveau de la requête individuelle
  • les limites sont liées au périmètre de l'organisation ou du projet
  • des rafales courtes peuvent quand même déclencher des échecs même quand l'utilisation mensuelle semble saine

Ce guide se concentre sur ce qui est vérifiable dans la documentation officielle, puis le traduit en patterns de production qui réduisent réellement les erreurs 429.

Résumé

  • Les systèmes d'agents atteignent les 429 plus vite que les applications simples parce qu'ils créent des rafales, pas du trafic lissé.
  • Vous devez budgétiser les tokens et la concurrence, pas seulement le nombre de requêtes.
  • La logique de retry doit suivre le comportement du fournisseur : utiliser retry-after quand c'est disponible, et ajouter un backoff avec jitter quand ce n'est pas le cas.
  • Les files d'attente, les checkpoints et la dégradation gracieuse comptent autant que le débit brut.
  • Le routage aide quand vous voulez réduire la dépendance envers un seul bucket de limites upstream.

Pourquoi les charges de travail d'agents rencontrent les 429 différemment

Les applications traditionnelles ressemblent souvent à ceci :

  • une requête utilisateur
  • un appel LLM
  • une réponse

Les systèmes d'agents ne se comportent pas ainsi. Ils déclenchent souvent :

  • des étapes de raisonnement à contexte long
  • un fanout d'appels d'outils
  • une concurrence multi-agents
  • des réponses en streaming qui maintiennent les connexions ouvertes
  • des retries en arrière-plan en même temps que le travail au premier plan
Cela signifie que le rate limiting apparaît comme un problème de gestion des rafales, pas simplement comme un problème de « trop de requêtes par minute ».

Ce que disent réellement les documentations des fournisseurs

FournisseurDimensions officielles des limitesPérimètrePoint opérationnel clé
OpenAIRPM, TPM, RPD, TPD, IPMNiveau organisation et projet, spécifique au modèle, avec certaines limites partagéesUn seul workflow bruyant peut consommer le pool dont dépendent vos autres requêtes
AnthropicRPM, ITPM, OTPMNiveau organisation avec limites basées sur les tiersDes rafales courtes peuvent déclencher des 429 avant qu'une minute complète de trafic ne se soit écoulée
Gemini APIRPM, TPM, RPDPar projet, spécifique au modèle, basé sur les tiersPlusieurs agents dans un projet sont toujours en concurrence pour les mêmes limites du projet

OpenAI : le contrôle au niveau du projet n'élimine pas le risque de rafales

Le guide actuel des rate limits d'OpenAI indique que les limites sont définies au niveau de l'organisation et du projet, pas au niveau utilisateur. La référence API expose également des objets de rate limit par projet et par modèle.

L'implication pratique est claire :

  • répartir le trafic entre les fonctionnalités au sein d'un projet ne fait pas disparaître les rafales
  • certaines familles de modèles peuvent partager un pool de limites
  • un trafic d'agents à haut débit peut affamer des requêtes sans rapport si vous ne faites pas de throttling côté client

Anthropic : la pression d'entrée et de sortie est séparée

La documentation des rate limits d'Anthropic est particulièrement utile pour les systèmes d'agents car elle distingue explicitement :

  • RPM
  • ITPM pour les tokens d'entrée
  • OTPM pour les tokens de sortie
La documentation précise également que les rate limits sont appliquées au niveau de l'organisation, utilisent un algorithme de token bucket et peuvent échouer sur des intervalles plus courts. Anthropic renvoie un en-tête retry-after sur les 429, exactement le type de signal que votre couche de retry devrait respecter.

Pour les systèmes d'agents, c'est important car les grands prompts, les longues sorties et les appels d'outils parallèles sollicitent différentes parties du budget.

Gemini API : le périmètre projet signifie toujours une pression partagée

La documentation de l'API Gemini de Google indique que les rate limits sont mesurées via RPM, TPM et RPD, et s'appliquent par projet, pas par clé API.

Cela signifie :

  • plusieurs agents sous un même projet partagent toujours les limites
  • les mises à niveau de tier au niveau du projet aident, mais ne résolvent pas la coordination des rafales au sein de votre application
  • vous devez traiter les limites actives comme des contraintes d'infrastructure, pas comme une réflexion après coup

Patterns qui réduisent réellement les erreurs 429

1. Budgétiser les tokens, pas seulement les requêtes

Un compteur de requêtes est trop grossier pour les systèmes d'agents. Une seule étape de raisonnement à contexte long peut consommer plus de votre budget réel que de nombreuses petites requêtes.

Utilisez un budget sensible aux tokens :

import asyncio
import time
from collections import deque


class TokenBudget:
    def __init__(self, tpm_limit: int):
        self.tpm_limit = tpm_limit
        self.window = deque()

    async def reserve(self, estimated_tokens: int) -> None:
        now = time.time()

        while self.window and self.window[0][0] < now - 60:
            self.window.popleft()

        used = sum(tokens for _, tokens in self.window)

        if used + estimated_tokens > self.tpm_limit and self.window:
            wait_seconds = 60 - (now - self.window[0][0])
            await asyncio.sleep(max(wait_seconds, 0))

        self.window.append((time.time(), estimated_tokens))
L'important n'est pas la classe exacte. L'important est de construire un contrôle d'admission pré-requête avant que le fournisseur n'ait à vous rejeter.

2. Limiter la concurrence autour de la boucle de l'agent

Beaucoup de tempêtes de 429 sont auto-infligées. Les appels d'outils, les jobs en arrière-plan et les retries s'accumulent les uns sur les autres.

Utilisez des contrôles de concurrence :

import asyncio

agent_slots = asyncio.Semaphore(5)


async def run_agent(task):
    async with agent_slots:
        return await execute_agent(task)

Cela seul n'éliminera pas les 429, mais cela empêche votre propre application de transformer un pic en effondrement.

3. Rendre les retries sensibles au fournisseur

La couche de retry ne devrait pas traiter chaque 429 de la même manière.

import asyncio
import random


async def retry_with_backoff(call, provider_name, attempts=5):
    for attempt in range(attempts):
        try:
            return await call()
        except Exception as exc:
            retry_after = getattr(exc, "retry_after", None)

            if retry_after is not None:
                await asyncio.sleep(float(retry_after))
                continue

            # Jittered fallback when the provider does not give a wait value
            delay = min(30, (2 ** attempt) + random.random())
            await asyncio.sleep(delay)

    raise RuntimeError(f"{provider_name} retry budget exhausted")

Recommandations de production :

  • respecter retry-after quand le fournisseur le renvoie
  • utiliser un backoff exponentiel avec jitter comme solution de repli, pas comme seule stratégie
  • ne pas réessayer indéfiniment
  • suivre le volume de retries séparément du trafic principal

4. Séparer les files d'attente premier plan et arrière-plan

Quand le même pool gère le travail d'agent visible par l'utilisateur et les jobs d'analyse en arrière-plan, votre arriéré de faible valeur peut bloquer le trafic de haute valeur.

Utilisez au moins deux files d'attente :

  • une file d'attente premier plan pour les réponses orientées utilisateur
  • une file d'attente arrière-plan pour le travail par lots ou de rattrapage

Cela vous donne un endroit pour écarter ou différer le trafic de basse priorité avant que le fournisseur ne le fasse pour vous.

5. Mettre des checkpoints sur les boucles de longue durée

Ne laissez pas un 429 relancer vingt minutes de travail.

Créez un checkpoint avant chaque appel coûteux :

  • état actuel de la tâche
  • résultats d'outils déjà collectés
  • dernière étape de raisonnement réussie
  • compteur de retries et horodatage de la prochaine tentative

Cela transforme un 429 d'un échec de workflow en un simple délai de planification.

6. Dégrader gracieusement plutôt qu'échouer brutalement

Votre agent n'a pas toujours besoin du plus gros modèle du système.

La dégradation gracieuse peut signifier :

  • des fenêtres de contexte plus petites
  • moins d'outils parallèles
  • un modèle de repli moins cher ou plus rapide
  • mettre en file d'attente les jobs de basse priorité au lieu de les exécuter immédiatement

Le bon repli dépend du workflow, mais le principe architectural est le même : une réponse partielle est généralement préférable à une session d'agent qui a planté.

Où le routage s'inscrit dans le tableau

Le routage n'est pas un remplacement du throttling. C'est un moyen d'empêcher la pression d'un seul fournisseur de dicter tout le comportement de votre application.

La bonne façon de penser le routage est :

  • le throttling contrôle ce que votre application envoie
  • la logique de retry contrôle comment votre application réagit
  • le routage contrôle où votre application peut envoyer du travail quand les conditions changent

Un tableau simple avant-après

PatternCe qui se passe sous chargePrincipale faiblesse
Fournisseur unique, pas de contrôle d'admissionLes requêtes s'accumulent jusqu'à ce que l'upstream commence à les rejeterTempêtes de 429 et retries en cascade
Fournisseur unique avec retries uniquementL'application survit à certains picsLes rafales soutenues bloquent toujours le même bucket upstream
Fournisseur unique avec throttling et files d'attenteLe trafic est plus lissé et les échecs sont moins chaotiquesVous dépendez toujours d'un seul pool upstream
Gateway de routage avec throttling et retriesL'application peut lisser les rafales et garder la surface d'intégration stablePlus de choix d'infrastructure à évaluer

La copie actuelle du repository pour EvoLink Smart Router supporte ces affirmations publiables :

  • EvoLink fournit une couche de routage développée en interne pour les charges de travail mixtes
  • vous pouvez envoyer evolink/auto comme identifiant de modèle
  • le modèle réellement utilisé est renvoyé dans la réponse
  • la forme de la requête reste compatible OpenAI
  • la couche de routage elle-même n'ajoute pas de frais de routage séparés
Cela ne signifie pas que vous devriez promettre zéro erreur 429. Cela signifie que le routage peut déplacer davantage de logique de sélection et de repli du code applicatif vers la couche gateway.

Voici la forme de requête supportée par la copie du repository :

curl https://api.evolink.ai/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "evolink/auto",
    "messages": [
      {
        "role": "user",
        "content": "Summarize the latest deployment incident and suggest next steps."
      }
    ]
  }'

Liste de vérification pratique pour le déploiement

Avant de blâmer le fournisseur, vérifiez d'abord ces points :

VérificationPourquoi c'est important
Estimer le volume de tokens par étape de l'agentBeaucoup de 429 sont en réalité des problèmes de TPM ou ITPM
Limiter les boucles d'agents concurrentesEmpêcher l'amplification auto-infligée des rafales
Respecter retry-after quand il est présentRéduit les tempêtes de retries inutiles
Séparer les files d'attente premier plan et arrière-planProtège la latence côté utilisateur
Sauvegarder des checkpoints pour le travail de longue duréeEmpêche le redémarrage complet après des 429 transitoires
Décider quand router ou basculerMaintient un comportement de repli délibéré plutôt qu'ad hoc

FAQ

Pourquoi les agents atteignent-ils les 429 plus vite qu'une application de chat classique ?

Parce que les agents génèrent du trafic en rafales : longs prompts, fanout d'outils, retries, jobs en arrière-plan et concurrence s'accumulent tous ensemble.

Ajouter plus de clés API résoudra-t-il le problème ?

Généralement pas à lui seul. OpenAI documente des limites au niveau organisation et projet, Anthropic documente des limites au niveau organisation, et Gemini documente des limites au niveau projet. Des clés supplémentaires dans le même périmètre ne créent pas un tout nouveau pool de capacité.

Devrais-je utiliser un backoff exponentiel pour chaque 429 ?

Pas comme première règle. Utilisez retry-after quand le fournisseur vous en donne un. Repliez-vous sur le backoff exponentiel avec jitter quand ce n'est pas le cas.

Ai-je besoin à la fois du throttling et du routage ?

Oui, si vous opérez à l'échelle de la production. Le throttling lisse le trafic avant que le fournisseur ne le rejette. Le routage aide à réduire la dépendance envers un seul chemin upstream.

Que devrais-je journaliser lors du débogage des 429 ?

Journalisez les tokens estimés, les tâches concurrentes, la profondeur de file d'attente, les compteurs de retries, la taille des requêtes et toute valeur d'attente du fournisseur comme retry-after.

Il est utile quand vous voulez conserver une forme de requête compatible OpenAI tout en déplaçant la sélection de modèle et le routage de charges de travail mixtes hors de votre code applicatif.

Un routeur peut-il garantir que je ne verrai plus jamais de 429 ?

Non. Un routeur peut améliorer la résilience et la flexibilité, mais il ne supprime pas le besoin de throttling côté client, de budgets de retry et de contrôle des files d'attente.

Construisez la couche de contrôle avant de scaler

Si votre système d'agents montre déjà un comportement en rafales, la correction des 429 est généralement d'abord un problème d'infrastructure avant d'être un problème de prompt.

Explore EvoLink Smart Router

Articles connexes

Sources

Prêt à réduire vos coûts IA de 89 % ?

Commencez avec EvoLink dès aujourd'hui et découvrez la puissance du routage intelligent des API.