API compatible con OpenAI: qué funciona y qué se rompe
Un reemplazo compatible con OpenAI implica cambiar dos líneas: base_url y la clave. Descubre qué endpoints y parámetros funcionan y cuáles fallan.
API compatible con OpenAI: qué funciona y qué se rompe
Un reemplazo compatible con OpenAI es una API que habla el protocolo de OpenAI, por lo que cambias de proveedor modificando dos cosas: el base_url y la clave de API, sin un nuevo SDK y sin reescribir el análisis de solicitudes ni de respuestas. Funciona correctamente para chat, embeddings, audio, herramientas y streaming, pero no para la Assistants API, la Responses API, trabajos por lotes, generación de imágenes ni entradas de visión.
La palabra «compatible» hace mucho trabajo silencioso en esa frase. Es verdad para la superficie que realmente llamas y falsa para la que no llamas, y la mayoría de las sorpresas en una migración provienen de esa brecha. Esta página mapea la brecha con exactitud: qué endpoints y parámetros se transfieren sin cambios, cuáles se rompen y qué probar antes de enviar tráfico de producción.
Tessera es una pasarela compatible con OpenAI para modelos de código abierto con residencia de datos en la UE y LATAM y precios mensuales fijos, por lo que los ejemplos a continuación la usan como destino concreto. Las reglas de compatibilidad son las mismas independientemente del endpoint compatible al que apuntes.
El cambio de dos líneas
El SDK de Python de OpenAI expone base_url como argumento del constructor (OpenAI Python SDK). Apúntalo a un endpoint compatible y actualiza la clave:
from openai import OpenAI
client = OpenAI(
base_url="https://api.tesseraai.cloud/v1",
api_key="sk-tessera-...",
)
resp = client.chat.completions.create(
model="Qwen/Qwen3.6-35B-A3B",
messages=[{"role": "user", "content": "Hola"}],
)
Esa es toda la migración para una carga de trabajo de chat. El mismo cliente también gestiona embeddings y audio contra el mismo base URL, por lo que un pipeline de recuperación se mueve sin un nuevo SDK:
emb = client.embeddings.create(
model="Qwen3-Embedding-8B",
input=["primer fragmento", "segundo fragmento"],
)
with open("llamada.wav", "rb") as f:
text = client.audio.transcriptions.create(
model="whisper-large-v3",
file=f,
)
El mismo patrón funciona en el SDK de Node (baseURL), en LangChain (openai_api_base) y en cualquier biblioteca que lea el base URL de OpenAI desde una variable de entorno. Para un plan de migración completo y por fases, consulta la guía de migración desde OpenAI; para una comparación de precios y proveedores, consulta la guía de alternativas a la API de OpenAI.
Matriz de compatibilidad: qué se transfiere
La tabla refleja la superficie documentada de Tessera. Otros proveedores compatibles difieren, así que confirma cada uno en su propia documentación.
| Función de OpenAI | Endpoint | ¿Compatible? |
|---|---|---|
| Completaciones de chat | /v1/chat/completions | Sí, con streaming SSE, herramientas, modo JSON, response_format=json_schema |
| Embeddings | /v1/embeddings | Sí, entrada de cadena o array |
| Transcripción de audio | /v1/audio/transcriptions | Sí, carga multipart, json/text/verbose_json |
| Texto a voz | /v1/audio/speech | Sí, salida mp3/wav/opus |
| Llamadas a funciones y herramientas | /v1/chat/completions | Sí: auto, none, required, llamadas paralelas |
| Streaming | SSE | Sí, tramas data: {...} idénticas que terminan en data: [DONE] |
| Salidas estructuradas | json_schema | Sí, validación estricta |
| Reranking | /v1/rerank | Extensión de Tessera (compatible con Cohere), no es un endpoint de OpenAI |
| Responses API | /v1/responses | No |
| Assistants, Threads, Runs | /v1/assistants | No |
| Batch API | /v1/batch | No |
| Fine-tuning | /v1/fine-tuning | No |
| Visión y entrada de imágenes | n/a | No |
| Generación de imágenes | DALL-E, Sora | No |
| Voz en tiempo real | WebSocket | No |
| Moderaciones | /v1/moderations | Solo stub (siempre devuelve no marcado) |
Si tu código toca únicamente las filas con «Sí», el cambio es genuinamente de dos líneas. Si depende de una fila con «No», esa parte necesita un rediseño, no una redirección. Los bloqueadores más comunes en la práctica son las aplicaciones construidas sobre la Assistants API (hilos con estado y orquestación de herramientas gestionados en el servidor) y todo lo que llama a la generación de imágenes. Ambos asumen funciones que residen en el producto de OpenAI, no en el formato de cable que implementan los proveedores compatibles.
Parámetros que se comportan de forma diferente
Incluso en los endpoints compatibles, algunos parámetros presentan diferencias sutiles que vale la pena probar:
max_tokenscuenta solo los tokens de salida. El contexto de entrada no consume el presupuesto, lo que puede cambiar el comportamiento de truncamiento.seedse acepta pero no garantiza una salida idéntica entre versiones del modelo.nse acepta pero siempre devuelve una única completación, por lo que el código que leechoices[1]y más allá necesita un fallback.logprobs,top_logprobsylogit_biasno están soportados, lo que importa si clasificas tokens o diriges el muestreo con términos de sesgo.- Los nombres de modelo se mapean. La mayoría de las cadenas de modelo de OpenAI se resuelven a
Qwen/Qwen3.6-35B-A3B, por lo que pasar un nombre de modelo antiguo sigue devolviendo una respuesta, pero desde un modelo de código abierto.
Ninguno de estos lanza un error en una solicitud correcta. Eso es exactamente por qué son fáciles de pasar por alto: la llamada tiene éxito, la forma es correcta y solo una prueba de comportamiento detecta la diferencia.
Opciones autoalojadas frente a gestionadas
Los endpoints compatibles con OpenAI se presentan en dos formas, y la diferencia es operativa, no a nivel de protocolo.
Los runtimes autoalojados te ofrecen la misma superficie /v1 en tu propio hardware. LocalAI y Ollama exponen rutas compatibles con OpenAI, y vLLM sirve una frente a modelos de pesos abiertos descargados desde Hugging Face. Tú gestionas las GPUs, las descargas de modelos, el escalado y el tiempo de actividad. Es la opción correcta cuando los datos nunca pueden salir de tu red o ya cuentas con un equipo de inferencia.
Las pasarelas gestionadas te ofrecen la misma superficie sin las operaciones. Tessera ejecuta modelos de código abierto en GPUs de centro de datos con memoria de alto ancho de banda, detrás de un único endpoint compatible con OpenAI, por lo que no hay imagen de Docker que mantener ni capacidad que planificar. El coste es un menor control a bajo nivel; el beneficio es que el cambio realmente son dos líneas y se mantiene así. La mayoría de los equipos que buscan un reemplazo compatible quieren la segunda opción, porque el objetivo de la compatibilidad es dejar de gestionar infraestructura.
Cómo probar antes de hacer el cambio
Un cambio de base_url es rápido, lo que hace tentador publicar sin verificar. Ejecuta esta lista corta contra una clave de staging primero:
- Enumera los endpoints que llamas. Busca en el código base cada método de OpenAI en uso y comprueba cada uno en la matriz anterior. Una sola llamada a Assistants es suficiente para bloquear la migración.
- Reproduce tráfico real. Envía una muestra de prompts de producción al nuevo endpoint y compara las respuestas. El formato coincidirá; el contenido no, porque el modelo es diferente.
- Vuelve a ejecutar tus evaluaciones. Puntúa el nuevo modelo en tu propia tarea, no en un benchmark público. Este es el paso que decide si el cambio es viable.
- Comprueba streaming y herramientas de extremo a extremo. Confirma que tu cliente gestiona el terminador
data: [DONE]y que los argumentos de las llamadas a herramientas se analizan correctamente. - Realiza pruebas de carga con tu concurrencia real. El rendimiento en modelos de código abierto difiere del de OpenAI; dimensiónalo antes del lanzamiento.
Esta lista es deliberadamente más corta que un runbook de migración completo. Para el proceso de extremo a extremo, incluyendo el despliegue y la reversión, la guía de migración desde OpenAI cubre cada fase.
Lo que los equipos olvidan: el modelo no es GPT
Una API compatible copia el formato de cable de OpenAI, no sus pesos. Tessera sirve únicamente modelos de código abierto: Qwen3.6-35B-A3B para chat, Qwen3-Embedding-8B para embeddings, Qwen3-Reranker-4B para reranking, Whisper large-v3 para transcripción y Kokoro 82M para voz. No hay modelos GPT ni Claude detrás del endpoint.
Eso significa que el protocolo es idéntico pero las salidas no lo son. Los prompts ajustados estrechamente a una versión de modelo pueden necesitar un ligero reajuste, y debes volver a ejecutar tus evaluaciones en el nuevo modelo antes del cambio. Esto es lo más importante que hay que probar, y es lo que un cambio de base_url no puede hacer por ti. El rendimiento de tokens en modelos de código abierto es un tema propio; los benchmarks de Qwen 3.6 lo cubren.
Por qué los equipos hacen el cambio
La compatibilidad del formato de cable es el medio, no el motivo. Las razones habituales para apuntar el SDK a otro lugar:
- Previsibilidad de costes. La facturación por tokens hace que las facturas varíen con el uso. Los precios mensuales fijos no. Consulta por qué las facturas por uso fluctúan en variación de facturas de OpenAI y el modelo de tarifa plana en precios de IA privada.
- Residencia de datos. Si los datos personales no pueden salir de la UE o LATAM, el endpoint debe estar en la región. Tessera aloja en la UE y LATAM; dónde alojar inferencia LLM con residencia de datos en la UE profundiza en el tema.
- Modelos de código abierto. Sin dependencia propietaria del roadmap o el calendario de deprecación de un único proveedor.
Nada de esto requiere una reescritura. Ese es el valor silencioso de una API compatible: convierte una decisión estratégica sobre costes, residencia o elección de modelo en un cambio de configuración.
Preguntas frecuentes
¿Necesito reescribir mi código para usar un reemplazo compatible?
No. Para los endpoints compatibles cambias el base_url y la clave de API. Las formas de solicitud y respuesta permanecen idénticas, por lo que el SDK de OpenAI, LangChain y bibliotecas similares siguen funcionando sin cambios en el código.
¿Es Tessera un verdadero reemplazo compatible con OpenAI?
Para los endpoints que soporta (completaciones de chat, embeddings, transcripción de audio, voz, herramientas, streaming, salidas estructuradas), sí. No implementa la Assistants API, la Responses API, la Batch API, el fine-tuning, la visión ni la generación de imágenes, por lo que las cargas de trabajo que usan esas funciones no son compatibles de forma directa.
¿Mis prompts producirán las mismas respuestas?
No. Una API compatible copia el formato de OpenAI, no sus modelos. Tessera ejecuta modelos de código abierto como Qwen3.6-35B-A3B, por lo que las salidas difieren. Vuelve a ejecutar tus evaluaciones en el modelo de destino antes de cambiar el tráfico de producción.
¿Puedo seguir usando LangChain o el SDK oficial de OpenAI?
Sí. Ambos leen el base URL desde la configuración, por lo que apuntan a un endpoint compatible sin cambios en el código. Establece openai_api_base en LangChain o base_url en el cliente de OpenAI.
¿Cuál es el base URL para el cambio?
https://api.tesseraai.cloud/v1, usado como base_url en el cliente de OpenAI. Consulta la documentación de migración desde OpenAI para detalles a nivel de endpoint.