Orbit: AI-агент продажів у продакшні

Кейс

У північноамериканського B2B-дистриб’ютора класична проблема: сотні ресторанів і кафе замовляють циклічно, а менеджери фізично не встигають вести повторні продажі по всій базі. Orbit — система, яку я для цього збудував: вона прогнозує, коли кожному клієнту час замовляти знову, відкриває розмову в правильний момент, і AI-агент веде її до замовлення, перенесення або передачі людині. Вона ж кваліфікує вхідні ліди з реклами та рятує покинуті кошики. Система працює в продакшні, пише реальним клієнтам і зробила перший продаж без людини вже за місяць після першого коміту.

8 тижнів до продакшну605 клієнтів, 6 465 SKUПерший продаж агента на 5-му тижні1 100+ тестів

Продукт наживо

Адмінка Orbit: таблиця клієнтів із прогнозами, впевненістю та consent
Адмінка Orbit: єдиний inbox для SMS, WhatsApp, Instagram, Messenger і веб-чату
Адмінка Orbit: воронка лідів зі статусами кваліфікації по каналах
Адмінка Orbit: рантайм-налаштування з фідами каталогу, частотою nudge та інтеграціями
1 / 4
Адмінка, наживо: кожен клієнт із датою прогнозу, рішенням auto-send, каліброваною впевненістю і станом consent. Імена замінені для скриншота; дані продакшн.

Цифри

605
Клієнтів у синку
6 465 SKU, 4 роки історії замовлень
11% → 60%
Покриття прогнозу
пар клієнт×SKU, ×5.5
9
Комплаєнс-перевірок
упорядковані, fail-closed, будь-яка = DROP
6
Запобіжників агента
поза моделлю, вона їх не бачить
1 100+
Тестів
тестового коду приблизно 1:1 з робочим
1 vCPU
Інфраструктура
один VPS, один Postgres, без Redis

Під капотом

Схема системи Orbit: три вхідні контури, хребет агентів, комплаєнс-гейт і контрольний шар
ComplianceGate: дев’ять упорядкованих перевірок між будь-яким автором і клієнтом
Лесенка прогнозу: покриття зросло з 11 до 60 відсотків пар клієнт-SKU
1 / 3
Три вхідні контури на одному хребті: прогнозні нагадування про перезамовлення, ліди з реклами й веб-чату сайту через WhatsApp, Instagram і Messenger, покинуті кошики Shopify. Усе сходиться в агентів і один комплаєнс-гейт. Праворуч контрольний шар: власник спілкується з даними через MCP і керує операціями голосом через codex-агента.

Як випустити 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: назви, бренди й ідентифікуючі деталі змінені або опущені, інженерія і цифри справжні.

Read this case study in English