AAYMA
RU
Войти

DIR ECHOES

Голосовой робот страхового контакт-центра: распознаёт речь, выбирает один из 40 сценариев, собирает поля, выполняет действия после согласия клиента…

Доведённый продукт
Команда «DIR ECHOES» 29💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: DIR ECHOES
Кейс HackAlem.ai: Коммуникации — Halyk Bank · кейс 2
Стадия: Доведённый продукт

Задача кейса: «Voice Router»: голосовой AI, маршрутизирующий звонки в контакт-центре страховой компании

Суть

Голосовой робот страхового контакт-центра: распознаёт речь, выбирает один из 40 сценариев, собирает поля, выполняет действия после согласия клиента или передаёт разговор живому оператору через WebRTC. Есть кабинет супервизора, приложение задеплоено на Vercel.

Как устроено

Речь → STT (gpt-transcribe) → если контекста достаточно, идёт быстрый путь без LLM, иначе LLM (gpt-5.4-mini) извлекает намерение и слоты → серверный исполнитель проверяет обязательные поля, принадлежность записи, допустимость действия и согласие → действия с идемпотентным ID операции в PostgreSQL → ответ → TTS (gpt-4o-mini-tts). Trace показывает сценарий, причину, альтернативы и время этапов. Супервизор видит LIVE-очередь, принимает разговор и звонит клиенту по WebRTC. Каталог организатора: 40 сценариев, 43 поля, 31 действие, knowledge base.

Ключевые решения

  • гибридная маршрутизация LLM + правила
  • slot filling
  • fast path без LLM
  • подтверждение перед действием
  • идемпотентные операции
  • WebRTC-передача оператору
  • kb_lookup

Особенности

LLM только предлагает маршрут, а все правила и согласие проверяет сервер. Для точных продолжений и подтверждений LLM обходится, что снижает задержку. Есть настоящая передача разговора человеку через WebRTC в том же треде, а описания сценариев супервизор меняет с версионированием, не затрагивая действия и политики.

Стек

Next.js 16 · React 19 · TypeScript · Zod · PostgreSQL/Neon · PGlite · WebRTC · Vercel

Модели

OpenAI gpt-5.4-mini · gpt-transcribe · gpt-4o-mini-tts


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-6d253846-dir-echoes.

README

README.md

Деплой: dir-echoes-voice-router.vercel.app

Доступ к версии с вымышленными данными кейса. Выберите роль и введите её код; имя пользователя не требуется.

РольКод доступа
Участник (Клиент)F4NgX_D78VKwtMHqp7ZrvQ
Супервизорgq7_aO48P3MEqwR8HCv0-JxAtTWxyz4B

Знак DIR ECHOES

DIR ECHOES

Кейс 2: Voice Router — голосовой робот с AI-слоем выбора сценария
DIR ECHOES для HackAlem AI

Открыть приложение · Презентация PPTX · PDF · Архитектура · Проверка по ТЗ

Задайте страховой вопрос голосом. DIR ECHOES соберёт недостающие данные, подготовит разрешённое действие к вашему подтверждению или подключит оператора вместе с историей разговора.

40 сценариев · 43 поля · 31 действие из официального набора организатора. Эти числа описывают каталог, а не измеренную точность модели.

Реальный голосовой экран с обозначениями кнопок Реальный мобильный экран, viewport 390 на 844

Разговор, операции и передача человеку сохраняются в базе. На телефоне главный элемент — голос. Чат, история и объяснение маршрута открываются по кнопке. Пользователь подтвердил работающую связь с оператором в своём сеансе. Проверка остальных сетей и устройств остаётся отдельной задачей.

Механика кейса в продукте

Требование кейсаКак реализовано
Гибридный выбор сценарияLLM извлекает намерение и поля; серверный исполнитель проверяет правила и действия
Контекст разговораУточнения, смена темы, возврат к сохранённому вопросу и продолжение после перезагрузки
Объяснение решенияTrace показывает сценарий, причину, альтернативы, параметры, действия и время этапов
Согласие перед действиемОтдельное подтверждение сохранённых параметров перед изменением или внешним запросом
Живой операторОбщая история и подключение человека в том же разговоре, текст и голос WebRTC

Опубликованная сборка: bfaf300, Vercel Ready, 23 сентября 2026 в 17:43. Этот deployment. Точные доказательства и ограничения: контрольные точки.

Два рабочих места

Клиент: один разговор, доступные объяснения

