hubris

BotHelp

Подключение Hubris к BotHelp — конструктору чат-ботов для Telegram, ВКонтакте и WhatsApp. Бот ведёт диалог с моделью и помнит последние реплики разговора.

BotHelp — российский конструктор чат-ботов и автоворонок: сценарий собирается шагами на холсте, боты работают в Telegram, ВКонтакте, Одноклассниках и WhatsApp. Готовой интеграции с Hubris в списке сервисов нет, и она не нужна: среди действий шага есть «Внешний запрос», через него бот обращается к нашему API напрямую.

На этой странице собирается бот, который ведёт настоящий диалог: отвечает на то, что написал человек, и помнит три последних хода разговора.

Требования

Блок «Внешний запрос» существует только внутри конструктора бота, а бот не создаётся без подключённого канала. Для Telegram это значит, что сначала нужен токен бота от @BotFather.

Подключение канала

«Настройки» → «Каналы» → «ДОБАВИТЬ НОВЫЙ КАНАЛ» → тип «Telegram» → поле «Telegram токен»«ДОБАВИТЬ КАНАЛ».

Отдельной формы «сменить токен у канала» в BotHelp нет. Если вы перевыпустили токен в BotFather, старый канал становится нерабочим: добавьте канал заново с новым токеном и перепривяжите к нему бота через ⚙ «Настройки» → «Выберите канал».

Как устроен диалог

Модель не помнит прошлые запросы: память разговора — это история реплик, которую бот каждый раз присылает заново в массиве messages, по очереди с ролями user и assistant. Бот хранит последние три хода в настраиваемых полях и после каждого ответа сдвигает их на одну позицию.

Сценарий из шести шагов:

  1. Старт — запуск по кнопке «Начать».
  2. Сброс памяти — очищает поля истории, чтобы /start начинал разговор заново.
  3. Приветствие — карточка «Вопрос», сохраняет текст человека в поле.
  4. Запрос к Hubris — «Внешний запрос», ответ модели пишется в поле.
  5. Сдвиг истории — шаг «Формула».
  6. Ответ — карточка «Вопрос», текстом которой служит ответ модели. Она ждёт следующее сообщение и возвращает бота на шаг 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

Вкладка «Заголовки», кнопка «ДОБАВИТЬ ЗАГОЛОВОК»:

KeyValue
AuthorizationBearer sk-gw-ваш-ключ
Content-Typeapplication/json
X-TitleBotHelp

Вкладка «Тело»:

{
  "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.contentgpt_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, сохранение на обоих уровнях и то, что шаг с запросом соединён со сценарием.

Бот не помнит прошлые реплики

Посмотрите карточку подписчика. Если в полях u1a3 лежит текст вида {%user_question%}, история пишется действием «Установить поле» — замените его шагом «Формула». Если поля пустые, проверьте, что формула стоит между запросом и ответом и что в ней есть проверки is_null.

Бот отвечает один раз и замолкает

Шаг ответа должен быть карточкой «Вопрос» с переходом обратно на шаг запроса. Обычное текстовое сообщение не ждёт ответа человека, и сценарий на нём заканчивается.

Бот отправляет {%gpt_answer%} текстом

Поля с таким именем не существует. Создайте его в «Настройки» → «Настраиваемые поля» и заново выберите в сопоставлении.

Ошибка авторизации

Ключ неверный или отозван. Он начинается на sk-gw-, без пробелов по краям; целиком виден только при создании. Новый — в разделе «Ключи».

Ошибка про модель

ID должен совпадать с каталожным символ в символ, вместе с вендором перед косой чертой. Короткие имена без вендора и имена с датой на конце мы не принимаем.

Ошибка про недостаточный баланс

Пополните баланс в кабинете — от 300 ₽, через СБП, банковской картой или по счёту для юридических лиц.

Проверено 11 сентября 2026 живым диалогом в Telegram-боте на BotHelp: бот отвечал на вопросы подряд с опорой на предыдущие реплики, размер запроса рос от хода к ходу. Память на три хода проверена тестовыми данными в самом BotHelp.

Что дальше

Обновлено: