О проекте
Команда: 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
Кейс 2: Voice Router — голосовой робот с AI-слоем выбора сценария
DIR ECHOES для HackAlem AI
Открыть приложение · Презентация PPTX · PDF · Архитектура · Проверка по ТЗ
Задайте страховой вопрос голосом. DIR ECHOES соберёт недостающие данные, подготовит разрешённое действие к вашему подтверждению или подключит оператора вместе с историей разговора.
40 сценариев · 43 поля · 31 действие из официального набора организатора. Эти числа описывают каталог, а не измеренную точность модели.
Разговор, операции и передача человеку сохраняются в базе. На телефоне главный элемент — голос. Чат, история и объяснение маршрута открываются по кнопке. Пользователь подтвердил работающую связь с оператором в своём сеансе. Проверка остальных сетей и устройств остаётся отдельной задачей.
Механика кейса в продукте
| Требование кейса | Как реализовано |
|---|---|
| Гибридный выбор сценария | LLM извлекает намерение и поля; серверный исполнитель проверяет правила и действия |
| Контекст разговора | Уточнения, смена темы, возврат к сохранённому вопросу и продолжение после перезагрузки |
| Объяснение решения | Trace показывает сценарий, причину, альтернативы, параметры, действия и время этапов |
| Согласие перед действием | Отдельное подтверждение сохранённых параметров перед изменением или внешним запросом |
| Живой оператор | Общая история и подключение человека в том же разговоре, текст и голос WebRTC |
Опубликованная сборка: bfaf300, Vercel Ready, 23 сентября 2026 в 17:43. Этот deployment. Точные доказательства и ограничения: контрольные точки.
Два рабочих места
Клиент: один разговор, доступные объяснения
| На экране | Что делает |
|---|---|
| Начать разговор | Запрашивает микрофон. После паузы отправляет реплику, озвучивает ответ и возвращается к слушанию. Завершение останавливает разговор |
| Чат | Показывает сохранённые реплики и текстовый ввод; позволяет продолжить без микрофона |
| Подсказки | Показывает текущую тему, ожидаемые данные и подтверждение; из панели можно открыть логику ответа |
| Меню | Открывает историю и каталог сценариев. Историю можно открыть повторно и продолжить |
| Новый разговор / тема | Начинает отдельный разговор / меняет светлое и тёмное оформление |
Частица реагирует на доступный уровень микрофона и декодированную копию TTS. Переходы её формы показывают состояние интерфейса и не служат измерением качества речи.
Супервизор: разговоры и подключение человека

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

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

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

Проверка для жюри за пять шагов
- Войти участником. Откройте приложение и используйте код из таблицы в начале README. Используйте только вымышленные данные официального кейса.
- Начать разговор. Скажите: «Сколько стоит обязательная страховка на машину?» Это стартовый пример SC01. Ответьте на уточнения. При недоступном микрофоне откройте «Чат».
- Открыть логику. Через «Подсказки» проверьте сценарий, собранные поля, причину, действия и время этапов. Затем смените тему и вернитесь к предыдущему вопросу.
- Проверить согласие и историю. Для SC29 попросите сменить почту по записи кейса. Сначала откажитесь от подготовленного изменения, затем повторите и подтвердите. Перезагрузите страницу и откройте сохранённый разговор.
- Передать человеку. Скажите «Соедините с оператором» (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 и API | Next.js 16, React 19, TypeScript, Zod |
| AI | OpenAI 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 и официальный набор организатора.
- Установите зависимости:
pnpm install --frozen-lockfile. - Скопируйте
.env.exampleв.env.local. ЗаполнитеOPENAI_API_KEY,SESSION_SECRET, отдельные коды участника и супервизора. УкажитеDATASET_PATH; для облачной версии такжеDATABASE_URL. - Выполните:
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 / PDF | 7 слайдов, редактируемые подписи и схема |
| Архитектура | Контракты, состояние диалога, безопасность исполнения |
| Приёмка по ТЗ | Реализованное, доказательства, непроверенное |
| Контрольные точки | Точные SHA, deployment и исторические измерения |
| Эксплуатация | Переменные, импорт, запуск, расходы и ограничения |
| План / сдача | Три этапа работы и требования мероприятия |
Историческая текстовая оценка прежней модели хранится отдельно от текущего профиля. HTTP 200, успешная сборка и видимый интерфейс не доказывают живой голос, точность маршрута или достижение целевой задержки.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.

