Retour au blog

API & SDKGuide

SDK AI de Vercel avec une URL de base personnalisée : CheapTokens en TypeScript

Pointez le SDK AI de Vercel vers CheapTokens avec createOpenAICompatible : un extrait fonctionnel de generateText et streamText, l'usage des tokens et des correctifs pour les erreurs courantes.

Par CheapTokens TeamPublié le 5 min de lecture

Code du SDK AI de Vercel avec createOpenAICompatible et l'URL de base CheapTokens
Sur cette page
  1. Installer et créer le provider
  2. generateText : une réponse et son décompte de tokens
  3. streamText : afficher les mots à mesure qu'ils arrivent
  4. Changer de modèle sans toucher au reste
  5. Si ça ne fonctionne pas

Pour exécuter le SDK AI de Vercel sur CheapTokens, installez @ai-sdk/openai-compatible, créez un provider avec baseURL: 'https://api.cheaptokens.dev/v1' et votre clé, puis passez provider('deepseek-ai/DeepSeek-V4-Flash-0731') comme model. Tout le reste de votre app, generateText, streamText, vos prompts, reste inchangé.

Donc si vous avez déjà une route Next.js ou un script Node qui parle à un modèle hébergé via le SDK AI, vous changez trois choses : l'URL de base, la clé et l'id du modèle. Ce guide vérifie la configuration par rapport à la page des providers compatibles OpenAI du SDK AI (29 octobre 2026). Il utilise l'interface Chat Completions de l'API CheapTokens, qui est ce que parle ce provider.

Installer et créer le provider#

Deux paquets : le paquet principal ai et le provider compatible OpenAI.

bash
npm install ai @ai-sdk/openai-compatible
export CHEAPTOKENS_API_KEY=ct_your_key_here

L'ordre des opérations est court :

Remettre en ordre

Mettez la configuration en ordre

  1. Rechargez le solde et créez une clé API
  2. Placez la clé dans une variable d'environnement
  3. Créez le provider avec le baseURL de CheapTokens
  4. Passez l'id complet du modèle à generateText

Le provider lui-même est un seul appel à createOpenAICompatible :

typescript
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';

export const cheaptokens = createOpenAICompatible({
  name: 'cheaptokens',
  apiKey: process.env.CHEAPTOKENS_API_KEY,
  baseURL: 'https://api.cheaptokens.dev/v1',
  includeUsage: true,
});

name n'est qu'un libellé pour vos propres logs. includeUsage: true demande aussi les décomptes de tokens dans les réponses en streaming ; sans cela, le comportement par défaut équivaut à false. Appeler cheaptokens('model-id') vous donne un modèle de chat ; cheaptokens.chatModel('model-id') et cheaptokens.languageModel('model-id') font la même chose.

Le chemin d'une requête : votre app, createOpenAICompatible, l'API CheapTokens
Votre code continue d'appeler le SDK AI ; seul le provider en dessous change

L'id du modèle doit être le complet : deepseek-ai/DeepSeek-V4-Flash-0731. Un nom court comme deepseek-v4-flash-0731 est ce que vous voyez dans les tableaux de prix, et l'API ne l'acceptera pas. Si vous ne savez pas quoi saisir, listez les modèles avec GET /v1/models et copiez l'id depuis là.

generateText : une réponse et son décompte de tokens#

Voici un script complet. Il demande une réponse courte et affiche à la fois le texte et l'objet usage.

typescript
import { generateText } from 'ai';
import { cheaptokens } from './provider';

const result = await generateText({
  model: cheaptokens('deepseek-ai/DeepSeek-V4-Flash-0731'),
  prompt: 'Explain in two sentences what a base URL is.',
});

console.log(result.text);
console.log(result.usage);

Exécutez-le avec npx tsx index.ts. Vous obtenez la réponse sous forme de chaîne dans result.text, et result.usage contient les décomptes de tokens d'entrée et de sortie pour cet appel. Nous affichons l'objet entier pour que vous voyiez tout ce qu'il contient. Dans la référence du SDK AI pour streamText (vérifiée le 29 octobre 2026), usage a inputTokens, outputTokens et totalTokens ; vérifiez les types de votre version installée avant de les brancher dans un dashboard.

