Fouten van OpenAI-API's simuleren

In één oogopslag
Doel: Foutafhandeling van OpenAI-API testen
Tijd: 10 minuten
Plugins:GenericRandomErrorPlugin, RetryAfterPlugin
Vereisten:Dev Proxy instellen

Wanneer u OpenAI-API's in uw app gebruikt, moet u testen hoe uw app API-fouten verwerkt. Met dev Proxy kunt u fouten in elke OpenAI-API simuleren met behulp van de GenericRandomErrorPlugin. Met de RetryAfterPlugin controleert Dev Proxy ook of uw app gedurende de tijd die is opgegeven in de Retry-After-header wacht voordat uw app de API opnieuw aanroept.

Tip

Download deze voorinstelling door in de opdrachtprompt devproxy config get openai-throttlinguit te voeren.

Maak in de projectmap een nieuw bestand met de naam devproxyrc.json. Open het bestand in een code-editor.

Maak een nieuw object in de plugins matrix waarnaar de GenericRandomErrorPluginverwijst. Definieer de OPENAI API-URL voor Dev Proxy om een verwijzing naar de configuratie van de invoegtoepassing te bewaken en toe te voegen.

Bestand: 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/*"
  ]
}

Voeg de RetryAfterPlugin toe en maak het configuratieobject van de invoegtoepassing om de GenericRandomErrorPlugin te voorzien van de locatie van de foutreacties en het percentage aanvragen dat moet mislukken.

Bestand: devproxyrc.json (volledige configuratie)

{
  "$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

Voeg de RetryAfterPlugin toe vóór de GenericRandomErrorPlugin in uw configuratiebestand. Als u deze later toevoegt, zorgt GenericRandomErrorPlugin ervoor dat de aanvraag mislukt voordat RetryAfterPlugin deze kan controleren.

Maak in dezelfde map het openai-errors.json-bestand. Dit bestand bevat de foutreacties waaruit Dev Proxy kiest wanneer Dev Proxy een aanvraag niet kan verwerken. Ze komen overeen met de fouten die de OpenAI-API retourneert:

Status error.code Wat het simuleert
429 rate_limit_exceeded Uw app heeft de limiet voor tokens per minuut (TPM) of aanvragen per minuut (RPM) bereikt.
429 slow_down De aanvraagsnelheid van uw app is te snel toegenomen.
429 credit_balance_exhausted Uw organisatie heeft geen vooruitbetaald tegoed meer. Opnieuw proberen helpt niet.
503 server_is_overloaded Het model is tijdelijk overbelast.

Zie Foutcodes in de OpenAI-documentatie voor meer informatie over deze fouten.

Bestand: 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"
            }
          }
        }
      ]
    }
  ]
}

De waarde @dynamic stelt de Retry-After-koptekst in en geeft RetryAfterPlugin aan hoe lang uw app moet wachten. Het credit_balance_exhausted antwoord heeft geen Retry-After header, omdat wachten het niet oplost.

Start Dev Proxy in uw projectmap:

devproxy

Wanneer uw app OpenAI-API's aanroept, mislukt dev proxy 90% van de aanvragen met een willekeurige fout uit het openai-errors.json bestand. Als uw app de API opnieuw aanroept vóór de tijd in de Retry-After-header, meldt RetryAfterPlugin dit en beperkt het de aanvraag.

Controleer of uw app:

  • Wacht op de Retry-After tijd na een rate_limit_exceeded- of slow_down-fout.
  • Stopt met het aanroepen van de API na een credit_balance_exhausted fout, in plaats van het opnieuw te proberen.
  • Probeert opnieuw met een vertraging na een server_is_overloaded fout en er wordt een duidelijk bericht weergegeven wanneer er geen nieuwe pogingen meer over zijn.

Meer informatie over genericRandomErrorPlugin.

Zie ook