Доступно

JavaScript и Node.js: вызов API Токенмоста

Серверный fetch к Chat Completions: переменные окружения, таймаут, Idempotency-Key, проверка HTTP и учёт расхода.

API Токенмоста работает

Базовый адрес — https://tokenmost.ru/v1. Создайте ключ в личном кабинете, выберите модель в каталоге и отправьте первый запрос. Методы, которые ещё не доступны, отмечены отдельно.

Как это устроено

В Node.js вызывайте https://tokenmost.ru/v1/chat/completions с серверной стороны. Браузерный JavaScript не должен получать API-ключ. Пример выполняет реальный платный запрос и проверяет HTTP-статус до чтения результата.

Что потребуется

  • Node.js с глобальным fetch и серверный процесс, в котором доступно окружение.
  • Положительный баланс и отдельный ключ с тестовым бюджетом и RPM.
  • Точный ID текстовой модели, доступной через Chat Completions.

Порядок работы

  1. Задайте TOKENMOST_API_KEY и TOKENMOST_MODEL в окружении сервера.
  2. Сохраните код в first-request.mjs и запустите node first-request.mjs.
  3. Проверьте HTTP 200, текст choices[0].message.content и usage.
  4. Сверьте списание в кабинете; не отправляйте секрет в клиентский bundle.
  5. Для сетевого повтора сохраняйте тело и Idempotency-Key, добавьте ограничение параллельности и обработку 429.

Готовая конфигурация

first-request.mjs

import { randomUUID } from "node:crypto";

const key = process.env.TOKENMOST_API_KEY;
const model = process.env.TOKENMOST_MODEL;
if (!key || !model) throw new Error("Задайте TOKENMOST_API_KEY и TOKENMOST_MODEL");
const operationId = randomUUID(); // сохраните для безопасного сетевого повтора
const body = JSON.stringify({
  model,
  messages: [{ role: "user", content: "Ответь одним словом: работает" }],
  max_tokens: 32,
});
let response;
try {
  response = await fetch("https://tokenmost.ru/v1/chat/completions", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${key}`,
      "Content-Type": "application/json",
      "Idempotency-Key": operationId,
    },
    body,
    signal: AbortSignal.timeout(20_000),
  });
} catch {
  throw new Error(`Неопределённый исход. Проверьте историю: ${operationId}`);
}
const result = await response.json();
if (!response.ok) throw new Error(`HTTP ${response.status}: ${JSON.stringify(result)}`);
console.log(result.choices?.[0]?.message?.content);
console.log("usage:", result.usage);

Пример запроса

Укажите TOKENMOST_BASE_URL=https://tokenmost.ru/v1, ключ проекта и точный ID модели из каталога. Пример отправляет запрос в публичный API и может списать средства с баланса по тарифу модели.

// Node.js, только серверная часть приложения
const response = await fetch(
  process.env.TOKENMOST_BASE_URL.replace(/\/$/, "") + "/chat/completions",
  {
    method: "POST",
    signal: AbortSignal.timeout(60000),
    headers: {
      Authorization: "Bearer " + process.env.TOKENMOST_API_KEY,
      "Content-Type": "application/json",
      "Idempotency-Key": crypto.randomUUID(),
    },
    body: JSON.stringify({
      model: process.env.TOKENMOST_MODEL,
      messages: [{ role: "user", content: "Что такое API?" }],
      max_tokens: 128,
    }),
  },
);
if (!response.ok) throw new Error("HTTP " + response.status);
const result = await response.json();
console.log(result.choices[0].message.content);

Что учесть

Этот пример предназначен для Node.js. Для сайта создайте свой серверный маршрут с проверкой пользователя и лимитами, а не вызывайте Токенмост напрямую из браузера.

Ожидаемый результат

Сервер получит HTTP 200, текст choices[0].message.content и usage. Проверьте запись и списание в истории. Если content пуст, проверьте тип ответа и модель.

Таймаут и идемпотентность

AbortSignal.timeout отменяет ожидание клиента, но не доказывает отмену работы поставщика. При неизвестном исходе сохраняйте исходные тело и Idempotency-Key. Новый ключ означает новую операцию.

Расходы и секрет

Начните с короткого ответа и отдельного бюджета ключа. История сообщений входит во входные токены. Секрет остаётся в серверном окружении и никогда не попадает в React или браузер.

Ошибки и диагностика

HTTP 400

Проверьте тело JSON и допустимые параметры модели.

HTTP 401

Проверьте серверную переменную и заголовок Bearer.

HTTP 402

Недостаточно баланса или бюджета ключа.

HTTP 404

Проверьте путь /v1/chat/completions и точный ID модели.

HTTP 429

Соблюдайте Retry-After и ограничьте конкурентные вызовы.

Timeout или HTTP 503

Проверьте историю по операции; при повторе используйте то же тело и Idempotency-Key.

Источники и связанные инструкции

Читайте дальше

← Все инструкции