AAYMA
RU
Войти

Tyńda — Voice Router

Прототип голосового роутера звонков страховой компании: принимает текст или речь (рус/каз/смешанную), выбирает сценарий из каталога, показывает…

Рабочий MVP
Команда «Antennas» 18💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Antennas
Кейс HackAlem.ai: Коммуникации — Halyk Bank · кейс 2
Стадия: Рабочий MVP

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

Суть

Прототип голосового роутера звонков страховой компании: принимает текст или речь (рус/каз/смешанную), выбирает сценарий из каталога, показывает причину, создаёт карточку handoff и трассировку для супервизора.

Как устроено

Браузер отправляет текст или PCM16 16 кГц по WebSocket в Node.js Gateway, который вызывает demo-роутер или OpenAI (при VOICE_ENABLED включаются STT/TTS) и возвращает транскрипт, решение и длительности этапов. Отдельный Python LLM-роутер выбирает сценарий со строгой JSON-схемой, считает уверенность по logprob и определяет язык параллельным LLM-вызовом. Качество измеряется eval-набором (synthetic/tune/holdout) с проверкой утечек и дубликатов. В ветке backend/voice-api есть альтернатива на FastAPI, SQLite и React.

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

  • LLM-классификация интента со strict JSON schema
  • logprob confidence
  • уточняющий вопрос при неоднозначности
  • eval tune/holdout
  • проверка leakage
  • WebSocket PCM16

Метрики

Eval gpt-4.1-mini: 24/24, p50 2519 мс (первый отчёт); prompt v1.2 — 15/16 на tune

Особенности

Отдельная воспроизводимая eval-инфраструктура: синтетика с ручным ревью, разделение tune/holdout, скрипты проверки утечек и дубликатов, метрики top-1, решения и языка. README прямо запрещает выдавать demo-числа за accuracy.

Стек

Node.js · WebSocket · Python · FastAPI · SQLite · React · Vite · TypeScript · Docker Compose

Модели

gpt-4.1-mini · OpenAI STT · OpenAI TTS


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

README

README.md

Tyńda — Voice Router

Tyńda — прототип голосового помощника для страховой компании. Он принимает текст или речь на русском, казахском и в смешанной форме, выбирает сценарий обслуживания, показывает причину выбора и сохраняет трассировку для супервизора. Для демонстрации используйте только синтетические данные.

Что находится в репозитории

КомпонентНазначениеСостояние
voice-router-backend/ + voice-router-frontend/Node.js Gateway и совместимый браузерный интерфейс: звонок, трассировка, каталог, супервизор и очередь handoffОсновное локальное демо в main
backend/app/router/ + eval/Отдельный Python LLM-роутер, каталог сценариев и воспроизводимые инструменты оценкиЕсть в main; к Node.js Gateway напрямую не подключены
frontend/Отдельный React/Vite интерфейс с собственным demo modeВ main запускается отдельно; его live-контракт отличается от Node.js Gateway
backend/voice-apiFastAPI + SQLite + React/Vite: текстовые и голосовые реплики, REST/WebSocket, каталог и трассировкиОтдельная проверенная ветка; ещё не слита в main

Эти два серверных пути используют разные контракты. Инструкции ниже дают готовый запуск каждого пути и не предполагают, что Python-роутер уже встроен в Node.js Gateway.

Быстрый запуск основного демо из main

Нужен Node.js 20.19+ и pnpm или npm. Из корня репозитория:

cd voice-router-backend
pnpm install --frozen-lockfile
node src/server.mjs

Если pnpm не установлен, используйте npm install --ignore-scripts вместо команды установки. Откройте http://127.0.0.1:8000. Gateway сам отдаёт voice-router-frontend/ и подключает его к WebSocket. Остановить сервер можно через Ctrl+C.

По умолчанию ROUTER_MODE=demo: ключ не нужен и платных вызовов нет. Этот режим проверяет интерфейс и транспорт на заранее заданных примерах; он не измеряет качество LLM-маршрутизации. Произвольная фраза может получить уточняющий вопрос.

