Назад в блог

API и SDKИнструкция

Vercel AI SDK с другим baseURL: CheapTokens в TypeScript

Подключите Vercel AI SDK к CheapTokens через createOpenAICompatible: рабочий код generateText и streamText, расход токенов и разбор частых ошибок.

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

Код Vercel AI SDK с createOpenAICompatible и base 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, менять нужно три вещи: base URL, ключ и id модели. Настройку мы сверили со страницей AI SDK про OpenAI-compatible провайдеры (29 октября 2026). Берём интерфейс Chat Completions в API CheapTokens — именно на нём работает этот провайдер.

Установка и создание провайдера#

Нужны два пакета: основной ai и провайдер для OpenAI-совместимых API.

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

Порядок действий короткий:

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

Расставьте шаги настройки по порядку

  1. Пополнить баланс и создать API-ключ
  2. Положить ключ в переменную окружения
  3. Создать провайдера с baseURL CheapTokens
  4. Передать полный id модели в 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, меняется только провайдер под ним

Id модели нужен полный: deepseek-ai/DeepSeek-V4-Flash-0731. Короткое имя вроде deepseek-v4-flash-0731 встречается в таблицах цен, а API его не примет. Если не уверены, что вписать, выведите список моделей через GET /v1/models и скопируйте id оттуда.

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 выходных токенов на запрос. Цены за 1M токенов актуальны и меняются вместе с нашими тарифами; столбец 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 — это promise, он выполняется, когда поток закончился, поэтому его ждут после цикла. В роуте Next.js вы бы вернули поток в браузер вместо записи в stdout; часть с провайдером та же. Если нужен тот же приём на обычном OpenAI SDK, смотрите потоковые ответы в Node.js.

Длинные ответы тут не проблема: DeepSeek-V4-Flash в CheapTokens пишет до 32 768 токенов за один ответ, держит контекст 380K и стоит одинаково в любое время суток. Страница модели — /ru/models/, актуальные цены — на странице тарифов.

Другая модель без правок остального кода#

Меняется только id модели, поэтому попробовать другую — правка в одну строку. У GLM-5.3-Flash контекст 390K и ответ до 8 192 токенов; по текущим ценам это $0.02 за 1M входных токенов и $0.04 за 1M выходных.

Попробуйте самиПопробуйте сами: какую строку менять, чтобы запустить тот же скрипт на GLM-5.3-Flash?Показать ответ

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

Удобно хранить id в переменной окружения (process.env.MODEL_ID): тогда две модели можно сравнить на одном промпте без пересборки. Какие стоит пробовать, подскажет сравнение GLM, DeepSeek и MiniMax.

Если не работает#

Почти всегда виноваты ключ, адрес или id модели.

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

Подробнее про первые две ошибки — в статье API 401 или 404: ключ, base URL или id модели.

Чек-лист

Перед запуском скрипта

Чтобы подключить другие инструменты и отправить первый запрос вручную, начните с документации CheapTokens.