Volver al blog

API y SDKGuía

LiteLLM con un api_base personalizado: llamar a CheapTokens en Python

Usa el prefijo openai/, api_base y un id de modelo completo para llamar a CheapTokens desde litellm.completion() y un config.yaml de proxy de LiteLLM, y corrige Not Found.

Por CheapTokens TeamPublicado el 5 min de lectura

Llamada de LiteLLM con prefijo openai/ en el modelo y api_base apuntando a CheapTokens
En esta página
  1. La misma llamada en Python y en un proxy
  2. Lo que deberías ver
  3. Añadir más modelos al proxy
  4. Cuando falla: Not Found y 401
  5. Cuánto cuestan mil llamadas

Para enviar LiteLLM a CheapTokens cambias tres valores: model recibe el prefijo openai/ delante del id completo del modelo, api_base pasa a ser https://api.cheaptokens.dev/v1, y api_key es tu clave de CheapTokens. Ese es todo el cambio, tanto para litellm.completion() en Python como para un proxy de LiteLLM.

Supón que ya tienes un proyecto que llama a litellm.completion() con un modelo de OpenAI o Anthropic, y quieres probar uno más barato sin tocar el resto del código. El prefijo es lo que lo hace funcionar: la documentación del proveedor compatible con OpenAI de LiteLLM (consultada el 29 de octubre de 2026) indica que para cualquier endpoint compatible con OpenAI se configura el modelo con openai/ para que LiteLLM enrute al proveedor de OpenAI, y luego se pasan api_base y api_key junto a él. CheapTokens habla el formato OpenAI Chat Completions en https://api.cheaptokens.dev/v1, así que encaja.

La misma llamada en Python y en un proxy#

Las dos configuraciones son breves. Elige la pestaña que corresponda a cómo ejecutas LiteLLM.

Un modelo de CheapTokens, dos formas de llamarlo

SDK de Python

python
import os
import litellm

response = litellm.completion(
    model="openai/deepseek-ai/DeepSeek-V4-Flash-0731",
    api_base="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
    messages=[{"role": "user", "content": "Explain what api_base does in one sentence."}],
    max_tokens=200,
)

print(response.choices[0].message.content)
print(response.usage)

Mantén la clave en una variable de entorno, no en el archivo.

Proxy config.yaml

yaml
model_list:
  - model_name: cheap-chat
    litellm_params:
      model: openai/deepseek-ai/DeepSeek-V4-Flash-0731
      api_base: https://api.cheaptokens.dev/v1
      api_key: os.environ/CHEAPTOKENS_API_KEY

Arráncalo con litellm --config /path/to/config.yaml. Los clientes piden al proxy cheap-chat y nunca ven el id real del modelo.

Llamar al proxy

bash
curl http://localhost:4000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "cheap-chat", "messages": [{"role": "user", "content": "Say hi"}]}'

El proxy escucha en el puerto 4000 por defecto. Cambia el modelo detrás de cheap-chat más adelante y esta petición no cambia.

El id del modelo es la parte con la que la gente tropieza. El id que acepta CheapTokens es el completo, deepseek-ai/DeepSeek-V4-Flash-0731, y openai/ va delante de él. No deepseek-v4-flash, ni solo el prefijo más un nombre corto. Si no estás seguro de cómo se llama un modelo, lista los modelos con GET /v1/models y copia el id de la respuesta.

La llamada en Python con los tres valores cambiados
Los tres valores que cambian: model con el prefijo openai/, api_base, api_key.

Lo que deberías ver#

Ejecuta la pestaña de Python. El primer print muestra el texto del modelo. El segundo muestra response.usage, los recuentos de tokens de esa única llamada: prompt_tokens para lo que enviaste y completion_tokens para lo que escribió el modelo. LiteLLM los devuelve con la forma de OpenAI, así que el código que ya lee usage sigue funcionando. Si quieres convertir esos dos números en una factura acumulada, tracking agent token cost in Python muestra cómo.

Añadir más modelos al proxy#

La gracia de model_name es que tus clientes mantienen un alias mientras tú cambias lo que hay detrás. Un model_list puede contener varias entradas, todas apuntando al mismo api_base y a la misma clave, porque un saldo de CheapTokens cubre todos los modelos:

