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-v4-flash",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-v4-flash",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.5",messages: [{ role: "user", content: "Какая погода в Москве?" }],tools,});console.log(resp.choices[0].message.tool_calls);Обработка ошибок
401— неверный или отозванный ключ: проверьте значение и что ключ активен в кабинете.402— нужна оплата: пуст баланс, исчерпана месячная квота, модель не входит в тариф, либо сработал лимит самого ключа (список моделей, потолок расхода, срок действия). Пополните баланс, смените тариф либо проверьте настройки ключа.429— превышен лимит запросов в минуту: снизьте темп и повторите с экспоненциальной паузой.5xx— сбой апстрима: шлюз сам повторяет запрос, резервные провайдеры модели подставляет апстрим, но свой retry с экспоненциальной паузой в проде не помешает.
import OpenAI from "openai";try {const resp = await client.chat.completions.create({model: "deepseek/deepseek-v4-flash",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;}}Какую модель выбрать
Частые вопросы
Работает ли SDK в браузере или только на сервере?
SDK предназначен для сервера (Node.js, Deno, Bun): ключ не должен попадать в клиентский бандл. Для браузерных приложений проксируйте запросы через свой бэкенд.
Поддерживаются ли Vercel AI SDK и LangChain.js?
Да — оба принимают кастомный baseURL и ключ AI Gateway. Для LangChain готовая инструкция: LangChain.
Есть ли типы для ответов и стриминга?
Да, пакет openai написан на TypeScript и поставляет полные типы — автодополнение работает для параметров запроса, чанков стрима и tool_calls.