Включить LLM и голос

  1. Скопируйте voice-router-backend/.env.example в voice-router-backend/.env.
  2. Укажите ROUTER_MODE=openai, действующий OPENAI_API_KEY и доступную проекту модель в OPENAI_MODEL.
  3. Для STT и TTS дополнительно установите VOICE_ENABLED=true. Модели и голос задаются STT_MODEL, TTS_MODEL, TTS_VOICE.
  4. Перезапустите сервер и проверьте http://127.0.0.1:8000/api/health.

Ключ остаётся только в .env на сервере. Доступ к моделям и квоту нужно проверить своим аккаунтом. Реальные вызовы OpenAI, качество казахской речи и задержку от конца речи до воспроизведения команда пока не подтвердила финальным прогоном.

Как работает основное демо

flowchart LR
    B[Браузер: voice-router-frontend] --> G[Node.js Gateway]
    G --> C[Каталог и состояние диалога]
    G --> R[Demo или OpenAI-роутер]
    G --> S[STT и TTS при включённом голосе]
    G --> X[Локальные трассы и карточки handoff]
    R --> B
    S --> B
    X --> B

Клиент отправляет текст или PCM16 mono 16 кГц по WebSocket. Gateway возвращает транскрипт, решение, ответ и длительности этапов. Интерфейс показывает четыре экрана: звонок, трассировку, супервизор и редактор каталога. При неоднозначности робот уточняет запрос; handoff создаёт локальную карточку, а не соединяет с реальным оператором. Платежи, возвраты и изменения полиса не выполняются.

Каталог и последние трассы сохраняются локально в voice-router-backend/data/state.json. Используйте один процесс на каталог данных. Backend слушает только 127.0.0.1; пользовательской авторизации нет, поэтому не публикуйте этот сервер в интернете.

Подробности: backend API и ограничения, WebSocket-контракт, интерфейс.

React/Vite + FastAPI из ветки backend/voice-api

Эта ветка подключает frontend/ к Python-серверу из backend/app/main.py и существующему LLM-роутеру. REST API обслуживает каталог, звонки и историю; WebSocket передаёт статусы, решение, PCM16-аудио и WAV-ответ. Диалоги сохраняются в SQLite. Ветка не заменяет Node.js Gateway в текущем main.

git clone --branch backend/voice-api https://github.com/BAITC-Hacks/hack-345ab97f-antennas.git
cd hack-345ab97f-antennas
Copy-Item .env.example .env
# Заполните LLM_API_KEY и LLM_MODEL в .env
docker compose up --build

Откройте http://localhost:5173/call; API — http://localhost:8000/docs. Для голосового ввода установите STT_PROVIDER=openai; для озвучивания — TTS_PROVIDER=openai и при необходимости SPEECH_API_KEY. Текст работает при выключенных STT/TTS, если настроен LLM. Чтобы изолированно показать интерфейс без API, задайте VITE_DEMO_MODE=true.

Код этой ветки прошёл 19 Python-тестов, сборку TypeScript/Vite, ESLint и smoke-тесты адаптера. Docker Compose и реальные платные API-вызовы в этом окружении не запускались. Инструкция FastAPI и инструкция React.

Отдельный Python-роутер и оценка в main

Python-роутер выбирает сценарий только через LLM и валидирует JSON по схеме. Его каталог читается при каждом запросе; eval-наборы не используются как примеры в промпте. Это исследовательский компонент, отдельный от основного Node.js Gateway.

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
$env:PYTHONPATH = "backend"
.\.venv\Scripts\python.exe -m pytest backend/tests eval/tests -q

Подробности: контракт роутера, методика eval, отчёты. Платный eval запускается отдельно по инструкции в eval/README.md; не используйте holdout для настройки.

Проверка и ограничения

  • Для основного Node.js демо после установки зависимости выполните node --test из корня репозитория. Тесты подменяют внешние API и не требуют ключа.
  • В браузере проверьте текстовую реплику, казахский и смешанный примеры, трассировку, сохранение каталога и карточку handoff. Голосовой путь требует включённых STT/TTS и доступа к моделям.
  • Числа из подготовленных demo-данных нельзя выдавать за accuracy, p50/p95 или результат финального eval. Публикуйте только метрики из воспроизводимого отчёта с названием набора и модели.
  • Ни один из серверов не выполняет реальные страховые операции и не предназначен для публичного production-развёртывания.

Командные правила и зоны ответственности: AGENTS.md.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
30
Авторы
4
Файлы
142
Ветки
5

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

