Simular erros de APIs da OpenAI

Visão geral
Objetivo: Testar o tratamento de erros da API openai
Tempo: 10 minutos
Plugins:GenericRandomErrorPlugin, RetryAfterPlugin
Pré-requisitos:Configurar o Proxy de Desenvolvimento

Ao usar APIs OpenAI em seu aplicativo, você deve testar como seu aplicativo lida com erros de API. O Proxy de Desenvolvimento permite simular erros em qualquer API OpenAI usando o GenericRandomErrorPlugin. Com o RetryAfterPlugin, o Proxy de Desenvolvimento também verifica se seu aplicativo aguarda o tempo indicado no cabeçalho Retry-After antes de chamar a API novamente.

Dica

Baixe essa predefinição executando o comando devproxy config get openai-throttling.

Na pasta do projeto, crie um novo arquivo chamado devproxyrc.json. Abra o arquivo em um editor de código.

Crie um novo objeto na plugins matriz que referencia o GenericRandomErrorPlugin. Defina a URL da API OpenAI para o Proxy de Desenvolvimento monitorar e adicionar uma referência à configuração do plug-in.

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

Adicione o RetryAfterPlugin e crie o objeto de configuração do plug-in para fornecer ao GenericRandomErrorPlugin a localização das respostas de erro e o percentual de solicitações a falhar.

Arquivo: devproxyrc.json (configuração completa)

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

Adicione o RetryAfterPlugin antes do GenericRandomErrorPlugin em seu arquivo de configuração. Se você adicioná-la depois, o GenericRandomErrorPlugin falha a solicitação antes que o RetryAfterPlugin possa verificá-la.

Na mesma pasta, crie o openai-errors.json arquivo. Esse arquivo contém as respostas de erro que o Dev Proxy escolhe quando não consegue processar uma solicitação. Eles correspondem aos erros retornados pela API OpenAI:

Status error.code O que simula
429 rate_limit_exceeded Seu aplicativo atingiu seu limite de tokens por minuto (TPM) ou solicitações por minuto (RPM).
429 slow_down A taxa de solicitação do aplicativo aumentou muito rapidamente.
429 credit_balance_exhausted Sua organização não tem mais créditos pré-pagos. Tentar novamente não ajuda.
503 server_is_overloaded O modelo está temporariamente sobrecarregado.

Para obter mais informações sobre esses erros, consulte códigos de erro na documentação do OpenAI.

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

O valor @dynamic define o cabeçalho Retry-After e informa ao RetryAfterPlugin para acompanhar por quanto tempo seu aplicativo deve aguardar. A credit_balance_exhausted resposta não tem cabeçalho Retry-After , pois esperar não a corrige.

Inicie o Proxy de Desenvolvimento na pasta do projeto:

devproxy

Quando seu aplicativo chama APIs OpenAI, o Dev Proxy falha em 90% das solicitações com um erro aleatório do arquivo openai-errors.json. Se o aplicativo chamar a API novamente antes do tempo no cabeçalho Retry-After, o RetryAfterPlugin reportará isso e restringirá a taxa da solicitação.

Verifique se seu aplicativo:

  • Aguarda o tempo de Retry-After após um erro rate_limit_exceeded ou slow_down.
  • Para de chamar a API após ocorrer um erro credit_balance_exhausted, em vez de tentar novamente.
  • Tenta novamente com um atraso após um server_is_overloaded erro e mostra uma mensagem clara quando as novas tentativas se esgotam.

Saiba mais sobre o GenericRandomErrorPlugin.

Consulte também