Torna al blog

API e SDKGuida

Vercel AI SDK con una base URL personalizzata: CheapTokens in TypeScript

Punta il Vercel AI SDK su CheapTokens con createOpenAICompatible: uno snippet funzionante di generateText e streamText, l'uso dei token e le correzioni per gli errori comuni.

Di CheapTokens TeamPubblicato il 5 min di lettura

Codice del Vercel AI SDK con createOpenAICompatible e la base URL di CheapTokens
In questa pagina
  1. Installa e crea il provider
  2. generateText: una risposta e il suo conteggio dei token
  3. streamText: stampa le parole mentre arrivano
  4. Cambia il modello senza toccare il resto
  5. Se non funziona

Per eseguire il Vercel AI SDK su CheapTokens, installa @ai-sdk/openai-compatible, crea un provider con baseURL: 'https://api.cheaptokens.dev/v1' e la tua chiave, e passa provider('deepseek-ai/DeepSeek-V4-Flash-0731') come model. Tutto il resto della tua app, generateText, streamText, i tuoi prompt, resta com'è.

Quindi se hai già una route Next.js o uno script Node che parla con un modello ospitato tramite l'AI SDK, cambi tre cose: la base URL, la chiave e l'id del modello. Questa guida verifica la configurazione rispetto alla pagina dei provider compatibili con OpenAI dell'AI SDK (29 ottobre 2026). Usa l'interfaccia Chat Completions dell'API CheapTokens, che è quella che parla quel provider.

Installa e crea il provider#

Due pacchetti: il pacchetto core ai e il provider compatibile con OpenAI.

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

L'ordine del lavoro è breve:

Metti in ordine

Metti in ordine la configurazione

  1. Ricarica il saldo e crea una chiave API
  2. Metti la chiave in una variabile d'ambiente
  3. Crea il provider con la baseURL di CheapTokens
  4. Passa l'id completo del modello a generateText

Il provider stesso è una singola chiamata a 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 è solo un'etichetta per i tuoi log. includeUsage: true richiede i conteggi dei token anche nelle risposte in streaming; senza di esso il comportamento predefinito è come false. Chiamare cheaptokens('model-id') ti dà un modello chat; cheaptokens.chatModel('model-id') e cheaptokens.languageModel('model-id') fanno la stessa cosa.

Il percorso di una richiesta: la tua app, createOpenAICompatible, l'API CheapTokens
Il tuo codice continua a chiamare l'AI SDK; cambia solo il provider sottostante

L'id del modello deve essere quello completo: deepseek-ai/DeepSeek-V4-Flash-0731. Un nome breve come deepseek-v4-flash-0731 è quello che vedi nelle tabelle dei prezzi, e l'API non lo accetterà. Se non sei sicuro di cosa digitare, elenca i modelli con GET /v1/models e copia l'id da lì.

generateText: una risposta e il suo conteggio dei token#

Ecco uno script completo. Chiede una risposta breve e stampa sia il testo sia l'oggetto 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);

Eseguilo con npx tsx index.ts. Ottieni la risposta come stringa in result.text, e result.usage contiene i conteggi dei token di input e output per quella chiamata. Stampiamo l'intero oggetto così vedi tutto ciò che contiene. Nel riferimento dell'AI SDK per streamText (verificato il 29 ottobre 2026) usage ha inputTokens, outputTokens e totalTokens; controlla i tipi della tua versione installata prima di collegarli a una dashboard.

Perché preoccuparsi di leggere usage? Perché è il numero che paghi. Supponi che la tua app invii un prompt da 1.500 token e riceva una risposta da 600 token. Quella richiesta costa $0.000083 ai prezzi attuali, e mille di queste sono così:

Modello Per richiesta 1000 richieste OpenRouter, 1000 richieste
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

1500 token di input e 600 token di output per richiesta. I prezzi per 1M di token sono attuali e cambiano insieme alle nostre tariffe; la colonna OpenRouter mostra i prezzi di riferimento per lo stesso carico di lavoro.

La colonna CheapTokens è in totale, input e output insieme, più economica di OpenRouter per ogni modello della tabella. Se vuoi trasformare usage in un budget in corso, tracking agent token cost mostra l'idea in Python; l'aritmetica è la stessa in TypeScript.

streamText: stampa le parole mentre arrivano#

Per una UI di chat vuoi che il testo appaia mentre il modello sta ancora scrivendo. streamText ti dà un iterabile asincrono di chunk di testo.

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);

Nota che non c'è await davanti a streamText(...): restituisce subito e consumi lo stream. usage è una promise che si risolve quando lo stream termina, quindi la attendi dopo il loop. In un route handler Next.js restituiresti lo stream al browser invece di scrivere su stdout; la parte del provider è identica. Se vuoi la stessa cosa con il semplice SDK OpenAI, vedi streaming chat responses in Node.js.

Le risposte lunghe vanno bene qui: DeepSeek-V4-Flash su CheapTokens può scrivere fino a 32.768 token in una risposta, ha una finestra di contesto di 380K e un unico prezzo a qualsiasi ora. La pagina del modello è su /en/cheap-deepseek/, e i prezzi attuali sono sulla pagina dei prezzi.

Cambia il modello senza toccare il resto#

Poiché cambia solo l'id del modello, provare un altro modello è una modifica di una riga. GLM-5.3-Flash ha una finestra di contesto di 390K e risponde fino a 8.192 token; ai prezzi attuali costa $0.02 per 1M token di input e $0.04 per 1M token di output.

Provalo tu stessoProva: quale riga cambi per eseguire lo stesso script su GLM-5.3-Flash?Mostra risposta

Solo l'id del modello: cheaptokens('zai-org/GLM-5.3-Flash'). Il provider, la chiave, la baseURL e il resto dello script restano uguali.

Un pattern utile è tenere l'id in una variabile d'ambiente (process.env.MODEL_ID) così puoi confrontare due modelli sullo stesso prompt senza un rebuild. Il confronto DeepSeek vs GLM vs MiniMax aiuta a scegliere quali vale la pena provare.

Se non funziona#

La maggior parte dei fallimenti è una di tre cose: la chiave, l'URL o l'id del modello.

  • 401 significa che la chiave manca o è sbagliata. Controlla che CHEAPTOKENS_API_KEY sia impostata nella shell che esegue lo script (un server Next.js la richiede in .env.local e un riavvio).
  • 404 di solito significa che la baseURL ha perso il suo /v1 o che l'id del modello è il nome breve. Usa https://api.cheaptokens.dev/v1 e l'id completo.
  • La risposta si interrompe a metà frase. Il modello ha raggiunto un limite di output; la correzione di finish_reason "length" lo spiega.

La spiegazione più lunga delle prime due è in API 401 o 404: chiave, base URL o id del modello sbagliati.

Lista di controllo

Prima di eseguire lo script

Per collegare altri strumenti e la prima richiesta a mano, parti dalla documentazione di CheapTokens.