F1j1tun1 13lazgr 13Admin 4Codex 1

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

  • 2026-09-23 17:47docs: rewrite main README with verified setup and component statusF1j1tun1
  • 2026-09-23 17:47feat: Node gateway uses the Python LLM router (ROUTER_MODE=python)lazgr
  • 2026-09-23 17:45feat: connect React frontend to voice APIerkin
  • 2026-09-23 17:41Merge origin/main (Node gateway, voice-router-frontend) into feature/Alikhanlazgr
  • 2026-09-23 17:39feat: add FastAPI server connecting frontend and LLM router (text end-to-end path)lazgr
  • 2026-09-23 17:31feat: merge latest main with Voice Router frontend and backendAdmin
  • 2026-09-23 17:25Merge Feature/Tileukhan into main: integrate Voice Router frontend and backendAdmin
  • 2026-09-23 17:23Merge origin/main (frontend, docs, README) into feature/Alikhanlazgr
Все коммиты (30)
  • 2026-09-23 17:23feat: adopt Codex eval metrics v2 in root eval (top-1/decision split, runs, language metric)lazgr
  • 2026-09-23 17:22chore: normalize line endings to LF and add .gitattributeslazgr
  • 2026-09-23 17:17fix: detect utterance language in a parallel LLM call; prompt v1.3; eval without lang hintlazgr
  • 2026-09-23 17:12feat(backend): add Voice Router gateway and frontend integrationAdmin
  • 2026-09-23 16:39feat: add voice router backend API and call pipelineerkin
  • 2026-09-23 16:34feat(frontend): add Voice Router UI, secure API proxy and pitch materialsAdmin
  • 2026-09-23 16:04feat: add LLM router backend (prompt v1.2, strict schema, logprob confidence)lazgr
  • 2026-09-23 16:04feat: add eval tooling, datasets and tune reports (v1.2: 15/16 on tune)lazgr
  • 2026-09-23 16:04docs: add AGENTS.md and CLAUDE.md so Codex and Claude read the same team ruleslazgr
  • 2026-09-23 15:58PleaseF1j1tun1
  • 2026-09-23 15:57Link Voice Router code and database guide from READMEF1j1tun1
  • 2026-09-23 15:27Add Voice Router frontend and database guideCodex
  • 2026-09-23 14:49docs: add working project README and delivery planF1j1tun1
  • 2026-09-23 14:42docs: add team CLAUDE.mdlazgr
  • 2026-09-23 14:42test: add first eval report for gpt-4.1-mini (24/24, p50 2519 ms)lazgr
  • 2026-09-23 13:37Add router_prototype: LLM router prototype with catalog, prompt, schema and evallazgr
  • 2026-09-23 12:17Delete 2F1j1tun1
  • 2026-09-23 12:16DeleteF1j1tun1
  • 2026-09-23 11:24init commitF1j1tun1
  • 2026-09-23 11:16Example 3F1j1tun1
  • 2026-09-23 11:01Example 2F1j1tun1
  • 2026-09-23 11:00ExampleF1j1tun1
