Erreurs

Chaque code d’erreur que cette API peut renvoyer, le statut HTTP qui le porte, et quoi faire à ce sujet. L’enveloppe a la forme OpenAI avec un ajout dans un espace de noms.

L’enveloppe

error.message est écrit pour une personne lisant un journal, error.type nomme la classe de l’échec, et error.code est l’identifiant stable sur lequel brancher — le texte du message n’est pas un contrat. Lorsque l’API a un détail structuré (quelle politique, quel point de terminaison, quel modèle), il arrive dans error.llmeu et ne remplace jamais les trois champs standard.

{
  "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 suit le statut

La correspondance ci-dessous est celle que l’API applique, générée à partir de la même table qui construit ses réponses.

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

Codes

Chaque code pouvant atteindre un client. Un test parcourt la source de l’API et échoue lorsque ce tableau et le code divergent dans un sens ou dans l’autre, donc un code ne peut pas être inventé ici ni ajouté là sans être documenté.

HTTP code Ce que cela signifie, et quoi faire
400 invalid_request Le corps de la requête a échoué à la validation.
400 invalid_json Le corps n’était pas un JSON valide.
400 invalid_llmeu L’objet llmeu n’était pas un objet, ou contenait un champ inconnu.
400 invalid_residency La résidence demandée ne fait pas partie des quatre classes d’hébergement.
400 invalid_data_class La data_class demandée ne fait pas partie des quatre classes.
400 invalid_retention La rétention demandée n’est pas zéro, 24h, 7d ou 30d.
400 invalid_max_tokens max_tokens n’était pas un entier positif.
400 invalid_stream stream n’était pas un booléen.
400 invalid_stop stop n’était ni une chaîne ni un tableau de chaînes.
400 invalid_role Un message portait un rôle en dehors de system, user, assistant et tool.
400 invalid_tools tools ou tool_choice était mal formé.
400 missing_model Le champ model est requis.
400 missing_messages messages est requis et ne doit pas être vide.
400 missing_input input est requis pour les embeddings.
400 missing_name name est requis.
401 invalid_api_key La clé est absente, inconnue, révoquée ou expirée.
402 budget_exceeded Le budget quotidien de l'organisation est épuisé. Augmentez max_usd_per_day ou attendez que la fenêtre se réinitialise.
403 api_key_required La requête a utilisé une session de console. Créez une clé API et envoyez-la à la place.
403 insufficient_scope La clé est valide mais ne dispose pas de la portée requise par ce point de terminaison.
403 no_organization L'identifiant n'est rattaché à aucune organisation.
403 model_denied La politique de l'organisation refuse ce modèle ou son fournisseur.
403 policy_violation La requête enfreint une règle de la politique de l’organisation.
403 retention_exceeds_policy La rétention demandée est plus longue que ce que la politique autorise. Ce point est vérifié avant toute autre chose concernant la requête.
403 data_class_not_allowed Le data_class de la requête n'est pas autorisé par la politique.
404 model_not_found Aucun modèle de ce nom pour cette organisation.
404 hosted_unavailable Le modèle figure au catalogue mais n'est pas hébergé sur LLM EU, il ne peut donc pas être appelé.
404 not_found La route existe mais l'objet n'existe pas.
404 unknown_route Aucune route n'est montée à ce chemin. Chaque point de terminaison OpenAI qui n'est pas listé sous Endpoints répond ceci.
404 policy_not_found Le policy_id dans llmeu n'appartient pas à cette organisation.
409 no_endpoint_for_policy Rien ne satisfait à la fois la politique et la résidence, et aucune des deux n'est assouplie silencieusement.
409 not_a_text_model Le modèle nommé ne peut pas générer de texte : c'est un modèle de reconnaissance vocale, d'embeddings ou de reranking.
409 conflict La requête entre en conflit avec l'état actuel de l'objet.
413 request_too_large Le corps a dépassé la limite de taille du point de terminaison.
429 rate_limit_exceeded Une limite du tableau des limites de débit a été atteinte. Le message indique l'heure de réinitialisation de la fenêtre.
500 internal_error Une défaillance inattendue de notre côté.
501 not_implemented Le point de terminaison n'est volontairement pas proposé, ou la capacité demandée n'existe pas sur ce déploiement.
501 retention_not_implemented La politique autorise une rétention autre que zéro et seul zéro est implémenté, la requête est donc refusée au lieu d'être stockée.
501 unsupported_n n supérieur à 1 n'est pas pris en charge.
502 upstream_error Aucun point de terminaison n'a pu traiter la requête après le basculement. La trace enregistre chaque tentative.
502 stream_failed Le flux a échoué après avoir déjà commencé.

no_endpoint_for_policy, c’est le produit qui fonctionne

Un 409 avec ce code signifie que la politique et la requête ensemble n’admettent aucun point de terminaison, et le routeur a refusé d’assouplir l’un ou l’autre en silence. Ce n’est pas transitoire : réessayer sans modifier la requête, la politique ou la résidence échoue de la même façon. L’erreur porte la résidence demandée, et la trace enregistre pourquoi chaque point de terminaison a été rejeté.

Erreurs dans un flux

Une requête en flux qui échoue après l’envoi des en-têtes écrit l’erreur comme trame SSE finale puis le terminateur, donc un client qui suit le format voit un échec au lieu d’un succès tronqué.

data: {"error":{"message":"No endpoint could start the stream.","type":"api_error","code":"upstream_error"}}

data: [DONE]