Orbit: AI-агент продажів у продакшні
КейсУ північноамериканського B2B-дистриб’ютора класична проблема: сотні ресторанів і кафе замовляють циклічно, а менеджери фізично не встигають вести повторні продажі по всій базі. Orbit — система, яку я для цього збудував: вона прогнозує, коли кожному клієнту час замовляти знову, відкриває розмову в правильний момент, і AI-агент веде її до замовлення, перенесення або передачі людині. Вона ж кваліфікує вхідні ліди з реклами та рятує покинуті кошики. Система працює в продакшні, пише реальним клієнтам і зробила перший продаж без людини вже за місяць після першого коміту.
Продукт наживо
Цифри
Під капотом
Як випустити LLM до живих клієнтів
Страшне в агентських продажах не якість розмови, а радіус ураження. Orbit трактує модель як недовірену: агент пропонує, звичайний TypeScript вирішує. Його інструмент відповіді лише накопичує текст; реальна відправка йде після ходу, через гейт. Шість запобіжників живуть поза моделлю:
1 розпізнавання відписки fail-closed: помилка класифікатора = вважаємо STOP 2 один хід за раз на розмову, гарантується чергою 3 ліміт відповідей на розмову, рахується в Postgres, не моделлю 4 ліміт ітерацій на хід, окремо від ліміту відповідей 5 deny-first хуки дозволів на кожен виклик інструмента 6 мова розмови заморожується до запуску моделі
Гейт довів себе в бою двічі за перші тижні. Тест kill-switch показав, що менеджер-людина його теж не пробиває. А перше живе SMS на американський номер було дропнуте з NO_CONSENT, і це було правильне рішення: бракувало express consent. Найкращий баг-репорт той, який система подає на саму себе.
Інциденти з продакшну
Агент вийшов у прод рано, за фіче-флагами, тож найцікавіші збої сталися на реальному трафіку, з повним аудит-логом для відновлення картини. Кілька таких, що вплинули на архітектуру:
Ехо, що змусило бота замовкнути
Вебхук месенджера приніс ехо нашого ж вихідного повідомлення на 0.9 с раніше, ніж повернувся API-виклик відправки і записав його. Система побачила невідоме вихідне, вирішила, що розмову перехопив оператор-людина, і ввічливо замовкла. Фікс: record-before-send. Рядок вихідного комітиться до API-виклику, оновлюється при успіху, видаляється при провалі.
Ретрай, що продублював повідомлення
Відправка впала після того, як повідомлення насправді доставилося, черга повторила хід, і клієнт отримав те саме двічі. Фікс: конфлікт-толерантний журнал, який зберігає перший вердикт ланцюжка, плюс success-first класифікація відповідей провайдера.
П’ять повідомлень за одну думку
Під час першого живого продажу модель за один хід викликала відповідь п’ять разів, і всі п’ять пішли клієнту: ліміт був на розмову, а на хід не існував узагалі. Фікс: кап на хід і правило в чартері, одне повідомлення на думку.
Хід, що не породив нічого
Зрідка модель завершувала хід без жодного виклику інструментів, і лід чув тишу. Фікс: повтор із системною приміткою, далі детермінований fallback, який іде через повний гейт. Тиша тепер неможлива за побудовою.
Що я збудував
ComplianceGate
Дев’ять упорядкованих перевірок перед кожним вихідним: kill-switch, suppression, consent, правила win-back, тихі години в часовому поясі отримувача, частотні капи, валідація контенту, ідемпотентність. Автор і канал незалежні: повідомлення людини проходять той самий гейт.
Прогнозний рушій
Імовірність перезамовлення як gamma CDF до горизонту на 4 роках історії, з backoff-лесенкою для розріджених пар. Імовірність і впевненість — окремі величини: нагадування спрацьовує за однією, людина читає іншу. Математику незалежно перевивели на рев’ю.
Машина станів розмови
Engagement живе в Postgres із частковим унікальним індексом, що гарантує не більше однієї живої розмови на контакт. Стан відписки ніколи не відкривається знову. LLM не є сховищем стану.
Детермінований тестовий стенд
Фейковий годинник плюс фейковий планувальник, що запускає відкладені джоби при просуванні тестового часу, з перевіреною еквівалентністю реальній черзі. Касети record-replay для LLM роблять CI детермінованим і безплатним. 1 100+ тестів.
Керування без редеплоїв
Тексти, чартер агента і налаштування редагуються в рантаймі з жорсткими юридичними підлогами: налаштування крутять поведінку всередині легального конверта, ніколи поза ним. Обробку STOP і тихі години вимкнути неможливо. Плюс kill-switch в адмінці.
Аналітика через MCP
Власник питає про свій бізнес зі свого AI-асистента. MCP-шар працює на read-only ролі Postgres із білим списком п’яти таблиць: навіть промпт-інʼєкція впирається в читання даних, які й так належать власнику. Без відправок, налаштувань і секретів.
Стек
TypeScript · Node.js 22 · Fastify · PostgreSQL · pg-boss · Prisma · Claude Agent SDK · Twilio SMS · WhatsApp / Instagram messaging · Telegram bot · Next.js admin · MCP · Docker on a single VPS
Потрібен AI-агент, який реально працює?
Патерн узагальнюється: прогноз або тригер, обмежений агент, комплаєнс-гейт під вашу юрисдикцію і аудит-лог, завдяки якому системі можна довіряти. Якщо вашому продукту потрібен агент, що говорить із живими клієнтами з реальними наслідками, я це вже проходив.
Зв’язатисяЗбудовано соло за 8 тижнів, у продакшні з липня 2026. Клієнт під NDA: назви, бренди й ідентифікуючі деталі змінені або опущені, інженерія і цифри справжні.







