Skip to content

Releases: dripips/hark

v1.1.0 — подключения на виду, внешность настраивается, бот зовёт человека вслух

Choose a tag to compare

@dripips dripips released this 04 Sep 14:53

Страница бота разбита на четыре вкладки со своими адресами, и открывается сразу на подключениях: раньше они лежали на 2129-м пикселе страницы длиной 3435, ниже кнопки «Сохранить». Вид подключения выбирается до формы двумя кнопками, данные проверяются до записи, подключение можно изменить, а кнопка «Проверить» дёргает его по-настоящему и показывает, что вернулось.

Внешность виджета настраивается целиком: шрифт вплоть до «как на сайте», кегль, межстрочный, три плотности, размеры окна, скругления, тень или рамка, палитра, фон ленты цветом, градиентом, точками, сеткой или картинкой, отступ кнопки от края экрана. Пять готовых наборов. Задаются три цвета, остальные выводятся из полотна и текста и следуют за ними. В рамке предпросмотра крутится сам виджет и тот же обработчик настроек, что отдаёт их сайту.

Об эскалации узнают сразу. Открытая вкладка админки получает событие потоком: цифра в шапке растёт, заголовок вкладки меняется, раздаётся звук. Настраивать нечего. Если админку никто не держит открытой, Hark дёргает один адрес, который владелец вписал сам, — Телеграм получается подстановкой api.telegram.org/bot<токен>/sendMessage.

У ждущего разговора есть тот, кто его взял. Взятие атомарно: два одновременных нажатия выигрывает ровно одно, второй видит, кто успел. Имя стоит в списке, а не только внутри разговора.

Страница менеджеров. Список, заведение, переименование, смена пароля, удаление. Себя и последнего убрать нельзя. Флаг -manager больше не меняет пароль молча: перезапись требует -reset, появился -managers.

Починено по дороге

  • значения темы уходили в текст CSS без единой проверки;
  • тёмная схема состояла из зашитых цветов и не знала про палитру владельца;
  • акцент служил и заливкой, и цветом текста — на бледном акценте текст пропадал;
  • запись эскалации терялась вместе с закрытой вкладкой: посетитель получал «передаю разговор менеджеру», а разговор оставался вне очереди;
  • обрезка строк резала байты, а не символы, и рубила кириллицу пополам.

Зависимостей по-прежнему четыре. Обновление с 1.0 идёт само: недостающие колонки досыпаются при первом запуске.

v1.0.0 — каждый ответ с чеком

Choose a tag to compare

@dripips dripips released this 04 Sep 07:26

Self-hosted AI chat bot for your site. One binary, one file next to it, no plans and no seats.

The receipt

Chat bot builders are black boxes: the bot tells a customer something wrong and nobody can reconstruct why. Open any reply in Hark and the receipt unfolds — the instruction, every tool call with its request and response, the rows read from your database, tokens split into prompt, completion and reasoning, and the cost.

Any provider

llm.Provider with two implementations. The OpenAI chat format covers OpenAI itself plus Ollama, vLLM, LM Studio and OpenRouter; Anthropic is separate because its format genuinely differs. Switching is two fields.

It asks the model what it accepts

Providers disagree about parameters and the disagreement is not in the docs. gpt-5-nano rejects temperature outright and refuses the older max_tokens. A builder with a temperature slider breaks every request against it.

Hark sends a few tiny requests, records what came back, and then offers only the knobs that model takes.

Reasoning tokens are counted apart

Measured on a real conversation: 288 output tokens, 192 of them reasoning. Two thirds of the paid output never appears in the answer. A cost report that folds them into "completion" is useless.

The SQL tool has six guards

SELECT only, no second statement, no dangerous keywords, an allowlist checked into subqueries, a row cap applied by wrapping the query (an appended LIMIT is escaped by UNION), and a timeout. A rejected query goes into the receipt rather than being swallowed. Defence in depth, not a substitute for a read-only user.

Handover

The bot gives up through a tool call, not phrase matching. The reason travels to the queue; the manager sees it and the whole receipt before typing.

Widget

One <script> tag. 10 KB, no dependencies, shadow root so neither side's CSS leaks, SSE streaming, light and dark.

READMEs in English, Russian and German. MIT.