Volver al blog

Primeros pasosGuía

Cambia de OpenRouter a CheapTokens: base_url, clave, id del modelo

Cambia base_url, la clave de API y el id del modelo en el SDK de OpenAI (Python y JavaScript), envía una primera petición y comprueba que funcionó.

Por CheapTokens TeamPublicado el 5 min de lectura

Portada: cambiar una aplicación con el SDK de OpenAI de OpenRouter a CheapTokens cambiando base_url, la clave y el id del modelo
En esta página
  1. Qué cambia realmente
  2. El código después del cambio
  3. Comprueba que funcionó
  4. Qué modelo sustituye a qué
  5. Cuánto cuesta el mismo tráfico
  6. Si no funciona
  7. Antes de publicar

Tu aplicación ya llama a OpenRouter a través del SDK de OpenAI, y quieres que llame a CheapTokens en su lugar. Cambias tres valores — base_url, la clave de API y el id de model — y eliminas dos cabeceras opcionales. El resto del código se queda como está.

A continuación tienes las líneas exactas para Python, JavaScript y curl, una forma rápida de confirmar que el cambio funcionó y una tabla de qué modelo encaja con qué tarea. Si nunca has enviado una petición a CheapTokens, la guía de la primera petición a la API cubre la cuenta y la clave; la documentación tiene la referencia completa.

Qué cambia realmente#

El quickstart de OpenRouter (consultado el 27 de octubre de 2026) configura el cliente de OpenAI con la URL base https://openrouter.ai/api/v1 y nombra los modelos como provider/model-name. CheapTokens habla el mismo formato OpenAI Chat Completions en https://api.cheaptokens.dev/v1. Así que la clase del cliente, chat.completions.create y la forma de leer la respuesta no se mueven.

Antes y después: los tres valores que cambian al pasar de OpenRouter a CheapTokens
Los tres valores que hay que sustituir. La clave se muestra como variable de entorno, nunca en el código.

Eso es un cambio por línea:

  • URL base — https://api.cheaptokens.dev/v1 en lugar de la dirección de OpenRouter;
  • clave de API — una clave de tu cuenta de CheapTokens, leída desde una variable de entorno;
  • id del modelo — el id completo de CheapTokens, por ejemplo deepseek-ai/DeepSeek-V4-Flash-0731. Toma los ids de la documentación de CheapTokens: distintos proveedores nombran el mismo modelo de forma diferente, y los ids cortos de las etiquetas de precio no se aceptan.

Y una eliminación. Las cabeceras HTTP-Referer y X-OpenRouter-Title de OpenRouter son opcionales y solo alimentan las clasificaciones de OpenRouter. Elimínalas de default_headers / defaultHeaders; aquí no las necesitas.

El código después del cambio#

La misma petición, tres entornos de ejecución. Elige el que use tu aplicación.

Tu código después del cambio

Python

python
import os
from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)

resp = client.chat.completions.create(
    model='deepseek-ai/DeepSeek-V4-Flash-0731',
    messages=[{'role': 'user', 'content': 'Reply with one word: ready'}],
    max_tokens=20,
)
print(resp.choices[0].message.content)

JavaScript

javascript
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://api.cheaptokens.dev/v1',
  apiKey: process.env.CHEAPTOKENS_API_KEY,
});

const resp = await client.chat.completions.create({
  model: 'deepseek-ai/DeepSeek-V4-Flash-0731',
  messages: [{ role: 'user', content: 'Reply with one word: ready' }],
  max_tokens: 20,
});
console.log(resp.choices[0].message.content);

curl

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "deepseek-ai/DeepSeek-V4-Flash-0731", "messages": [{"role": "user", "content": "Reply with one word: ready"}], "max_tokens": 20}'

Una cosa más antes de ejecutarlo. Si tu petición lleva campos exclusivos de OpenRouter — listas de enrutamiento o de fallback, preferencias de proveedor, ids de modelo ~alias — esos pertenecen a OpenRouter. Limita la petición a los campos estándar de Chat Completions: model, messages, temperature, max_tokens, stream.

Comprueba que funcionó#

Una respuesta no es prueba suficiente. Imprime tres cosas junto a ella: qué modelo respondió, por qué se detuvo y cuántos tokens facturó.

