AGONTS

Кейс: обзвон должников

Сквозной пример: SQL → исходящий звонок → диалог с веткой по каждому ответу клиента → передача оператору + история запусков.

Сценарий «обзвон должников по оборудованию» собран из трёх стандартных узлов платформы: интеграция с БД → исходящий звонок → диалог-flow. Ниже — каждое окно редактора с подписями, чтобы было видно, что́ настраивается мышкой, а что — текстом в правой панели.

Два типа потока

В AGONTS два режима flow, и они работают в паре:

  • automation (основной) — без клиента на проводе. Запускается по cron / webhook / вручную. Тянет данные, дёргает интеграции, инициирует звонки.
  • conversation (диалог) — то, что слышит / читает клиент. Узлы задают реплики и ветвления.

Основной поток вызывает диалог через узел «Исходящий звонок». Один диалог переиспользуется в десятке основных потоков.


Шаг 1. Папка кейса в списке потоков

Все потоки одного кейса лежат в папке. Здесь — папка «Долг обзвон» с тремя потоками: один cron-обзвон + два диалога.

Список потоков с папкой «Долг обзвон»

Видны последние 28 запусков по каждому, статус (Активный), число узлов, дата изменения. Слева — дерево папок, справа — действия (Запустить, Тест, История, Аналитика).


Шаг 2. Основной поток: «Прозвон должников (cron)»

Это automation-flow. 4 узла, никакого общения с клиентом.

Cron-flow: триггер → SQL → звонок → лог

Триггер: cron — раз в час

Расписание задаётся в UI (0 * * * * и т.п.). Параллельно подключён ручной триггер — для прогона из админки одной кнопкой.

Найти должника в billing_db (Интеграция)

SQL-запрос напрямую в вашу базу через MCP-инструмент execute_query_json. Никаких выгрузок в Excel.

Звонок должнику (Исходящий звонок)

Дёргает SIP-провайдера, передаёт ответившего в выбранный диалог-flow.

Залогировать (Выход)

Финальная нода — пишет результат запуска в flow_runs и в audit-log.


Шаг 3. Узел «Исходящий звонок» — настройки

Клик по узлу → справа открывается панель параметров.

Voice-call: кому, с какого номера, в какой диалог

  • Кому звонить — литерал E.164 (+7123123123) или выражение {{$prev.output.rows.0.customer_phone}} — берёт телефон из результата предыдущего SQL-узла.
  • С какого номера — переопределение caller-id; пусто = провайдер по умолчанию.

Voice-call: целевой диалог + SIP-провайдер

  • Целевой диалог-flowРазговор с должником. Список фильтруется по mode=conversation.
  • SIP-провайдерmango-vpbx400363293. Меняется в один клик.

Шаблоны {{$input.X}}, {{$prev.output.X}}, {{slot.X}} доступны почти в любом текстовом поле — это и есть «связка данных между нодами».


Шаг 4. Узел «Интеграция» — SQL в продовую БД

Тот же редактор, другая нода.

Интеграция: MCP-сервер, инструмент, SQL-запрос

  • ИсточникПлатформенный сервер (заранее настроенный MCP) или любой URL на лету.
  • MCP-серверSQL к БД и семантический каталог.
  • Инструментexecute_query_json (read-only).
  • Аргументы — обычный SQL: SELECT a.customer_display_name, a.customer_phone, a.legacy_account_number, ROUND(...) AS balance_rub, a.dunning_stage::text AS dunning_stage_raw, ...

Результат уезжает в $prev.output.rows[], и любой следующий узел может к нему обратиться.

Read-only по умолчанию. Запись в CRM — отдельный узел Действие в фоне с правом write у MCP-сервера и подтверждением со стороны оператора для критичных операций (через узел Шлюз согласования).


Шаг 5. Диалог «Разговор с должником» — общий вид

Это conversation-flow. Каждый ответ клиента уходит в ИИ-маршрут по смыслу, который классифицирует фразу и выбирает ветку.

Диалог-flow целиком: 33 узла, 7 веток интента + слот-филлеры + операторы + завершения

Все семь сценариев из обсуждения уже на холсте:

Реплика клиентаКуда уйдёт диалогФинал
«Не сейчас, перезвоните»callback_requestedЗавершение «Перезвон», задача в CRM
Голосовая почта / автоответчикvoicemailЗавершение «Голосовая почта» + повтор позже по 230-ФЗ
Не тот человекwrong_personЗавершение «Не тот», флаг чистки списка
«Удалите мой номер»do_not_callЗавершение «do-not-call» + лок номера
«Уже оплатил»paid_today (после сверки оператором)Завершение «Стандарт»
«Заплачу N-го через X дней»promise_to_pay → слот-филлер promise_amount_rub + promise_daysЗавершение «Обещанный платёж»
«Ничего не должен» / спорdisputedtransfer-humanПередача оператору с приоритетом

