Klarety

Errores

Cómo se ve un error, cómo lo lanza el SDK y cuándo reintentar.

Para desarrolladores

Toda llamada fallida devuelve la misma forma JSON y un estado HTTP estándar. El convierte cada uno en una excepción de Python, así su código maneja un significado, no un número.

El cuerpo del error

Los errores siguen el RFC 9457 y se envían como application/problem+json:

{
  "type": "https://klarety.ai/problems/too-many-requests",
  "title": "Too many requests",
  "status": 429,
  "detail": "slow down and retry in 12s",
  "instance": "/v1/sql"
}
CampoSignificado
typeUna dirección estable para este tipo de problema. Es seguro decidir con base en ella.
titleUn resumen corto.
statusEl estado HTTP.
detailQué pasó, en palabras que puede mostrar o registrar.
instanceLa ruta llamada.
creditsSi aparece: lo que costaría la acción rechazada, para que una persona acepte el precio y pida de nuevo.
limitSi aparece: el límite del plan que la rechazó, para que una persona pida aumentarlo.

Códigos de estado

EstadoSignificado¿Reintentar?
401Falló el inicio de sesión: sin token, un token incorrecto o vencido, o una clave rechazada. El cuerpo es igual para toda causa.No. Corrija la clave u obtenga un token nuevo.
402El no puede pagar este trabajo.Después de agregar créditos.
403Inició sesión, pero esto está fuera del alcance de su clave o rol.No.
404No existe, o no le corresponde verlo.No.
409Cambió desde que lo leyó, o está cambiando.Lea de nuevo y reintente.
413El cuerpo de la solicitud es demasiado grande (más de 1 MiB).No. Envíe menos, o suba un archivo.
422La solicitud no es una que usted pueda hacer, o no es válida.No. Corrija la solicitud.
429Demasiadas solicitudes, o todos los espacios ocupados. No se ejecutó nada.Sí, después de Retry-After segundos.
500Algo falló de nuestro lado. El cuerpo no trae detalle.Sí, un poco más tarde.
503No disponible por el momento, por ejemplo mientras Nexus arranca.Sí, después de Retry-After cuando aparece.

Cómo los lanza el SDK

Todas las excepciones del SDK heredan de KlaretyError, y se importan desde klarety.

ExcepciónSe lanza por
AuthError401, y una clave rechazada en Nexus.connect().
RefusedError403 y 422.
TableRuleErrorUn cambio que incumple una regla de la tabla (un tipo de RefusedError). Nunca lo reenvíe igual.
NotFoundError404.
ConflictError409.
InsufficientCreditsError402.
OverBudgetError413, 429, y una consulta que leería más de lo que permite su plan.
RateLimitedErrorMás llamadas por minuto de las que permite su plan (un tipo de OverBudgetError).
ServiceError500, 503 y cualquier otra falla de nuestro lado.
AnswerNotReadyErrorSin respuesta en el tiempo permitido, a menudo mientras Nexus arranca (un tipo de ServiceError).
SparkStartingError está arrancando para su espacio de trabajo (un tipo de AnswerNotReadyError).
WaitingForOwnerErrorUn cambio está en espera del visto bueno del propietario. Trae job_id. Nunca lo reenvíe.

Un manejo cuidadoso

from klarety import (
    AuthError,
    ConflictError,
    InsufficientCreditsError,
    KlaretyError,
    Nexus,
    OverBudgetError,
    RefusedError,
    ServiceError,
)

try:
    with Nexus.connect() as nexus:
        result = nexus.sql("SELECT COUNT(*) AS n FROM orders")
        print(result.rows)
except AuthError:
    print("Sign-in failed: check or replace the API key.")
except InsufficientCreditsError:
    print("Out of credits.")
except OverBudgetError as over:
    print(f"Over a plan limit or rate: {over}")
except RefusedError as refused:
    print(f"Not allowed: {refused}")
except ConflictError:
    print("Changed since read: read again, then retry.")
except ServiceError as failed:
    print(f"Klarety could not answer, try later: {failed}")
except KlaretyError as other:
    print(f"Klarety error: {other}")

El orden importa: capture primero las excepciones más específicas.

Lo que el SDK reintenta por usted

Rara vez necesita su propio ciclo de reintentos.

  • Las lecturas (GET) se reintentan hasta tres veces ante 502, 503 y 504, con una espera corta.
  • Las respuestas de ocupado o de límite de solicitudes se esperan en cualquier llamada, respetando Retry-After, hasta por cinco minutos. No se ejecutó nada, así que es seguro.
  • Las sentencias SQL llevan un ID, así que una sentencia reenviada se ejecuta una sola vez.
  • Las demás escrituras (POST, PUT, PATCH, DELETE) nunca se reintentan, porque repetir una podría gastar créditos dos veces.

Reintentos con HTTP directo

Si llama a la API directamente:

  1. Reintente solo ante 429, 503 y 500.
  2. Espere los segundos del encabezado Retry-After cuando aparece; si no, espere un tiempo creciente con variación aleatoria.
  3. Reintente una escritura solo si es seguro ejecutarla dos veces, o si lleva su propio ID (statement_id en /v1/sql, write_id en ediciones de filas).

Próximos pasos

En esta página