python
print(resp.model)
print(resp.choices[0].finish_reason)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
El entorno y el script de comprobación ejecutados en una terminal
Configura la clave una vez, ejecuta la comprobación y lee model, finish_reason y usage.

finish_reason de stop significa que el modelo terminó por sí solo. length significa que max_tokens cortó la respuesta. usage muestra los tokens de entrada y de salida por separado, y esos son los dos números de los que se compone tu factura — los mismos dos que estabas siguiendo en OpenRouter.

Pruébalo tú mismoPruébalo: ¿qué dice finish_reason si pones max_tokens a 1?Mostrar respuesta

Dice length — la respuesta fue cortada por max_tokens. Una buena prueba de que tu código maneja una respuesta truncada.

Qué modelo sustituye a qué#

Elige el modelo por la tarea, no por el nombre que usabas en OpenRouter. Los datos de abajo son de la lista de precios de CheapTokens consultada el 27 de octubre de 2026; un solo saldo cubre los tres modelos y el precio no cambia según la hora del día.

Modelo id de model Contexto Respuesta máx.
DeepSeek-V4-Flash deepseek-ai/DeepSeek-V4-Flash-0731 380K 32.768 tokens
GLM-5.3-Flash zai-org/GLM-5.3-Flash 390K 8.192 tokens
MiniMax-M2.7 MiniMaxAI/MiniMax-M2.7 180K 8.192 tokens

¿No sabes cuál es tu fila? Empieza por lo que hace la aplicación:

Elige tu caso

¿Qué hace tu aplicación sobre todo?

Peticiones cortas y frecuentes — clasificación, extracción, respuestas de soporte

Prueba zai-org/GLM-5.3-Flash: 390K de contexto, respuestas de hasta 8.192 tokens, y es más barato que OpenRouter en total, contando entrada y salida juntas.

Respuestas largas, código, bucles de agentes

Prueba deepseek-ai/DeepSeek-V4-Flash-0731: respuestas de hasta 32.768 tokens, 380K de contexto, un precio a cualquier hora del día.

Una carga de trabajo constante por la que ahora pagas una tarifa alta de OpenRouter

Prueba MiniMaxAI/MiniMax-M2.7: 180K de contexto, respuestas de hasta 8.192 tokens, y en total sale más barato que OpenRouter.

Cuánto cuesta el mismo tráfico#

Supón que tu bot envía 1.000 peticiones, cada una con unos 500 tokens de entrada y 300 de salida. Eso es una suposición — sustituye tus propios números de usage. La tabla de abajo es dinámica: nuestros precios y la columna de OpenRouter vienen de la lista de precios actual, contando entrada y salida juntas.

Modelo Por solicitud 1000 solicitudes OpenRouter, 1000 solicitudes
GLM-5.3-Flash $0.000022 $0.022 $0.0434
DeepSeek-V4-Flash $0.000038 $0.0375 $0.0708
MiniMax-M2.7 $0.00007 $0.07 $0.51

500 tokens de entrada y 300 tokens de salida por solicitud. Los precios por 1M de tokens son actuales y cambian junto con nuestras tarifas; la columna de OpenRouter muestra precios de referencia para la misma carga de trabajo.

En DeepSeek-V4-Flash esas 1.000 peticiones salen por $0.0375. Los precios completos están en la página de precios; la idea de por qué se te factura está en tokens de entrada vs salida.

Si no funciona#

Tras un cambio, tres errores cubren la mayor parte de los problemas. Relaciona el mensaje con la causa:

Emparejar los pares

Relaciona cada síntoma con su causa

  • 401 UnauthorizedFalta la clave, está mal escrita o sigue siendo la de OpenRouter
  • 404 Not FoundLa ruta de la URL base es incorrecta o el id del modelo no es un id completo de CheapTokens
  • Respuesta cortada a mitad de frasemax_tokens es menor de lo que necesita la respuesta; finish_reason dice length

El artículo de solución de problemas 401 y 404 repasa cada uno con los mensajes exactos, y qué es base_url explica por qué una barra mal puesta rompe la ruta.

Antes de publicar#

Lista de verificación

Lista de comprobación del cambio