Erros
Todos os códigos de erro com que esta API pode responder, o estado HTTP que os transporta e o que fazer quanto a isso. O envelope tem a forma da OpenAI com uma adição com namespace.
O envelope
error.message é escrito para uma pessoa que lê um registo, error.type indica a classe de falha, e error.code é o identificador estável para ramificar — o texto da mensagem não é um contrato. Quando 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" }
}
}
type segue o estado
O mapeamento abaixo é o que a API aplica, gerado a partir da mesma tabela que constrói as suas respostas.
| HTTP | type |
|---|---|
| 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
Todos os códigos que podem chegar a um cliente. Um teste percorre o código-fonte da API e falha quando esta tabela e o código divergem em qualquer direção, por isso 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 pedida não é uma das quatro classes de alojamento. |
| 400 | invalid_data_class | O data_class pedido não é uma das quatro classes. |
| 400 | invalid_retention | A retenção pedida não é zero, 24h, 7d ou 30d. |
| 400 | invalid_max_tokens | max_tokens não era um número inteiro positivo. |
| 400 | invalid_stream | stream não era um booleano. |
| 400 | invalid_stop | stop não era 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 estavam malformados. |
| 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á ausente, é desconhecida, foi revogada ou expirou. |
| 402 | budget_exceeded | O orçamento diário da organização está esgotado. Aumente max_usd_per_day ou aguarde a janela reiniciar. |
| 403 | api_key_required | O pedido usou uma sessão da consola. Crie uma chave de API e envie essa em vez disso. |
| 403 | insufficient_scope | A chave é válida, mas não tem o scope exigido por este endpoint. |
| 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 é superior à permitida pela política. Isto é verificado antes de qualquer outra coisa sobre o pedido. |
| 403 | data_class_not_allowed | O data_class do pedido não é permitido pela política. |
| 404 | model_not_found | Não existe esse 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 | Não há nenhuma rota montada neste caminho. Todos os endpoints OpenAI não listados em Endpoints respondem com 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 das duas é relaxada em silêncio. |
| 409 | not_a_text_model | O modelo indicado não pode gerar texto: é um modelo de reconhecimento de fala, embeddings ou reranker. |
| 409 | conflict | O pedido 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 | Foi atingido um limite da tabela de rate limit. A mensagem indica a hora de reinício da janela. |
| 500 | internal_error | Uma falha inesperada do nosso lado. |
| 501 | not_implemented | O endpoint não é oferecido intencionalmente, ou a capacidade solicitada não existe nesta implementação. |
| 501 | retention_not_implemented | A política permite uma retenção diferente de zero e só zero está implementada, por isso o pedido é recusado em vez de ser armazenado. |
| 501 | unsupported_n | n maior que 1 não é suportado. |
| 502 | upstream_error | Nenhum endpoint conseguiu servir o pedido após failover. O trace regista todas as tentativas. |
| 502 | stream_failed | O stream falhou depois de já ter começado. |
no_endpoint_for_policy é o produto a funcionar
Um 409 com este código significa que a política e o pedido, em conjunto, 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 pedida, e o trace regista porque cada endpoint foi rejeitado.
Erros dentro de um stream
Um pedido em streaming que falha depois de os cabeçalhos serem enviados escreve o erro como um frame SSE final e depois o terminador, por isso um cliente que siga o formato vê 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]