Plataforma
Errores
Los errores llegan en JSON con el formato del endpoint que llamaste, con un mensaje escrito para personas y, en los endpoints al estilo OpenAI, un código estable para los programas.
La estructura
{ "error": { "message": "This API key can't use `gpt-6-astra`. It's limited to gpt-6-sol. Change that at https://zurelay.com/app/keys.", "type": "permission_error", "param": "model", "code": "model_not_allowed" }}En /v1/messages los mismos errores llegan con la forma de Anthropic, que no incluye código: usa el estado HTTP y error.type: { "type": "error", "error": { "type": "...", "message": "..." } }. Toda respuesta de chat, imagen y video, sea un error o no, lleva una cabecera x-request-id.
Códigos
Reintentos
- Reintenta
429y503, esperando los segundos de la cabeceraretry-after(o con retroceso exponencial), salvo que la respuesta indiquex-should-retry: false. - No reintentes otros errores
4xxsin cambios: fallarán igual. - Las solicitudes fallidas son gratis, así que reintentar no cuesta nada hasta que una funcione. Un stream que se cortó a medias se cobra por lo que entregó, y el raro
503conx-should-retry: falsepor su entrada (ver Facturación). - Los SDK oficiales de OpenAI y Anthropic ya reintentan los errores correctos por ti.
Errores a mitad de stream
Los errores que un modelo devuelve sobre tu propia solicitud (un parámetro que no acepta, un prompt demasiado largo para él) llegan con el mensaje y el código del propio modelo, como 400 o 422.
Errores a mitad de stream
Una vez iniciado un stream, un fallo no puede convertirse en un estado HTTP. En su lugar recibes un evento de error final (en el formato del endpoint) y el stream termina. Se te cobra la entrada y la salida que te llegaron antes, nada después. Es poco frecuente: la mayoría de los problemas se detectan y se reintentan antes del primer token.
El mismo tipo de evento termina un stream cuyo saldo o presupuesto de la clave se agota a medias, con insufficient_quota, key_budget_exceeded o key_daily_budget_exceeded. Una solicitud no streaming que se queda sin saldo a medias devuelve lo escrito, cortado como una respuesta que alcanzó max_tokens (finish_reason: "length", o stop_reason: "max_tokens" en /v1/messages), con una cabecera x-zurelay-stopped que indica el código.
¿Tienes dudas o falta algo? Escribe a nuestro equipo de soporte y te responderemos por email, normalmente en menos de un minuto.