yaml
model_list:
  - model_name: cheap-chat
    litellm_params:
      model: openai/deepseek-ai/DeepSeek-V4-Flash-0731
      api_base: https://api.cheaptokens.dev/v1
      api_key: os.environ/CHEAPTOKENS_API_KEY
  - model_name: cheap-glm
    litellm_params:
      model: openai/zai-org/GLM-5.3-Flash
      api_base: https://api.cheaptokens.dev/v1
      api_key: os.environ/CHEAPTOKENS_API_KEY
  - model_name: cheap-minimax
    litellm_params:
      model: openai/MiniMaxAI/MiniMax-M2.7
      api_base: https://api.cheaptokens.dev/v1
      api_key: os.environ/CHEAPTOKENS_API_KEY

¿Qué alias para qué tarea? Para llamadas de chat y de agente donde la respuesta puede ser larga, DeepSeek-V4-Flash es el indicado para empezar: contexto de 380K, hasta 32.768 tokens de salida por respuesta y un precio fijo sin horas punta. GLM-5.3-Flash tiene un contexto de 390K y hasta 8.192 tokens de salida. MiniMax-M2.7 tiene 180K de contexto. La página de DeepSeek tiene los detalles, y pricing lista las tarifas actuales de los tres.

Cuando falla: Not Found y 401#

Dos errores cubren la mayoría de las primeras llamadas fallidas. La documentación de LiteLLM dice que no añadas nada extra a la URL base, y que ante un error Not Found compruebes que api_base termina en /v1. Un detalle: el propio ejemplo de la documentación para un proxy local usa http://0.0.0.0:4000 sin /v1. Ese es otro servidor. Para CheapTokens, el /v1 se queda.

Not Found cuando api_base no tiene /v1
Un 404 Not Found suele significar que a api_base le falta /v1.

Elige tu caso

¿Cómo es tu error?

Not Found (404)

Revisa api_base. Debe ser exactamente https://api.cheaptokens.dev/v1, con /v1 y sin /chat/completions al final. LiteLLM añade el resto de la ruta por su cuenta.

401 Unauthorized

Falta la clave, es incorrecta, o LiteLLM leyó una variable de entorno vacía. Imprime la longitud de os.environ.get("CHEAPTOKENS_API_KEY"), no la clave en sí, para comprobar que está definida, y asegúrate de que no pasaste una clave de OpenAI por costumbre.

El modelo es rechazado

Compara el id letra por letra con el de /v1/models. El prefijo openai/ es solo para LiteLLM; lo que va después es el id completo de CheapTokens, incluida la parte del desarrollador antes de la barra.

Para el recorrido completo por los códigos de estado consulta API 401 or 404: wrong key, base URL or model id. Si primero quieres la idea que hay detrás de api_base, what base_url is and how to switch lo explica en lenguaje llano.

Verificación rápida

Tu api_base es https://api.cheaptokens.dev y la llamada devuelve Not Found. ¿Qué cambias primero?

Mostrar respuesta

Respuesta: Añadir /v1 para que quede https://api.cheaptokens.dev/v1

Not Found apunta a la ruta. La clave daría 401, y el prefijo es lo que le dice a LiteLLM que use la petición al estilo OpenAI.

Cuánto cuestan mil llamadas#

Supón que un bot de soporte detrás del proxy envía 1.000 peticiones al día, cada una con unos 2.000 tokens de entrada (la pregunta más el contexto) y 500 tokens de salida. Aquí tienes esa carga con precios reales, con una columna de OpenRouter para comparar el total, contando entrada y salida juntas:

Modelo Por solicitud 1000 solicitudes OpenRouter, 1000 solicitudes
GLM-5.3-Flash $0.00006 $0.06 $0.121
DeepSeek-V4-Flash $0.00008 $0.08 $0.173
MiniMax-M2.7 $0.00018 $0.175 $1.20

2000 tokens de entrada y 500 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.

Para DeepSeek-V4-Flash esa carga cuesta $0.08 al día, y la tabla muestra que es más barato que OpenRouter en total. Cambia los dos números por tu petición media y tendrás tu presupuesto.

Eso es todo lo que necesita LiteLLM: tres valores, un /v1 y un id de modelo completo. Añade la clave de tu panel y ejecuta la pestaña de Python.