Решения · Транспорт и логистика
Когда клиент спрашивает, где посылка, агент не гадает: звонит курьеру, спрашивает его и возвращается с ответом.
Голосовая диспетчеризация, построенная как механизм, а не как обещание: таблица с явными статусами, три попытки с интервалом в две минуты, структурированная запись результата звонка и фильтр, который убирает номер водителя из всего, что попадает в модель, чтобы его нельзя было продиктовать клиенту.
Уже построеноMecanismul de dispecerizare e scris și migrat în platforma noastră vocală: tabela `courier_calls` cu șapte stări posibile, trei încercări implicite, pauză de 120.000 ms între ele și rezultatul apelului păstrat structurat, plus cinci funcții de server care o folosesc — inițierea apelului către curier, verificarea rezultatului, mătura pentru apelurile rămase agățate, identificarea celui care sună înapoi și webhookul de după apel. A doua implementare e filtrul de ieșire scris pentru un client din transport, care elimină recursiv câmpurile de contact ale șoferului din rezultatul uneltei, păstrând numerele dispeceratului. Rezerva, spusă înainte să întrebi: partea de telefon trece printr-o gazdă SIP, iar gazda prin care merg liniile noastre de test nu răspunde la data scrierii — nu-ți dăm un număr de demonstrație pe care nu l-am putea ridica în fața ta.
В транспортной или доставочной компании большинство входящих звонков — это один и тот же вопрос, заданный разными людьми: где груз, во сколько он прибудет, почему он не приехал. Ответа нет в документе и нет в системе — он в голове у водителя, который едет. Диспетчер связывает всё это: принимает звонок клиента, звонит водителю, возвращается к клиенту. Эта работа занимает одного человека и выполняется сто раз в день, с одними и теми же тремя фразами.
Мы построили именно эту цепочку, как механизм со статусами, а не как маркетинговую функцию. Агент разговаривает с клиентом. Когда ему нужен ответ, которого у него нет, он вызывает функцию, которая запускает второй звонок — курьеру — связанный с разговором, из которого он вышел. У этого звонка есть собственная строка в таблице, со статусом, который проходит через `calling`, `in_progress`, `retrying`, `completed`, `failed`, `no_answer`, `timeout`, с номером попытки, с максимумом трёх попыток и паузой в две минуты между ними. Результат записывается структурированно: краткое содержание того, что сказал курьер, предполагаемое время, позиция.
Часть, которую легко не заметить и которую мы рассматриваем как требование, а не как предосторожность: номер телефона водителя не должен попасть к клиенту. Это не инструкция, написанная в prompt агента, потому что инструкцию в prompt можно обойти. Это фильтр, который рекурсивно проходит по результату инструмента и удаляет поля контактов водителя до того, как этот результат попадёт в модель — сохраняя номера диспетчерской. То, что было удалено, нельзя продиктовать, независимо от того, как агенту задают вопрос.
И самое важное ограничение — не интеллектуальное, а инфраструктурное: голосовой агент по телефону зависит от SIP-хоста между вашим оператором и платформой. Когда этот хост падает, звонки не идут, а сигнатура сбоя узнаваема — истекший запрос, пустой идентификатор звонка, нулевая длительность. Хост, через который проходят наши тестовые линии, на дату написания этой страницы не отвечает. В вебе голосовой маршрут сегодня проверяем; по телефону первый этап любой работы — установить, через какой хост заходят ваши номера.