OpenAI API-k hibáinak szimulálása

Egy pillantással
Cél: Az OpenAI API hibakezelésének tesztelése
Idő: 10 perc
`Beépülő modulok:GenericRandomErrorPlugin, RetryAfterPlugin`
Előfeltételek:Fejlesztői proxy beállítása

Amikor OpenAI API-kat használ az alkalmazásban, tesztelnie kell, hogyan kezeli az alkalmazás az API-hibákat. A Dev Proxy segítségével bármilyen OpenAI API-n szimulálhat hibákat a GenericRandomErrorPluginhasználatával. A RetryAfterPlugin használatával a Dev Proxy azt is ellenőrzi, hogy az alkalmazás megvárja-e a Retry-After fejlécben megadott időtartamot, mielőtt újra meghívja az API-t.

Borravaló

Töltse le ezt az előre beállítást a devproxy config get openai-throttlingparancs futtatásával a parancssorban.

A projektmappában hozzon létre egy új, devproxyrc.json nevű fájlt. Nyissa meg a fájlt egy kódszerkesztőben.

Hozzon létre egy új objektumot a pluginshivatkozó GenericRandomErrorPlugin tömbben. Adja meg a Dev Proxy számára az OpenAI API URL-címét a figyeléshez, és adjon hozzá egy hivatkozást a beépülőmodul konfigurációjához.

Fájl: 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/*"
  ]
}

Adja hozzá a RetryAfterPlugin elemet, és hozza létre a beépülő modul konfigurációs objektumát, hogy megadja a GenericRandomErrorPlugin számára a hibaválaszok helyét és a szándékosan meghiúsítandó kérelmek százalékos arányát.

Fájl: devproxyrc.json (teljes konfiguráció)

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

Adja hozzá az RetryAfterPlugin elemet a GenericRandomErrorPlugin elé a konfigurációs fájlban. Ha ezt követően adja hozzá, a GenericRandomErrorPlugin elutasítja a kérést, mielőtt az RetryAfterPlugin ellenőrizni tudja.

Ugyanabban a mappában hozza létre a openai-errors.json fájlt. Ez a fájl tartalmazza azokat a hibaválaszokat, amelyek közül a Dev Proxy választ, amikor egy kérés meghiúsul. Ezek megfelelnek az OpenAI API által visszaadott hibáknak:

Állapot error.code Amit szimulál
429 rate_limit_exceeded Az alkalmazás elérte a percenkénti tokenek (TPM) vagy a percenkénti kérelmek (RPM) korlátját.
429 slow_down Az alkalmazás kéréseinek aránya túl gyorsan nőtt.
429 credit_balance_exhausted A szervezet nem rendelkezik előre kifizetett jóváírásokkal. Az újrapróbálkozás nem segít.
503 server_is_overloaded A modell átmenetileg túlterhelt.

Ezekről a hibákról további információt az OpenAI dokumentáció Hibakódok című részében talál.

Fájl: 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"
            }
          }
        }
      ]
    }
  ]
}

Az @dynamic érték beállítja a Retry-After fejlécet, és jelzi a(z) RetryAfterPlugin számára, hogy kövesse, mennyi ideig kell várnia az alkalmazásnak. A credit_balance_exhausted válasz nem tartalmaz Retry-After fejlécet, mert a várakozás nem oldja meg.

Indítsa el a Dev Proxy-t a projektmappájában:

devproxy

Amikor az alkalmazás OpenAI API-kat hív meg, a Dev Proxy a kérések 90%-át meghiúsítja a openai-errors.json fájlból származó véletlenszerű hibával. Ha az alkalmazás a fejlécben lévő Retry-After időpont előtt ismét meghívja az API-t, a RetryAfterPlugin jelzi ezt, és korlátozza a kérést.

Ellenőrizze az alkalmazását:

  • A slow_down vagy rate_limit_exceeded hiba utáni Retry-After ideig vár.
  • Ahelyett, hogy újrapróbálkozna, egy credit_balance_exhausted hiba után leállítja az API meghívását.
  • Egy server_is_overloaded hiba után késleltetéssel újrapróbálkozik, és az újrapróbálkozási lehetőségek kimerülésekor egy egyértelmű üzenetet jelenít meg.

További információ a GenericRandomErrorPluginről.

Lásd még