Slack-бот на Heli — это небольшой сервис на Node.js: Slack присылает событие, когда бота упомянули, сервис отправляет текст в Heli API и отвечает в треде. Ключ sk-heli- хранится только на сервере и не попадает в Slack. Ключ создаётся во вкладке «Ключи» после регистрации на getheli.ru.
Создайте приложение Slack
Socket Mode удобен тем, что не нужен публичный HTTPS-адрес: приложение само открывает WebSocket-соединение со Slack. Для публикации в Slack Marketplace этот режим не подходит — там нужен HTTP-режим с Request URL.
- На api.slack.com/apps создайте приложение (From scratch) и выберите рабочее пространство.
- В разделе Socket Mode включите режим и создайте app-level токен со scope connections:write — это токен xapp-.
- В OAuth & Permissions добавьте bot token scopes app_mentions:read и chat:write.
- В Event Subscriptions включите события и подпишитесь на bot event app_mention.
- Установите приложение в workspace и скопируйте Bot User OAuth Token (xoxb-).
Код бота
Bolt for JavaScript принимает события Slack, а официальный SDK openai отправляет запрос в Heli: меняется только baseURL. Токены и ключ передаются через переменные окружения SLACK_BOT_TOKEN, SLACK_APP_TOKEN и HELI_API_KEY.
npm install @slack/bolt openai
// app.js
const { App } = require("@slack/bolt");
const { OpenAI } = require("openai");
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
appToken: process.env.SLACK_APP_TOKEN,
socketMode: true,
});
const heli = new OpenAI({
apiKey: process.env.HELI_API_KEY,
baseURL: "https://getheli.ru/v1",
});
app.event("app_mention", async ({ event, say }) => {
const question = event.text.replace(/<@[A-Z0-9]+>/g, "").trim();
const thread_ts = event.thread_ts ?? event.ts;
try {
const res = await heli.chat.completions.create({
model: "openai/gpt-5.4-mini",
messages: [
{ role: "system", content: "Ты помощник команды. Отвечай кратко, по-русски." },
{ role: "user", content: question },
],
max_tokens: 800,
});
await say({ text: res.choices[0].message.content || "Пустой ответ", thread_ts });
} catch (err) {
console.error(err);
await say({ text: "Не получилось получить ответ, попробуйте позже.", thread_ts });
}
});
(async () => {
await app.start();
console.log("Slack-бот запущен");
})();Как это работает
- Событие app_mention приходит, когда бота упоминают в канале, куда его добавили командой /invite.
- thread_ts = event.thread_ts ?? event.ts: если бота упомянули в треде, ответ придёт туда же, если в канале — бот начнёт тред под сообщением.
- Bolt подтверждает получение событий сам. Для slash-команд и кнопок нужно вызвать ack() в течение трёх секунд, а ответ модели отправлять уже после.
- Бот видит только текст упоминания. Чтобы учитывать историю треда, получите её методом conversations.replies — понадобится scope channels:history, а для приватных каналов groups:history.
Запуск и безопасность
Socket Mode требует постоянно работающего процесса: запускайте бота на VPS или в контейнере под pm2, systemd или Docker с автоперезапуском. Токены Slack и ключ Heli не коммитьте в репозиторий.
Всё, что пишут боту, уходит в выбранную модель, поэтому договоритесь в команде, какие данные можно отправлять. Для ключа бота во вкладке «Лимиты» кабинета Heli задайте бюджет на день или месяц, список разрешённых моделей и лимит запросов в минуту.
Попробуйте Heli
Ключ sk-heli- появляется после подтверждения почты. Через Google и Яндекс — сразу в кабинете.