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
400invalid_request_error
401authentication_error
402insufficient_quota
403permission_error
404not_found_error
409conflict_error
413invalid_request_error
422invalid_request_error
429rate_limit_error
500api_error
501api_error
502api_error
503api_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]