Errores y límites
MarkdownCódigos de respuesta, su significado y qué hacer. Todos los errores están en JSON e incluyen el Request ID.
Guía completa
Formato del error
El error llega en el formato de la API que invocaste: el objeto error para OpenAI, {"type": "error", "error": {...}} para Anthropic y error con los campos status y details para Gemini. Por eso, los SDK los reconocen como errores normales de API.
error.codeyerror.reasonindican la misma clase de error de la tabla siguiente.error.typees el valor estándar del formato (por ejemplo,invalid_request_erroroserver_error).error.request_id(en Anthropic,request_iden el nivel superior), el encabezadoX-Request-IDy el final del mensaje contienen el identificador de solicitud.- En Gemini, la clase se encuentra en
error.details:ErrorInfo.reason: el mismo código en mayúsculas (por ejemplo,MODEL_OVERLOADED),domain—ailoot.ai; el identificador de solicitud está enRequestInfo.requestId. - En Gemini, los errores 5xx que no se deben reintentar automáticamente y
result_pending_checkse devuelven con el código de estado 409 ystatusABORTED, para que los SDK y CLI de Gemini no los reintenten automáticamente. La clase de error está enErrorInfo.reason(por ejemplo,MODEL_TIMEOUToRESULT_PENDING_CHECK). - La respuesta en formato OpenAI también incluye los campos de nivel superior
codeymessagepara los clientes antiguos.
{
"code": "API_KEY_REQUIRED",
"error": {
"code": "invalid_api_key",
"message": "No API key was sent with the request. Nothing was charged. Please check that the full key is sent in the Authorization header as \"Bearer <key>\". Request ID: 3b28d3de-5b02-4d07-9f3c-4b9a7d0e68d6.",
"param": null,
"reason": "invalid_api_key",
"request_id": "3b28d3de-5b02-4d07-9f3c-4b9a7d0e68d6",
"type": "invalid_request_error"
},
"message": "No API key was sent with the request. Nothing was charged. …"
}{
"type": "error",
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"reason": "invalid_api_key",
"message": "… Nothing was charged. … Request ID: 94ed3e31-4373-41ce-bf8a-0d1ed3f7235e."
},
"request_id": "94ed3e31-4373-41ce-bf8a-0d1ed3f7235e"
}{
"error": {
"code": 401,
"status": "UNAUTHENTICATED",
"message": "The API key is not valid. Nothing was charged. … Request ID: e7aa743b-9d0d-4064-b206-2562609f545b.",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "INVALID_API_KEY",
"domain": "ailoot.ai",
"metadata": {
"code": "invalid_api_key",
"reason": "invalid_api_key",
"request_id": "e7aa743b-9d0d-4064-b206-2562609f545b"
}
},
{
"@type": "type.googleapis.com/google.rpc.RequestInfo",
"requestId": "e7aa743b-9d0d-4064-b206-2562609f545b"
}
]
}
}Códigos de error
| HTTP | Clase (reason) | Qué ocurrió | Qué hacer |
|---|---|---|---|
| 400 | invalid_request | Solicitud no válida: cuerpo o parámetro incorrecto; el modelo no admite un campo, adjunto o herramienta de la solicitud; la clave se envió en la URL | Corrige la solicitud según el mensaje de error: elimina el campo, adjunto o herramienta no admitidos y envía la clave en un encabezado. El rechazo por un campo, adjunto o herramienta no admitidos se produce antes de la reserva; no se cobra nada |
| 400 | context_length_exceeded | La solicitud supera el contexto del modelo | Acorta el historial o elige un modelo con más contexto |
| 400 | content_policy_violation | Las reglas del modelo rechazan la solicitud | Reformula la solicitud |
| 401 | invalid_api_key | La clave falta o no es válida | Verifica que hayas enviado la clave completa |
| 401 | api_key_disabled | La clave está desactivada | Actívala o crea una clave nueva |
| 402 | insufficient_balance, insufficient_quota | No hay suficiente saldo disponible ni para la reserva mínima (insufficient_quota representa el mismo caso en el formato habitual de OpenAI SDK) | Recarga el saldo o reduce max_tokens |
| 402 | api_key_quota_exhausted | Se agotó el límite total de gasto de la clave | Aumenta el límite de la clave en el panel |
| 402 | payment_disputed | La cuenta tiene una deuda por un pago impugnado | Las nuevas solicitudes quedan suspendidas hasta pagar la deuda; contacta a soporte |
| 403 | api_key_expired | La clave venció | Crea una clave nueva |
| 403 | account_inactive | Tu cuenta está desactivada | Contacta a soporte |
| 403 | permission_denied | La clave no permite esta solicitud, por ejemplo, por la IP | Verifica las restricciones de la clave |
| 404 | model_not_found | El modelo no existe | Verifica el ID en /v1/models |
| 404 | unsupported_endpoint | El modelo no funciona en este formato | Elige otro formato o modelo |
| 404 | not_found | La ruta o el objeto, como una tarea, no existe | Verifica la URL y el identificador |
| 409 | duplicate_request | Ya se aceptó una operación con la misma clave de idempotencia y puede que haya terminado | Verifica el resultado de la primera operación; no envíes una nueva |
| 409 | not_ready, video_not_ready | La tarea de video u otra tarea aún no está lista | Consulta el estado más tarde |
| 409, 503 | result_pending_check | Estamos verificando el resultado de la solicitud. En las tareas de video, se indica con result_pending_check: true en la respuesta de estado; la tarea sigue en in_progress | No vuelvas a enviar la solicitud: el estado aparecerá en el historial (GET https://ailoot.ai/api/v1/usage). No crees de nuevo la tarea de video; consúltala más tarde mediante GET /v1/videos/{id} |
| 410 | model_retired | El modelo se retiró del servicio | Elige una versión nueva en GET /v1/models |
| 413 | request_too_large | El cuerpo de la solicitud es demasiado grande | Reduce los archivos o el historial |
| 429 | rate_limit_exceeded, gateway_concurrency_limit, gateway_queue_full | Demasiadas solicitudes o solicitudes simultáneas desde tu cuenta | Espera (encabezado Retry-After, normalmente 10 s) y vuelve a intentarlo |
| 429 | usage_limit_reached | Se agotó el límite de gasto de la clave para esta ventana de tiempo (5 horas, 1 día o 7 días) | Espera a que se renueve la ventana de tiempo o aumenta el límite de la clave |
| 500 | internal_error | Error de Ailoot | Contacta a soporte e indica el Request ID |
| 502 | invalid_model_response, empty_response, incomplete_response | El modelo devolvió una respuesta no válida, vacía o incompleta | Busca el Request ID en el historial del panel de control. Si ya hay un resultado o un cargo, reintentar creará una segunda solicitud facturable. La ausencia de un registro no confirma que la solicitud no se haya enviado o ejecutado: no repitas un envío cuyo resultado se desconoce; contacta con soporte e indica el Request ID. |
| 502 | result_not_delivered | El resultado no se entregó por un fallo de Ailoot; se devolvió la reserva o el cargo | Puedes volver a enviar la solicitud |
| 503 | model_overloaded | El modelo está temporalmente sobrecargado | Si X-Should-Retry: true, vuelve a intentarlo después de los segundos indicados en Retry-After; si es false, consulta primero el Request ID en el historial |
| 503 | model_unavailable | El modelo no está disponible temporalmente | Elige otro modelo. Si X-Should-Retry: true, vuelve a intentarlo después de los segundos indicados en Retry-After; si es false, consulta primero el Request ID en el historial |
| 503 | service_unavailable | Fallo temporal de Ailoot | Si X-Should-Retry: true, vuelve a intentarlo después de los segundos indicados en Retry-After; si es false, consulta primero el Request ID en el historial |
| 503 | charge_not_confirmed | No se entregó la respuesta porque no se pudo confirmar el cargo; se devolvió la reserva y no se cobró nada | Si X-Should-Retry: true, vuelve a intentarlo después de los segundos indicados en Retry-After; si es false, consulta primero el Request ID en el historial |
| 504 | model_timeout | El modelo no respondió a tiempo; el resultado aún puede aparecer | No vuelvas a enviar la solicitud hasta consultar el Request ID en el historial |
Los códigos de respuesta del modelo y verificación del resultado (502, 503 y 504) ahora hacen referencia al modelo o a la solicitud: model_unavailable, model_timeout, invalid_model_response, incomplete_response, charge_not_confirmed y result_pending_check. Si tu código compara error.code con los valores antiguos, reemplázalos por los de la tabla; para saber la equivalencia entre los códigos antiguos y los nuevos, consulta con soporte.
Cuándo reintentar una solicitud
- Verifica primero X-Should-Retry: si ves
false,result_pending_checkomodel_timeout, no reintentes automáticamente. Busca el Request ID en el historial del panel para consultar el resultado y el cargo. - Es seguro reintentar cuando recibes X-Should-Retry: true: espera
Retry-Aftersegundos. En los errores 5xx, el código por sí solo no basta: el resultado podría haberse generado ya. Consulta primero el historial del panel o contacta a soporte e indica el Request ID. Es especialmente importante para imágenes, videos, música y pasos de agentes que tardan mucho. - Reintentar no solucionará el problema: 400, 401, 402, 403 y 404; corrige primero la solicitud, la clave o el saldo.
Límites
La frecuencia y el número de solicitudes simultáneas se limitan para tu cuenta en su conjunto, no para cada clave. Si se supera el límite, recibirás 429 rate_limit_exceeded con el encabezado Retry-After: 10. Si el propio modelo está sobrecargado, recibirás 503 model_overloaded con Retry-After: 30. Si necesitas más capacidad, contacta a soporte.
Los límites de gasto se configuran en la clave: el límite total devuelve 402 api_key_quota_exhausted y las ventanas de 5 horas, 1 día y 7 días devuelven 429 usage_limit_reached. Más información en Claves y dirección de la API.
Modelos NVIDIA: cola
Puedes consultar la lista de modelos con saldo cero; para generar necesitas saldo para la reserva. Los modelos NVIDIA, como Nemotron, funcionan mediante una cola compartida: con una carga alta, la respuesta puede tardar más o se puede devolver un error de «modelo temporalmente sobrecargado» con la cabecera Retry-After. Reintenta tras el tiempo indicado. Los precios están en el catálogo y los cargos se calculan igual que en los demás modelos.
El modelo define los límites de tamaño: contexto, es decir, cuántos tokens puedes enviar, y longitud máxima de respuesta. Se indican en el catálogo.
Historial y gastos
Historial y gastos · GET https://ailoot.ai/api/v1/usage · JWT · Authorization: Bearer $TOKEN
JWT ≠ sk-… · Acceso y sesiones