HTTP 400
Проверьте тело JSON и допустимые параметры модели.
Серверный fetch к Chat Completions: переменные окружения, таймаут, Idempotency-Key, проверка HTTP и учёт расхода.
Базовый адрес — https://tokenmost.ru/v1. Создайте ключ в личном кабинете, выберите модель в каталоге и отправьте первый запрос. Методы, которые ещё не доступны, отмечены отдельно.
В Node.js вызывайте https://tokenmost.ru/v1/chat/completions с серверной стороны. Браузерный JavaScript не должен получать API-ключ. Пример выполняет реальный платный запрос и проверяет HTTP-статус до чтения результата.
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 или браузер.
Проверьте тело JSON и допустимые параметры модели.
Проверьте серверную переменную и заголовок Bearer.
Недостаточно баланса или бюджета ключа.
Проверьте путь /v1/chat/completions и точный ID модели.
Соблюдайте Retry-After и ограничьте конкурентные вызовы.
Проверьте историю по операции; при повторе используйте то же тело и Idempotency-Key.