Simulieren von Fehlern aus OpenAI-APIs

Auf einen Blick
Ziel: Testen der Fehlerbehandlung der OpenAI-API
Zeit: 10 Minuten
Plugins:GenericRandomErrorPlugin, RetryAfterPlugin
Voraussetzungen:Einrichten des Dev-Proxys

Wenn Sie OpenAI-APIs in Ihrer App verwenden, sollten Sie testen, wie Ihre App API-Fehler behandelt. Dev Proxy ermöglicht es Ihnen, Fehler in jeder OpenAI-API mithilfe des GenericRandomErrorPlugin zu simulieren. Mit dem RetryAfterPlugin überprüft Dev Proxy auch, dass Ihre App die im Retry-After-Header angegebene Zeit abwartet, bevor sie die API erneut aufruft.

Tipp

Laden Sie diese Voreinstellung herunter, indem Sie den Befehl devproxy config get openai-throttling in der Eingabeaufforderung ausführen.

Erstellen Sie in Ihrem Projektordner eine neue Datei mit dem Namen devproxyrc.json. Öffnen Sie die Datei in einem Code-Editor.

Erstellen Sie ein neues Objekt im plugins Array, das auf das GenericRandomErrorPluginArray verweist. Definieren Sie die OpenAI-API-URL für Dev Proxy und fügen Sie einen Verweis auf die Plug-In-Konfiguration hinzu.

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

Fügen Sie RetryAfterPlugin hinzu und erstellen Sie das Plug-In-Konfigurationsobjekt, um GenericRandomErrorPlugin den Speicherort der Fehlerantworten und den Prozentsatz der Anforderungen, die fehlschlagen sollen, bereitzustellen.

Datei: devproxyrc.json (vollständige Konfiguration)

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

Fügen Sie das RetryAfterPlugin vor dem GenericRandomErrorPlugin in Ihrer Konfigurationsdatei hinzu. Wenn Sie sie danach hinzufügen, schlägt die Anforderung bei GenericRandomErrorPlugin fehl, bevor RetryAfterPlugin sie überprüfen kann.

Erstellen Sie die openai-errors.json Datei im selben Ordner. Diese Datei enthält die Fehlerantworten, aus denen Dev Proxy auswählt, wenn eine Anforderung fehlschlägt. Sie entsprechen den Fehlern, die die OpenAI-API zurückgibt:

Status error.code Was es simuliert
429 rate_limit_exceeded Ihre App hat das Limit für Token pro Minute (TPM) oder Anfragen pro Minute (RPM) erreicht.
429 slow_down Die Anforderungsrate Ihrer App ist zu schnell gestiegen.
429 credit_balance_exhausted Ihre Organisation hat kein Prepaid-Guthaben mehr. Erneutes Versuchen hilft nicht.
503 server_is_overloaded Das Modell ist vorübergehend überlastet.

Weitere Informationen zu diesen Fehlern finden Sie in der OpenAI-Dokumentation unter Fehlercodes .

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

Der @dynamic Wert legt die Retry-After Kopfzeile fest und weist RetryAfterPlugin an, nachzuverfolgen, wie lange Ihre App warten muss. Die credit_balance_exhausted Antwort hat keinen Retry-After Header, da Warten das Problem nicht behebt.

Starten Sie Dev Proxy in Ihrem Projektordner:

devproxy

Wenn Ihre App OpenAI-APIs aufruft, schlägt Dev Proxy 90% der Anfragen mit einem zufälligen Fehler aus der openai-errors.json Datei fehl. Wenn Ihre App die API erneut vor dem Zeitpunkt im Retry-After Header aufruft, meldet RetryAfterPlugin dies und drosselt die Anforderung.

Prüfen Sie Folgendes:

  • Wartet die Zeit Retry-After nach einem rate_limit_exceeded oder slow_down Fehler ab.
  • Beendet den Aufruf der API nach einem credit_balance_exhausted Fehler, anstatt es erneut zu versuchen.
  • Wiederholt mit einer Verzögerung nach einem server_is_overloaded-Fehler und zeigt eine eindeutige Meldung an, wenn keine Wiederholungsversuche mehr übrig sind.

Weitere Informationen zum GenericRandomErrorPlugin.

Siehe auch