На экранеЧто делает
Начать разговорЗапрашивает микрофон. После паузы отправляет реплику, озвучивает ответ и возвращается к слушанию. Завершение останавливает разговор
ЧатПоказывает сохранённые реплики и текстовый ввод; позволяет продолжить без микрофона
ПодсказкиПоказывает текущую тему, ожидаемые данные и подтверждение; из панели можно открыть логику ответа
МенюОткрывает историю и каталог сценариев. Историю можно открыть повторно и продолжить
Новый разговор / темаНачинает отдельный разговор / меняет светлое и тёмное оформление

Частица реагирует на доступный уровень микрофона и декодированную копию TTS. Переходы её формы показывают состояние интерфейса и не служат измерением качества речи.

Супервизор: разговоры и подключение человека

Реальный экран супервизора с пояснениями

ВозможностьРезультат
Список и LIVEОбщая история, состояния AI/оператора и текущая активность участника. Открытие контекста клиента
Принять и позвонитьПоказывает тему и подтверждение. Оператор принимает обращение, AI прекращает отвечать, клиент отдельно принимает приглашение в голосовой звонок
Ответить / завершитьСохраняет ответ в том же разговоре; завершённое обращение блокирует новый ввод
Голос оператораWebRTC между участником и оператором, без записи аудио. Без TURN соединение зависит от сети
КачествоРучная оценка выбранного сценария, реальные времена этапов и постоянный журнал безопасных кодов ошибок
СценарииПоиск SC01–SC40. Супервизор меняет описания и примеры с сохранением версии; действия и политики защищены от такого редактирования

Скриншоты сняты с настоящей локальной сборки. Цифровые пометки добавлены поверх неизменённых снимков; они объясняют управление. Оригиналы и источник снимков.

Ещё реальные экраны: вход, подтверждение звонка и мобильный супервизор

Вход с выбором роли. Демо-коды находятся в начале README.

Реальный экран входа

Перед подключением оператор видит тему. Клиент получает приглашение и сам принимает голосовой звонок. Кнопка «Отмена» закрывает подтверждение без включения микрофона.

Реальное подтверждение звонка

Список разговоров супервизора на узком экране:

Реальный мобильный экран Supervisor Live

Проверка для жюри за пять шагов

  1. Войти участником. Откройте приложение и используйте код из таблицы в начале README. Используйте только вымышленные данные официального кейса.
  2. Начать разговор. Скажите: «Сколько стоит обязательная страховка на машину?» Это стартовый пример SC01. Ответьте на уточнения. При недоступном микрофоне откройте «Чат».
  3. Открыть логику. Через «Подсказки» проверьте сценарий, собранные поля, причину, действия и время этапов. Затем смените тему и вернитесь к предыдущему вопросу.
  4. Проверить согласие и историю. Для SC29 попросите сменить почту по записи кейса. Сначала откажитесь от подготовленного изменения, затем повторите и подтвердите. Перезагрузите страницу и откройте сохранённый разговор.
  5. Передать человеку. Скажите «Соедините с оператором» (SC37). В отдельном браузере войдите супервизором, откройте разговор и нажмите «Принять и позвонить». Подтвердите тему, а на стороне клиента примите звонок. Ответьте и завершите обращение. Голосовое соединение проверяйте с двумя устройствами.

Эти шаги являются маршрутом приёмки. Они не означают, что все устройства, языки и сети уже проверены.

Ещё один официальный маршрут и где находятся 40 сценариев

Откройте «Меню → Сценарии»: поиск по коду или названию, параметры, действия, требования идентификации и примеры. Нажатие примера переносит текст в черновик; отправка остаётся отдельным действием.

Для SC18 спросите «Какие документы нужны для выплаты?», затем назовите продукт ОГПО. Ответ должен опираться на kb_lookup. Вопрос о документах сам по себе не регистрирует страховой случай. Запрошенная отправка SMS требует согласия, а очередь доставки не означает фактически отправленное сообщение.

Для SC01 используйте регион Алматы, легковой автомобиль и ИИН водителя из набора. Для SC29 контакт и идентификатор берите только из набора. SC37 также содержит официальный пример «Операторға қосыңызшы».

Как устроено

flowchart LR
    A[Речь или текст] --> B[STT для речи]
    A --> R{Достаточно известного контекста?}
    B --> R
    R -->|Точное продолжение| FST[Быстрый путь]
    R -->|Нужно понять запрос| C[LLM: сценарий и поля]
    FST --> D[Правила и подтверждение]
    C --> D
    D --> E[Исполнитель действий]
    E <--> F[(PostgreSQL)]
    E --> G[Ответ по результату]
    G --> H[TTS и воспроизведение]
    F --> I[История и супервизор]

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

