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 |
|---|---|
| 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 |
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]