Powrót do bloga

API i SDKPrzewodnik

Vercel AI SDK z własnym bazowym URL: CheapTokens w TypeScript

Skieruj Vercel AI SDK na CheapTokens przez createOpenAICompatible: działający fragment generateText i streamText, użycie tokenów i poprawki typowych błędów.

Autor: CheapTokens TeamOpublikowano 4 min czytania

Kod Vercel AI SDK z createOpenAICompatible i bazowym URL CheapTokens
Na tej stronie
  1. Instalacja i utworzenie providera
  2. generateText: jedna odpowiedź i jej liczba tokenów
  3. streamText: wypisuj słowa, gdy nadchodzą
  4. Zmień model bez ruszania reszty
  5. Jeśli nie działa

Aby uruchomić Vercel AI SDK na CheapTokens, zainstaluj @ai-sdk/openai-compatible, utwórz provider z baseURL: 'https://api.cheaptokens.dev/v1' i swoim kluczem, a następnie przekaż provider('deepseek-ai/DeepSeek-V4-Flash-0731') jako model. Wszystko inne w Twojej aplikacji, generateText, streamText, Twoje prompty, pozostaje bez zmian.

Jeśli masz już trasę Next.js lub skrypt Node, który komunikuje się z hostowanym modelem przez AI SDK, zmieniasz trzy rzeczy: bazowy URL, klucz i identyfikator modelu. Ten przewodnik weryfikuje konfigurację względem strony providerów zgodnych z OpenAI w AI SDK (29 października 2026). Korzysta z interfejsu Chat Completions API CheapTokens, którym posługuje się ten provider.

Instalacja i utworzenie providera#

Dwa pakiety: podstawowy pakiet ai i provider zgodny z OpenAI.

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

Kolejność pracy jest krótka:

Ustaw w kolejności

Uporządkuj konfigurację

  1. Zasil saldo i utwórz klucz API
  2. Umieść klucz w zmiennej środowiskowej
  3. Utwórz provider z baseURL CheapTokens
  4. Przekaż pełny identyfikator modelu do generateText

Sam provider to jedno wywołanie 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 to tylko etykieta dla Twoich własnych logów. includeUsage: true prosi o liczniki tokenów także w odpowiedziach strumieniowych; bez tego domyślne zachowanie działa jak false. Wywołanie cheaptokens('model-id') daje model czatu; cheaptokens.chatModel('model-id') i cheaptokens.languageModel('model-id') robią to samo.

Ścieżka żądania: Twoja aplikacja, createOpenAICompatible, API CheapTokens
Twój kod nadal wywołuje AI SDK; zmienia się tylko provider pod spodem

Identyfikator modelu musi być pełny: deepseek-ai/DeepSeek-V4-Flash-0731. Krótka nazwa jak deepseek-v4-flash-0731 to ta, którą widzisz w tabelach cen, i API jej nie zaakceptuje. Jeśli nie jesteś pewien, co wpisać, wylistuj modele przez GET /v1/models i skopiuj stamtąd identyfikator.

generateText: jedna odpowiedź i jej liczba tokenów#

Oto kompletny skrypt. Prosi o krótką odpowiedź i wypisuje zarówno tekst, jak i obiekt 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);

Uruchom go przez npx tsx index.ts. Odpowiedź otrzymujesz jako ciąg znaków w result.text, a result.usage zawiera liczbę tokenów wejściowych i wyjściowych dla tego wywołania. Wypisujemy cały obiekt, żebyś zobaczył wszystko, co w nim jest. W dokumentacji AI SDK dla streamText (sprawdzonej 29 października 2026) usage ma inputTokens, outputTokens i totalTokens; sprawdź typy w zainstalowanej wersji, zanim podłączysz je do dashboardu.

Po co w ogóle czytać usage? Bo to jest liczba, za którą płacisz. Załóżmy, że Twoja aplikacja wysyła prompt o 1 500 tokenach i dostaje odpowiedź o 600 tokenach. To żądanie kosztuje $0.000083 przy obecnych cenach, a tysiąc takich wygląda tak:

