Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
De relance
Objetivo: Testar a gestão 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 Dev Proxy permite simular erros em qualquer API OpenAI usando o GenericRandomErrorPlugin. Com o RetryAfterPlugin, o Dev Proxy também verifica se a tua aplicação aguarda o tempo indicado no cabeçalho Retry-After antes de voltar a chamar a API.
Dica
Transfira esta predefinição executando na linha de comandos devproxy config get openai-throttling.
Na pasta do seu projeto, crie um novo ficheiro chamado devproxyrc.json. Abra o arquivo em um editor de código.
Crie um novo objeto na matriz plugins fazendo referência ao GenericRandomErrorPlugin. Defina a URL da API OpenAI para o Dev Proxy observar e adicione uma referência à configuração do plugin.
Ficheiro: 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 plugin para fornecer a GenericRandomErrorPlugin a localização das respostas de erro e a percentagem de pedidos que devem falhar.
Ficheiro: 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 no seu arquivo de configuração. Se adicionares depois, o GenericRandomErrorPlugin rejeita o pedido antes de o RetryAfterPlugin poder verificar.
Na mesma pasta, crie o arquivo openai-errors.json. Este ficheiro contém as respostas de erro que o Dev Proxy escolhe quando o Dev Proxy falha um pedido. Eles correspondem aos erros que a API da OpenAI devolve:
| Status | error.code |
O que simula |
|---|---|---|
| 429 | rate_limit_exceeded |
A sua aplicação atingiu o limite de tokens por minuto (TPM) ou pedidos por minuto (RPM). |
| 429 | slow_down |
A taxa de pedidos da tua aplicação aumentou demasiado depressa. |
| 429 | credit_balance_exhausted |
A sua organização já não tem créditos pré-pagos. Tentar novamente não ajuda. |
| 503 | server_is_overloaded |
O modelo está temporariamente sobrecarregado. |
Para mais informações sobre estes erros, consulte Códigos de erro na documentação OpenAI.
Ficheiro: 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 indica ao RetryAfterPlugin para registar quanto tempo a sua aplicação tem de esperar. A credit_balance_exhausted resposta não tem cabeçalho Retry-After, porque esperar não resolve o problema.
Iniciar Proxy de Desenvolvimento na pasta do seu projeto:
devproxy
Quando a sua aplicação chama APIs OpenAI, o Dev Proxy falha 90% dos pedidos com um erro aleatório no ficheiro openai-errors.json. Se a sua aplicação chamar a API novamente antes do horário indicado no cabeçalho Retry-After, o RetryAfterPlugin comunica isso e limita o pedido.
Verifique se a sua aplicação:
- Espera durante o tempo
Retry-Afterapós um errorate_limit_exceededouslow_down. - Deixa de chamar a API após um
credit_balance_exhaustederro, em vez de tentar novamente. - Tenta novamente com um atraso após um
server_is_overloadederro e mostra uma mensagem clara quando as tentativas terminam.
Saiba mais sobre o GenericRandomErrorPlugin.