Simuler des erreurs à partir d’API OpenAI

En un clin d’œil
Objectif: Tester la gestion des erreurs de l’API OpenAI
Heure : 10 minutes
Plugins :GenericRandomErrorPlugin, RetryAfterPlugin
Prérequis :configurer le proxy de développement

Lorsque vous utilisez des API OpenAI dans votre application, vous devez tester la façon dont votre application gère les erreurs d’API. Le proxy de développement vous permet de simuler des erreurs sur n’importe quelle API OpenAI à l’aide de GenericRandomErrorPlugin. Avec RetryAfterPlugin, le proxy de développement vérifie également que votre application attend la durée indiquée dans l’en-tête Retry-After avant d’appeler à nouveau l’API.

Conseil / Astuce

Téléchargez cette présélection en exécutant l’invite de commandes devproxy config get openai-throttling.

Dans votre dossier de projet, créez un fichier nommé devproxyrc.json. Ouvrez le fichier dans un éditeur de code.

Créez un objet dans le plugins tableau référençant le GenericRandomErrorPlugin. Définissez l’URL de l’API OpenAI pour que Dev Proxy la surveille et ajoute une référence à la configuration du plug-in.

Fichier : devproxyrc.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
  "plugins": [
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "openAIAPI"
    }
  ],
  "urlsToWatch": [
    "https://api.openai.com/*"
  ]
}

Ajoutez RetryAfterPlugin et créez l’objet de configuration du plug-in pour fournir à GenericRandomErrorPlugin l’emplacement des réponses d’erreur et le pourcentage de requêtes devant échouer.

Fichier : devproxyrc.json (configuration complète)

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
  "plugins": [
    {
      "name": "RetryAfterPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
    },
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "openAIAPI"
    }
  ],
  "urlsToWatch": [
    "https://api.openai.com/*"
  ],
  "openAIAPI": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
    "errorsFile": "openai-errors.json",
    "rate": 90
  }
}

Caution

Ajoutez le RetryAfterPlugin avant le GenericRandomErrorPlugin dans votre fichier de configuration. Si vous l'ajoutez après, GenericRandomErrorPlugin fait échouer la requête avant que RetryAfterPlugin puisse la vérifier.

Dans le même dossier, créez le openai-errors.json fichier. Ce fichier contient les réponses d'erreur que Dev Proxy sélectionne lorsqu'il fait échouer une requête. Ils correspondent aux erreurs retournées par l’API OpenAI :

Status error.code Ce qu’il simule
429 rate_limit_exceeded Votre application a atteint sa limite de jetons par minute (TPM) ou de requêtes par minute (RPM).
429 slow_down Le taux de demandes de votre application a augmenté trop rapidement.
429 credit_balance_exhausted Votre organisation n’a plus de crédits prépayés. Réessayer ne sert à rien.
503 server_is_overloaded Le modèle est temporairement surchargé.

Pour plus d’informations sur ces erreurs, consultez les codes d’erreur dans la documentation OpenAI.

Fichier : openai-errors.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.errorsfile.schema.json",
  "errors": [
    {
      "request": {
        "url": "https://api.openai.com/*"
      },
      "responses": [
        {
          "statusCode": 429,
          "headers": [
            {
              "name": "content-type",
              "value": "application/json; charset=utf-8"
            },
            {
              "name": "Retry-After",
              "value": "@dynamic"
            }
          ],
          "body": {
            "error": {
              "message": "Rate limit reached for gpt-4.1 in organization org-K7hT684bLccDbBRnySOoK9f2 on tokens per min (TPM): Limit 30000, Used 30000, Requested 1200. Please try again in 2.4s. Visit https://platform.openai.com/settings/organization/limits to learn more.",
              "type": "tokens",
              "param": null,
              "code": "rate_limit_exceeded"
            }
          }
        },
        {
          "statusCode": 429,
          "headers": [
            {
              "name": "content-type",
              "value": "application/json; charset=utf-8"
            },
            {
              "name": "Retry-After",
              "value": "@dynamic"
            }
          ],
          "body": {
            "error": {
              "message": "Rate limit reached for gpt-4.1 in organization org-K7hT684bLccDbBRnySOoK9f2 on requests per min (RPM): Limit 500, Used 500, Requested 1. Please try again in 120ms. Visit https://platform.openai.com/settings/organization/limits to learn more.",
              "type": "requests",
              "param": null,
              "code": "rate_limit_exceeded"
            }
          }
        },
        {
          "statusCode": 429,
          "headers": [
            {
              "name": "content-type",
              "value": "application/json; charset=utf-8"
            },
            {
              "name": "Retry-After",
              "value": "@dynamic"
            }
          ],
          "body": {
            "error": {
              "message": "Your request rate increased too quickly. Reduce your request rate and increase it gradually.",
              "type": "rate_limit_error",
              "param": null,
              "code": "slow_down"
            }
          }
        },
        {
          "statusCode": 429,
          "headers": [
            {
              "name": "content-type",
              "value": "application/json; charset=utf-8"
            }
          ],
          "body": {
            "error": {
              "message": "Your organization has no prepaid credits remaining. Add credits to continue using the API. For more information on this error, read the docs: https://developers.openai.com/api/docs/guides/error-codes.",
              "type": "insufficient_quota",
              "param": null,
              "code": "credit_balance_exhausted"
            }
          }
        },
        {
          "statusCode": 503,
          "headers": [
            {
              "name": "content-type",
              "value": "application/json; charset=utf-8"
            }
          ],
          "body": {
            "error": {
              "message": "The requested model is temporarily overloaded. Please try again later.",
              "type": "service_unavailable_error",
              "param": null,
              "code": "server_is_overloaded"
            }
          }
        }
      ]
    }
  ]
}

La valeur @dynamic définit l’en-tête Retry-After et indique à RetryAfterPlugin de suivre la durée pendant laquelle votre application doit attendre. La credit_balance_exhausted réponse n’a pas d’en-tête Retry-After , car l’attente ne le corrige pas.

Démarrez le proxy de développement dans votre dossier de projet :

devproxy

Lorsque votre application appelle les API OpenAI, Dev Proxy fait échouer 90 % des requêtes en renvoyant une erreur aléatoire provenant du fichier openai-errors.json. Si votre application rappelle l'API avant la fin du délai indiqué dans l'en-tête Retry-After, le RetryAfterPlugin le signale et limite le débit de la requête.

Vérifiez que votre application :

  • Attend le délai Retry-After après une erreur rate_limit_exceeded ou slow_down.
  • Arrête d'appeler l'API après une erreur credit_balance_exhausted, au lieu de réessayer.
  • Effectue une nouvelle tentative après une erreur server_is_overloaded, en respectant un délai d'attente, et affiche un message clair lorsque toutes les tentatives sont épuisées.

En savoir plus sur GenericRandomErrorPlugin.

Voir aussi