Erros
Todos os códigos de erro com que esta API pode responder, o estado HTTP que os transporta, e o que fazer a respeito. O envelope tem a forma da OpenAI com uma adição em namespace.
O envelope
error.message é escrito para uma pessoa que lê um registo, error.type nomeia a classe de falha, e error.code é o identificador estável para ramificar — o texto da mensagem não é um contrato. Onde a API tem detalhe estruturado (que política, que endpoint, que modelo) este chega em error.llmeu e nunca substitui os três campos padrão.
{
"error": {
"message": "No endpoint satisfies residency eu-owned. Residency is never relaxed silently.",
"type": "conflict_error",
"code": "no_endpoint_for_policy",
"llmeu": { "requested": "llmeu-auto" }
}
}
tipo segue o status
O mapeamento abaixo é o que a API aplica, renderizado a partir da mesma tabela que constrói as suas respostas.
| HTTP | tipo |
|---|---|
| 400 | invalid_request_error |
| 401 | authentication_error |
| 402 | insufficient_quota |
| 403 | permission_error |
| 404 | not_found_error |
| 409 | conflict_error |
| 413 | invalid_request_error |
| 422 | invalid_request_error |
| 429 | rate_limit_error |
| 500 | api_error |
| 501 | api_error |
| 502 | api_error |
| 503 | api_error |
Códigos
Todo código que pode chegar a um cliente. Um teste percorre o código-fonte da API e falha quando esta tabela e o código discordam em qualquer direção, portanto um código não pode ser inventado aqui nem adicionado lá sem ser documentado.
| HTTP | code | O que significa, e o que fazer |
|---|---|---|
| 400 | invalid_request | O corpo do pedido falhou a validação. |
| 400 | invalid_json | O corpo não era JSON válido. |
| 400 | invalid_llmeu | O objeto llmeu não era um objeto, ou continha um campo desconhecido. |
| 400 | invalid_residency | A residência solicitada não é uma das quatro classes de alojamento. |
| 400 | invalid_data_class | A data_class solicitada não é uma das quatro classes. |
| 400 | invalid_retention | A retenção solicitada não é zero, 24h, 7d ou 30d. |
| 400 | invalid_max_tokens | max_tokens não era um inteiro positivo. |
| 400 | invalid_stream | stream não era um booleano. |
| 400 | invalid_stop | stop não era nem uma string nem um array de strings. |
| 400 | invalid_role | Uma mensagem continha um role fora de system, user, assistant e tool. |
| 400 | invalid_tools | tools ou tool_choice estava malformado. |
| 400 | missing_model | O campo model é obrigatório. |
| 400 | missing_messages | messages é obrigatório e não pode estar vazio. |
| 400 | missing_input | input é obrigatório para embeddings. |
| 400 | missing_name | name é obrigatório. |
| 401 | invalid_api_key | A chave está em falta, desconhecida, revogada ou expirada. |
| 402 | budget_exceeded | O orçamento diário da organização está esgotado. Aumente max_usd_per_day ou espere que a janela reinicie. |
| 403 | api_key_required | O pedido usou uma sessão de consola. Crie uma chave de API e envie essa em vez disso. |
| 403 | insufficient_scope | A chave é válida, mas não possui o escopo que este endpoint requer. |
| 403 | no_organization | A credencial não está associada a uma organização. |
| 403 | model_denied | A política da organização nega este modelo ou o seu fornecedor. |
| 403 | policy_violation | O pedido viola uma regra da política da organização. |
| 403 | retention_exceeds_policy | A retenção solicitada é mais longa do que a política permite. Isto é verificado antes de qualquer outra coisa sobre o pedido. |
| 403 | data_class_not_allowed | A data_class do pedido não é permitida pela política. |
| 404 | model_not_found | Não existe tal modelo para esta organização. |
| 404 | hosted_unavailable | O modelo está no catálogo, mas não está alojado no LLM EU, por isso não pode ser chamado. |
| 404 | not_found | A rota existe, mas o objeto não. |
| 404 | unknown_route | Nenhuma rota está montada neste caminho. Todos os endpoints OpenAI que não estão listados em Endpoints respondem a isto. |
| 404 | policy_not_found | O policy_id em llmeu não pertence a esta organização. |
| 409 | no_endpoint_for_policy | Nada satisfaz a política e a residência em conjunto, e nenhuma delas é relaxada silenciosamente. |
| 409 | not_a_text_model | O modelo nomeado não pode gerar texto: é um modelo de reconhecimento de fala, embedding ou reranker. |
| 409 | conflict | A solicitação entra em conflito com o estado atual do objeto. |
| 413 | request_too_large | O corpo excedeu o limite de tamanho do endpoint. |
| 429 | rate_limit_exceeded | Um limite da tabela de limite de taxa foi atingido. A mensagem indica o horário de reinício da janela. |
| 500 | internal_error | Uma falha inesperada do nosso lado. |
| 501 | not_implemented | O endpoint intencionalmente não é oferecido, ou o recurso solicitado não existe nesta implantação. |
| 501 | retention_not_implemented | A política permite uma retenção diferente de zero e apenas zero é implementada, então a solicitação é recusada em vez de ser armazenada. |
| 501 | unsupported_n | n maior que 1 não é suportado. |
| 502 | upstream_error | Nenhum endpoint pôde atender à solicitação após o failover. O trace registra cada tentativa. |
| 502 | stream_failed | O stream falhou depois que já havia começado. |
no_endpoint_for_policy é o produto a funcionar
Um 409 com este código significa que a política e o pedido juntos não admitem nenhum endpoint, e o router recusou-se a relaxar qualquer um deles silenciosamente. Não é transitório: tentar novamente sem alterar o pedido, a política ou a residência falha da mesma forma. O erro transporta a residência solicitada, e o trace regista por que cada endpoint foi rejeitado.
Erros dentro de um stream
Um pedido de streaming que falha depois de os cabeçalhos serem enviados escreve o erro como um frame SSE final e depois o terminador, para que um cliente que segue o formato veja uma falha em vez de um sucesso truncado.
data: {"error":{"message":"No endpoint could start the stream.","type":"api_error","code":"upstream_error"}}
data: [DONE]