ES ▾

Diferencias de la API compatible con OpenAI respecto a OpenAI

Dos paneles de conexión similares comparados con un calibrador, mostrando las diferencias entre APIs compatibles

Compatible significa que las formas de las peticiones y respuestas coinciden, no que el servicio detrás de ellas sea el mismo. Aquí están las diferencias de la API compatible con OpenAI frente a OpenAI que suelen causar problemas, y las carencias específicas de esta.

Última actualización

Resumen

  • La compatibilidad cubre el formato de la capa de transporte: estructura de la URL, autenticación Bearer, campos JSON y streaming SSE.
  • Los IDs de modelo, los límites, los detalles de error y los endpoints adicionales son las partes que difieren entre proveedores.
  • Esta API ofrece un modelo (uncensored), solo texto, sin embeddings, imágenes, audio ni fine-tuning.
  • Prueba los parámetros exactos de los que dependes antes de migrar, en lugar de asumir la paridad.

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.

ÁreaEsta APIQué verificar en cualquier proveedor
Ids de modeloUn solo ID: uncensoredSi se acepta, mapea o rechaza tu nombre de modelo antiguo
Endpoints/v1/chat/completions, /v1/responses, /v1/modelsSi existe cada endpoint al que llama tu código
ModalidadesSolo textoSoporte de imagen, audio y video, si lo necesitas
Embeddings, ajuste finoNo ofrecidoHacia dónde irán esas llamadas en su lugar
Ventana de contexto100.000 tokens, prompt más completaciónSi el límite cubre solo la entrada o ambos
Concurrencia y tasaClave de API completa: 8 a la vez, 300 por minuto. Clave de API de prueba: 2 a la vez, 60 por minutoCómo se miden los límites y cómo se reporta un rechazo
Llamadas a funciones, modo JSONAdmitidoCasos extremos como llamadas a funciones en streaming
Comportamiento de contenidoAjustado para responder sin rechazos de contenido para uso adulto legalCapas de moderación que cambian lo que devuelve el modelo
FacturaciónCrédito prepago, por token, sin suscripciónMí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.

  1. 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.
  2. Elimina llamadas a endpoints que no existen en el nuevo lado, y enrútalas al proveedor que las tenga.
  3. Ejecuta tu conjunto de prompts y compara las salidas. Espera diferente redacción y formato de un modelo diferente.
  4. Prueba el streaming a través de cada proxy y balanceador de carga entre tus usuarios y la API.
  5. Añade lógica de reintento para 429 que lea el código de error y el encabezado Retry-After.
  6. 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.

Preguntas comunes

¿Es una API compatible con OpenAI lo mismo que OpenAI?

No. Acepta el mismo estilo de peticiones, pero el modelo, los límites, los endpoints y las políticas pertenecen al proveedor que la gestiona. Esta API no es operada por OpenAI ni por ningún proveedor de modelos.

¿Puedo seguir usando el SDK de OpenAI?

Sí. Cambia la base URL a https://api.apicompatible.com/v1, usa tu clave y envía el ID del modelo uncensored.

¿Esta API admite embeddings o fine-tuning?

No. Solo es texto, con chat completions, respuestas y una lista de modelos. Usa otro proveedor para embeddings, imágenes o fine-tuning.

¿Cómo sé qué límite he alcanzado con un 429?

Lee el código de error en la respuesta. rate_limited significa demasiadas peticiones por minuto, concurrency significa demasiadas a la vez, y un encabezado Retry-After de 5 significa sobrecarga temporal.

Obtén tu clave en segundos

Regístrate, copia el token, actualiza la URL del endpoint. Esa es toda la configuración.

Abrir cuenta