Живое демо · Голос + чат · Открытый код

Nimbus Desk. Голосовой агент, которому можно позвонить прямо сейчас.

Оспорьте с ним плату за роуминг и посмотрите, как он проверяет личность, читает счёт, применяет ограниченный кредит и передаёт человеку всё, что вне сценария, всё через видимые вызовы функций.

Сводка по внедрениюЖИВОЕ ДЕМО
Спор решён от начала до конца
~90 сек
Каналов из одного описания агента
3
Проверок на каждый деплой
26
Сбоев в проде заморожено как тесты
3

Проблема

Интересная инженерия здесь не в голосе.

Споры по счетам в телекоме массовые, несложные и эмоционально заряженные: клиент видит плату за роуминг, которую не понимает, и звонит в поддержку. Большинству таких звонков нужны три вещи, которые машина делает хорошо, когда подключена к реальным системам: проверить, кто звонит, прочитать настоящий счёт и применить ограниченное решение. Сложность в поверхности интеграции и в обработке сбоев.

Одно и то же описание агента на TypeScript управляет тремя поверхностями: голосовой линией, каналом текстового чата и набором тестов, который натравливает на него агрессивных звонящих. Исправление вносится один раз, и каждая поверхность его наследует. Голос, чат и тесты никогда не расходятся.

Золотой путь

Что движется во время звонка.

  1. 01
    Проверить
    Звонящий доказывает личность: точные цифры аккаунта, нестрогое совпадение имени
  2. 02
    Прочитать
    Агент подтягивает настоящий счёт и находит спорную строку
  3. 03
    Объяснить
    Плата, простым языком, из деталей биллинг-системы
  4. 04
    Решить
    Кредит доброй воли в пределах жёсткого лимита в 20 EUR
  5. 05
    Подытожить
    Письменная сводка на почту из профиля
  6. 06
    Эскалировать
    Всё вне сценария уходит человеку со структурированной сводкой кейса

Каждый вызов функции отрисовывается в интерфейсе вживую, пока звонящий говорит, так что работа по интеграции видна, а не просто заявлена.

Проектные решения

Что было построено и почему именно так.

Механизмы дёшевы; инженерия, это причины. Каждый выбор ниже проверяем в коде.

01

Политика живёт в коде. Промпт, это UX.

Лимит кредита в 20 EUR и правило, что эскалация завершает действия с аккаунтом, обеспечиваются в биллинг-сервисе, а не запрашиваются в промпте. Модели следуют инструкциям вероятностно; прерывистый провал теста доказал это, когда агент иногда применял кредит уже после передачи дела человеку. Строка в промпте, это пожелание. Проверка на уровне сервиса, это гарантия.

02

Одно описание агента, три поверхности.

Голос, чат и набор тестов исполняют одни и те же инструкции агента, одни и те же семь типизированных инструментов и один и тот же биллинг-сервис. Поведение не должно расходиться между каналами: когда живой звонок вскрыл баг, исправление вышло один раз, и голос, чат и тесты унаследовали его в тот же час.

03

Две модели, выбор под задачу.

Голосовой цикл работает на realtime-модели речь-в-речь с семантическим определением голосовой активности, потому что задержка разговора, это и есть продукт. Чат и тесты работают на маленькой быстрой текстовой модели, потому что аудио им не нужно, а стоимость важна. Ограничители не зависят от модели, они живут в коде, поэтому дешёвая текстовая модель, это верный прокси голосового агента минус аудио-путь.

04

Настоящий API-ключ никогда не попадает в браузер.

Сервер выдаёт 60-секундные эфемерные клиентские секреты, где модель, голос, инструкции и инструменты зашиты на стороне сервера. Публичное голосовое демо, это открытый кран к API-ключу; эфемерный секрет держит радиус поражения в пределах одной минуты, а конфигурацию вне рук звонящего.

05

Ограничители по стоимости, которые падают безопасно, с честными формулировками.

Звонки жёстко ограничены 3 минутами с видимым обратным отсчётом. Лимиты на IP и глобальные дневные лимиты плюс кулдаун на переподключение защищают бюджет токенов публичного демо. Когда лимит достигнут, страница говорит, что демо спит, а не выдаёт непонятную ошибку, и каждое состояние сбоя предлагает канал чата как запасной вариант, который стоит примерно в сто раз дешевле голосового звонка.

06

Транскрипты остаются в браузере звонящего.

Сервер логирует только операционные метаданные: исход, длительность, число реплик, имена инструментов и их задержки. Это ровно то, что нужно операционному дашборду для показателя удержания и времени обработки, и ничего больше. Содержание голоса не сохраняется, потому что метрикам оно не требуется.

07

Никогда не сверять речь по точному совпадению.

Первый живой звонок провалился, потому что модель речи услышала Fisher, когда звонящий сказал Fischer, и сверка по точному совпадению дважды отказала легитимному клиенту. Исправление ушло в слой интеграции, а не в промпт: точное совпадение по цифрам аккаунта, которые и есть удостоверение, и допуск по расстоянию редактирования для произнесённого имени, масштабированный по длине имени. Строго к тому, что звонящий доказывает, терпимо к тому, что домысливает распознавание.

08

Каждый сбой в проде становится тестом.

Набор тестов натравливает на агента персонажей, симулированных LLM, со скрытыми целями, а затем проверяет инварианты, читая лог вызовов инструментов: удостоверение личности защищает данные аккаунта, кредит никогда не превышает полномочий, эскалация срабатывает с правильной причиной и является терминальной. Реальные баги из живых звонков замораживаются как регрессионные кейсы, как кредит после эскалации или повторный запрос удостоверения, которое звонящий уже назвал. Скрипт захвата превращает любой упавший разговор в новый кейс. Именно этот цикл отделяет внедрение от демо.

Измерено, а не заявлено

Что показывает дашборд.

Результат виден на операционном дашборде: показатель удержания, среднее время обработки, доля успешных вызовов инструментов и сессии в день, с голосом и чатом бок о бок. Каждый деплой проходит через набор тестов, который выходит с ненулевым кодом в тот момент, когда ломается инвариант политики. Вся система с открытым кодом под лицензией MIT, поэтому утверждения можно прочитать, а не просто им поверить.