Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les API de modèle de langage limitent votre trafic de 2 façons à la fois : nombre de demandes que vous envoyez par minute (RPM) et combien de jetons vous utilisez par minute (TPM). Vous pouvez rester largement en dessous de votre limite de requêtes tout en subissant une limitation de débit, car quelques prompts longs peuvent suffire à épuiser votre budget de jetons. Lorsque vous atteignez l’une ou l’autre limite, l’API répond avec 429 Too Many Requests et votre application doit attendre.
Comment OpenAI, Azure OpenAI et Anthropic effectuent le comptage
| Provider | Éléments soumis à des limites | Éléments à connaître |
|---|---|---|
| OpenAI | RPM, demandes par jour, TPM, jetons par jour, et bien plus, par organisation et par projet, par modèle | La première limite atteinte déclenche la limitation. Pour la limite de jetons, une requête est comptabilisée selon la valeur la plus élevée entre max_tokens et une estimation fondée sur le nombre de caractères. Les requêtes ayant échoué sont également comptabilisées. |
| Azure OpenAI | TPM que vous affectez à chaque déploiement, ainsi qu’une limite RPM définie en proportion de celui-ci | Le RPM est vérifié sur des intervalles de 1 ou 10 secondes, donc une rafale reçoit une erreur 429 même lorsque le total par minute est correct. L’estimation du token inclut max_tokens. |
| Anthropic | RPM, jetons d’entrée par minute (ITPM) et jetons de sortie par minute (OTPM), par modèle | La capacité se rétablit en continu. Ainsi, une limite de 60 requêtes par minute (RPM) peut être appliquée à raison d’une requête par seconde. Pour la plupart des modèles, les jetons d’entrée mis en cache ne comptent pas vers ITPM et max_tokens ne compte pas vers OTPM. |
Si vous définissez max_tokens sur 4 000 et recevez 200 jetons en retour, OpenAI et Azure OpenAI comptabilisent tout de même les 4 000 jetons dans votre limite. C’est ainsi que vous pouvez obtenir 429 si vos métriques d’utilisation sont bien inférieures à votre quota.
Ce que signifie un 429 pour chaque fournisseur
Les erreurs 429 ne disparaissent pas toutes après un simple délai d’attente.
| Provider | Attendre et réessayer | Arrêtez et parlez-en à quelqu’un |
|---|---|---|
| OpenAI | 429 pour les demandes ou jetons, 429 slow_down (votre trafic a augmenté trop rapidement, même dans vos limites) et 503 server_is_overloaded. Attendez Retry-After lorsqu’il est présent. |
429 avec credit_balance_exhausted, organization_spend_limit_exceeded, project_spend_limit_exceededou organization_usage_limit_exceeded en error.code. Une nouvelle tentative ne rétablira pas l’accès. |
| Azure OpenAI | Erreur 429 liée aux limites de jetons par minute (TPM) ou de requêtes par minute (RPM) du déploiement, à la capacité du système ou à une réduction temporaire de votre limite de débit. Attendez que retry-after-ms soit écoulé. |
Erreurs 429 persistantes en production alors que votre utilisation reste inférieure au quota qui vous a été accordé. Vérifiez l’allocation TPM du déploiement, puis ouvrez une demande de support. |
| Anthropic | Erreur 429 rate_limit_error accompagnée d’un en-tête retry-after, notamment en cas de limites d’accélération déclenchées par une forte augmentation de l’utilisation, et erreur 529 overloaded_error. |
429 pour le plafond mensuel des dépenses. Aucun en-tête retry-after n’est présent, error.details.error_code correspond à enforced_spend_limit_reached, et les requêtes continuent d’échouer jusqu’au rétablissement de l’accès. |
Comment gérer les limites de débit LLM
- Vérifiez quel 429 vous avez obtenu. Les erreurs de facturation, de coûts et de quota ont besoin d’une personne, et non d’une nouvelle tentative.
- Attendez aussi longtemps que l’API le demande. OpenAI et Anthropic indiquent
retry-afteren secondes. Azure OpenAI envoieretry-after-msen millisecondes. En l’absence d’indication, appliquez un délai d’attente exponentiel avec une temporisation aléatoire et limitez à la fois le nombre de tentatives et la durée totale des nouvelles tentatives. - Sachez ce que fait déjà votre Kit de développement logiciel (SDK). Les SDK Python OpenAI et Anthropic réessaient en cas d’erreurs de connexion et de réponses
408,409,429et 5xx, 2 fois par défaut. Si vous ajoutez votre propre boucle de nouvelle tentative, désactivez les nouvelles tentatives du Kit de développement logiciel (SDK), par exemple avecmax_retries=0dans Python, comme le recommande Azure OpenAI, ou les tentatives se multiplient. - Réduisez ce qui compte. Sur OpenAI et Azure OpenAI, définissez
max_tokenssur une valeur proche de la taille de réponse attendue. Sur Anthropic, cachez du contenu répété comme les instructions système. - Augmentez progressivement. Une forte hausse du trafic peut déclencher le mécanisme
slow_downd’OpenAI et les limites d’accélération d’Anthropic, même si vous respectez les limites qui vous sont imposées. OpenAI recommande, lorsque vous atteignez un million de jetons d’entrée par minute, d’augmenter votre utilisation de 50 % au maximum toutes les 15 minutes. - Ne relancez pas un flux de données que vous avez déjà consommé. Une erreur après le démarrage d’un flux peut arriver en tant qu’événement de flux, et OpenAI déconseille de relancer automatiquement une requête après avoir consommé la sortie.
- Indiquez à l’utilisateur quand une demande se bloque sur un 429, au lieu d’afficher un spinner.
Comment tester que votre application gère les limites de débit LLM
| Approach | Ce que vous trouvez | Ce qui vous manque |
|---|---|---|
| Simuler le client SDK dans vos tests, ou laisser votre agent de codage écrire la simulation | Si votre branche d’erreur s’exécute | Les codes d’état réels du fournisseur, les codes d’erreur du fournisseur et les en-têtes du fournisseur, ainsi que les nouvelles tentatives de votre Kit de développement logiciel (SDK). Votre application a également besoin d’un commutateur réservé aux tests pour accéder au simulateur. |
| Appelez l’API réelle jusqu’à ce qu’elle applique une limitation de débit. | Comportement réel | Chaque jeton vous est facturé, et vous ne pouvez pas déclencher à la demande slow_down, une surcharge ou un plafond de dépenses |
| Interceptez le trafic réel de votre application et renvoyez les erreurs du fournisseur, ou appliquez une limitation en fonction des jetons que votre application utilise | Des URL réelles, la politique de nouvelle tentative de votre SDK et les corps de réponse d’erreur du fournisseur, avec une limite que vous choisissez | Votre code isolé. Conservez vos tests unitaires pour cela. |
Essayez-le sur votre application
Dev Proxy intercepte les requêtes de votre application à l’API du modèle de langage et retourne les propres erreurs du fournisseur, tandis que votre application continue d’appeler l’URL réelle. Pour OpenAI, téléchargez la configuration prédéfinie, puis démarrez Dev Proxy en l’utilisant :
devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"
La configuration prédéfinie openai-throttling fait échouer 90 % des requêtes vers https://api.openai.com/* en renvoyant une erreur aléatoire parmi les suivantes : rate_limit_exceeded pour les limites TPM ou RPM, slow_down, credit_balance_exhausted ou 503 server_is_overloaded. La configuration prédéfinie anthropic-throttling applique le même comportement à https://api.anthropic.com/*, avec des erreurs 429 liées aux limites RPM, aux jetons d’entrée, aux jetons de sortie et à l’accélération, ainsi que des erreurs 529 overloaded_error. Les deux préréglages incluent le RetryAfterPlugin, qui vous indique quand votre application appelle à nouveau l’API avant que le délai retry-after n’expire sur un code 429, 503 ou 529.
Pour appliquer une limitation en fonction du nombre réel de jetons utilisés par votre application, utilisez le composant LanguageModelRateLimitingPlugin. Il compte les jetons d’invite et de complétion que chaque réponse signale et retourne 429 avec retry-after lorsque votre application dépasse les limites que vous avez définies. Il fonctionne avec les API compatibles OpenAI, notamment Azure OpenAI et les modèles locaux :
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.0.0/rc.schema.json",
"plugins": [
{
"name": "LanguageModelRateLimitingPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "languageModelRateLimitingPlugin"
}
],
"urlsToWatch": [
"https://api.openai.com/*",
"https://*.openai.azure.com/openai/deployments/*/chat/completions*"
],
"languageModelRateLimitingPlugin": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.0.0/languagemodelratelimitingplugin.schema.json",
"promptTokenLimit": 1000,
"completionTokenLimit": 500,
"resetTimeWindowSeconds": 60
}
}
Le plug-in ne reproduit pas l’estimation max_tokens . Le corps de réponse 429 par défaut est l’erreur d’OpenAI rate_limit_exceeded pour les jetons par minute. Pour renvoyer le corps d'erreur d'un autre fournisseur, comme celui d'Azure OpenAI, définissez whenLimitExceeded sur Custom et pointez customResponseFile sur votre propre réponse. Pour installer Dev Proxy, consultez Configurer Dev Proxy.