BotHelp
Подключение Hubris к BotHelp — конструктору чат-ботов для Telegram, ВКонтакте и WhatsApp. Бот ведёт диалог с моделью и помнит последние реплики разговора.
BotHelp — российский конструктор чат-ботов и автоворонок: сценарий собирается шагами на холсте, боты работают в Telegram, ВКонтакте, Одноклассниках и WhatsApp. Готовой интеграции с Hubris в списке сервисов нет, и она не нужна: среди действий шага есть «Внешний запрос», через него бот обращается к нашему API напрямую.
На этой странице собирается бот, который ведёт настоящий диалог: отвечает на то, что написал человек, и помнит три последних хода разговора.
Требования
Блок «Внешний запрос» существует только внутри конструктора бота, а бот не создаётся без подключённого канала. Для Telegram это значит, что сначала нужен токен бота от @BotFather.
Подключение канала
«Настройки» → «Каналы» → «ДОБАВИТЬ НОВЫЙ КАНАЛ» → тип «Telegram» → поле «Telegram токен» → «ДОБАВИТЬ КАНАЛ».
Отдельной формы «сменить токен у канала» в BotHelp нет. Если вы перевыпустили токен в BotFather, старый канал становится нерабочим: добавьте канал заново с новым токеном и перепривяжите к нему бота через ⚙ «Настройки» → «Выберите канал».
Как устроен диалог
Модель не помнит прошлые запросы: память разговора — это история реплик, которую бот каждый раз присылает заново в массиве messages, по очереди с ролями user и assistant. Бот хранит последние три хода в настраиваемых полях и после каждого ответа сдвигает их на одну позицию.
Сценарий из шести шагов:
- Старт — запуск по кнопке «Начать».
- Сброс памяти — очищает поля истории, чтобы
/startначинал разговор заново. - Приветствие — карточка «Вопрос», сохраняет текст человека в поле.
- Запрос к Hubris — «Внешний запрос», ответ модели пишется в поле.
- Сдвиг истории — шаг «Формула».
- Ответ — карточка «Вопрос», текстом которой служит ответ модели. Она ждёт следующее сообщение и возвращает бота на шаг 4.
1. Настраиваемые поля
«Настройки» → «Настраиваемые поля» → «ДОБАВИТЬ НОВОЕ ПОЛЕ», тип «Текст», восемь полей:
| Поле | Что хранит |
|---|---|
user_question | текущее сообщение человека |
gpt_answer | последний ответ модели |
u1, a1 | предыдущий ход: реплика человека и ответ модели |
u2, a2 | ход до него |
u3, a3 | самый старый ход в памяти |
Поля создаются до настройки сценария: в списках выбора показываются только существующие поля, а поиск по несуществующему имени выдаёт «Не найдено».
2. Бот и сброс памяти
«Боты» → «НОВЫЙ БОТ» → тип «Телеграм» → задайте название и выберите канал → «СОЗДАТЬ БОТА».
У стартового шага нажмите «ДОБАВИТЬ ДЕЙСТВИЕ» → «Действия с полями/переменными» → «Очистить поле». Повторите для u1, a1, u2, a2, u3, a3.
3. Приветствие
Следующий шаг — сообщение с карточкой «ВОПРОС». Текст приветствия:
Здравствуйте! Я ассистент на Hubris. Спрашивайте — я помню несколько последних реплик разговора. Чтобы начать заново, отправьте /start.В настройке «Сохранить в поле» выберите user_question.
Макроса «текст последнего сообщения» в BotHelp нет, и триггера «любое текстовое сообщение» тоже. Текст человека попадает в поле только через карточку «Вопрос», а отвечать на каждое сообщение подряд бот начинает благодаря циклу: пока он стоит на такой карточке, он принимает любой текст.
4. Запрос к Hubris
Следующий шаг: «ДОБАВИТЬ ДЕЙСТВИЕ» → «Внешний запрос».
| Поле | Значение |
|---|---|
| Тип запроса | POST |
| URL-адрес | https://api.hubris.pw/v1/chat/completions |
Вкладка «Заголовки», кнопка «ДОБАВИТЬ ЗАГОЛОВОК»:
| Key | Value |
|---|---|
Authorization | Bearer sk-gw-ваш-ключ |
Content-Type | application/json |
X-Title | BotHelp |
Вкладка «Тело»:
{
"model": "anthropic/claude-haiku-4.5",
"max_tokens": 500,
"messages": [
{ "role": "system", "content": "Ты — дружелюбный ассистент. Отвечай по-русски, кратко. Перед текущим вопросом идут предыдущие реплики диалога — опирайся на них." },
{ "role": "user", "content": "{%u3%}" },
{ "role": "assistant", "content": "{%a3%}" },
{ "role": "user", "content": "{%u2%}" },
{ "role": "assistant", "content": "{%a2%}" },
{ "role": "user", "content": "{%u1%}" },
{ "role": "assistant", "content": "{%a1%}" },
{ "role": "user", "content": "{%user_question%}" }
]
}Вкладка «Сопоставление ответов», кнопка «ДОБАВИТЬ СОПОСТАВЛЕНИЕ»:
| JSON Path | Пользовательское поле |
|---|---|
$.choices.0.message.content | gpt_answer |
Сохраните оба уровня: «СОХРАНИТЬ» в диалоге запроса, затем «СОХРАНИТЬ И ЗАКРЫТЬ» на панели шага. Иначе настройки сбрасываются.
Адрес — именно api.hubris.pw, с api. в начале и /v1 в пути. Домен hubris.pw — это сайт и личный кабинет, запросы к API он не обслуживает.
5. Сдвиг истории
Кнопка «+» внизу конструктора → «Формула» → «ДОБАВИТЬ ВЫЧИСЛЕНИЯ»:
client.u3 = if(is_null(client.u2), "", client.u2)
client.a3 = if(is_null(client.a2), "", client.a2)
client.u2 = if(is_null(client.u1), "", client.u1)
client.a2 = if(is_null(client.a1), "", client.a1)
client.u1 = client.user_question
client.a1 = client.gpt_answerПорядок строк важен: сдвиг идёт с конца, иначе одно значение перетрёт все позиции. Проверки is_null нужны на первых ходах, пока поля пустые: при ошибке в строке формула останавливается и дальше не выполняется.
6. Ответ и цикл
Следующий шаг — сообщение с карточкой «ВОПРОС», текст:
{%gpt_answer%}В «Сохранить в поле» выберите user_question, а переходом шага укажите шаг «Запрос к Hubris». Проверьте, что все шаги соединены стрелками на холсте, и нажмите «АКТИВИРОВАТЬ».
Бот отправляет только ответ модели и ждёт следующего сообщения. Отдельная карточка с приглашением «Напишите вопрос» в цикле не нужна: она повторялась бы после каждого ответа.
На чём теряется время
JSON Path пишется в синтаксисе BotHelp. Нужен префикс $., а индекс массива ставится через точку: $.choices.0.message.content. Запись choices[0].message.content, привычную по другим платформам, движок молча не распознаёт, и бот отправляет пустой ответ без всякой ошибки.
«Установить поле» записывает только константу. Макрос в значении не подставляется: вместо текста в поле ляжет строка {%user_question%}. Скопировать одно поле в другое можно только шагом «Формула», поля в нём доступны с префиксом client..
Кнопка «ПРОТЕСТИРОВАТЬ ЗАПРОС» проверяет только транспорт. Она показывает код и тело ответа, но не значения, извлечённые в поля, и не то, подключён ли шаг к сценарию. «200 OK» здесь не гарантирует ни ответа в чате, ни записи в поле: это проверяется живым сообщением боту и карточкой подписчика.
Экранировать текст вручную не нужно. Кавычки и переносы строк в сообщении человека BotHelp экранирует сам при подстановке макроса в JSON, запрос не ломается. Пустые поля истории на первом ходу запрос тоже не ломают.
Таймаута и журнала ошибок шага в интерфейсе нет. Дошёл ли запрос, видно в логах Hubris: заголовок X-Title подписывает вызовы именем BotHelp, а растущее от хода к ходу число входных токенов показывает, что история действительно передаётся.
Глубина памяти и расходы
- В запрос всегда уходят системная инструкция, три прошлых хода и текущий вопрос, поэтому стоимость запроса не растёт бесконечно. Глубина меняется добавлением пар полей
u4/a4и строк сдвига в формуле. У формулы есть лимит: до 50 строк и 5000 символов. - Заведите под бота отдельный ключ с дневным лимитом — ошибка в сценарии не съест весь баланс.
- У моделей с размышлением закладывайте запас
max_tokens: при жёстком лимите весь бюджет уходит в размышление, и вcontentприходит пустая строка. Отключить размышление можно параметром"reasoning_effort": "none".
Выбор моделей
| ID | Когда подходит |
|---|---|
anthropic/claude-haiku-4.5 | быстрые ответы в диалоге, аккуратный русский |
google/gemini-3.7-flash | дешёвые массовые сценарии |
deepseek/deepseek-v4-flash | самая низкая цена на простых ответах |
anthropic/claude-sonnet-5 | сложные консультации, длинный контекст |
ID берите из каталога целиком, вместе с вендором. Каталог открыт без ключа: api.hubris.pw/v1/models.
Решение проблем
Бот отправляет пустой ответ
Значение не извлеклось. Проверьте синтаксис пути $.choices.0.message.content, сохранение на обоих уровнях и то, что шаг с запросом соединён со сценарием.
Бот не помнит прошлые реплики
Посмотрите карточку подписчика. Если в полях u1–a3 лежит текст вида {%user_question%}, история пишется действием «Установить поле» — замените его шагом «Формула». Если поля пустые, проверьте, что формула стоит между запросом и ответом и что в ней есть проверки is_null.
Бот отвечает один раз и замолкает
Шаг ответа должен быть карточкой «Вопрос» с переходом обратно на шаг запроса. Обычное текстовое сообщение не ждёт ответа человека, и сценарий на нём заканчивается.
Бот отправляет {%gpt_answer%} текстом
Поля с таким именем не существует. Создайте его в «Настройки» → «Настраиваемые поля» и заново выберите в сопоставлении.
Ошибка авторизации
Ключ неверный или отозван. Он начинается на sk-gw-, без пробелов по краям; целиком виден только при создании. Новый — в разделе «Ключи».
Ошибка про модель
ID должен совпадать с каталожным символ в символ, вместе с вендором перед косой чертой. Короткие имена без вендора и имена с датой на конце мы не принимаем.
Ошибка про недостаточный баланс
Пополните баланс в кабинете — от 300 ₽, через СБП, банковской картой или по счёту для юридических лиц.
Проверено 11 сентября 2026 живым диалогом в Telegram-боте на BotHelp: бот отвечал на вопросы подряд с опорой на предыдущие реплики, размер запроса рос от хода к ходу. Память на три хода проверена тестовыми данными в самом BotHelp.Что дальше
- Каталог моделей — ID для поля
model. - Управление ключами — отдельный ключ с лимитом под бота.
- Логи — как назвать бота в колонке «Приложение».
- Chat Completions — полный справочник по запросу.
Обновлено: