Errores
UberLLM devuelve envoltorios de error al estilo de OpenAI para que el manejo de errores existente funcione sin cambios:
{
"error": {
"code": "insufficient_credits",
"message": "Your credit balance is too low to serve this request.",
"type": "insufficient_credits"
}
}
Superficie de inferencia (/v1/*)
| HTTP | code |
Significado | Qué hacer |
|---|---|---|---|
| 402 | insufficient_credits |
Tu saldo prepago no puede cubrir la reserva de la solicitud. | Recarga en Dashboard → Créditos. |
| 402 | key_spend_cap_exceeded |
Esta API key alcanzó su límite de gasto configurado (diario / mensual / de por vida). | Aumenta o elimina el límite de la API key, o usa otra API key. |
| 400 | invalid_request |
El cuerpo de la solicitud no pudo ser analizado, o el modelo rechazó la solicitud (el mensaje indica el motivo). | Corrige la solicitud; no se reintentará. |
| 413 | request_too_large |
El cuerpo de la solicitud supera los 10 MB (la mayoría de las veces imágenes enviadas como base64). | Envía las imágenes como enlaces https://, o acorta la conversación. No se cobró nada. |
| 404 | model_not_found |
El ID model no está disponible. Un prefijo uberllm/ delante está bien: uberllm/deepseek/deepseek-v4.1-flash llega a deepseek/deepseek-v4.1-flash. |
Verifica GET /v1/models; corrige el ID. |
| 400 | context_length_exceeded |
El prompt es más largo de lo que el modelo admite, sea quien sea el vendedor. En /v1/chat/completions sin una lista models, el modelo más cercano que lo admite responde en su lugar (el model de la respuesta lo nombra); este error ocurre cuando ninguno lo hace, o en /v1/messages. El mensaje proporciona ambos tamaños y nombra los modelos que lo admiten. |
Envía menos, o elige un modelo de los que nombra el mensaje. No se cobró nada. |
| 400 | tools_not_supported |
La solicitud envía tools y el modelo no puede llamarlos, sea quien sea el vendedor. Se aplica la misma regla de sustitución que arriba. El mensaje nombra los modelos que sí pueden. |
Envíalo sin tools, o elige un modelo de los que nombra el mensaje. No se cobró nada. |
| 400 | max_price_exceeded |
Nadie vende el modelo dentro de tu provider.max_price ahora mismo (y ningún modelo en models podría admitirlo). |
Aumenta max_price, inténtalo más tarde, o nombra otros modelos. No se cobró nada. |
| 400 | unsupported_routing_option |
Una opción provider que UberLLM no puede aplicar (el mensaje la nombra). |
Omítela; consulta Modelos y enrutamiento. |
| 400 | invalid_metadata |
metadata no es un objeto de hasta 16 valores de texto. |
Corrige las tags; los números van entre comillas. |
| 400 | unknown_capability |
Un alias best-price: / fastest: no nombra ningún job. |
Usa uno de chat, image, image-edit, text-to-video, image-to-video, music, speech, transcription. |
| 400 | wrong_endpoint |
El modelo (o alias) realiza un job que esta ruta no admite: un modelo de imagen, video, música, voz o transcripción enviado a /v1/chat/completions o /v1/messages, un modelo de chat enviado a una ruta de medios, o voz y transcripción intercambiadas. El mensaje nombra la ruta correcta. Rechazado antes de que se ejecute nada; no se cobra nada, y Actividad lo lista como rechazado. |
Envíalo a la ruta que nombra el mensaje (también en endpoints en /v1/models/{id}). |
| 503 | no_timing_data |
Se solicitó fastest: antes de que se cronometraran suficientes solicitudes para comparar modelos. |
Usa best-price: o nombra un modelo. |
| 429 | rate_limited |
Esta API key excedió su límite de solicitudes por minuto, o el marketplace siguió aplicando límites de tasa después de los reintentos automáticos. | Espera y reintenta con jitter; aumenta el límite de tasa de la API key. |
| 503 | no_available_provider |
Nadie puede servir ese modelo ahora mismo, incluso después de reintentos automáticos (ningún vendedor, todos los vendedores fallando o demasiado lentos para empezar, o tus opciones provider no dejaron nada a lo que enrutar), o un alias best-price: / fastest: no encontró ningún modelo para el job que esté disponible ahora mismo. El mensaje nombra el modelo o el job. Esto también cubre a un vendedor cuya propia cuenta de proveedor falló: UberLLM intenta con otros vendedores y nunca transmite el error de ese vendedor como si tu API key fuera incorrecta. |
Reintenta en breve o elige otro modelo. No se cobró nada. |
| 503 | service_unavailable |
Un problema temporal por parte de UberLLM. | Reintenta en unos minutos. |
Las solicitudes de imagen, video y música añaden algunos códigos propios (image_required,
invalid_image_url (un enlace de imagen de origen que no lleva a una imagen),
max_cost_too_low, idempotency_key_reused, artifact_expired); consulta
Crear un video o una imagen.
Una solicitud de chat rechazada o fallida aparece en Dashboard → Actividad con el
mensaje que se te envió. Las respuestas de chat, imagen, video, música, voz y transcripción
llevan un header X-Request-Id con el mismo ID que su fila de Actividad,
errores incluidos.
Los reintentos ocurren por ti antes de que se devuelva un error: hasta 4 intentos, solo antes del primer byte de contenido. Consulta Modelos y enrutamiento.
Reservas y abortos
UberLLM reserva un costo estimado antes de hacer proxy y lo liquida según el uso real después. Si una solicitud falla, se aborta o te desconectas a mitad de la transmisión, la reserva no utilizada es liberada — solo se te factura por el contenido realmente producido. Las transmisiones abortadas se concilian a partir de una estimación del tokenizer y se marcan en Dashboard → Actividad.
Limitación de tasa
Los límites de tasa por clave se aplican con una ventana fija. En la superficie de inferencia, las comprobaciones de límite de tasa fallan cerradas — si UberLLM no puede verificar tu límite, la solicitud es rechazada en lugar de ser atendida sin medir. Establece (o aumenta) el límite de solicitudes por minuto de una clave en Dashboard → API keys.
Cada respuesta autenticada /v1/* lleva la ventana actual de la clave:
| Encabezado | Significado |
|---|---|
X-RateLimit-Limit |
Solicitudes que esta clave puede enviar por minuto |
X-RateLimit-Remaining |
Solicitudes restantes en el minuto actual |
X-RateLimit-Reset |
Cuando la ventana se reinicia (segundos Unix) |
Retry-After |
En un 429 de este límite: segundos a esperar antes de reintentar |
Reduce la velocidad cuando X-RateLimit-Remaining se acerca a 0. Los encabezados se omiten cuando la ventana no puede ser leída.
API de Vendedor (/api/v1/seller/*)
Estos utilizan códigos REST estándar:
| HTTP | code |
Significado |
|---|---|---|
| 400 | invalid_request |
Validación fallida (ej. endpoint_url no https, precios faltantes para absolute, multiplier fuera de 0 < m ≤ 1.5). El mensaje nombra el campo. |
| 400 | model_not_in_catalog |
model_id no es un modelo de catálogo conocido. |
| 401 | unauthorized |
JWT de panel de control faltante o inválido. |
| 404 | seller_not_found |
No hay vendedor para tu organización — llama a POST /api/v1/seller/register primero. |
| 404 | offer_not_found |
No hay oferta con esa ID bajo tu vendedor. |
| 409 | invalid_status_transition |
Cambio de estado ilegal — ej. reanudar una oferta delisted (deslistada es terminal). |
Nota: una sonda de validación fallida no es una respuesta de error. La oferta se
crea/actualiza con éxito y se devuelve con status: "paused" y un
last_probe_error explicando el motivo — corrige el endpoint y PATCH de nuevo a
active para volver a sondear. Ver Vendedores.
Errores de autenticación
| HTTP | Significado |
|---|---|
| 401 | Falta/inválido Authorization header. Inference keys son Bearer ull_...; dashboard endpoints usan tu account JWT. |
| 403 | La key es válida pero carece del scope requerido (ej. una key solo para inference llamando a un dashboard endpoint). |