Referencia de la API

unbleep habla la API de Chat Completions de OpenAI. Si ya has llamado a OpenAI antes, ya conoces esta API: apunta tu cliente a https://unbleep.ai/v1 y cambia la clave.

Inicio rápido

Instala el SDK de OpenAI, configura la URL base y tu clave, y haz una llamada.

python
from openai import OpenAI

client = OpenAI(
    base_url="https://unbleep.ai/v1",
    api_key="ub_live_9f2c…",
)

resp = client.chat.completions.create(
    model="unbleep",
    messages=[{"role": "user", "content": "Say hello."}],
)
print(resp.choices[0].message.content)

Autenticación

Cada solicitud necesita un token Bearer en la cabecera Authorization. Las claves llevan un prefijo para que una filtración sea evidente para los escáneres de secretos:

cabecera
Authorization: Bearer ub_live_9f2c…

Mantén las claves en el servidor. Nunca incluyas una clave live en código de navegador o de aplicación móvil.

Modelos

Pasa uno de estos ID como model. El alias sin fecha apunta siempre a la última versión; los ID de snapshot con fecha también se aceptan y actualmente resuelven a esa misma versión. Envíes la forma que envíes, la respuesta devuelve el ID sin fecha: una solicitud con unbleep-250811 vuelve como "model": "unbleep".

ModeloEl alias apunta aContextoIdeal para
unbleepunbleep-250811256KUso general: el predeterminado
unbleep-highunbleep-high-2508111MLos trabajos más grandes: documentos largos y bases de código enteras
unbleep-miniunbleep-mini-25081132KLlamadas baratas, rápidas y de alto volumen

Chat completions

POST /v1/chat/completions: el endpoint principal. Los cuerpos de solicitud y respuesta siguen el esquema de OpenAI.

curl · solicitud
curl https://unbleep.ai/v1/chat/completions \
  -H "Authorization: Bearer ub_live_9f2c…" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "unbleep",
    "messages": [
      {"role": "system", "content": "You are terse."},
      {"role": "user", "content": "Explain abliteration in one line."}
    ],
    "temperature": 0.7,
    "max_tokens": 256
  }'
json · respuesta
{
  "id": "chatcmpl_a1b2c3",
  "object": "chat.completion",
  "model": "unbleep",
  "choices": [{
    "index": 0,
    "message": { "role": "assistant", "content": "…" },
    "finish_reason": "stop"
  }],
  "usage": { "prompt_tokens": 24, "completion_tokens": 18, "total_tokens": 42 }
}

Streaming

Establece "stream": true para recibir Server-Sent Events. Cada evento es un chat.completion.chunk con un delta; el stream termina con un data: [DONE] literal.

flujo de eventos
data: {"choices":[{"delta":{"content":"Ab"}}]}
data: {"choices":[{"delta":{"content":"literation"}}]}
data: {"choices":[{"delta":{},"finish_reason":"stop"}]}
data: [DONE]

Razonamiento

Los modelos de razonamiento piensan antes de responder. La traza vuelve como reasoning_content junto al content habitual: en message en una llamada normal, y en delta durante el streaming. El campo solo está presente cuando el modelo produjo realmente una traza, así que trátalo como opcional y lee content para obtener la respuesta en sí.

json · fragmento de respuesta
{
  "index": 0,
  "message": {
    "role": "assistant",
    "reasoning_content": "The question asks for one line, so…",
    "content": "…"
  },
  "finish_reason": "stop"
}

Los tokens de razonamiento se facturan. La traza es salida generada y se cobra a la tarifa de salida normal del modelo, lea tu código el campo o no. Una deliberación larga sobre una pregunta corta es una línea real en tu factura.

Envía "thinking": false para desactivar el razonamiento, de modo que el presupuesto de la respuesta vaya a la respuesta en lugar de a la traza:

json · fragmento de solicitud
{
  "model": "unbleep",
  "messages": […],
  "thinking": false
}

Dial de política

El diferenciador de unbleep. El parámetro opcional policy define cuánta gobernanza se aplica a una solicitud. Por defecto es off.

json · fragmento de solicitud
{
  "model": "unbleep",
  "messages": […],
  "policy": "research"
}

Errores

Los errores usan el envoltorio de OpenAI, así que tu manejo de errores actual funciona sin cambios.

json · 401
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_api_key",
    "message": "Incorrect API key provided."
  }
}
EstadoSignificado
401Clave ausente o inválida
402Sin crédito: recarga para continuar
422Bloqueado por policy: strict
429Límite de tasa: espera y reintenta
5xxError upstream: es seguro reintentar con backoff

Límites de tasa

Se aplican dos límites independientes, ambos por cuenta: una tasa de solicitudes y un tope de concurrencia.

Tasa de solicitudes

60 solicitudes por minuto por cuenta, medidas en una ventana deslizante de 60 segundos. El límite es de la cuenta, no de la clave: crear claves adicionales no compra más rendimiento, y todas las claves que posees consumen de las mismas 60. Una clave de prueba tiene un techo por clave más bajo, de 15 solicitudes por minuto; aun así cuenta contra la misma ventana de la cuenta.

Cada respuesta lleva las cabeceras estándar para que puedas dosificar las solicitudes sin adivinar. Informan de la ventana que esté más cerca de frenarte:

cabeceras de respuesta
x-ratelimit-limit-requests: 60
x-ratelimit-remaining-requests: 58
x-ratelimit-reset-requests: 43

x-ratelimit-reset-requests es un entero sin más: segundos enteros hasta que la ventana libere un hueco, sin sufijo de unidad. Parséalo como número, no como cadena de duración.

Concurrencia

Como máximo 8 solicitudes en vuelo a la vez por cuenta. Una novena solicitud concurrente se rechaza de inmediato con 429 y el código too_many_concurrent_requests; la respuesta lleva retry-after: 1. No se factura nada por una solicitud rechazada. Una llamada en streaming conserva su hueco hasta que el stream termina, así que los streams largos son lo que suele llevarte al tope.

json · 429
{
  "error": {
    "type": "rate_limit_error",
    "code": "too_many_concurrent_requests",
    "message": "Too many concurrent requests for this account (limit 8)."
  }
}

Ambos techos son fijos para las cuentas estándar: no escalan con tu saldo prepago. ¿Necesitas más margen? Enterprise los eleva.