~ 8-9 минут
Как сделать бота в MAX с GigaChat: простой пример на JavaScript
170
03.05.2026
Разбираемся, как связать чат-бота MAX с GigaChat API на Node.js: подготовка бота, переменные окружения, обработка сообщений, запрос к модели и отправка ответа пользователю.


Содержание
Раньше бот часто был набором кнопок и заранее написанных сценариев: нажал кнопку, получил ответ, перешел на следующий шаг. Для многих задач этого хватало, особенно если нужно было просто принять заявку или показать FAQ.
Но в реальной поддержке или продажах пользователь редко идет строго по сценарию. Он может написать "а сколько стоит?", "а можно завтра?", "а если у меня уже есть сайт?" - и вот тут обычное дерево кнопок начинает быстро разрастаться.
Когда к боту подключается языковая модель, сценарий становится намного гибче. Пользователь пишет вопрос обычным языком, а бот уже пробует понять контекст и дать нормальный ответ.
Например, для небольшой студии такой бот может закрывать первые вопросы по услугам: что входит в разработку сайта, сколько примерно занимает MVP, какие материалы нужны для старта. Не финально продавать за человека, а хотя бы не оставлять пользователя без ответа вечером или в выходной.
В этой статье разберем простой пример: бот в MAX принимает сообщение пользователя, отправляет текст в GigaChat и возвращает ответ обратно в чат.
Если вам нужен не только кодовый пример, а бизнес-разбор сценариев, можно отдельно посмотреть статью о GigaChat для бизнеса: там больше про заявки, поддержку, базу знаний, MVP и внедрение.
Не будем сразу строить сложную систему с базой данных, CRM, историей диалога и админкой. Я бы в такой задаче сначала проверил самый простой поток:
пользователь -> MAX bot -> Node.js приложение -> GigaChat API -> MAX bot -> пользователь
Если он работает, уже можно спокойно добавлять память, роли, ограничения, интеграции и нормальную production-архитектуру.
Что понадобится
Для базового примера нам нужно совсем немного:
- бот в MAX;
- токен бота MAX;
- ключ авторизации GigaChat API;
- Node.js;
- библиотека
@maxhub/max-bot-api; - SDK
gigachat; - файл
.envдля секретов.
Здесь есть важный организационный момент, который лучше не пропускать.
По документации MAX, подключение к платформе для партнеров и создание чат-ботов доступно для юрлиц и ИП, которые являются резидентами РФ. Также для создания бота нужен верифицированный профиль организации на платформе MAX для партнеров.
То есть это не совсем история "за 2 минуты создал любого бота с личного аккаунта". Сначала нужно пройти организационную часть, создать бота, дождаться модерации и получить токен. Лучше заложить это в сроки заранее, чтобы потом не удивляться: код уже готов, а проверить его на реальном боте еще нельзя.
Как работает бот в MAX
MAX Bot API позволяет боту взаимодействовать с платформой через HTTPS-запросы. Если говорить проще, ваше приложение слушает события от MAX и отвечает обратно от имени бота.
Через API бот получает обновления от пользователей, отправляет сообщения, работает с чатами, кнопками, вложениями и другими объектами.
В документации MAX отдельно указано, что токен нужно передавать через заголовок:
Authorization: <token>
Передавать токен через query-параметры больше не нужно.
Также есть два способа получать уведомления о действиях пользователей:
- Long Polling - удобно для разработки и тестирования;
- Webhook - вариант для production.
Использовать оба режима одновременно нельзя, поэтому на старте лучше не усложнять. Для локальной разработки Long Polling обычно проще: запустили процесс, бот слушает обновления, можно проверять логи и быстро менять код. Для первого прототипа этого более чем достаточно.
Можно ходить в REST API напрямую через fetch, но для первого проекта я бы не усложнял. Если пишете на JavaScript или TypeScript, MAX рекомендует использовать официальную библиотеку @maxhub/max-bot-api. Она дает класс Bot, обработчики команд, входящих сообщений, callback-кнопок и методы для отправки ответов.
Создаем проект
Создадим папку и установим зависимости:
mkdir max-gigachat-bot cd max-gigachat-bot npm init -y npm install @maxhub/max-bot-api gigachat dotenv
Чтобы использовать import, добавим в package.json поле type и простой script:
{ "type": "module", "scripts": { "dev": "node --watch bot.js", "start": "node bot.js" } }
node --watch удобен для разработки: поменяли код, сервер перезапустился. Не главная магия в мире, но когда вы десятый раз правите обработчик сообщения, это уже начинает радовать.
Настраиваем переменные окружения
Создадим файл .env:
MAX_BOT_TOKEN=ваш_токен_бота_max GIGACHAT_CREDENTIALS=ваш_ключ_авторизации_gigachat GIGACHAT_SCOPE=GIGACHAT_API_PERS GIGACHAT_MODEL=GigaChat
И сразу добавим .env в .gitignore:
.env
На этом месте лучше не торопиться и не оставлять "потом разберусь".
Токен MAX - это прямой доступ к управлению ботом. Ключ GigaChat - это доступ к генерации через API. Такие вещи нельзя хранить в публичном репозитории, отправлять в чат команды или вставлять в примеры кода без замены.
Подключаем GigaChat
По документации SDK GigaChat для JS устанавливается пакетом gigachat, а объект создается с параметрами credentials, scope и model.
Сделаем отдельный файл gigachat.js. Так код бота останется читаемым, а всю работу с моделью можно будет потом отдельно расширять:
import GigaChat from 'gigachat' const giga = new GigaChat({ credentials: process.env.GIGACHAT_CREDENTIALS, scope: process.env.GIGACHAT_SCOPE || 'GIGACHAT_API_PERS', model: process.env.GIGACHAT_MODEL || 'GigaChat' }) export async function askGigaChat(userText) { const response = await giga.chat({ messages: [ { role: 'system', content: [ 'Ты помощник компании в чат-боте MAX.', 'Отвечай кратко, понятно и по делу.', 'Если вопрос неясный, задай один уточняющий вопрос.', 'Не выдумывай факты, цены и сроки, если их нет в сообщении пользователя.' ].join(' ') }, { role: 'user', content: userText } ] }) return response.choices[0]?.message?.content || 'Не получилось подготовить ответ.' }
Здесь уже появляется первая важная настройка - system-сообщение.
Без него модель будет отвечать слишком свободно. А для бота обычно нужно задать рамки: кто он, как отвечает, что делать при неопределенности и чего не нужно придумывать.
Я бы не пропускал этот шаг даже в тестовом проекте. Потом именно такие мелочи определяют, будет бот похож на помощника или на случайный генератор ответов.
Если бот нужен для конкретной компании, в system-сообщение можно добавить тон общения, список услуг, ограничения по темам и правило "если не уверен - предложи связаться с менеджером". Это часто полезнее, чем пытаться сделать один универсальный промпт на все случаи.
Пишем бота MAX
Теперь создадим bot.js:
import 'dotenv/config' import { Bot } from '@maxhub/max-bot-api' import { askGigaChat } from './gigachat.js' const bot = new Bot(process.env.MAX_BOT_TOKEN) bot.command('start', async (ctx) => { await ctx.reply( 'Привет! Напишите вопрос, а я попробую ответить с помощью GigaChat.' ) }) bot.hears('ping', async (ctx) => { await ctx.reply('pong') }) bot.on('message_created', async (ctx) => { const text = ctx.message?.body?.text?.trim() if (!text) { return ctx.reply('Пока я умею отвечать только на текстовые сообщения.') } if (text.startsWith('/')) { return } try { await ctx.reply('Думаю над ответом...') const answer = await askGigaChat(text) await ctx.reply(limitMaxMessage(answer), { link: { type: 'reply', mid: ctx.message.body.mid } }) } catch (error) { console.error(error) await ctx.reply('Что-то пошло не так. Попробуйте повторить запрос чуть позже.') } }) function limitMaxMessage(text) { const limit = 3900 if (text.length <= limit) { return text } return `${text.slice(0, limit)}\n\nОтвет получился длинным, поэтому я его сократил.` } bot.start()
Тут уже есть минимальный рабочий бот. Он пока простой, но это как раз хорошо:
bot.command('start')отвечает на команду/start;bot.hears('ping')нужен для простой проверки, что бот вообще живой;bot.on('message_created')ловит обычные сообщения;- текст пользователя отправляется в
askGigaChat; - ответ возвращается через
ctx.reply; - длинный ответ заранее обрезается.
Отдельный момент про limitMaxMessage.
Почему я поставил лимит 3900, если в методе отправки сообщений MAX у текста указан лимит до 4000 символов?
Потому что лучше оставить небольшой запас. В реальных проектах могут добавиться подписи, ссылки, служебные фразы или форматирование. Если каждый раз упираться ровно в лимит, такие мелочи быстро начинают ломать отправку.
Позже лучше сделать нормальное разбиение длинных ответов на несколько сообщений. Но для первого прототипа мягко обрезать ответ проще и безопаснее.
Запускаем локально
Запускаем:
npm run dev
Проверяем в MAX:
/start
Потом:
ping
И уже после этого обычный вопрос:
Расскажи простыми словами, чем API отличается от webhook
Если все настроено правильно, бот примет сообщение, отправит его в GigaChat и вернет ответ в чат.
Я бы проверял именно в таком порядке: сначала /start, потом ping, и только потом GigaChat. Так проще понят