Docs · Referência
Erros
Cada superfície reporta os erros no formato que os seus clientes esperam, então não existe um formato de erro único. Esta página lista os formatos, o que cada status quer dizer e o que é seguro tentar de novo.
Os formatos#
| Superfície | Formato |
|---|---|
/v1/chat/completions, /v1/responses, /v1/audio/*, /v1/models | {"error": {"message", "type", "param", "code"}} |
/v1/messages | {"type": "error", "error": {"type", "message"}} |
/api/v1/*, falha de autenticação | {"message": "Unauthenticated."} |
/api/v1/*, falha de validação (422) | {"message": "…", "errors": {"field": ["…"]}} |
/api/v1/auth/login | {"status": "error", "message": "…", "errors": {…}} |
/api/v1/agent/chat, /api/v1/embeddings e outros | {"detail": "…"} |
/api/v1/conversations | {"status": "error", "message": "…"} |
/api/v1/collections | {"status": "error", "code": "…", "message": "…"}, veja coleções |
/api/v1/chat (stream) | um evento error dentro de um stream 200, veja chat stream |
/api/v1/mcp | erros JSON-RPC dentro de um 200, veja servidor MCP |
um limite de requisições (429) | {"message": "Too Many Attempts."}, ou {"codigo": "limite_de_requisicoes", "detail": "…"}, veja limites e cotas |
Dois detalhes que surpreendem as pessoas:
- Nos endpoints
/v1, um401sempre usa o formato da OpenAI, inclusive em/v1/messages, cujos outros erros usam o formato da Anthropic. - Um erro no nível do framework em
/v1, como um429ou um404para uma rota que não existe, só é JSON quando você enviaAccept: application/json. Todo SDK oficial envia. Umcurlpuro recebe uma página HTML.
Códigos de status#
| Status | Significado | Tentar de novo |
|---|---|---|
| 400 | a requisição está malformada. Em POST /api/v1/agent/chat também quer dizer um modelo ou servidor que não existe | não. Corrija a requisição |
| 401 | a credencial está ausente, errada, expirada ou revogada, ou a conta dela não tem acesso à API ou está desativada. Em /api/v1, um token de sessão nesses dois últimos casos recebe 403 | não. Confira a chave. Veja autenticação |
| 403 | os limites do grupo da sua conta recusaram a chamada: um modelo não permitido, uma cota de tokens esgotada, ou servidores remotos que o grupo não pode usar. Ou uma operação que uma chave de API não pode fazer | não. Mude alguma coisa antes |
| 404 | nos endpoints /v1, um id que nomeia um servidor que não tem o modelo (um nome simples que não existe é respondido por outro modelo, veja modelos). Em qualquer lugar, uma rota, conversa ou resposta que não existe ou não é sua | não |
| 413 | o upload é grande demais | não |
| 422 | o corpo falhou na validação | não. Leia errors ou message |
| 429 | um limite de requisições foi atingido | sim, depois de Retry-After segundos |
| 501 | um recurso que este gateway não oferece, como ferramentas no endpoint Responses | não |
| 502 | o servidor do modelo, ou o provedor dele, falhou ou não devolveu nada | sim, com espera crescente, algumas vezes |
| 503 | o serviço está indisponível, ou todos os modelos da cadeia falharam de um jeito que vale tentar de novo | sim, depois de Retry-After quando ele é enviado |
| 504 | o modelo parou de responder no meio da resposta | sim, com espera crescente. A resposta parcial está em partial |
Os campos que identificam uma chamada#
Guarde estes campos quando for relatar um problema:
X-Request-Id, em toda resposta. Ele identifica a requisição HTTP. Você pode enviar o seu, com até 64 letras, dígitos,-e_, e ele volta inalterado, o que permite seguir uma chamada pelos seus próprios sistemas.X-Inference-Request-Id, nos endpoints/v1e no stream do chat, e o campo de corporequest_id, emPOST /api/v1/agent/chate nos eventos do stream do chat. Eles identificam a chamada ao modelo.
Status de provedor em agent/chat#
Quando todos os modelos da cadeia falham, POST /api/v1/agent/chat responde 503 com Retry-After e retry_after para qualquer falha que vale tentar de novo: um limite de requisições, uma cota esgotada no provedor, um provedor sobrecarregado, uma chave de provedor recusada ou ausente, um erro de servidor, ou um servidor que não pode ser alcançado. Ele faz isso seja qual for o status que o provedor enviou, e detail termina dizendo quando tentar de novo. Um 503 aqui não é o gateway fora do ar, e uma chave de provedor recusada não é a sua chave do gateway. Uma requisição que o provedor rejeita como inválida mantém o status do próprio provedor, em geral 400.
Os endpoints /v1 são diferentes. A recusa de um provedor de nuvem mantém o status dele ali só quando nenhum outro modelo da cadeia pode responder; caso contrário o modelo padrão responde com 200 (veja modelos). /v1/chat/completions mapeia os status dos servidores do próprio operador, como a página dele diz.
Erros que chegam tarde#
Uma resposta em streaming já respondeu 200 quando falha, então os erros dela viajam dentro do stream:
/v1/chat/completions:data: {"error": {…}}, depoisdata: [DONE]./v1/messages:event: error. Um stream que termina semmessage_stoptambém falhou./v1/responses:response.failedouresponse.incompletecomo último evento./api/v1/chat: um eventoerror, depoisdone.
Em todos os casos o texto que chegou antes da falha era real. Quando um modelo para no meio da resposta (504, read_timeout), os endpoints sem streaming o devolvem em partial, e o chat nativo o salva.
Como tentar de novo direito#
- Espere
Retry-Afterquando ele estiver presente. É um número de segundos. - Caso contrário, espere de forma exponencialmente crescente com jitter, e desista depois de algumas tentativas.
- Não repita um
4xxque não seja429. - Uma chamada repetida sem streaming é uma chamada nova: ela é medida de novo.
- Use um
X-Request-Idpor operação lógica, e o mesmo nas repetições, para poder distingui-las nos logs.