Códigos de error y reintentos

Estructura de las respuestas de error de HopBase, qué significa cada código de estado y si se puede reintentar, cómo se manifiestan los fallos en streaming y qué datos incluir al reportar un problema.

Para localizar un síntoma concreto usa Solución de problemas; esta página es la referencia completa. Los límites de concurrencia, los tiempos de espera y la facturación están en Concurrencia, tiempos de espera y facturación.

Estructura de la respuesta de error

Protocolo OpenAI (/v1/chat/completions, /v1/responses, /v1/images/*, /v1/video/*):

{ "error": { "message": "…", "type": "invalid_request_error", "code": "insufficient_quota" } }

Protocolo Anthropic (/v1/messages):

{ "type": "error", "error": { "type": "invalid_request_error", "message": "…" } }

El idioma del mensaje sigue la cabecera Accept-Language y por defecto es inglés. En tu código decide según el código HTTP y code, nunca según el texto del mensaje.

Códigos de estado

CódigoCausa habitual¿Reintentable?Qué hacer
401Falta la clave, está incompleta, desactivada o caducadaNoCopia la clave de nuevo desde Claves API en la consola, o crea otra
402Saldo de la cuenta agotado; cuota de la clave agotada; el saldo no cubre la reserva al enviar un vídeoTras recargarRecarga o amplía la cuota de la clave; no reintentes en bucle
403El plan restringe qué clientes pueden llamar, o la capacidad no está habilitadaNoUsa un cliente o un plan que lo admita
404El modelo no está en el plan de esta clave, la ruta no corresponde, o el plan se ha retiradoNoLlama a GET /v1/models con esta clave para confirmar el ID; para rutas consulta Base URL y protocolos
413Cuerpo de la petición mayor de 60 MBNoComprime el material o envía una URL cuando el modelo lo admita
429Límite de concurrencia de la cuenta o de la clave, o el modelo está limitado en este momentoReintenta según Retry-After y reduce la concurrencia
499El cliente cortó la conexión antes de terminar (parada manual o tiempo de lectura agotado)Usa streaming para salidas largas y amplía el tiempo de lectura del cliente
502 / 503El modelo no está disponible temporalmente; el reintento automático tampoco lo consiguióEspera y reintenta, o cambia a otro modelo de la misma familia
504La petición agotó el tiempo en el servicioEspera y reintenta; para trabajos largos usa streaming o los endpoints asíncronos

Hay un 404 que en realidad significa «no disponible ahora mismo»

Si recibes Model "X" is not supported by any configured account in this group, llama primero a GET /v1/models con la misma clave. Si el modelo aparece en la lista, solo está temporalmente no disponible: trátalo como un 502 / 503. Solo si no aparece el plan realmente no incluye ese modelo.

Reglas de reintento

  • Nunca reintentes sin cambios: 400, 402, 403, 404, 413, 422. Corrige antes la petición, la configuración o el saldo.
  • Reintenta con espera creciente: 429, 502, 503, 504 y los flujos interrumpidos. Se sugieren 2 s, 5 s y 15 s, como máximo tres intentos.
  • El 429 trae pistas de reintento: Retry-After (segundos) y Retry-After-Ms (milisegundos). Respétalas cuando estén presentes.
  • No reenvíes una tarea asíncrona ya aceptada: un envío de vídeo o de imagen asíncrona aceptado ya creó la tarea; reenviarlo crea tareas adicionales que se facturan por separado. Consulta el estado por sondeo.

Fallos en streaming

En cuanto una respuesta en streaming empieza, el código HTTP ya es 200 y no cambia. Los fallos posteriores llegan como eventos:

  • Protocolo OpenAI: event: error, o response.failed en el protocolo Responses.
  • Protocolo Anthropic: event: error.

Gestiona los eventos de error dentro del bucle de lectura. La salida parcial no se puede reanudar: vuelve a lanzar la petición completa.

Al reportar un problema

  • La cabecera de respuesta x-request-id (todas las respuestas la llevan e identifica esa petición concreta)
  • La hora (con zona horaria) y el ID del modelo
  • El texto completo del error y el código HTTP

Escríbenos con esos datos y podremos rastrear la petición directamente.

En esta página