Структура репозитория (142 файлов)
.env.example
.gitattributes
.gitignore
AGENTS.md
CLAUDE.md
Makefile
README.md
backend/README.md
backend/app/__init__.py
backend/app/api/__init__.py
backend/app/api/catalog.py
backend/app/api/gateway.py
backend/app/dialog/__init__.py
backend/app/dialog/manager.py
backend/app/main.py
backend/app/router/__init__.py
backend/app/router/catalog.py
backend/app/router/cli.py
backend/app/router/confidence.py
backend/app/router/llm_router.py
backend/app/router/policy.py
backend/app/router/prompt.py
backend/app/router/providers/__init__.py
backend/app/router/providers/base.py
backend/app/router/providers/fake.py
backend/app/router/providers/openai_provider.py
backend/app/router/schema.py
backend/app/trace/__init__.py
backend/app/trace/store.py
backend/tests/test_api.py
backend/tests/test_eval_tools.py
backend/tests/test_gateway_bridge.py
backend/tests/test_router.py
data/dev_utterances.json
data/dialogs_sample.json
data/scenarios.json
database/README.md
docs/DEMO_SCRIPT.md
docs/FRONTEND_README.md
docs/PITCH.md
docs/VIDEO_BACKUP.md
docs/contracts/router.md
eval/README.md
eval/check_duplicates.py
eval/check_leakage.py
eval/datasets/holdout.json
eval/datasets/synthetic.json
eval/datasets/synthetic_raw.json
eval/datasets/synthetic_review.csv
eval/datasets/tune.json
eval/export_review.py
eval/generate_synthetic.py
eval/import_review.py
eval/metrics.py
eval/reports/error-analysis-2026-09-23.md
eval/reports/tune-2026-09-23_110623_620508Z-run1.json
eval/reports/tune-2026-09-23_110623_620508Z-run2.json
eval/reports/tune-2026-09-23_110623_620508Z-run3.json
eval/reports/tune-2026-09-23_110623_620508Z-summary.json
eval/reports/tune-2026-09-23_110623_620508Z-summary.md
eval/reports/tune-2026-09-23_122228_403242Z-run1.json
eval/reports/tune-2026-09-23_122228_403242Z-summary.json
eval/reports/tune-2026-09-23_122228_403242Z-summary.md
eval/reports/tune-2026-09-23_1507-gpt-4.1-mini.json
eval/reports/tune-2026-09-23_1601-gpt-4.1-mini.json
eval/reports/tune-2026-09-23_1619-gpt-4.1-mini.json
eval/reports/tune-2026-09-23_1620-gpt-4.1-mini.json
eval/reports/tune-2026-09-23_1629-gpt-4.1-mini.json
eval/run_eval.py
eval/split_dev.py
eval/tests/test_metrics.py
frontend/.env.example
frontend/eslint.config.js
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/scripts/demo-smoke.mjs
frontend/src/App.tsx
frontend/src/api/index.ts
frontend/src/api/mockApi.ts
frontend/src/api/realApi.ts
frontend/src/main.tsx
frontend/src/styles.css
frontend/src/types.ts
frontend/src/vite-env.d.ts
frontend/tsconfig.app.json
frontend/tsconfig.json
frontend/tsconfig.node.json
frontend/vite.config.ts
requirements.txt
router_prototype/.env.example
router_prototype/.gitignore
router_prototype/README.md
router_prototype/catalog.json
router_prototype/prompt.py
router_prototype/reports/.gitkeep
router_prototype/reports/2026-09-23_1403_gpt-4.1-mini.json
router_prototype/requirements.txt
router_prototype/router.py
router_prototype/run_eval.py
router_prototype/schema.py
router_prototype/test_fallback.py
router_prototype/tests.json
voice-router-backend/.env.example
voice-router-backend/.gitignore
voice-router-backend/API_EXAMPLES.http
voice-router-backend/README.md
voice-router-backend/VERIFICATION.md
voice-router-backend/catalog.seed.json
voice-router-backend/package.json
voice-router-backend/pnpm-lock.yaml
voice-router-backend/src/audio.mjs
voice-router-backend/src/config.mjs
voice-router-backend/src/errors.mjs
voice-router-backend/src/gateway.mjs
voice-router-backend/src/provider.mjs
voice-router-backend/src/server.mjs
voice-router-backend/src/store.mjs
voice-router-backend/src/validation.mjs
voice-router-backend/test/backend.test.mjs
voice-router-backend/test/python-provider.test.mjs
voice-router-frontend/.env.example
voice-router-frontend/.gitignore
voice-router-frontend/API_SETUP.md
voice-router-frontend/CONFORMANCE.md
voice-router-frontend/DEMO_SCRIPT.md
voice-router-frontend/ORGANIZER_MESSAGES.md
voice-router-frontend/PROJECT_README.md
voice-router-frontend/README.md
voice-router-frontend/VERIFICATION.md
voice-router-frontend/VIDEO_BACKUP.md
voice-router-frontend/app.js
voice-router-frontend/gateway-contract.json
voice-router-frontend/gateway.js
voice-router-frontend/index.html
voice-router-frontend/package.json
voice-router-frontend/server.mjs
voice-router-frontend/styles.css
voice-router-frontend/test/fixtures/.env.fixture
voice-router-frontend/test/gateway.test.mjs
voice-router-frontend/test/server.test.mjs
voice-router-frontend/tynda-voice-router-pitch.pptx
Ветки (5)

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

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

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