Любая ветка на плюс-минус строчке текста — добавить ещё одну (например «хамство и оскорбления» → отдельный outcome) — это перетащить новый узел и подписать стрелку.


Шаг 6. Узел «ИИ-маршрут по смыслу» — настройки

Главный «мозг» диалога. Без машинного обучения, без грамматик — конфигурируется текстом.

Intent-router: реплика бота + подсказка для классификатора

  • Что спросить клиента — реплика, которую бот произнесёт перед слушанием: «Удобно ли вам сейчас обсудить вопрос оплаты?»
  • Подсказка для ИИ — свободный текст-инструкция: «Классифицируй ответ ровно одной веткой. ГОТОВ — клиент согласился говорить (да, ага, удобно, конечно...). ЗАНЯТ — попросил перезвонить позже (нет, не сейчас, занят, перезвоните...)» и т.д. по каждой ветке.
  • Ветки — берутся с холста: подписали стрелку ЗАНЯТ — появилась ветка ЗАНЯТ. Удалили стрелку — ветка пропала.

Если ИИ не уверен — уходит в ветку other. На неё повешен retry или эскалация на оператора (зависит от логики).


Шаг 7. Узел «Извлечь данные ИИ» (slot-filler)

Когда от клиента нужно вытащить числа или даты из живой речи — ставите этот узел.

Slot-filler: поля promise_amount_rub + promise_days

  • Что говорим клиенту — «Хорошо, могу оформить обещанный платёж — доступ продлим, оплату внесёте позже. На какую сумму и на сколько дней (до 7 дней)?»
  • Поля для извлечения — список из каталога:
    • promise_amount_rub — число, обязательное (сумма обещанного платежа).
    • promise_days — число 1-7, обязательное (срок).
  • Сообщение при недостающих полях — фраза, которую бот скажет, если клиент назвал только сумму, но не срок (или наоборот). Бот сам переспросит до 3 раз, потом фолбэк.

Извлечённые значения доступны во всех следующих узлах как {{slot.promise_amount_rub}} и {{slot.promise_days}} — например, в финальной реплике «Зафиксировал: 5000 ₽ через 3 дня. Жду перевода до 8 мая.»


Шаг 8. Узел «Передать оператору»

Эскалация на живого человека — отдельный узел с приоритетом.

Transfer-human: причина, приоритет, hold-loop

  • Причина переключения — текст, который увидит оператор в карточке сессии: «Клиент утверждает, что уже оплатил. Сверить с биллингом.» + все слоты диалога, плюс предыдущие ответы ({{$prev.…}}).
  • ПриоритетНизкий / Обычный / Высокий (попадание в очередь).
  • Голос: hold-loop — для звонков. Бот будет повторять reassurance-фразу («Минуту, специалист сверяет вашу оплату с биллингом...»), пока оператор не возьмёт сессию — иначе SIP-линия молчит и клиент сбрасывает.
  • Текст ожидания — то, что произносится в цикле.

Шаг 9. История запусков и трасса

Каждый прогон — запись в flow_runs. Видно, на какой ноде разговор остановился, что сказал клиент, какой интент сработал.

Список запусков 119 шт.

Клик по запуску → панель с пошаговой трассой:

Трасса: каждый шаг + интент + слова клиента

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


Что меняется без программистов

Через UI в правой панели редактируется:

  • любая реплика бота;
  • список интентов и подсказка для классификатора;
  • список полей в slot-filler;
  • условия в decision-узлах;
  • параметры SQL-запроса и MCP-инструмента;
  • caller-id / SIP-провайдер;
  • расписание cron-триггера;
  • приоритет и текст для оператора.

Всё это — без редеплоя. Версии потока сохраняются (v1·draft, v2·draft, ...), можно откатиться одним кликом.


Связь с CRM, биллингом, Bitrix24

Платформа подключается к источникам через MCP-серверы:

  • SQLexecute_query_json для read и execute_query_write для write (с правами и audit-логом).
  • HTTP — любая REST-API через универсальный http_call.
  • Bitrix24 — отдельный MCP с готовыми инструментами (crm.lead.add, crm.deal.update, crm.contact.get, ...).
  • — через HTTP-сервис 1С или ODBC; ноду можно вешать на Действие в фоне после любого исхода.

В ноде интеграции вы выбираете сервер → инструмент → передаёте аргументы шаблонами {{slot.*}} / {{$prev.*}}. Подключение MCP-сервера делается один раз в Настройки → MCP-серверы (URL + headers + список разрешённых инструментов).


On this page