Symulowanie błędów z API OpenAI

Na pierwszy rzut oka
Celem: Testowanie obsługi błędów OpenAI API
Czas: 10 minut
Plugins:GenericRandomErrorPlugin, RetryAfterPlugin
Wymagania wstępne:konfigurowanie serwera proxy deweloperskiego

Korzystając z interfejsów API OpenAI w swojej aplikacji, należy przetestować, jak aplikacja obsługuje błędy API. Serwer proxy Dev umożliwia symulowanie błędów w dowolnym interfejsie API OpenAI przy użyciu GenericRandomErrorPlugin. Dzięki funkcji RetryAfterPlugin Dev Proxy sprawdza również, czy aplikacja czeka przez czas określony w nagłówku Retry-After, zanim ponownie wywoła interfejs API.

Napiwek

Pobierz to ustawienie wstępne, uruchamiając wiersz polecenia devproxy config get openai-throttling.

W folderze projektu utwórz nowy plik o nazwie devproxyrc.json. Otwórz plik w edytorze kodu.

Utwórz nowy obiekt w tablicy plugins odwołującej się do GenericRandomErrorPlugin. Zdefiniuj adres URL interfejsu API OpenAI dla serwera proxy deweloperskiego, aby monitorować i dodać odwołanie do konfiguracji wtyczki.

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

Dodaj RetryAfterPlugin i utwórz obiekt konfiguracji wtyczki, aby dostarczyć elementowi GenericRandomErrorPlugin informacje o lokalizacji odpowiedzi na błędy oraz procencie żądań, które mają zakończyć się niepowodzeniem.

Plik: devproxyrc.json (pełna konfiguracja)

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

Dodaj element RetryAfterPlugin przed elementem GenericRandomErrorPlugin w pliku konfiguracji. Jeśli dodasz to później, GenericRandomErrorPlugin spowoduje niepowodzenie żądania, zanim RetryAfterPlugin będzie mogło to sprawdzić.

W tym samym folderze utwórz plik openai-errors.json. Ten plik zawiera odpowiedzi o błędach wybrane przez Dev Proxy w przypadku niepowodzenia żądania. Są one zgodne z błędami zwracanymi przez interfejs API OpenAI:

Status error.code Co symuluje
429 rate_limit_exceeded Aplikacja przekroczyła limit tokenów na minutę (TPM) lub limit żądań na minutę (RPM).
429 slow_down Częstotliwość żądań aplikacji wzrosła zbyt szybko.
429 credit_balance_exhausted Twoja organizacja nie ma już żadnych środków przedpłaconych. Ponawianie próby nie pomaga.
503 server_is_overloaded Model jest tymczasowo przeciążony.

Aby uzyskać więcej informacji na temat tych błędów, zobacz Kody błędów w dokumentacji interfejsu OpenAI.

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

Wartość @dynamic ustawia nagłówek Retry-After i informuje element RetryAfterPlugin, aby śledzić, jak długo Twoja aplikacja musi czekać. Odpowiedź Retry-After nie ma nagłówka credit_balance_exhausted, ponieważ oczekiwanie tego nie naprawi.

Uruchom Dev Proxy w folderze Twojego projektu:

devproxy

Gdy aplikacja wywołuje interfejsy API OpenAI, Dev Proxy powoduje niepowodzenie 90% żądań z losowym błędem z pliku openai-errors.json. Jeśli aplikacja ponownie wywołuje interfejs API przed czasem podanym w nagłówku Retry-After, element RetryAfterPlugin informuje o tym i ogranicza liczbę żądań.

Sprawdź, czy Twoja aplikacja:

  • Czeka przez czas Retry-After po wystąpieniu błędu rate_limit_exceeded lub slow_down.
  • Zatrzymuje wywoływanie interfejsu API po credit_balance_exhausted błędzie zamiast ponawiania próby.
  • Ponawia próbę z opóźnieniem po błędzie server_is_overloaded i wyświetla jasny komunikat, gdy wyczerpią się ponowne próby.

Dowiedz się więcej o genericRandomErrorPlugin.

Zobacz także