СлойСтек
Web и APINext.js 16, React 19, TypeScript, Zod
AIOpenAI gpt-5.4-mini, reasoning_effort: none; модель задаётся сервером
Речьgpt-transcribe, gpt-4o-mini-tts, нативный HTMLAudioElement
ДанныеPostgreSQL / Neon, локально постоянная PGlite
ОператорСохранённая очередь и сообщения, WebRTC с временным SDP
ПубликацияVercel, серверные ключи и внешняя PostgreSQL

Один запуск после настройки

Нужны Node.js 22+, pnpm, доступ к OpenAI и официальный набор организатора.

  1. Установите зависимости: pnpm install --frozen-lockfile.
  2. Скопируйте .env.example в .env.local. Заполните OPENAI_API_KEY, SESSION_SECRET, отдельные коды участника и супервизора. Укажите DATASET_PATH; для облачной версии также DATABASE_URL.
  3. Выполните:
pnpm launch

Команда проверяет окружение, импортирует набор, собирает и запускает приложение. По умолчанию адрес localhost:13300. Занятый порт возвращает ошибку и не останавливает чужие процессы. Без DATABASE_URL локальная версия сохраняет данные в PGlite.

DATASET_PATH должен указывать на внешний каталог с scenarios.json, slots.json, actions.json, knowledge_base.json и mock_backend.json. Исходный архив, клиентские записи, API-ключи и строка подключения базы не добавляются в Git или public/. Демо-коды доступа к опубликованному приложению указаны выше по решению владельца проекта. Полные настройки и эксплуатация.

Границы решения

  • Данные и действия. Работает официальный вымышленный набор. Контакты и обращения сохраняются в базе приложения. Реальных API страховщика, платежей, SMS и расписаний нет: внешние запросы остаются в очереди, полис ожидает оплату, доставка не заявляется выполненной.
  • Подтверждение. Любое изменение бизнес-данных и запрос внешнего действия требуют отдельного согласия на сохранённые параметры. Явная просьба о переводе оператору разрешает сам перевод.
  • Языки. Контракт принимает нормализованные коды языков и смешанную речь. Новые языки допускают справочный перевод; изменения данных требуют проверенных серверных формулировок RU/KK/TR. Качество каждого нового языка отдельно не измерено.
  • Голос и скорость. Поочерёдный разговор с определением паузы, не полнодуплексный Realtime. Цели 500 мс / 1,5 с не подтверждены. Пользователь сообщил о медленном ответе и проблеме слышимости синтезированного ответа в Codex IAB; публикация исправлений не заменяет проверку живым человеком.
  • Операторский голос. Пользователь подтвердил работу связи с оператором в своём сеансе. STUN без настроенного TURN обеспечивает соединение не во всех сетях; это подтверждение не распространяется автоматически на другие устройства и сети.
  • Приватность. Аудио отправляется в STT до текстовой маскировки. Не вводите и не произносите реальные персональные данные. Секреты остаются на сервере, технический журнал содержит безопасный код, этап и внутренние ссылки.

Материалы проекта

МатериалСодержание
Презентация PPTX / PDF7 слайдов, редактируемые подписи и схема
АрхитектураКонтракты, состояние диалога, безопасность исполнения
Приёмка по ТЗРеализованное, доказательства, непроверенное
Контрольные точкиТочные SHA, deployment и исторические измерения
ЭксплуатацияПеременные, импорт, запуск, расходы и ограничения
План / сдачаТри этапа работы и требования мероприятия

Историческая текстовая оценка прежней модели хранится отдельно от текущего профиля. HTTP 200, успешная сборка и видимый интерфейс не доказывают живой голос, точность маршрута или достижение целевой задержки.

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
18
Авторы
2
Файлы
100
Ветки
2

Авторы коммитов

Islam 17sydllvshona 1

История коммитов

  • 2026-09-23 17:45docs: record final deployment and submission artifactsIslam
  • 2026-09-23 17:42docs: present Voice Router case with visual guide and jury accessIslam
  • 2026-09-23 17:37feat: clarify live supervision and confirm operator callsIslam
  • 2026-09-23 17:19feat: add live operator voice takeover and faster voice flowIslam
  • 2026-09-23 17:01fix: improve multilingual routing and dialogue reliabilityIslam
  • 2026-09-23 16:45fix: preserve native speech audio and expand ambient sceneIslam
  • 2026-09-23 16:32fix: smooth reactive particles and adopt voicebird identityIslam
  • 2026-09-23 16:17feat: immersive mobile voice scene and resilient audio lifecycleIslam
