Счёт приходит за то, чего не видно
Чат-бот на сайте отвечает одной фразой, а в счёте за неё стоит впятеро больше, чем можно предположить по её длине. Разница уходит на рассуждение модели: посетитель не видит из него ни слова, а оплачено оно как обычный вывод. Личный кабинет поставщика этого не разделяет.
Hark прикладывает чек к каждому ответу. Какую модель дёрнул, в какие подключения сходил, сколько заняло каждое обращение и сколько стоило. Рассуждение стоит отдельной колонкой. На демонстрационной базе оно составило от 72 до 86 процентов оплаченного вывода — в одном ответе из 518 токенов 448 ушли на думанье.
Что внутри
Чек к каждому ответу
Шаги разговора видны по порядку: обращение к модели, запрос в базу, снова модель. У каждого шага своё время и своя цена. Стоимость хранится в микрорублях, потому что в копейках один ответ округляется до нуля.
Модель любая, включая свою
OpenAI, Anthropic и всё, что говорит в формате OpenAI: Ollama, vLLM, LM Studio, OpenRouter, свой сервер. Переключение — два поля. Поставщики расходятся в том, какие параметры принимают, и в документации этого нет, поэтому Hark спрашивает модель сам и прячет ручки, которые она отвергла.
Свои данные вместо догадок
Бот дёргает ваш адрес или читает вашу базу. Запрос к базе пишет модель, а пускать его решает Hark: только SELECT, таблицы по белому списку, второй запрос отклоняется, предел строк ставится обёрткой запроса — приписку LIMIT обходит UNION.
Передача человеку вслух
Когда бот сдаётся, открытая вкладка админки узнаёт об этом потоком: счётчик в шапке, заголовок вкладки, звук. Если админку никто не держит открытой, Hark дёргает один адрес — Телеграм получается подстановкой, интеграций внутри нет.
Виджет, который настраивается целиком
Один тег на страницу, 23 КБ, по проводу семь. Шрифт вплоть до «как на сайте», отступы, цвета, фон, скругления. Задаются три цвета, остальные выводятся из полотна и текста. В предпросмотре крутится сам виджет, а не макет.
Два языка и один файл на новый
Админка и виджет говорят по-русски и по-английски, язык бота задаётся отдельно от языка админки. Ключ перевода — сама русская строка, поэтому непереведённое остаётся текстом, а не именем ключа. Добавить язык — перевести один JSON.