Решения · Транспорт и логистика
Когда клиент спрашивает, где посылка, агент не гадает: звонит курьеру, спрашивает его и возвращается с ответом.
Голосовая диспетчеризация, построенная как механизм, а не как обещание: таблица с явными статусами, три попытки с интервалом в две минуты, структурированная запись результата звонка и фильтр, который убирает номер водителя из всего, что попадает в модель, чтобы его нельзя было продиктовать клиенту.
Уже построеноМеханизм диспетчеризации написан и перенесён на нашу голосовую платформу: таблица `courier_calls` с семью возможными состояниями, тремя попытками по умолчанию, паузой 120.000 ms между ними и структурированным сохранением результата вызова, плюс пять серверных функций, которые её используют — инициирование звонка курьеру, проверка результата, очистка для зависших звонков, определение того, кто перезванивает, и webhook после звонка. Вторая реализация — фильтр выхода, написанный для клиента из транспорта, который рекурсивно удаляет поля контактов водителя из результата инструмента, сохраняя номера диспетчерской. Оговорка заранее: телефонная часть проходит через SIP-хост, а хост, через который идут наши тестовые линии, не отвечает на момент написания — мы не дадим вам демонстрационный номер, который не смогли бы поднять при вас.
В транспортной или доставочной компании большинство входящих звонков — это один и тот же вопрос, заданный разными людьми: где груз, во сколько он прибудет, почему он не приехал. Ответа нет в документе и нет в системе — он в голове у водителя, который едет. Диспетчер связывает всё это: принимает звонок клиента, звонит водителю, возвращается к клиенту. Эта работа занимает одного человека и выполняется сто раз в день, с одними и теми же тремя фразами.
Мы построили именно эту цепочку, как механизм со статусами, а не как маркетинговую функцию. Агент разговаривает с клиентом. Когда ему нужен ответ, которого у него нет, он вызывает функцию, которая запускает второй звонок — курьеру — связанный с разговором, из которого он вышел. У этого звонка есть собственная строка в таблице, со статусом, который проходит через `calling`, `in_progress`, `retrying`, `completed`, `failed`, `no_answer`, `timeout`, с номером попытки, с максимумом трёх попыток и паузой в две минуты между ними. Результат записывается структурированно: краткое содержание того, что сказал курьер, предполагаемое время, позиция.
Часть, которую легко не заметить и которую мы рассматриваем как требование, а не как предосторожность: номер телефона водителя не должен попасть к клиенту. Это не инструкция, написанная в prompt агента, потому что инструкцию в prompt можно обойти. Это фильтр, который рекурсивно проходит по результату инструмента и удаляет поля контактов водителя до того, как этот результат попадёт в модель — сохраняя номера диспетчерской. То, что было удалено, нельзя продиктовать, независимо от того, как агенту задают вопрос.
И самое важное ограничение — не интеллектуальное, а инфраструктурное: голосовой агент по телефону зависит от SIP-хоста между вашим оператором и платформой. Когда этот хост падает, звонки не идут, а сигнатура сбоя узнаваема — истекший запрос, пустой идентификатор звонка, нулевая длительность. Хост, через который проходят наши тестовые линии, на дату написания этой страницы не отвечает. В вебе голосовой маршрут сегодня проверяем; по телефону первый этап любой работы — установить, через какой хост заходят ваши номера.