AI-модели в JavaScript и TypeScript через AI Gateway — SDK OpenAI
AI Gateway полностью совместим с официальным JavaScript-SDK OpenAI: меняются только baseURL и ключ, весь остальной код — как в документации OpenAI. Один клиент даёт доступ ко всем моделям каталога — Claude, GPT, Gemini, DeepSeek — сменой параметра model. Пакет работает и в Node.js, и в Deno, и в Bun, а типы TypeScript идут из коробки.
Установка
npm install openaiПервый запрос
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://ai-gatewey.ru/v1",
apiKey: process.env.OPENAI_API_KEY, // sk-aigate-ваш_ключ
});
const resp = await client.chat.completions.create({
model: "deepseek/deepseek-chat",
messages: [{ role: "user", content: "Привет!" }],
});
console.log(resp.choices[0].message.content);OPENAI_API_KEY подхватывается SDK автоматически), а не в коде — тогда apiKey можно не передавать вовсе. В браузере ключ не размещайте: SDK кинет ошибку без явного разрешения, потому что клиентский код видят все.Стриминг
Ответ частями через Server-Sent Events — параметр stream: true превращает вызов в асинхронный итератор, который перебирают через for await:
const stream = await client.chat.completions.create({
model: "deepseek/deepseek-chat",
messages: [{ role: "user", content: "Расскажи о токенах" }],
stream: true,
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}Function calling
Вызов инструментов работает прозрачно — выбирайте модель с поддержкой function calling (бейдж «инструменты» в каталоге). Модель возвращает tool_calls, которые нужно исполнить и отправить результат обратно:
const tools = [
{
type: "function" as const,
function: {
name: "get_weather",
description: "Погода в городе",
parameters: {
type: "object",
properties: { city: { type: "string" } },
required: ["city"],
},
},
},
];
const resp = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
messages: [{ role: "user", content: "Какая погода в Москве?" }],
tools,
});
console.log(resp.choices[0].message.tool_calls);Обработка ошибок
401— неверный или отозванный ключ: проверьте значение и что ключ активен в кабинете.403— модель сверх тарифа при пустом балансе: пополните баланс или выберите модель тарифа.429— исчерпана квота или RPM-лимит ключа: дождитесь окна, поднимите лимит или тариф.5xx— сбой апстрима: шлюз сам ретраит и переключает провайдера, но свой retry с экспоненциальной паузой в проде не помешает.
import OpenAI from "openai";
try {
const resp = await client.chat.completions.create({
model: "deepseek/deepseek-chat",
messages: [{ role: "user", content: "Привет!" }],
});
} catch (err) {
if (err instanceof OpenAI.RateLimitError) {
// квота/RPM: подождать и повторить
} else if (err instanceof OpenAI.APIError) {
console.error(err.status, err.message);
} else {
throw err;
}
}Какую модель выбрать
| Модель | Ввод, ₽/1М | Вывод, ₽/1М | Контекст |
|---|---|---|---|
| DeepSeek: DeepSeek V3 | 31 | 125 | 128K |
| Anthropic: Claude Sonnet 5 | 314 | 1 568 | 1M |
| OpenAI: GPT-5.4 Mini | 118 | 705 | 400K |
Частые вопросы
Работает ли SDK в браузере или только на сервере?
SDK предназначен для сервера (Node.js, Deno, Bun): ключ не должен попадать в клиентский бандл. Для браузерных приложений проксируйте запросы через свой бэкенд.
Поддерживаются ли Vercel AI SDK и LangChain.js?
Да — оба принимают кастомный baseURL и ключ AI Gateway. Для LangChain готовая инструкция: LangChain.
Есть ли типы для ответов и стриминга?
Да, пакет openai написан на TypeScript и поставляет полные типы — автодополнение работает для параметров запроса, чанков стрима и tool_calls.
Node.js-приложение с AI — за пять минут
Получить ключ