v2v-demo — мультигалузевий AI-консьєрж: Telegram-бот, Mini App і веб
Огляд
Рушій голосового й текстового AI-консьєржа на Go, що працює через три інтерфейси на одному API: Telegram-бот, Telegram Mini App і веб-сторінку. У кожному з них він веде справжню двомовну (українську/англійську) розмову голосом чи текстом, відповідає лише з фіксованої бази знань і передає розмову людині в момент невпевненості. Те, що почалося як один сценарій, виросло у десять по-справжньому незалежних асистентів — стоматологічна клініка, автосервіс, агенція нерухомості, клінінгова компанія, бюро перекладів, салон краси, барбершоп, ресторан, піцерія та магазин акупресурних товарів — обираних з одного inline-пікера при /start (він також веде на сторінки портфоліо, проєктів, брифів і «Про мене»), кожен зі своєю базою знань, системним промптом і схемою збору ліда, усі на одному й тому ж ядрі гейта заземлення.
Результат: один фреймворк, десять бізнес-галузей, без форкнутої кодової бази — кожен асистент ділить той самий гейт заземлення, а скриптований probe-інструмент знайшов реальний баг, критичний для безпеки (запит на стоматологічну седацію потрапляв у звичайний запис), ще до того, як він дістався користувача.
Це живе демо, не скріншот — протестуйте самі: напишіть @v2v_demo_bot у Telegram і оберіть галузь при /start; натисніть Open Concierge у боті, щоб відкрити Mini App; або відкрийте веб-версію web.pere.org.ua. Той самий рушій, ті самі асистенти, три способи зайти.
Один рушій, три інтерфейси
Логіка розмови — сесії, теми, ліміти, розпізнавання мови, діалог із заземленням, озвучення, ліди — живе в рушії й віддається через один /v1 API. Кожен інтерфейс — тонкий клієнт поверх нього:
| Інтерфейс | Що додає |
|---|---|
| Telegram-бот (v2v-bot) | Long-poll адаптер: голос чи текст у чаті, вибір теми, голосові відповіді |
| Telegram Mini App (v2v-tma) | Відкривається кнопкою Open Concierge у боті: повноцінний мобільний екран із Voice-to-UI (голосова чи текстова команда підсвічує товар і додає його в кошик), кошиком і цінами на сервері, перевіркою Telegram initData (HMAC-SHA256) та оплатою через інвойс Telegram Stars |
| Веб (v2v-web) | Звичайна сторінка з вибором теми, чатом і кошиком; невеликий Go-сервер віддає її й проксіює /v1, поручаючись за відвідувача анонімним cookie-ідентифікатором, з лімітами на відвідувача й на IP |

Справжня складна задача
Плавність голосового бота маскує його точність. Природно звучний голос, що читає розмиту чи вигадану відповідь, провалює єдине, що важливо — тому архітектура побудована навколо заземлення, а не красномовності: уся база знань їде в кожному промпті, ключовий гейт ловить питання поза темою чи про відповідальність до виклику LLM, а модель має інструкцію передавати людині замість вигадувати. Друга складна задача — узагальнити це на десять непов’язаних бізнесів без форку коду: кожна тема постачає свою базу знань, промпт, привітання, години роботи та схему слотів через один JSON-маніфест — гейт, оркестрація LLM і Telegram-механіка лишаються ідентичними під капотом.
Архітектура

Кожен хід проходить через один гейт до будь-якого виклику LLM: скор перетину ключових слів проти бази знань активної теми плюс список ключових слів жорсткої ескалації для тем відповідальності. Нижче порогу довіри чи при влучанні в список відповідальності бот одразу передає людині — без LLM, без вигадки. Вище порогу LLM відповідає з повної бази знань цієї теми й оновлює структурований лід-запис (поля різняться за темою — стоматологічний запис збирає бажаний час, лід нерухомості — бюджет і район); завершений запис записується як лід.
Ключові інженерні рішення
| Рішення | Чому |
|---|---|
Один JSON-маніфест (topics.json) керує пікером |
Кожна тема постачає власну базу знань, промпт, привітання, години роботи й схему слотів; додавання одинадцятого бізнесу — це зміна даних, не коду; сам пікер з’являється лише коли задекларовано дві чи більше теми |
| Години роботи per-тема визначають текст ескалації, не лише базу знань | У стоматологічної клініки й клінінгової компанії, що працює 7 днів, різна поведінка “ми зачинені”; рішення відкрито/зачинено рахується в Go проти фіксованого часового поясу, ніколи не залишається на здогад моделі |
| Скриптований probe-інструмент проганяє реальні ходи діалогу через живий конвеєр | dialog-probe відтворює сценарні файли проти справжнього гейта заземлення + LLM — без Telegram, без юніт-тест-моків — саме так знайдено баг ескалації седації нижче |
| Уся база знань у кожному промпті, без retrieval-для-контексту | При такому розмірі бази на тему (~17–37 КБ) retrieval лише додає режим відмови (пропустити потрібний фрагмент) без вигоди — ключовий гейт все одно працює окремо як pre-LLM фільтр |
Результати
- Десять незалежних, двомовних асистентів живі за одним пікером: стоматологічна клініка, автосервіс, агенція нерухомості, клінінгова компанія, бюро перекладів, салон краси, барбершоп, ресторан, піцерія, магазин акупресурних товарів — кожен зі своєю базою знань, привітанням і схемою ліда, на одному ядрі гейта заземлення
- Реальний баг, критичний для безпеки, знайдено автоматизованим probe-прогоном, а не скаргою користувача: стоматологічний запит “дитині потрібне лікування уві сні” потрапляв як звичайний запис на прийом — седація потребує консультації анестезіолога й індивідуального ціноутворення, а не зібраного ліда. Виправлено спеціальним жорстким правилом у промпті теми, перевірено на трьох формулюваннях плюс контрольний випадок, що звичайний запис на чистку все ще завершується
- Ще два виправлення гейта заземлення знайдено тим самим способом: голий номер телефону (останнє, що запитує кожна тема, яка збирає лід) потрапляв на лінію “уточніть, будь ласка” замість завершення ліда; а дзвінок із проханням “адміністратора” чи “майстра” (не “менеджера”) не розпізнавався як явний запит передачі людині
- Один рушій за трьома інтерфейсами: Telegram-бот, Mini App і веб-сторінка ділять тих самих асистентів, ліміти й гейт заземлення — новий фронтенд це тонкий клієнт, а не новий продукт
- Перевіряється на кожен push (
gofmt+go vet+go test -race), одна основна стороння залежність (go-telegram/bot) плюс бібліотека визначення мови — все інше стандартна бібліотека Go
Живе демо: @v2v_demo_bot у Telegram (кнопка Open Concierge відкриває Mini App) · web.pere.org.ua · Код: github.com/valpere/v2v-demo
Стек
Go · go-telegram/bot · Telegram Mini Apps · Telegram Stars · Web Speech API · lingua-go (визначення мови) · OpenAI Whisper (локальний CLI + API) · Ollama / OpenAI / Gemini (плагований діалоговий LLM) · ElevenLabs / Azure Neural TTS (плаговано)