Migración desde OpenAI
Tessera implementa la API de OpenAI v1. En la mayoría de casos basta con cambiar el base_url y los nombres de modelo. Esta guía documenta lo demás: lo que es idéntico, lo que se comporta distinto y lo que aún no soportamos.
TL;DR
Si tu código usa el SDK oficial de OpenAI (Python, Node, Go) y los endpoints clásicos de chat, embeddings, audio y TTS, la migración son tres líneas. El cliente sigue siendo el de OpenAI; sólo cambia a quién apunta.
- Cambia base_url a https://api.tesseraai.cloud/v1.
- Cambia tu API key por la de Tessera (sk-tessera-…).
- Cambia los nombres de modelo según la tabla de abajo.
- No hace falta SDK propio. Tampoco un wrapper.
1. Cambia el base_url
Los SDKs oficiales de OpenAI exponen el parámetro de configuración: base_url en Python y baseURL en Node. Pásalos al constructor del cliente y todo lo demás funciona igual.
# Antes (OpenAI)
client = OpenAI(api_key="sk-…")
# Después (Tessera) — sólo cambia el destino
client = OpenAI(
base_url="https://api.tesseraai.cloud/v1",
api_key="sk-tessera-…",
)
response = client.chat.completions.create(
model="Qwen/Qwen3.6-35B-A3B",
messages=[{"role": "user", "content": "Hola"}],
)
- base_url="https://api.openai.com/v1"
+ base_url="https://api.tesseraai.cloud/v1"2. Sustituye tus modelos
Tessera ofrece ocho modelos abiertos sobre GPU dedicada. La tabla mapea los modelos OpenAI más usados al equivalente más cercano en Tessera. No es una equivalencia 1:1 — son arquitecturas y entrenamientos distintos. Recomendamos validar contra tus prompts reales antes de promover el cambio a producción.
| Modelo OpenAI | Equivalente en Tessera | Notas |
|---|---|---|
gpt-4o · gpt-4-turbo · gpt-4 | Qwen/Qwen3.6-35B-A3B | El modelo rápido: chat, RAG, extracción y JSON estructurado con baja latencia, contexto según tier (hasta 256K). Para agentes con herramientas, código o imágenes, usa Qwen/Qwen3.8-27B, el más capaz. |
gpt-5 · o3 · o4-mini | Qwen/Qwen3.8-27B-thinking | El más capaz: casi duplica a Qwen3.6 en el índice de Artificial Analysis (34 frente a 18). Razonamiento de varios pasos, código, agentes con herramientas e imágenes. Usa Qwen/Qwen3.8-27B (sin sufijo) para el mismo modelo sin razonamiento extendido. |
gpt-4o-mini | Qwen/Qwen3.6-35B-A3B | Qwen3.6 es un MoE con 3B de parámetros activos: nuestra opción rápida. Suele estar al nivel de gpt-4o-mini en latencia y por encima en calidad. |
gpt-3.5-turbo | Qwen/Qwen3.6-35B-A3B (cola async) | Mismo modelo en cola async/lower-priority. Pensado para batch jobs y workloads no interactivos. |
text-embedding-3-small · -large · ada-002 | Qwen/Qwen3-Embedding-8B | Salida de 4096 dimensiones, o menos con el parámetro dimensions. Acepta input string o array, igual que OpenAI. |
whisper-1 | nvidia/canary-1b-v2 · nvidia/parakeet-tdt-0.6b-v3 | Canary para español (pasa language), Parakeet para inglés o idioma desconocido. Archivos de hasta 4 horas y separación por hablante con diarize=true. whisper-large-v3 sigue disponible como sustituto directo (hasta 25 MB, también para translations). |
tts-1 · tts-1-hd | kokoro-82m | Voces en español neutro, inglés y otros 6 idiomas. Salida MP3 / WAV / Opus / AAC / FLAC / PCM. |
No publicamos benchmarks comparativos contra OpenAI: cualquier número fuera de tu propio dataset es marketing. La calculadora de la home te deja simular tu coste con tus volúmenes reales.
3. Endpoints soportados
La superficie cubre las rutas más usadas de la API v1 de OpenAI. Lo que aún no exponemos está marcado como "roadmap" — si bloquea tu migración, escríbenos y lo priorizamos.
| Endpoint | Estado | Nota |
|---|---|---|
POST /v1/chat/completions | Soportado | Streaming SSE, tools, JSON mode, response_format=json_schema. |
POST /v1/embeddings | Soportado | input string o array. encoding_format float (base64 en roadmap). |
POST /v1/rerank | Soportado | Endpoint propio de Tessera (no existe en OpenAI). Forma de respuesta compatible con Cohere — migración drop-in desde Cohere / Voyage / Jina. |
POST /v1/audio/transcriptions | Soportado | multipart/form-data idéntico a OpenAI. response_format json | text | srt | vtt | verbose_json | diarized_json; diarize=true separa hablantes. |
POST /v1/audio/translations | Soportado | Mismo contrato, con whisper-large-v3. Traduce a inglés. |
POST /v1/audio/speech | Soportado | Voces es-ES / es-LA / en-US. response_format mp3 | wav | opus. |
GET /v1/models | Soportado | Devuelve los modelos de Tessera con metadata extendida. |
POST /v1/moderations | Parcial | Endpoint expuesto. Responde "flagged: false" siempre — no hacemos moderation managed. |
/v1/responses (Responses API) | Roadmap | Migrar a Chat Completions: el contrato sigue siendo el modo soportado por todos los SDKs. |
/v1/realtime (WebSocket) | Roadmap | Voice + low-latency duplex. Sin ETA. |
/v1/batch | Roadmap | Para volúmenes async usa la cola asíncrona del modelo de chat por ahora (mismo identificador, prioridad inferior). |
/v1/fine-tuning | Roadmap | Hablemos: el modelo es open-weights, hay rutas no estándar para custom checkpoints. |
/v1/images | Roadmap | No tenemos modelo de imagen. Sin ETA. |
/v1/assistants · /v1/threads · /v1/runs | Roadmap | OpenAI los marcó como deprecated en favor de Responses. Recomendamos migrar a Chat Completions + tools. |
4. Diferencias de comportamiento documentadas
Mismo contrato no significa mismo comportamiento. Estos son los puntos donde Tessera se aparta del comportamiento que verías contra OpenAI, ordenados por probabilidad de que te afecten.
temperature, top_p, max_tokens- Idénticos. max_tokens se interpreta como "tokens de salida" — el contexto de entrada no cuenta contra ese presupuesto.
tool_choice y tools- Function calling compatible. tool_choice acepta "auto", "none", "required" y { type: "function", function: { name } }. Soporte de tools en paralelo.
response_format- JSON mode (response_format: { type: "json_object" }) y JSON Schema (type: "json_schema") soportados. La validación es estricta: si el modelo intenta salir del schema se reintenta internamente antes de fallar.
stream- SSE idéntico al de OpenAI: data: {…}, terminado por data: [DONE]. Heartbeats cada 15 s para mantener proxies vivos.
seed- Aceptado pero no garantiza determinismo absoluto entre versiones del modelo. OpenAI tampoco lo garantiza — la diferencia es que aquí lo decimos.
logprobs / top_logprobs- No soportados en /v1/chat/completions todavía. En roadmap. Si tu uso depende de logprobs, dínoslo.
n (múltiples completions)- Aceptado pero siempre devuelve n=1. Para sampling múltiple, llama N veces — el coste es el mismo y la latencia más predecible.
logit_bias- No soportado. Útil casi siempre para constrained generation; recomendamos response_format=json_schema en su lugar.
Vision (image inputs)- Soportado con Qwen/Qwen3.8-27B y Qwen/Qwen3.8-27B-thinking: partes image_url en el content (URL https o data URI en base64), igual que OpenAI. Qwen/Qwen3.6-35B-A3B sigue siendo solo texto.
Rate limits y errores- Mismo formato de error (error.type, error.code, error.message). 429 con header Retry-After. Detalle en /docs/api/rate-limits.
5. Migración progresiva
Una vez funciona en local, lo prudente es enviar tráfico real de forma gradual y comparar respuestas contra el flujo OpenAI antes de cortar el cable. Patrón típico con feature flag o porcentaje:
# Python — routing por porcentaje, sin tocar el SDK del producto
import random
from openai import OpenAI
openai_client = OpenAI(api_key=OPENAI_KEY)
tessera_client = OpenAI(
base_url="https://api.tesseraai.cloud/v1",
api_key=TESSERA_KEY,
)
def chat(messages, *, tessera_share=0.10):
use_tessera = random.random() < tessera_share
client = tessera_client if use_tessera else openai_client
model = "Qwen/Qwen3.6-35B-A3B" if use_tessera else "gpt-4o"
return client.chat.completions.create(model=model, messages=messages)
Empieza con tessera_share=0.05 sobre tráfico de baja criticidad. Loguea las respuestas de ambos lados y compáralas en frío durante 1-2 días antes de subir el porcentaje.
Lo que todavía no migres
Hay flujos que aún dependen de capacidades que no exponemos. Si tu producto los usa, mantén ese subset en OpenAI — el resto puede vivir en Tessera sin problema.
- Realtime API (voz duplex con WebSocket).
- Batch API: usa la cola asíncrona del modelo de chat si tu workload tolera async.
- Fine-tuning vía API. Open-weights permite rutas alternativas — escríbenos.
- Vision (image inputs): el modelo es text-only.
- Image generation, DALL·E, Sora.
- Assistants API y Agents SDK: OpenAI los está rebajando, recomendamos Chat Completions + tools.
¿Necesitas ayuda?
La migración suele tardar menos de una tarde. Si te bloqueas — endpoint que no encuentras, salida que no cuadra, prompt que se comporta distinto — escribe directamente al founder.