Slack-бот на Heli API: Bolt for JavaScript и Socket Mode

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.

code
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-бот запущен");
})();

Heli в Node.js и TypeScript

Как это работает

  • Событие 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 и Яндекс — сразу в кабинете.

Документация API · Модели и цены

Читайте также