Pourquoi lire usage tout court ? Parce que c'est le nombre que vous payez. Disons que votre app envoie un prompt de 1 500 tokens et reçoit une réponse de 600 tokens. Cette requête coûte $0.000083 aux prix actuels, et mille d'entre elles ressemblent à ceci :

Modèle Par requête 1 000 requêtes OpenRouter, 1 000 requêtes
GLM-5.3-Flash $0.000054 $0.054 $0.107
DeepSeek-V4-Flash $0.000083 $0.0825 $0.165
MiniMax-M2.7 $0.00017 $0.165 $1.17

1 500 tokens d'entrée et 600 tokens de sortie par requête. Les prix par million de tokens sont actuels et évoluent avec nos tarifs ; la colonne OpenRouter indique des prix de référence pour la même charge de travail.

La colonne CheapTokens est en total, entrée et sortie ensemble, moins chère qu'OpenRouter pour chaque modèle du tableau. Si vous voulez transformer usage en budget courant, tracking agent token cost montre l'idée en Python ; l'arithmétique est la même en TypeScript.

streamText : afficher les mots à mesure qu'ils arrivent#

Pour une UI de chat, vous voulez que le texte apparaisse pendant que le modèle écrit encore. streamText vous donne un itérable asynchrone de morceaux de texte.

typescript
import { streamText } from 'ai';
import { cheaptokens } from './provider';

const result = streamText({
  model: cheaptokens('deepseek-ai/DeepSeek-V4-Flash-0731'),
  prompt: 'Write a 100-word product description for a pocket notebook.',
});

for await (const chunk of result.textStream) {
  process.stdout.write(chunk);
}

console.log('\n', await result.usage);

Remarquez qu'il n'y a pas de await devant streamText(...) : il retourne immédiatement et vous consommez le flux. usage est une promesse qui se résout à la fin du flux, donc vous l'attendez après la boucle. Dans un gestionnaire de route Next.js, vous renverriez le flux au navigateur au lieu d'écrire sur stdout ; la partie provider est identique. Si vous voulez la même chose avec le SDK OpenAI simple, voir streaming chat responses in Node.js.

Les réponses longues passent ici : DeepSeek-V4-Flash sur CheapTokens peut écrire jusqu'à 32 768 tokens en une réponse, dispose d'une fenêtre de contexte de 380K et d'un prix unique à toute heure. La page du modèle est à /en/cheap-deepseek/, et les prix actuels sont sur la page de tarification.

Changer de modèle sans toucher au reste#

Comme seul l'id du modèle change, essayer un autre modèle est une modification d'une ligne. GLM-5.3-Flash dispose d'une fenêtre de contexte de 390K et répond jusqu'à 8 192 tokens ; aux prix actuels, il coûte $0.02 par 1M de tokens d'entrée et $0.04 par 1M de tokens de sortie.

Essayez vous-mêmeEssayez : quelle ligne changez-vous pour exécuter le même script sur GLM-5.3-Flash ?Afficher la réponse

Seulement l'id du modèle : cheaptokens('zai-org/GLM-5.3-Flash'). Le provider, la clé, le baseURL et le reste du script restent identiques.

Un schéma pratique consiste à garder l'id dans une variable d'environnement (process.env.MODEL_ID) pour pouvoir comparer deux modèles sur le même prompt sans rebuild. La comparaison DeepSeek vs GLM vs MiniMax aide à choisir lesquels valent la peine d'être essayés.

Si ça ne fonctionne pas#

La plupart des échecs relèvent de trois choses : la clé, l'URL ou l'id du modèle.

  • 401 signifie que la clé est absente ou erronée. Vérifiez que CHEAPTOKENS_API_KEY est défini dans le shell qui exécute le script (un serveur Next.js en a besoin dans .env.local et d'un redémarrage).
  • 404 signifie généralement que le baseURL a perdu son /v1 ou que l'id du modèle est le nom court. Utilisez https://api.cheaptokens.dev/v1 et l'id complet.
  • La réponse s'arrête en milieu de phrase. Le modèle a atteint une limite de sortie ; le correctif finish_reason "length" l'explique.

Le tutoriel plus long des deux premiers cas se trouve dans API 401 or 404: wrong key, base URL or model id.

Liste de contrôle

Avant d'exécuter le script

Pour connecter d'autres outils et faire la première requête à la main, commencez par la documentation CheapTokens.