Guide › Limites de débit
Gestion des erreurs 429
Une réponse HTTP 429 veut dire que le serveur LLM (Albert par exemple) refuse la requête parce qu'une limite est atteinte. CsAgent distingue une limite qui se lève toute seule en quelques secondes d'une limite journalière qui ne se lève qu'à la remise à zéro, et ne réagit pas de la même façon.
Ce qui se passe, dans l'ordre
- La requête part vers le serveur (
/chat/completions). - Si le serveur répond 429, CsAgent lit le texte de la réponse pour savoir de quelle limite il s'agit (voir la section suivante).
- Limite par minute ou non reconnue : CsAgent attend, puis renvoie la même requête, jusqu'au nombre maximal de tentatives.
- Limite journalière : aucune nouvelle tentative, car attendre ne servirait à rien. CsAgent passe à un autre modèle si c'est possible, sinon il s'arrête avec un message.
- Toute autre erreur HTTP (401, 500…) n'est jamais réessayée : elle est affichée tout de suite.
Reconnaître le type de limite
CsAgent cherche des mots dans le corps de la réponse 429, sans tenir compte des majuscules.
| Mots trouvés | Type | Réaction |
|---|---|---|
per day, per_day, daily, (tpd), (rpd) | Journalière | Pas de nouvel essai, bascule de modèle |
per minute, per min, per_minute, (tpm), (rpm) | Par minute | Nouvel essai avec attente |
| aucun de ces mots | Non reconnue | Traitée comme une limite par minute |
Si les deux familles de mots apparaissent, la limite journalière l'emporte. Exemple de réponse d'Albert : {"detail":"1280000 input tokens per day exceeded (remaining: 0)."}
Le délai entre deux essais
- Si le serveur envoie l'en-tête
Retry-After(en secondes ou sous forme de date), CsAgent attend ce délai. - Sinon, le délai double à chaque essai :
délai de base × 2^(essai − 1). - Dans les deux cas, l'attente est plafonnée à 70 secondes.
Avec les valeurs par défaut (6 tentatives, 1 000 ms de délai de base), il y a cinq attentes : 1, 2, 4, 8 et 16 secondes, soit environ 31 secondes au total avant d'abandonner.
Réglages en ligne de commande
| Option | Défaut | Effet |
|---|---|---|
--max-retries <n> | 6 | Nombre total de tentatives, première requête comprise. 1 désactive toute nouvelle tentative |
--retry-delay <ms> | 1000 | Délai de base avant la première nouvelle tentative, en millisecondes |
Ces deux options valent pour tous les modes : terminal, interface web, Lean UI et mode --api.
- Une valeur absente, non numérique, nulle ou négative est ignorée sans message : la valeur par défaut s'applique.
--retry-delayne peut pas dépasser 70 000 (le plafond). Au-delà, la combinaison est refusée.- Le facteur de doublement (2) et le plafond (70 s) ne se règlent pas en ligne de commande.
Durées d'attente cumulées
| Commande | Attentes (secondes) | Total |
|---|---|---|
| (défaut) | 1, 2, 4, 8, 16 | 31 s |
--max-retries 5 --retry-delay 2000 | 2, 4, 8, 16 | 30 s |
--max-retries 8 --retry-delay 2000 | 2, 4, 8, 16, 32, 64, 70 | 196 s |
--max-retries 1 | aucune | 0 s |
Quand le serveur envoie Retry-After, c'est lui qui fixe chaque attente, toujours dans la limite de 70 s.
Quota journalier épuisé : la bascule de modèle
Quand la limite est journalière, CsAgent ne perd pas la requête : il la renvoie à un autre modèle et poursuit la tâche, avec un message d'avertissement.
Quel modèle est choisi
- Celui de la variable d'environnement
CSAGENT_FALLBACK_MODEL, si elle est définie. - Sinon, le modèle de code (
deepseek-v4-flashpar défaut, ou la valeur de--code-model), uniquement sur l'endpoint Albert par défaut. Sur un autre--endpoint, ce nom ne veut rien dire : il n'y a alors pas de bascule automatique.
Valeur de CSAGENT_FALLBACK_MODEL | Effet |
|---|---|
| un nom de modèle | Bascule vers ce modèle |
off ou none | Désactive la bascule |
| (non définie) | Règle 2 ci-dessus |
Règles de sécurité
- Au plus 2 bascules par exécution.
- Pas de bascule si la conversation contient une image : l'autre modèle ne saurait peut-être pas la lire.
- Pas de bascule vers le modèle qu'on quitte, ni vers un modèle lui aussi épuisé.
- Un modèle épuisé est mémorisé 1 heure, en mémoire du processus. Pendant ce temps, les messages suivants partent directement vers l'autre modèle, sans retenter le premier. Un redémarrage de CsAgent efface cette mémoire.
Il n'existe pas d'option en ligne de commande pour la bascule : seule la variable d'environnement la règle. Les options --model, --code-model, --chat-model et --endpoint fixent les modèles utilisés et, par ce biais, influencent la bascule.
set CSAGENT_FALLBACK_MODEL=openweight-large csagent --max-retries 4 set CSAGENT_FALLBACK_MODEL=off csagent
Quand tout échoue
CsAgent affiche API error: API 429: … suivi d'un conseil, puis arrête la tâche.
- Quota journalier épuisé : « The daily token quota is used up: retrying is useless until it resets. Wait for the reset, or use another model (--model) or endpoint (--endpoint). »
- 429 qui persiste après toutes les tentatives : « The API still answers 429 (rate limit) after the retries. Wait a little and try again, or send less text per request. »
Les messages peuvent apparaître traduits selon la langue.
Que faire selon la situation
| Situation | Piste |
|---|---|
| 429 fréquents, mais qui passent après quelques essais | Augmenter --max-retries (par exemple 8) et, si besoin, --retry-delay |
| Échec rapide, vous préférez ne pas attendre | --max-retries 1 ou 2 |
| Quota journalier épuisé et plus aucun modèle disponible | Attendre la remise à zéro, ou changer de modèle (--model) ou d'endpoint (--endpoint) |
| Trop de jetons par minute | Réduire l'historique envoyé : --context-chars plus petit (minimum 8 000), garder la compaction par défaut (pas de --no-compact), éviter --all-tools |
| Vous ne voulez jamais de bascule de modèle | CSAGENT_FALLBACK_MODEL=off |
Limites actuelles
- Pas d'affichage pendant l'attente : l'interface peut sembler figée jusqu'à 70 secondes sans message.
- Pas de comptage préventif : CsAgent ne sait pas qu'il approche de la limite, il la découvre par un refus.
- Limite mal identifiée : un 429 journalier dont le texte ne contient aucun des mots reconnus est traité comme une limite par minute. Il est alors réessayé jusqu'au bout avant l'échec.
- Options ignorées en silence : une valeur invalide pour
--max-retriesou--retry-delayretombe sur le défaut sans avertissement.