Model Za żądanie 1000 żądań OpenRouter, 1000 żądań
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ów wejściowych i 600 tokenów wyjściowych na żądanie. Ceny za 1 mln tokenów są aktualne i zmieniają się wraz z naszymi taryfami; kolumna OpenRouter pokazuje ceny referencyjne dla tego samego obciążenia.

Kolumna CheapTokens to suma, wejście i wyjście razem, taniej niż OpenRouter dla każdego modelu w tabeli. Jeśli chcesz zamienić usage w bieżący budżet, śledzenie kosztu tokenów agenta pokazuje ten pomysł w Pythonie; arytmetyka jest taka sama w TypeScript.

streamText: wypisuj słowa, gdy nadchodzą#

W interfejsie czatu chcesz, aby tekst pojawiał się, gdy model jeszcze pisze. streamText daje Ci asynchroniczny iterowalny strumień fragmentów tekstu.

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

Zauważ, że przed streamText(...) nie ma await: zwraca wynik od razu, a Ty konsumujesz strumień. usage to promise, który rozwiązuje się po zakończeniu strumienia, więc awaitujesz go po pętli. W handlerze trasy Next.js zwróciłbyś strumień do przeglądarki zamiast pisać do stdout; część związana z providerem jest identyczna. Jeśli chcesz tego samego z czystym OpenAI SDK, zobacz strumieniowanie odpowiedzi czatu w Node.js.

Długie odpowiedzi są tu w porządku: DeepSeek-V4-Flash na CheapTokens może napisać do 32 768 tokenów w jednej odpowiedzi, ma okno kontekstu 380K i jedną cenę o każdej porze. Strona modelu jest pod /en/cheap-deepseek/, a aktualne ceny na stronie cennika.

Zmień model bez ruszania reszty#

Ponieważ zmienia się tylko identyfikator modelu, wypróbowanie innego modelu to edycja jednej linii. GLM-5.3-Flash ma okno kontekstu 390K i odpowiada do 8 192 tokenów; przy obecnych cenach kosztuje $0.02 za 1M tokenów wejściowych i $0.04 za 1M tokenów wyjściowych.

Spróbuj samSpróbuj: którą linię zmieniasz, aby uruchomić ten sam skrypt na GLM-5.3-Flash?Pokaż odpowiedź

Tylko identyfikator modelu: cheaptokens('zai-org/GLM-5.3-Flash'). Provider, klucz, baseURL i reszta skryptu pozostają bez zmian.

Przydatny wzorzec to trzymanie identyfikatora w zmiennej środowiskowej (process.env.MODEL_ID), dzięki czemu możesz porównać dwa modele na tym samym promptcie bez przebudowy. Porównanie DeepSeek vs GLM vs MiniMax pomaga wybrać, które warto wypróbować.

Jeśli nie działa#

Większość błędów to jedna z trzech rzeczy: klucz, URL lub identyfikator modelu.

  • 401 oznacza, że klucz jest brakujący lub błędny. Sprawdź, czy CHEAPTOKENS_API_KEY jest ustawiony w powłoce, która uruchamia skrypt (serwer Next.js potrzebuje go w .env.local i restartu).
  • 404 zwykle oznacza, że baseURL zgubił /v1 lub identyfikator modelu to krótka nazwa. Użyj https://api.cheaptokens.dev/v1 i pełnego identyfikatora.
  • Odpowiedź urywa się w połowie zdania. Model osiągnął limit wyjścia; poprawka finish_reason "length" to wyjaśnia.

Dłuższy opis dwóch pierwszych przypadków jest w API 401 lub 404: zły klucz, bazowy URL lub identyfikator modelu.

Lista kontrolna

Zanim uruchomisz skrypt

Aby podłączyć inne narzędzia i wykonać pierwsze żądanie ręcznie, zacznij od dokumentacji CheapTokens.