Quickstart

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.

5 min de lectura

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"}],
)
Diff típico de migración
- 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 OpenAIEquivalente en TesseraNotas
gpt-4o · gpt-4-turbo · gpt-4Qwen/Qwen3.6-35B-A3BNuestro modelo de chat. Razonamiento general, tool calling, JSON estructurado, contexto 128K.
gpt-4o-miniQwen/Qwen3.6-35B-A3BNo 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-turboQwen/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-002Qwen3-Embedding-8BSalida 4096-dim. Acepta input string o array, igual que OpenAI. El string exacto de model: se publicará al abrir el endpoint.
whisper-1whisper-large-v3Acepta 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-hdkokoro-82mVoces 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.

EndpointEstadoNota
POST /v1/chat/completionsSoportadoStreaming SSE, tools, JSON mode, response_format=json_schema.
POST /v1/embeddingsSoportadoinput string o array. encoding_format float (base64 en roadmap).
POST /v1/rerankSoportadoEndpoint propio de Tessera (no existe en OpenAI). Forma de respuesta compatible con Cohere — migración drop-in desde Cohere / Voyage / Jina.
POST /v1/audio/transcriptionsSoportadomultipart/form-data idéntico a OpenAI. response_format json | text | verbose_json.
POST /v1/audio/translationsSoportadoMismo contrato. Traduce a inglés.
POST /v1/audio/speechSoportadoVoces es-ES / es-LA / en-US. response_format mp3 | wav | opus.
GET /v1/modelsSoportadoDevuelve los cinco modelos de Tessera con metadata extendida.
POST /v1/moderationsParcialEndpoint expuesto. Responde "flagged: false" siempre — no hacemos moderation managed.
/v1/responses (Responses API)RoadmapMigrar a Chat Completions: el contrato sigue siendo el modo soportado por todos los SDKs.
/v1/realtime (WebSocket)RoadmapVoice + low-latency duplex. Sin ETA.
/v1/batchRoadmapPara volúmenes async usa la cola asíncrona del modelo de chat por ahora (mismo identificador, prioridad inferior).
/v1/fine-tuningRoadmapHablemos: el modelo es open-weights, hay rutas no estándar para custom checkpoints.
/v1/imagesRoadmapNo tenemos modelo de imagen. Sin ETA.
/v1/assistants · /v1/threads · /v1/runsRoadmapOpenAI 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.