Все коммиты (18)
  • 2026-09-23 15:59feat: voice-focused workspace, dark theme and explicit multilingual routingIslam
  • 2026-09-23 15:41feat: add hands-free voice conversation and collapsible readable workspaceIslam
  • 2026-09-23 15:28fix: preserve mixed prompts and consent context across scenariosIslam
  • 2026-09-23 15:12feat: harden operator workflow, protect model inputs and add one-command launchIslam
  • 2026-09-23 15:11docs: prepare teammate 3 pitch and evidence-backed demo plansydllvshona
  • 2026-09-23 14:55docs: assign team roles with owned files and delivery timesIslam
  • 2026-09-23 14:50docs: record production checkpoint and parallel team assignmentsIslam
  • 2026-09-23 14:39feat: add safe fast paths, streamed speech and supervisor controlsIslam
  • 2026-09-23 14:13feat: implement persistent bilingual voice router and operator workspaceIslam
  • 2026-09-23 13:33docs: define Voice Router architecture and three-stage delivery planIslam
Структура репозитория (100 файлов)
.env.example
.gitattributes
.gitignore
.vercelignore
AGENTS.md
CLAUDE.md
README.md
docs/ACCEPTANCE.md
docs/ARCHITECTURE.md
docs/CHECKPOINTS.md
docs/OPERATIONS.md
docs/PLAN.md
docs/SUBMISSION.md
docs/TEAMWORK.md
docs/assets/README.md
docs/assets/call-confirmation-screen.png
docs/assets/client-annotated.png
docs/assets/client-annotated.svg
docs/assets/client-screen.png
docs/assets/login-mobile-screen.png
docs/assets/login-screen.png
docs/assets/mobile-screen.png
docs/assets/supervisor-annotated.png
docs/assets/supervisor-annotated.svg
docs/assets/supervisor-mobile-screen.png
docs/assets/supervisor-screen.png
docs/brand/01-echo.png
docs/brand/02-routes.png
docs/brand/03-flow.png
docs/brand/04-voicebird.png
docs/brand/05-dialogue-spark.png
docs/brand/06-direction.png
docs/brand/README.md
docs/presentation/DIR-ECHOES.pdf
docs/presentation/DIR-ECHOES.pptx
docs/presentation/README.md
docs/presentation/cover.png
next-env.d.ts
next.config.ts
package.json
pnpm-lock.yaml
pnpm-workspace.yaml
postcss.config.mjs
public/brand/dir-echoes-mark.png
public/brand/halyk-mark-classic.png
public/brand/halyk-mark-gold.png
scripts/evaluate.ts
scripts/import-dataset.ts
scripts/launch.ts
src/app/api/[...path]/route.ts
src/app/globals.css
src/app/layout.tsx
src/app/page.tsx
src/components/auth-gate.module.css
src/components/auth-gate.tsx
src/components/background-starfield.tsx
src/components/brand-mark.tsx
src/components/conversation-context.tsx
src/components/conversation-thread.tsx
src/components/operator-voice-controls.module.css
src/components/operator-voice-controls.tsx
src/components/operator-workbench.module.css
src/components/operator-workbench.tsx
src/components/supervisor-tools.module.css
src/components/supervisor-tools.tsx
src/components/voice-particles.tsx
src/components/voice-workspace.tsx
src/components/workspace-panels.tsx
src/components/workspace-ui.tsx
src/lib/ai.ts
src/lib/audio-playback.ts
src/lib/auth.ts
src/lib/budget.ts
src/lib/conversation.ts
src/lib/dataset.ts
src/lib/db.ts
src/lib/domain-actions.ts
src/lib/domain-data.ts
src/lib/domain-language.ts
src/lib/domain.ts
src/lib/error-events.ts
src/lib/fast-path.ts
src/lib/handoffs.ts
src/lib/languages.ts
src/lib/operator-rtc.ts
src/lib/presence.ts
src/lib/privacy.ts
src/lib/repository.ts
src/lib/routing-slots.ts
src/lib/speech-profile.ts
src/lib/speech-stream.ts
src/lib/supervision.ts
src/lib/types.ts
src/lib/use-playback-meter.ts
src/lib/use-voice-call.ts
tests/budget.test.ts
tests/domain.test.ts
tests/router-contract.test.ts
tsconfig.json
vercel.json
Ветки (2)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.