Назад до блогу

API та SDKПосібник

Vercel AI SDK із власним базовим URL: CheapTokens у TypeScript

Спрямуйте Vercel AI SDK на CheapTokens за допомогою createOpenAICompatible: робочі фрагменти generateText і streamText, використання токенів і виправлення типових помилок.

Автор: CheapTokens TeamОпубліковано 4 хв читання

Код Vercel AI SDK із createOpenAICompatible і базовим URL CheapTokens
На цій сторінці
  1. Встановлення та створення провайдера
  2. generateText: одна відповідь і кількість її токенів
  3. streamText: друкуйте слова в міру їх надходження
  4. Змініть модель, не чіпаючи решту
  5. Якщо не працює

Щоб запустити Vercel AI SDK на CheapTokens, встановіть @ai-sdk/openai-compatible, створіть провайдер за допомогою baseURL: 'https://api.cheaptokens.dev/v1' та вашого ключа і передайте provider('deepseek-ai/DeepSeek-V4-Flash-0731') як model. Усе інше у вашому застосунку, generateText, streamText, ваші промпти, залишається без змін.

Тож якщо у вас уже є маршрут Next.js або скрипт Node, який звертається до розміщеної моделі через AI SDK, ви змінюєте три речі: базовий URL, ключ і ідентифікатор моделі. Цей посібник звіряє налаштування зі сторінкою OpenAI-сумісних провайдерів AI SDK (29 жовтня 2026). Він використовує інтерфейс Chat Completions API CheapTokens, яким і спілкується цей провайдер.

Встановлення та створення провайдера#

Два пакети: основний пакет ai і OpenAI-сумісний провайдер.

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

Порядок роботи короткий:

Розставте по порядку

Упорядкуйте налаштування

  1. Поповніть баланс і створіть API-ключ
  2. Помістіть ключ у змінну середовища
  3. Створіть провайдер із baseURL CheapTokens
  4. Передайте повний ідентифікатор моделі в generateText

Сам провайдер — це один виклик 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 — це лише мітка для ваших власних логів. includeUsage: true також запитує кількість токенів у потокових відповідях; без нього типова поведінка еквівалентна false. Виклик cheaptokens('model-id') повертає чат-модель; cheaptokens.chatModel('model-id') і cheaptokens.languageModel('model-id') роблять те саме.

Шлях запиту: ваш застосунок, createOpenAICompatible, API CheapTokens
Ваш код і далі викликає AI SDK; змінюється лише провайдер під ним

Ідентифікатор моделі має бути повним: deepseek-ai/DeepSeek-V4-Flash-0731. Коротка назва на кшталт deepseek-v4-flash-0731 — це те, що ви бачите в таблицях цін, і API її не прийме. Якщо ви не впевнені, що вводити, перелічіть моделі через GET /v1/models і скопіюйте ідентифікатор звідти.

generateText: одна відповідь і кількість її токенів#

Ось повний скрипт. Він просить коротку відповідь і виводить як текст, так і об'єкт 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);

Запустіть його командою npx tsx index.ts. Ви отримаєте відповідь як рядок у result.text, а result.usage містить кількість вхідних і вихідних токенів для цього виклику. Ми виводимо весь об'єкт, щоб ви побачили все, що в ньому є. У довідці AI SDK для streamText (перевірено 29 жовтня 2026) usage має inputTokens, outputTokens і totalTokens; перевірте типи вашої встановленої версії, перш ніж підключати їх до дашборда.

Навіщо взагалі читати usage? Бо саме за це число ви платите. Скажімо, ваш застосунок надсилає промпт на 1 500 токенів і отримує відповідь на 600 токенів. Цей запит коштує $0.000083 за поточними цінами, а тисяча таких виглядає так:

Модель За запит 1 000 запитів OpenRouter, 1 000 запитів
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 вхідних і 600 вихідних токенів на запит. Ціни за 1 млн токенів актуальні та змінюються разом із нашими тарифами; стовпець OpenRouter показує довідкові ціни для того самого навантаження.

Стовпець CheapTokens — це загальна сума, вхідні й вихідні разом, дешевше за OpenRouter для кожної моделі в таблиці. Якщо ви хочете перетворити usage на поточний бюджет, відстеження вартості токенів агента показує ідею на Python; арифметика та сама й у TypeScript.

streamText: друкуйте слова в міру їх надходження#

Для чат-інтерфейсу ви хочете, щоб текст з'являвся, поки модель ще пише. streamText повертає асинхронний ітерований об'єкт із фрагментами тексту.

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

Зверніть увагу, що перед streamText(...) немає await: він повертається одразу, і ви споживаєте потік. usage — це проміс, який завершується, коли потік закінчується, тож ви робите await для нього після циклу. В обробнику маршруту Next.js ви повернули б потік у браузер замість запису в stdout; частина з провайдером ідентична. Якщо ви хочете те саме зі звичайним OpenAI SDK, дивіться потокові відповіді чату в Node.js.

Довгі відповіді тут не проблема: DeepSeek-V4-Flash на CheapTokens може писати до 32 768 токенів в одній відповіді, має контекстне вікно 380K і одну ціну в будь-яку годину. Сторінка моделі — /en/cheap-deepseek/, а поточні ціни — на сторінці цін.

Змініть модель, не чіпаючи решту#

Оскільки змінюється лише ідентифікатор моделі, спроба іншої моделі — це редагування одного рядка. GLM-5.3-Flash має контекстне вікно 390K і відповідає до 8 192 токенів; за поточними цінами він коштує $0.02 за 1M вхідних токенів і $0.04 за 1M вихідних токенів.

Спробуйте саміСпробуйте: який рядок ви зміните, щоб запустити той самий скрипт на GLM-5.3-Flash?Показати відповідь

Лише ідентифікатор моделі: cheaptokens('zai-org/GLM-5.3-Flash'). Провайдер, ключ, baseURL і решта скрипта залишаються тими самими.

Зручний підхід — тримати ідентифікатор у змінній середовища (process.env.MODEL_ID), щоб порівнювати дві моделі на одному промпті без перезбирання. Порівняння DeepSeek vs GLM vs MiniMax допомагає вибрати, які варто спробувати.

Якщо не працює#

Більшість збоїв — це одне з трьох: ключ, URL або ідентифікатор моделі.

  • 401 означає, що ключ відсутній або неправильний. Перевірте, що CHEAPTOKENS_API_KEY встановлено в оболонці, яка запускає скрипт (серверу Next.js він потрібен у .env.local і перезапуск).
  • 404 зазвичай означає, що baseURL втратив /v1 або ідентифікатор моделі — це коротка назва. Використовуйте https://api.cheaptokens.dev/v1 і повний ідентифікатор.
  • Відповідь обривається на півслові. Модель досягла ліміту виводу; виправлення finish_reason "length" це пояснює.

Довший розбір перших двох — у API 401 або 404: неправильний ключ, базовий URL або ідентифікатор моделі.

Чек-лист

Перш ніж запускати скрипт

Щоб підключити інші інструменти й зробити перший запит вручну, почніть із документації CheapTokens.