ShvIA

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ícieFormato
/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/mcperros 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, um 401 sempre 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 um 429 ou um 404 para uma rota que não existe, só é JSON quando você envia Accept: application/json. Todo SDK oficial envia. Um curl puro recebe uma página HTML.

Códigos de status#

StatusSignificadoTentar de novo
400a requisição está malformada. Em POST /api/v1/agent/chat também quer dizer um modelo ou servidor que não existenão. Corrija a requisição
401a 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 403não. Confira a chave. Veja autenticação
403os 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 fazernão. Mude alguma coisa antes
404nos 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 é suanão
413o upload é grande demaisnão
422o corpo falhou na validaçãonão. Leia errors ou message
429um limite de requisições foi atingidosim, depois de Retry-After segundos
501um recurso que este gateway não oferece, como ferramentas no endpoint Responsesnão
502o servidor do modelo, ou o provedor dele, falhou ou não devolveu nadasim, com espera crescente, algumas vezes
503o serviço está indisponível, ou todos os modelos da cadeia falharam de um jeito que vale tentar de novosim, depois de Retry-After quando ele é enviado
504o modelo parou de responder no meio da respostasim, 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 /v1 e no stream do chat, e o campo de corpo request_id, em POST /api/v1/agent/chat e 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": {…}}, depois data: [DONE].
  • /v1/messages: event: error. Um stream que termina sem message_stop também falhou.
  • /v1/responses: response.failed ou response.incomplete como último evento.
  • /api/v1/chat: um evento error, depois done.

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-After quando 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 4xx que não seja 429.
  • Uma chamada repetida sem streaming é uma chamada nova: ela é medida de novo.
  • Use um X-Request-Id por operação lógica, e o mesmo nas repetições, para poder distingui-las nos logs.