Mensimulasikan kesalahan dari API OpenAI

Sekilas
Tujuan: Menguji Penanganan Kesalahan API OpenAI
Waktu: 10 menit
Plugins:GenericRandomErrorPlugin, RetryAfterPlugin
Prasyarat:Menyiapkan Proksi Dev

Saat menggunakan API OpenAI di aplikasi, Anda harus menguji bagaimana aplikasi Anda menangani kesalahan API. Dev Proxy memungkinkan Anda mensimulasikan kesalahan pada API OpenAI apa pun menggunakan GenericRandomErrorPlugin. Dengan RetryAfterPlugin, Dev Proxy juga memeriksa apakah aplikasi Anda menunggu selama waktu yang ditentukan dalam header Retry-After sebelum memanggil API lagi.

Ujung

Unduh prasetel ini dengan menjalankannya di prompt perintah devproxy config get openai-throttling.

Di folder proyek Anda, buat file baru bernama devproxyrc.json. Buka file di editor kode.

Buat objek baru di array plugins yang mereferensikan GenericRandomErrorPlugin. Tentukan URL API OpenAI agar Dev Proxy memantau dan menambahkan referensi ke konfigurasi plugin.

Berkas: devproxyrc.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.0.0/rc.schema.json",
  "plugins": [
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "openAIAPI"
    }
  ],
  "urlsToWatch": [
    "https://api.openai.com/*"
  ]
}

RetryAfterPlugin Tambahkan dan buat objek konfigurasi plugin untuk menyediakan GenericRandomErrorPlugin dengan lokasi respons kesalahan dan persentase permintaan yang akan dibuat gagal.

File: devproxyrc.json (konfigurasi lengkap)

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.0.0/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/v4.0.0/genericrandomerrorplugin.schema.json",
    "errorsFile": "openai-errors.json",
    "rate": 90
  }
}

Caution

RetryAfterPlugin Tambahkan sebelum GenericRandomErrorPlugin dalam file konfigurasi Anda. Jika Anda menambahkannya setelahnya, GenericRandomErrorPlugin menggagalkan permintaan sebelum RetryAfterPlugin dapat memeriksanya.

Di folder yang sama, buat file openai-errors.json. File ini berisi respons kesalahan yang dipilih Proksi Dev saat gagal menangani permintaan. Mereka cocok dengan kesalahan yang dikembalikan OpenAI API:

Status error.code Apa yang disimulasikan
429 rate_limit_exceeded Aplikasi Anda mencapai batas token per menit (TPM) atau permintaan per menit (RPM).
429 slow_down Tingkat permintaan aplikasi Anda meningkat terlalu cepat.
429 credit_balance_exhausted Organisasi Anda tidak memiliki kredit prabayar yang tersisa. Mencoba kembali tidak membantu.
503 server_is_overloaded Model sedang kelebihan beban untuk sementara.

Untuk informasi lebih lanjut tentang kesalahan ini, lihat Kode kesalahan dalam dokumentasi OpenAI.

Berkas: openai-errors.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.0.0/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"
            }
          }
        }
      ]
    }
  ]
}

Nilai @dynamic mengatur Retry-After header dan memberi tahu RetryAfterPlugin untuk melacak berapa lama aplikasi Anda harus menunggu. Respons credit_balance_exhausted tidak Retry-After memiliki header, karena menunggu tidak memperbaikinya.

Mulai Proksi Dev di folder proyek Anda:

devproxy

Saat aplikasi Anda memanggil API OpenAI, Dev Proxy gagal 90% permintaan dengan kesalahan acak dari openai-errors.json file. Jika aplikasi Anda memanggil API lagi sebelum waktu yang ditentukan dalam header Retry-After, RetryAfterPlugin akan melaporkannya dan membatasi laju permintaan tersebut.

Periksa apakah aplikasi Anda:

  • Menunggu Retry-After waktu setelah terjadi kesalahan rate_limit_exceeded atau slow_down.
  • Berhenti memanggil API setelah terjadi error credit_balance_exhausted, alih-alih mencoba kembali.
  • Mencoba lagi setelah jeda setelah kesalahan server_is_overloaded, dan menampilkan pesan yang jelas saat percobaan ulang mencapai batas.

Pelajari selengkapnya tentang GenericRandomErrorPlugin.

Lihat juga