Simulera fel från OpenAI-API:er

Överblick
Mål: Testa OpenAI API-felhantering
Tid: 10 minuter
Plugin-program:GenericRandomErrorPlugin, RetryAfterPlugin
Krav:Konfigurera Dev Proxy

När du använder OpenAI-API:er i din app bör du testa hur appen hanterar API-fel. Med Dev Proxy kan du simulera fel på alla OpenAI-API:er med hjälp av GenericRandomErrorPlugin. Med RetryAfterPlugin kontrollerar Dev Proxy också att appen väntar den tid som anges i rubriken Retry-After innan den anropar API:et igen.

Tips

Ladda ned den här förinställningen genom att köra följande kommando i kommandotolken devproxy config get openai-throttling.

Skapa en ny fil med namnet devproxyrc.jsoni projektmappen. Öppna filen i en kodredigerare.

Skapa ett nytt objekt i matrisen plugins som refererar till GenericRandomErrorPlugin. Definiera URL:en för OpenAI API för Dev Proxy för att övervaka och lägga till en referens till plugin-konfigurationen.

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

RetryAfterPlugin Lägg till och skapa konfigurationsobjektet för plugin-programmet för att förse GenericRandomErrorPlugin med platsen för felsvaren och procentandelen begäranden som ska misslyckas.

Fil: devproxyrc.json (fullständig 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
  }
}

Försiktighet

Lägg till RetryAfterPlugin före GenericRandomErrorPlugin i din konfigurationsfil. Om du lägger till den efter gör GenericRandomErrorPlugin att begäran misslyckas innan RetryAfterPlugin kan kontrollera den.

Skapa filen openai-errors.json i samma mapp. Den här filen innehåller de felsvar som Dev Proxy väljer mellan när Dev Proxy misslyckas med en begäran. De motsvarar de fel som OpenAI API returnerar:

Status error.code Vad den simulerar
429 rate_limit_exceeded Appen har nått sin gräns för token per minut (TPM) eller begäranden per minut (RPM).
429 slow_down Appens förfrågningsfrekvens ökade för snabbt.
429 credit_balance_exhausted Din organisation har inga förbetalda krediter kvar. Det hjälper inte att försöka igen.
503 server_is_overloaded Modellen är tillfälligt överbelastad.

Mer information om dessa fel finns i Felkoder i OpenAI-dokumentationen.

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

Värdet @dynamic anger rubriken Retry-After och instruerar RetryAfterPlugin att spåra hur länge appen måste vänta. Svaret credit_balance_exhausted har ingen Retry-After-rubrik, eftersom det inte åtgärdas genom att vänta.

Starta Dev Proxy i projektmappen:

devproxy

När appen anropar OpenAI-API:er misslyckas Dev Proxy med 90 % av begärandena med ett slumpmässigt fel från filen openai-errors.json. Om din app anropar API:et igen före tiden i rubriken Retry-After, rapporterar RetryAfterPlugin detta och begränsar begäran.

Kontrollera att din app:

  • Väntar på Retry-After tiden efter ett rate_limit_exceeded eller slow_down fel.
  • Slutar anropa API:et efter ett credit_balance_exhausted fel i stället för att försöka igen.
  • Försöker igen med en fördröjning efter ett server_is_overloaded fel och visar ett tydligt meddelande när återförsöken tar slut.

Läs mer om GenericRandomErrorPlugin.

Se även