О проекте
Команда: Sever
Кейс HackAlem.ai: Коммуникации — Halyk Bank · кейс 2
Стадия: Доведённый продукт
Задача кейса: «Voice Router»: голосовой AI, маршрутизирующий звонки в контакт-центре страховой компании
Суть
Голосовой робот контакт-центра страховой: распознаёт ru/kk/смешанную речь, LLM выбирает один из 40 сценариев и доводит его до конца на моках действий, отвечает голосом; есть панель супервизора с трассировкой.
Как устроено
Аудио по WebSocket распознаётся gpt-4o-transcribe (запасной ElevenLabs Scribe), код нормализует числа ru/kk, телефоны, ИИН, относительные даты. LLM-роутер (gpt-4.1-mini, каскад с быстрым путём NVIDIA llama-3.1-8b) по каталогу сценариев с правилами «не этот, если…» возвращает JSON со сценарием, уверенностью, альтернативами и слотами; политика в коде: ≥0.75 — запуск, 0.45–0.75 — переспрос, дважды ниже — оператор. Исполнитель gpt-4.1 с инструментами вызывает 31 мок-действие (find_client, check_payment…), необратимые действия только через preview + явное «да»; ответ стримится по предложениям в TTS ElevenLabs/OpenAI, трассировка пишется в SQLite.
Ключевые решения
- LLM routing по описаниям сценариев
- model cascade по уверенности
- confidence policy thresholds
- function calling
- preview/execute guard
- нормализация чисел ru/kk
- sentence-level streaming TTS
- стек тем
Особенности
Осознанный отказ от intent-классификатора: новый сценарий добавляется записью в scenarios.json. Защита необратимых действий реализована в коде, а не в промпте; несколько просьб в одной реплике кладутся в стек тем; супервизор видит альтернативы, уверенность и тайминги этапов по каждой реплике.
Стек
Python · FastAPI · WebSocket · SQLite · React 19 · TypeScript · Vite · Tailwind CSS · shadcn/ui · Docker · Railway
Модели
gpt-4.1-mini · gpt-4.1 · gpt-4o-transcribe · ElevenLabs Scribe v2 · ElevenLabs eleven_flash_v2_5 · OpenAI tts-1 · meta/llama-3.1-8b-instruct (NVIDIA) · text-embedding-3-small
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-dc2355c1-sever.
README
README.mdVoice Router
Голосовой AI-робот контакт-центра, в котором сценарий разговора выбирает LLM, а не классификатор намерений.
HackAlem AI · трек Halyk Bank · кейс 2 «Voice Router» · команда Sever
🔗 Демо: https://voice-router-production.up.railway.app — экран клиента, /supervisor — панель супервизора.
Версия на Railway обновляется вручную (railway up) и может отставать от ветки main.
1. О проекте
Голосовые роботы в контакт-центрах хорошо говорят и слышат, но сценарий разговора у большинства выбирает классификатор, обученный на фиксированных формулировках. Он ломается на живой речи: клиент меняет тему посреди разговора, просит две вещи сразу, говорит на стыке двух сценариев или переходит с русского на казахский внутри фразы. Каждый неверный выбор — это перевод на оператора или потерянный клиент.
Voice Router — голосовой робот контакт-центра вымышленной страховой компании Saqta Insurance (данные из стартового кита хакатона). Клиент говорит своими словами по-русски, по-казахски или смешивая языки. Робот:
- понимает запрос с первой реплики и выбирает один из 40 сценариев LLM-слоем, который читает описания сценариев и правила их разграничения в контексте диалога;
- доводит сценарий до конца на данных: находит клиента по телефону, считает цены по формулам, проверяет платежи и заявления, оформляет полисы — необратимые действия только после явного «да»;
- отвечает голосом, а супервизор видит по каждой реплике: какой сценарий выбран, почему, какие были альтернативы, какие действия вызваны и сколько заняли этапы.
Для кого: клиенты контакт-центра, которые говорят своими словами, и супервизоры, которым нужно видеть, где робот сомневался и ошибся.
2. Что реализовано
Разговор
- Голос через микрофон в браузере и текст как резервный канал. Ответ в том же канале: спросили голосом — бот отвечает голосом, написали текстом — отвечает только текстом.
- Русский, казахский и смешанная речь внутри одной фразы; ответ на языке клиента.
- Выбор сценария LLM из каталога 40 сценариев + системные
SYS_UNCLEAR,SYS_OUT_OF_SCOPE,SYS_GOODBYE. - Несколько просьб в одной реплике: срочная первой, остальные — в стек тем, робот возвращается к ним после текущей.
- Смена темы посреди разговора с сохранением прерванной темы.
- Переспрос вместо угадывания при низкой уверенности; после двух неуверенных ответов подряд — передача оператору с резюме разговора.
- Гибридный каскад роутера: быстрый путь на NVIDIA API (OpenAI-совместимый, модель
NVIDIA_MODEL) и эскалация на OpenAI, если уверенность нижеFAST_CONFIDENCE_THRESHOLD(0.85), речь смешанная, в реплике несколько тем или запрос неясен. Включается ключомNVIDIA_API_KEY; без ключа роутер сразу идёт в OpenAI.
Ведение сценария на данных
- Моки всех 31 действия из
actions.jsonповерхmock_backend.jsonи формулknowledge_base.json: поиск клиента и полисов, расчёт ОГПО / КАСКО / путешествий / имущества / НС, проверка платежа, статус заявления, запись к врачу и на осмотр, расторжение с возвратом, жалобы, мошенничество, передача оператору. - Суммы и номера считает код, модель их только озвучивает.
- Необратимые действия (оформление, продление, изменение, расторжение полиса, заявление, запись, смена контактов): сначала
previewс озвучиванием данных, выполнение — только после явного подтверждения, строго с аргументами изpreview. Проверка в коде, а не в промпте. - Нормализация продиктованных чисел кодом (ru/kk): «плюс жеті, жеті жүз бір, нөл нөл нөл, нөл нөл, он» →
+77010000010; ИИН, номера полиса и заявления, госномер; относительные даты («вчера», «үш күн бұрын»).
Интерфейс
- Экран клиента: голосовой шар (WebGL), запись, текст, потоковое воспроизведение ответа, выключение звука, новый диалог.
- Трассировка под каждым ответом: сценарии с уверенностью, альтернативы, обоснование, решение политики, слоты, клиент, действия (
preview/execute/ защита / ошибка), отложенные темы, время по этапам. - Панель супервизора: метрики (реплики, доля передач оператору, p50 роутера и до звука), живая лента трассировок, поиск, карточка реплики, популярные сценарии.
Инфраструктура
- Запуск одной командой (
docker compose up), деплой на Railway. - Переключаемые провайдеры STT/TTS и запасные варианты: демо не замолкает, если один API недоступен.
- Скрипты проверки: точность на dev-наборе, прогон эталонных диалогов, репетиция в формате жюри, смоук-тест API.
3. Как работает — путь одной реплики
Пример из ТЗ: «Здравствуйте, я вчера оплатил, деньги списались, а полиса нет».
- Микрофон → STT. Браузер записывает реплику и отправляет аудио по WebSocket. Сервер распознаёт речь (
gpt-4o-transcribeс подсказкой «только русский или казахский»; запасной — ElevenLabs Scribe). Если текст почти без кириллицы — распознаёт повторно другим провайдером. - Триаж (код). Числа, телефоны, ИИН, номера полисов и относительные даты приводятся к нормальному виду: «вчера» →
2026-09-30(дата «сегодня» по киту — 2026-10-01). - LLM-роутер. Модель получает весь каталог сценариев, историю диалога и реплику и возвращает JSON:
SC30(деньги списаны, полис не выпущен) с уверенностью, альтернативы, язык, слоты (payment_date). Решение читается из потока, как только модель его дописала. - Политика (код). Уверенность ≥ 0.75 — запуск сценария; 0.45–0.75 — переспрос с двумя вариантами; ниже 0.45 два раза подряд — оператор.
- Исполнитель сценария. LLM с инструментами — только действиями этого сценария. Спрашивает телефон, находит клиента (
find_client), проверяет платёж (check_payment: 31 200 ₸, полис не выпущен) и по правилу сценария передаёт разговор специалисту (transfer_to_operator). Пока идут действия, клиент уже слышит «Сейчас проверю». - TTS → динамик. Если реплика была голосовой, каждое готовое предложение ответа сразу озвучивается (ElevenLabs, запасной — OpenAI TTS) и играет в браузере потоком.
- Трассировка. Решение, действия и время этапов пишутся в SQLite и сразу появляются под ответом и в панели супервизора.
4. Технологии
| Слой | Что используется |
|---|---|
| Бэкенд | Python 3.12, FastAPI, Uvicorn, Pydantic / pydantic-settings, httpx, NumPy, SQLite |
| Фронтенд | React 19, TypeScript, Vite 6, Tailwind CSS 4, shadcn/ui, lucide-react, ogl (WebGL-шар); запасные страницы — HTML/JS без сборки в static/ |
| LLM | OpenAI gpt-4.1-mini — роутер (OPENAI_MODEL), gpt-4.1 — исполнитель сценария (EXECUTOR_MODEL) |
| STT | OpenAI gpt-4o-transcribe (основной), ElevenLabs Scribe scribe_v2 с language_code=kaz (запасной) |
| TTS | ElevenLabs eleven_flash_v2_5 со стримом (основной), OpenAI tts-1 (запасной), браузерный speechSynthesis |
| Опционально | NVIDIA API (OpenAI-совместимый, meta/llama-3.1-8b-instruct по умолчанию) — быстрый путь каскада роутера, включается NVIDIA_API_KEY; OpenAI text-embedding-3-small — сужение кандидатов (TOP_K_CANDIDATES). Оба выключены по умолчанию |
| Инфраструктура | Docker (многостадийная сборка: Node 22 → Python 3.12), docker compose, Railway |
5. Архитектура
flowchart LR
mic([Микрофон / текст]) --> stt[STT<br/>gpt-4o-transcribe / Scribe]
stt --> triage[Триаж<br/>нормализация чисел — код]
triage --> router[LLM-роутер<br/>каталог 40 сценариев]
router --> policy[Политика решений<br/>пороги — код]
policy -->|route / continue| exec[Исполнитель сценария<br/>LLM + действия]
policy -->|clarify / out_of_scope / goodbye| tmpl[Ответ по шаблону кита]
policy -->|handoff| op[Оператор + резюме]
exec <--> backend[(Моки действий<br/>mock_backend + KB)]
exec --> tts[TTS<br/>ElevenLabs / OpenAI]
tmpl --> tts
tts --> spk([Динамик])
router -.-> trace[[Трассировка → SQLite → UI]]
exec -.-> trace
| Компонент | Файл | Роль |
|---|---|---|
| API и WebSocket | app/main.py | страницы, /ws/session (голос и текст), /ws/supervisor, REST, конвейер озвучки по предложениям |
| Оркестратор | app/orchestrator.py | состояние разговора: история, клиент, активный сценарий, стек тем, слоты, озвученные preview; параллельный запуск исполнителя с роутером на репликах-продолжениях |
| Триаж | app/normalize.py | числа ru/kk → цифры, телефон, ИИН, полис, заявление, госномер, относительные даты |
| LLM-роутер | app/router/llm_router.py | промпт из каталога (description, not_this_if, слоты, примеры), потоковый разбор JSON |
| Каскад | app/router/cascade.py | быстрый путь (NVIDIA, опционально) → сильная модель (OpenAI) |
| Политика | app/router/policy.py | пороги уверенности, порядок сценариев, продолжение, переспрос, оператор |
| Исполнитель | app/executor.py | LLM с инструментами, защита необратимых действий, поток ответа по предложениям |
| Моки действий | app/backend.py | 31 действие, формулы цен и возвратов, ошибки в формате кита, preview на копии состояния |
| Системные ответы | app/responder.py | SYS_*, передача оператору |
| Провайдеры | app/providers/ | OpenAI / NVIDIA, STT, TTS с запасными вариантами |
| Трассировка | app/tracing.py | замеры этапов, SQLite, статистика, трансляция супервизору |
| Интерфейс | frontend/ (React), static/ (запасной) | экран клиента и панель супервизора |
Почему это не intent-классификатор. Сценарий выбирает генеративная LLM по описаниям сценариев и правилам «НЕ этот сценарий, если …» в контексте диалога. Модель не обучалась на примерах и не сопоставляет реплики с метками; эмбеддинг-поиск по умолчанию выключен (TOP_K_CANDIDATES=0), а если включить — он только сокращает промпт, решение всё равно за LLM. Новый сценарий добавляется записью в scenarios.json без переобучения. Проверочные реплики не захардкожены.
6. Установка и запуск
Нужны ключ OpenAI (обязательно) и ключ ElevenLabs с правами Text to Speech и Speech to Text (желательно; без него работают запасные OpenAI STT/TTS).
Docker — одной командой
git clone https://github.com/BAITC-Hacks/hack-dc2355c1-sever.git
cd hack-dc2355c1-sever
cp .env.example .env # вписать OPENAI_API_KEY и ELEVENLABS_API_KEY
docker compose up --build
Откройте http://localhost:8000 (клиент) и http://localhost:8000/supervisor (супервизор). Микрофон работает на localhost и по HTTPS.
Без Docker
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cd frontend && npm ci && npm run build && cd .. # сборка React-интерфейса в static/ui (нужен Node 22)
.venv/bin/uvicorn app.main:app --port 8000
Без сборки фронтенда сервер отдаёт запасные страницы из static/.
Railway
Образ собирается из Dockerfile, порт — из $PORT, healthcheck — /api/health (railway.toml).
railway login
railway init # или railway link к существующему проекту
railway up # заливает текущую папку; .env не отправляется
railway domain # HTTPS-домен — нужен браузеру для микрофона
Переменные из .env добавьте в Variables → Raw Editor (PORT не нужен).
Основные переменные окружения
Полный список с комментариями — в .env.example.
| Переменная | По умолчанию | Назначение |
|---|---|---|
OPENAI_API_KEY | — | роутер, исполнитель, STT, запасной TTS |
OPENAI_MODEL / EXECUTOR_MODEL | gpt-4.1-mini / gpt-4.1 | модели роутера и исполнителя |
ELEVENLABS_API_KEY | — | TTS и запасной STT |
STT_PROVIDER / TTS_PROVIDER | openai / elevenlabs | основной провайдер распознавания и озвучки |
ROUTE_THRESHOLD / CLARIFY_THRESHOLD | 0.75 / 0.45 | пороги политики решений |
SPECULATIVE_EXECUTOR | true | исполнитель параллельно с роутером на репликах-продолжениях |
NVIDIA_API_KEY | — | опциональный быстрый путь роутера |
7. Как проверить решение
Сценарий для жюри (5 минут)
Откройте экран клиента и рядом /supervisor. Говорите в микрофон или пишите текстом.
- Клиент из базы, запрос из ТЗ. «Здравствуйте, я вчера оплатил полис, деньги списались, а полиса нет» → бот просит телефон → «Плюс семь семьсот один ноль ноль ноль ноль ноль ноль три». Ожидается: бот находит клиента, видит платёж 31 200 ₸ без выпущенного полиса и передаёт разговор специалисту. В трассировке —
SC30, действияfind_client,check_payment,transfer_to_operator. - Казахский и данные клиента. «Сәлеметсіз бе, полисім әлі жарамды ма?» → «Телефоным плюс жеті жеті жүз бір нөл нөл нөл нөл нөл нөл сегіз». Ожидается: ответ на казахском, полис SQ-OGPO-103990 действует до 14 февраля 2027.
- Две темы и стык сценариев. «Выплату одобрили, но сумма почти вдвое меньше, чем посчитали на СТО» →
SC19(несогласие с решением), а неSC17(статус). - Необратимое действие. «Көлігімді саттым, КАСКО шартын бұзғым келеді» → телефон
+7 701 000 00 10. Ожидается: бот называет возврат 163 800 ₸ и спрашивает подтверждение; в трассировкеcancel_policy:preview. Только после «Иә, растаймын» —cancel_policy:execute. - Вне тематики и неясный запрос. «Можно у вас взять кредит?» → вежливый отказ. «Мне по поводу машины» → переспрос с двумя вариантами.
Полный список реплик — TEST_QUESTIONS.md
Реплики по группам с ожидаемыми сценариями и ответами: простые запросы, казахский, смешанная речь, две темы, стыки похожих сценариев, 7 разговоров с клиентами из mock_backend.json (с телефонами), необратимые действия, смена темы и возврат, вне тематики, оператор, ошибки. Там же — что смотреть в трассировке.
Автоматические проверки
# Точность роутера на 104 размеченных репликах dev-набора → эталонный data/evaluate.py
.venv/bin/python -m scripts.eval_router --mode strong # только OpenAI
.venv/bin/python -m scripts.eval_router --mode cascade # NVIDIA → OpenAI (нужен NVIDIA_API_KEY)
# 10 размеченных диалогов из data/dialogs_sample.json через весь конвейер: сценарии и действия против эталона
.venv/bin/python -m scripts.run_dialogs
# 10 собственных реплик в формате проверки жюри (scripts/rehearsal_set.json)
.venv/bin/python -m scripts.rehearsal
# Смоук-тест API (28 проверок) на запущенном сервере — локальном или задеплоенном
.venv/bin/python -m scripts.smoke_api
.venv/bin/python -m scripts.smoke_api https://voice-router-production.up.railway.app
eval_router, run_dialogs и rehearsal вызывают OpenAI API (прогон eval_router — порядка $0.3–1).
Результаты наших прогонов
| Проверка | Результат |
|---|---|
dev-набор, 104 реплики (eval_router, gpt-4.1-mini) | основной сценарий 96.2 %, полное совпадение 97.1 %; казахский 97.8 %, смешанная речь 100 %, вне тематики 100 %, неясные 100 %; язык ответа 96 из 97 |
эталонные диалоги (run_dialogs) | основной сценарий в 38 из 40 реплик; суммы и номера совпадают с эталоном (ОГПО 38 000 ₸, поездка 15 400 ₸, возврат 163 800 ₸, CL-500342) |
репетиция (rehearsal) | 10 из 10 по основному сценарию, всем темам и языку ответа |
смоук-тест API (smoke_api) | 28 из 28 локально |
| время до первого звука ответа (текстовый канал) | медиана 1.8–2.7 с в разных прогонах; реплики-продолжения быстрее (1.3–1.9 с) за счёт параллельного исполнителя |
Оставшиеся ошибки на dev-наборе — пограничные пары: «сломал ногу за границей» (SC15 / SC16), «какие бумаги, если затопили» (SC18 / SC14).
8. Данные и интеграции
Данные — стартовый кит хакатона (data/, синтетические; «сегодня» по киту — 2026-10-01):
| Файл | Содержимое | Где используется |
|---|---|---|
scenarios.json | 40 сценариев + 3 системных намерения: описание, not_this_if, приоритет, слоты, действия, примеры ru/kk, стартовые реплики | промпт роутера, исполнитель, ответы |
slots.json | 43 слота: тип, формат, вопросы ru/kk | вопросы клиенту, нормализация |
actions.json | 31 действие, коды ошибок, очереди операторов | моки действий, инструменты исполнителя |
knowledge_base.json | офисы, продукты и формулы цен, клиники, правила урегулирования, документы, возвраты | расчёты и ответы по фактам |
mock_backend.json | 11 клиентов, 11 полисов, 4 заявления, 2 платежа | идентификация клиента и ответы по его данным |
dev_utterances.json, evaluate.py | 104 размеченные реплики и эталонный скрипт оценки | scripts/eval_router.py |
dialogs_sample.json | 10 размеченных диалогов | scripts/run_dialogs.py |
Внешние API:
| Сервис | Для чего | Обязателен |
|---|---|---|
| OpenAI API | роутер, исполнитель, STT gpt-4o-transcribe, запасной TTS | да |
| ElevenLabs API | TTS (стрим), запасной STT | нет — есть запасные варианты |
| NVIDIA API | быстрый путь роутера (каскад NVIDIA → OpenAI) | нет, включается NVIDIA_API_KEY |
Интерфейсы приложения:
| Метод | Путь | Назначение |
|---|---|---|
| WS | /ws/session | реплика голосом (бинарное аудио) или текстом {"type":"text","text":"…"} → transcript, bot_partial, mp3-чанки (только на голосовую реплику или с "speak": true), trace, final |
| WS | /ws/supervisor | трассировки всех сессий в реальном времени |
| POST | /api/chat | текстовая реплика {text, session_id?} → трассировка |
| GET | /api/traces, /api/stats | последние трассировки и статистика |
| GET / PUT | /api/scenarios | чтение и сохранение каталога сценариев |
| GET | /api/sessions/{id}/handoff | резюме разговора для оператора |
| GET | /api/health | какие провайдеры подключены |
9. Ограничения
- Задержка. Время до первого звука зависит от сети до OpenAI и в наших прогонах менялось от 1.8 до 2.7 с по текстовому каналу — выше ориентира ТЗ в 1.5 с. Голосом добавляется распознавание (0.7–1.9 с): аудио отправляется целиком после окончания реплики, распознавания во время речи нет. На новых темах роутер и исполнитель идут последовательно.
- STT. Качество распознавания казахской и смешанной речи определяет всё остальное. Проверяли на синтезированной речи и отдельных живых репликах; большой проверки живыми голосами не было.
- Языки. Только русский и казахский.
- Данные. Backend — моки на синтетических данных; изменения (оформленные полисы, расторжения) живут в памяти процесса и сбрасываются при перезапуске. Трассировки хранятся в SQLite внутри контейнера и на Railway пропадают при новом деплое.
- Редактирование каталога.
PUT /api/scenariosсохраняет каталог, но роутер кэширует промпт — новые описания применяются после перезапуска сервера. - Доступ. Авторизации нет:
/supervisorиPUT /api/scenariosоткрыты всем, у кого есть ссылка. - Быстрый путь NVIDIA реализован (
app/router/cascade.py,app/providers/llm.py) и включается одной переменнойNVIDIA_API_KEY;scripts/eval_router.py --mode fastи--mode cascadeзамеряют его точность и задержку. В демо он не включён: бесплатный endpointllama-3.1-8b-instructпомечен deprecated, а маленькие открытые модели слабо понимают казахский, поэтому точность и выигрыш по задержке с NVIDIA мы не замеряли. Метрика «Быстрый маршрут» в панели супервизора без ключа показывает 0 %. - Браузеры. Интерфейс проверялся в Chrome на desktop; Safari и iPhone отдельно не проверялись (для Safari есть запасное воспроизведение звука без MediaSource и определение формата записи mp4).
- Перебивание только кнопкой. Голосом перебить робота во время ответа нельзя: нажатие на микрофон останавливает озвучку и начинает новую запись.
- Приватность. Все данные синтетические; реальные персональные данные во внешние API не передаются.
Авторы коммитов
История коммитов
- 2026-09-23 17:30Merge pull request #15 from BAITC-Hacks/feat/halyk-lookBeknur Tanibergen
- 2026-09-23 17:30Интерфейс в стиле банковского приложения: светлая тема, фирменный зелёныйBeknur kachok
- 2026-09-23 17:23Revert "Merge pull request #14 from BAITC-Hacks/feat/kk-voice"Beknur kachok
- 2026-09-23 17:20Merge pull request #14 from BAITC-Hacks/feat/kk-voiceBeknur Tanibergen
- 2026-09-23 17:19Казахское произношение: голос Kari, прогрев TTS, отдельный провайдер для kkBeknur kachok
- 2026-09-23 17:10README: быстрый путь NVIDIA реализован — как включить и как замеритьBeknur kachok
- 2026-09-23 17:08Merge pull request #13 from BAITC-Hacks/feat/reply-modalityBeknur Tanibergen
- 2026-09-23 17:08Ответ в канале вопроса: голос → голос, текст → только текстBeknur kachok
Все коммиты (44)
- 2026-09-23 17:00style: ensure white labels on brand buttonsKNari06
- 2026-09-23 16:57style: apply Halyk theme to existing React interfaceKNari06
- 2026-09-23 16:54Revert "Merge pull request #12 from BAITC-Hacks/nariman/halyk-style"Beknur kachok
- 2026-09-23 16:47Merge pull request #12 from BAITC-Hacks/nariman/halyk-styleBeknur Tanibergen
- 2026-09-23 16:45feat(static): apply Halyk palette to full voice interfaceKNari06
- 2026-09-23 16:44README: полное описание для жюри — проблема, функции, путь реплики, технологии, архитектура, запуск, проверка, данные, ограниченияBeknur kachok
- 2026-09-23 16:40TEST_QUESTIONS.md: реплики для ручной проверки ботаBeknur kachok
- 2026-09-23 16:37Merge pull request #11 from BAITC-Hacks/feat/react-styles-tracesBeknur Tanibergen
- 2026-09-23 16:35React-фронт: стили, трассировка под ответом, подсказки про страхование; фикс ответа после заполнителяBeknur kachok
- 2026-09-23 16:23feat(frontend): add bilingual voice demo and supervisor toolsKNari06
- 2026-09-23 16:21Merge pull request #9 from BAITC-Hacks/fix/docker-frontend-optionalBeknur Tanibergen
- 2026-09-23 16:18Docker: сборка фронтенда не роняет деплойBeknur kachok
- 2026-09-23 16:10Merge pull request #8 from BAITC-Hacks/feat/react-frontendBeknur Tanibergen
- 2026-09-23 16:09Фронтенд на React + Vite: экран ассистента с голосовым шаром и панель супервизораBeknur kachok
- 2026-09-23 15:26Merge pull request #7 from BAITC-Hacks/feat/english-tts-fallbackBeknur Tanibergen
- 2026-09-23 15:24Голос: только ru/kk с повторным распознаванием, запасная озвучка OpenAI, без дубля ответаBeknur kachok
- 2026-09-23 15:15Merge pull request #6 from BAITC-Hacks/fix/stt-providerBeknur Tanibergen
- 2026-09-23 15:15STT: основной gpt-4o-transcribe, запасной Scribe с language_code=kazBeknur kachok
- 2026-09-23 15:10Merge pull request #5 from BAITC-Hacks/fix/stt-datesBeknur Tanibergen
- 2026-09-23 15:09STT: запасной gpt-4o-transcribe с подсказкой ru/kk; относительные даты кодомBeknur kachok
- 2026-09-23 15:00Merge pull request #4 from BAITC-Hacks/fix/api-edge-casesBeknur Tanibergen
- 2026-09-23 14:59API: смоук-тест и исправления граничных случаевBeknur kachok
- 2026-09-23 14:56API: смоук-тест и исправления граничных случаевBeknur kachok
- 2026-09-23 14:52Merge pull request #3 from BAITC-Hacks/feat/voice-speed-dialogsBeknur Tanibergen
- 2026-09-23 14:50Параллельный исполнитель, вторая тема в продолжении, язык ответа, набор репетицииBeknur kachok
- 2026-09-23 14:44Скорость: поток ответа исполнителя в TTS по предложениям, потоковое аудио в браузере, фраза-заполнительBeknur kachok
- 2026-09-23 14:36Скорость: поток ответа исполнителя в TTS по предложениям, потоковое аудио в браузере, фраза-заполнительBeknur kachok
- 2026-09-23 14:36Merge pull request #2 from BAITC-Hacks/feat/executor-data-answersBeknur Tanibergen
- 2026-09-23 14:32README: архитектура, запуск, Railway, результаты eval и диалогов, границы применимостиBeknur kachok
- 2026-09-23 14:30Ответы на данных: исполнитель сценария с действиями, моки backend, нормализация чисел, поток роутераBeknur kachok
- 2026-09-23 13:54Merge pull request #1 from BAITC-Hacks/feat/kit-router-policyBeknur Tanibergen
- 2026-09-23 13:53Роутер под формат стартового кита: весь каталог в промпте, политика порогов, evalBeknur kachok
- 2026-09-23 13:29Docker и Railway: образ на $PORT, healthcheck, docker-compose для локального запускаBeknur kachok
- 2026-09-23 13:26Каркас Voice Router на FastAPI: LLM-роутер с каскадом, STT/TTS, трассировкаBeknur kachok
- 2026-09-23 13:14каркас агентаKNari06
- 2026-09-23 13:14fix: import reKNari06
Структура репозитория (68 файлов)
.dockerignore .env.example .gitignore Dockerfile README.md TEST_QUESTIONS.md app/__init__.py app/backend.py app/catalog.py app/config.py app/executor.py app/main.py app/normalize.py app/orchestrator.py app/providers/__init__.py app/providers/llm.py app/providers/stt.py app/providers/tts.py app/responder.py app/router/__init__.py app/router/candidates.py app/router/cascade.py app/router/llm_router.py app/router/policy.py app/schemas.py app/tracing.py data/README.kz.md data/README.md data/README.ru.md data/actions.json data/dev_utterances.json data/dialogs_sample.json data/evaluate.py data/knowledge_base.json data/mock_backend.json data/scenarios.json data/slots.json docker-compose.yml frontend/components.json frontend/components/ui/button.tsx frontend/components/ui/voice-powered-orb.tsx frontend/index.html frontend/lib/audio-player.ts frontend/lib/utils.ts frontend/package-lock.json frontend/package.json frontend/src/App.tsx frontend/src/Supervisor.tsx frontend/src/TraceCard.tsx frontend/src/hooks/use-conversation.ts frontend/src/main.tsx frontend/src/styles.css frontend/tsconfig.json frontend/vite.config.ts railway.toml requirements.txt scripts/__init__.py scripts/eval_router.py scripts/rehearsal.py scripts/rehearsal_set.json scripts/run_dialogs.py scripts/smoke_api.py static/css/app.css static/index.html static/js/client.js static/js/common.js static/js/supervisor.js static/supervisor.html
Ветки (17)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.