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 cinco 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 | Nuestro modelo de chat. Razonamiento general, tool calling, JSON estructurado, contexto 128K. |
gpt-4o-mini | Qwen/Qwen3.6-35B-A3B | No tenemos un modelo intermedio: el chat sirve a todos los casos. 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 | Qwen3-Embedding-8B | Salida 4096-dim. Acepta input string o array, igual que OpenAI. El string exacto de model: se publicará al abrir el endpoint. |
whisper-1 | whisper-large-v3 | Acepta WAV / MP3 / M4A / WebM hasta 25 MB. Soporta translation y verbose JSON. El string exacto de model: se publicará al abrir el endpoint. |
tts-1 · tts-1-hd | kokoro-82m | Voces es-ES, es-LA y en-US. Salida MP3 / WAV / OGG. El string exacto de model: se publicará al abrir el endpoint. |
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 | verbose_json. |
POST /v1/audio/translations | Soportado | Mismo contrato. 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 cinco 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)- No soportado. Qwen3.6-35B-A3B es text-only. Si necesitas vision como bloqueo, escríbenos: tenemos beta privada con un modelo distinto.
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.