О проекте
Команда: 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.mdTyń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-api | FastAPI + 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 и голос
- Скопируйте
voice-router-backend/.env.exampleвvoice-router-backend/.env. - Укажите
ROUTER_MODE=openai, действующийOPENAI_API_KEYи доступную проекту модель вOPENAI_MODEL. - Для STT и TTS дополнительно установите
VOICE_ENABLED=true. Модели и голос задаютсяSTT_MODEL,TTS_MODEL,TTS_VOICE. - Перезапустите сервер и проверьте
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.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.