Guias
Erros, limites e novas tentativas
Leia respostas de erro e cabeçalhos de limite de taxa, repita com segurança e diagnostique falhas comuns.
Toda API da Felo retorna um corpo de erro JSON com um código de erro estável e um request ID. Leia primeiro o status HTTP, depois o código e, por fim, a mensagem.
Envelope de erro
As respostas de produção atuais usam o status HTTP como status:
{
"status": 401,
"code": "UNAUTHORIZED",
"message": "Invalid API Key",
"request_id": "202610221444486982113280416060637185"
}| Campo | Significado |
|---|---|
status | Código de status HTTP, repetido no corpo |
code | Código de erro legível por máquina |
message | Explicação legível por humanos |
request_id | Identificador opaco desta requisição; inclua-o nos pedidos de suporte |
Alguns exemplos antigos de endpoints usam status: "error" e uma string de código diferente. Decida com base no status HTTP e em code, não no texto exato de message.
Códigos comuns
| HTTP | Código | O que significa | O que fazer |
|---|---|---|---|
| 400 | Código de validação específico do endpoint | Um parâmetro está faltando ou é inválido | Corrija a requisição; não tente novamente sem alterações |
| 401 | UNAUTHORIZED | Chave de API ausente, inválida, expirada ou revogada | Envie Authorization: Bearer $FELO_API_KEY; rotacione a chave se ela foi revogada |
| 402 | INSUFFICIENT_CREDITS | Créditos de serviço insuficientes | Recarregue em Console Billing e tente novamente |
| 404 | Específico do endpoint | Modelo, tarefa ou rota desconhecidos | Verifique o ID do modelo ou da tarefa e o caminho do endpoint |
| 429 | RATE_LIMITED | Um limite de requisições foi excedido | Aguarde o Retry-After e tente novamente |
| 5xx | CHAT_FAILED, *_FAILED, SERVICE_UNAVAILABLE | Falha do upstream ou do serviço | Tente novamente com backoff; fale com o suporte se persistir |
As referências de endpoint listam os códigos específicos daquele endpoint. Comece pelos erros da Chat API ou pela referência do endpoint que você está chamando.
Endpoints de geração de modelos
POST /api/v1/images/generations e POST /api/v1/videos/generations retornam erros no nível do endpoint no envelope da OpenAI, em vez do envelope acima:
{
"error": {
"message": "Model kind does not match this generation endpoint",
"type": "invalid_request_error",
"param": null,
"code": "model_kind_mismatch"
}
}O request ID fica no cabeçalho de resposta X-Request-Id, não no corpo. Uma requisição rejeitada não cria uma tarefa. Depois que uma tarefa existe, a maioria das falhas chega como status terminal na tarefa em uma resposta 200, e não como erro HTTP: verifique se status é failed ou interrupted e então leia error.message. Consulte Geração de imagens e Tarefas assíncronas.
Request IDs
Os corpos de erro da Felo incluem request_id. Registre-o no log junto com o endpoint, o status HTTP, o código de erro, o ID do modelo e o ID da tarefa. Nunca registre a chave de API completa.
A Model API também aceita um cabeçalho de requisição opcional X-Request-Id. Quando você envia um, ele é devolvido para fins de diagnóstico, o que permite correlacionar seus próprios logs com uma requisição. Se você não enviar um, use o request_id retornado.
Limites de requisições
/v2/chat é o único endpoint da Felo com limites de requisições documentados e aplicados:
- Por chave de API, janela de 1 minuto.
- Por usuário, janela de 1 minuto.
- Por usuário, janela de 1 hora.
Usuários com uma assinatura Felo paga efetiva, incluindo assinaturas empresariais, estão isentos e não recebem cabeçalhos X-RateLimit-*. Se o status da assinatura não puder ser verificado, os limites continuam valendo.
| Cabeçalho | Significado |
|---|---|
X-RateLimit-Limit | Limite da dimensão mais restritiva em vigor no momento |
X-RateLimit-Remaining | Cota restante mínima entre as três dimensões |
X-RateLimit-Reset | Timestamp Unix em segundos de quando a janela atual é redefinida |
Retry-After | Em um 429, o atraso recomendado em segundos |
Os demais endpoints /v2/** não têm limites de requisições aplicados no momento. Requisições à Model API ainda podem ser limitadas pelo provedor upstream, o que pode aparecer como um 429.
Não codifique limites numéricos. Leia os cabeçalhos de cada resposta.
Política de novas tentativas
| Situação | Tentar novamente? |
|---|---|
| 400, 401, 402, 404 | Não. Corrija primeiro a requisição, a chave ou o saldo. |
| 429 | Sim, após Retry-After ou X-RateLimit-Reset. |
| 5xx, timeouts, conexões redefinidas | Sim, com backoff exponencial e jitter. |
| Conexão de streaming interrompida no meio da resposta | Tente novamente apenas se sua aplicação puder tolerar uma geração duplicada. |
Loop recomendado:
- Tente novamente apenas requisições idempotentes ou seguras de repetir.
- Use backoff exponencial: comece em cerca de 1 segundo, dobre a cada tentativa e limite a 30 segundos.
- Adicione jitter aleatório para que os clientes não tentem novamente em sincronia.
- Pare após um número pequeno de tentativas e exponha o erro.
- Em um 429, respeite o
Retry-Afterem vez do seu próprio intervalo.
Sequência de depuração
- Verifique se a chave está presente e não foi revogada.
- Chame
GET /api/v1/modelscom a mesma chave para confirmar a autenticação. - Envie a menor requisição válida para o endpoint de destino.
- Adicione streaming, ferramentas ou entradas grandes um de cada vez.
- Para trabalho assíncrono, verifique o status da tarefa antes de reenviar.