Errores
Cada código de error con el que puede responder esta API, el estado HTTP que lo acompaña y qué hacer al respecto. El envoltorio tiene forma de OpenAI con una adición con espacio de nombres.
El envoltorio
error.message está escrito para una persona que lee un registro, error.type nombra la clase de fallo y error.code es el identificador estable sobre el que ramificar —el texto del mensaje no es un contrato. Cuando la API tiene detalle estructurado (qué política, qué endpoint, qué modelo), llega en error.llmeu y nunca reemplaza los tres campos estándar.
{
"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 sigue al estado
La asignación siguiente es la que aplica la API, generada a partir de la misma tabla que construye sus respuestas.
| 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
Cada código que puede llegar a un cliente. Una prueba recorre el código fuente de la API y falla cuando esta tabla y el código no coinciden en uno u otro sentido, así que no se puede inventar un código aquí ni añadirlo allí sin documentarlo.
| HTTP | code | Qué significa y qué hacer |
|---|---|---|
| 400 | invalid_request | El cuerpo de la solicitud no superó la validación. |
| 400 | invalid_json | El cuerpo no era JSON válido. |
| 400 | invalid_llmeu | El objeto llmeu no era un objeto, o llevaba un campo desconocido. |
| 400 | invalid_residency | La residencia solicitada no es una de las cuatro clases de alojamiento. |
| 400 | invalid_data_class | La data_class solicitada no es una de las cuatro clases. |
| 400 | invalid_retention | La retención solicitada no es zero, 24h, 7d o 30d. |
| 400 | invalid_max_tokens | max_tokens no era un entero positivo. |
| 400 | invalid_stream | stream no era un booleano. |
| 400 | invalid_stop | stop no era ni una cadena ni un array de cadenas. |
| 400 | invalid_role | Un mensaje llevaba un rol fuera de system, user, assistant y tool. |
| 400 | invalid_tools | tools o tool_choice estaban mal formados. |
| 400 | missing_model | El campo model es obligatorio. |
| 400 | missing_messages | messages es obligatorio y no debe estar vacío. |
| 400 | missing_input | input es obligatorio para embeddings. |
| 400 | missing_name | name es obligatorio. |
| 401 | invalid_api_key | La clave falta, es desconocida, está revocada o ha caducado. |
| 402 | budget_exceeded | El presupuesto diario de la organización se ha agotado. Aumente max_usd_per_day o espere a que la ventana se renueve. |
| 403 | api_key_required | La solicitud usó una sesión de consola. Cree una clave de API y envíe esa en su lugar. |
| 403 | insufficient_scope | La clave es válida pero carece del ámbito que requiere este endpoint. |
| 403 | no_organization | La credencial no está asociada a una organización. |
| 403 | model_denied | La política de la organización deniega este modelo o su proveedor. |
| 403 | policy_violation | La solicitud infringe una regla de la política de la organización. |
| 403 | retention_exceeds_policy | La retención solicitada es más larga de lo que permite la política. Esto se comprueba antes que cualquier otra cosa sobre la solicitud. |
| 403 | data_class_not_allowed | El data_class de la solicitud no es uno de los que permite la política. |
| 404 | model_not_found | No existe tal modelo para esta organización. |
| 404 | hosted_unavailable | El modelo está en el catálogo pero no está alojado en LLM EU, por lo que no se puede llamar. |
| 404 | not_found | La ruta existe pero el objeto no. |
| 404 | unknown_route | No hay ninguna ruta montada en este path. Todos los endpoints de OpenAI que no figuran en Endpoints responden esto. |
| 404 | policy_not_found | El policy_id en llmeu no pertenece a esta organización. |
| 409 | no_endpoint_for_policy | Nada satisface la política y la residencia juntas, y ninguna se relaja en silencio. |
| 409 | not_a_text_model | El modelo nombrado no puede generar texto: es un modelo de reconocimiento de voz, de embedding o de reranking. |
| 409 | conflict | La solicitud entra en conflicto con el estado actual del objeto. |
| 413 | request_too_large | El cuerpo superó el límite de tamaño del endpoint. |
| 429 | rate_limit_exceeded | Se alcanzó un límite de la tabla de límites de velocidad. El mensaje indica el tiempo de reinicio de la ventana. |
| 500 | internal_error | Un fallo inesperado por nuestra parte. |
| 501 | not_implemented | El endpoint no se ofrece intencionadamente, o la capacidad solicitada no existe en este despliegue. |
| 501 | retention_not_implemented | La política permite una retención distinta de cero y solo se implementa cero, por lo que la solicitud se rechaza en lugar de almacenarse. |
| 501 | unsupported_n | No se admite n mayor que 1. |
| 502 | upstream_error | Ningún endpoint pudo servir la solicitud tras el failover. La traza registra cada intento. |
| 502 | stream_failed | El stream falló después de haber comenzado ya. |
no_endpoint_for_policy es el producto haciendo su trabajo
Un 409 con este código significa que la política y la solicitud juntas no admiten ningún endpoint, y el enrutador se negó a relajar cualquiera de las dos en silencio. No es transitorio: reintentar sin cambiar la solicitud, la política o la residencia falla de la misma manera. El error lleva la residencia solicitada, y la traza registra por qué se rechazó cada endpoint.
Errores dentro de un stream
Una solicitud en streaming que falla después de enviar las cabeceras escribe el error como un frame SSE final y luego el terminador, así que un cliente que sigue el formato ve un fallo en lugar de un éxito truncado.
data: {"error":{"message":"No endpoint could start the stream.","type":"api_error","code":"upstream_error"}}
data: [DONE]