Lo que realmente promete la compatibilidad
Una API compatible con OpenAI acepta las mismas peticiones HTTP que envían los SDK de OpenAI. Cambias la URL base y la clave, y el cliente sigue funcionando. Esa promesa reside en la capa de protocolo: la ruta /v1/chat/completions, un token Bearer en el encabezado Authorization, un cuerpo JSON con model y messages, y una respuesta con choices y usage. El streaming sigue el mismo patrón de eventos enviados por el servidor.
No promete el mismo modelo, el mismo comportamiento, los mismos límites o el mismo conjunto de endpoints. La compañía detrás de la API original decide qué envía, y cada otro proveedor decide de forma independiente qué copiar. Trata la compatibilidad como una forma de evitar reescribir el código de tu cliente, no como una garantía de que no cambie nada más.
Las diferencias, lado a lado
La tabla enumera las áreas que varían entre proveedores y lo que es cierto para esta API. La columna derecha es una sugerencia para tus propias pruebas cuando evalúes cualquier servicio.
| Área | Esta API | Qué verificar en cualquier proveedor |
|---|---|---|
| Ids de modelo | Un solo ID: uncensored | Si se acepta, mapea o rechaza tu nombre de modelo antiguo |
| Endpoints | /v1/chat/completions, /v1/responses, /v1/models | Si existe cada endpoint al que llama tu código |
| Modalidades | Solo texto | Soporte de imagen, audio y video, si lo necesitas |
| Embeddings, ajuste fino | No ofrecido | Hacia dónde irán esas llamadas en su lugar |
| Ventana de contexto | 100.000 tokens, prompt más completación | Si el límite cubre solo la entrada o ambos |
| Concurrencia y tasa | Clave de API completa: 8 a la vez, 300 por minuto. Clave de API de prueba: 2 a la vez, 60 por minuto | Cómo se miden los límites y cómo se reporta un rechazo |
| Llamadas a funciones, modo JSON | Admitido | Casos extremos como llamadas a funciones en streaming |
| Comportamiento de contenido | Ajustado para responder sin rechazos de contenido para uso adulto legal | Capas de moderación que cambian lo que devuelve el modelo |
| Facturación | Crédito prepago, por token, sin suscripción | Mínimos, caducidad, niveles de suscripción |
La fila de precios para esta API es de $0,15 por 1M de tokens de entrada y $0,50 por 1M de tokens de salida. Para cualquier otro servicio, lee su página de precios actual en lugar de confiar en la memoria o en un resumen de terceros.
IDs de modelo y comportamiento
La diferencia práctica más grande es el modelo en sí. Con OpenAI eliges de un menú de modelos con nombre. Aquí envías "model": "uncensored" y obtienes un único modelo de pesos abiertos gestionado por un proveedor independiente. No es la API oficial de ningún proveedor de modelos, ni es un enrutador que reenvía peticiones a varios proveedores.
Esto tiene dos consecuencias. Primero, no puedes hacer pruebas A/B de tamaños de modelo cambiando una cadena; ejecutas un modelo y ajustas prompts y muestreo alrededor de él. Segundo, los prompts escritos para otro modelo pueden necesitar pequeñas ediciones, porque el seguimiento de instrucciones, los hábitos de formato y el comportamiento de rechazo difieren. Este modelo está ajustado para responder sin rechazos de contenido para uso adulto legal, por lo que un prompt que contenga largos preámbulos de seguridad escritos para un modelo más estricto a menudo puede acortarse.
Un límite estricto no cambia: no hay contenido sexual que involucre menores de edad.
Endpoints y funciones que no están
La compatibilidad rara vez es completa en toda la superficie de OpenAI. Aquí las lagunas son deliberadas: el servicio maneja texto y nada más.
- Sin generación de imágenes, audio o video.
- Sin endpoint de embeddings, por lo que una pipeline de recuperación necesita un proveedor de embeddings separado.
- Sin fine-tuning.
Lo presente cubre la mayoría de las aplicaciones de chat: POST /v1/chat/completions, POST /v1/responses, streaming, llamadas a funciones con tools y tool_choice, y modo JSON a través de response_format. Los controles de muestreo como temperature, top_p, stop, seed y las penalizaciones se pasan al modelo.
Si tu aplicación mezcla capacidades, el patrón habitual es mantener el proveedor original para embeddings e imágenes, y enviar solo la generación de texto que quieras sin censura a la nueva URL base. El análisis de compensaciones funciona a través de esa división.
Límites, errores y encabezados
Los límites son donde las migraciones sorprenden a la gente, porque determinan cómo debe comportarse tu código bajo carga. Esta API establece 8 peticiones simultáneas y 300 peticiones por minuto en una clave completa, 2 y 60 en una clave de prueba, y un cuerpo máximo de 8 MB. Una petición que excede responde HTTP 429. El código de error te dice qué límite alcanzaste: rate_limited para peticiones por minuto, concurrency para demasiadas peticiones a la vez. Una sobrecarga temporal también devuelve 429 y añade Retry-After: 5.
Lee el código y el encabezado, no solo el estado. Reintentar un error concurrency inmediatamente empeora las cosas, mientras que una breve espera lo soluciona. Una petición de streaming mantiene su espacio hasta que termina el stream, por lo que la concurrencia cuenta streams abiertos, no solo llamadas en curso.
Las respuestas incluyen X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests y X-RateLimit-Limit-Concurrency. El encabezado de saldo es un extra específico del proveedor: el código del SDK de OpenAI lo ignora, pero puedes leerlo para rastrear el gasto. El saldo también está disponible a través de GET /v1/balance y el estilo OpenAI GET /v1/dashboard/billing/credit_grants.
Lista de verificación de migración
Cuando muevas una aplicación entre proveedores, recorre la misma lista corta cada vez. Detecta la mayoría de las sorpresas antes de que los usuarios las encuentren.
- Reemplaza la base URL, la clave y el ID de modelo juntos, y busca en el repositorio nombres de modelos antiguos ocultos en archivos de configuración.
- Elimina llamadas a endpoints que no existen en el nuevo lado, y enrútalas al proveedor que las tenga.
- Ejecuta tu conjunto de prompts y compara las salidas. Espera diferente redacción y formato de un modelo diferente.
- Prueba el streaming a través de cada proxy y balanceador de carga entre tus usuarios y la API.
- Añade lógica de reintento para 429 que lea el código de error y el encabezado Retry-After.
- Registra el uso de tokens por petición, para que las sorpresas de coste aparezcan en días, no a finales de mes.
Una prueba rápida de compatibilidad
No confíes en una lista de funciones, incluida esta. Ejecuta las llamadas que hace tu aplicación y compara los resultados. Un script corto que ejercite las partes de las que dependes toma unos minutos:
from openai import OpenAI
client = OpenAI(
base_url="https://api.apicompatible.com/v1",
api_key="YOUR_API_KEY",
)
# 1. Plain completion
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Reply with the word ready."}],
temperature=0,
seed=7,
)
print("plain:", r.choices[0].message.content)
# 2. JSON mode
j = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Return a JSON object with keys name and age for a fictional person."}],
response_format={"type": "json_object"},
)
print("json:", j.choices[0].message.content)
# 3. Streaming
chunks = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Count from one to five."}],
stream=True,
)
print("stream:", "".join(c.choices[0].delta.content or "" for c in chunks if c.choices))
Añade un caso de llamada a funciones si tu código usa funciones, y un caso de contexto largo cercano a los tamaños reales de tus prompts. Los detalles de cada parámetro están en la documentación, y la página de clave de API muestra cómo reclamar el crédito de prueba de $0,50, que es suficiente para este tipo de comprobación.
