AAYMA
RU
Войти

Voice Router

Голосовой робот контакт-центра страховой: распознаёт ru/kk/смешанную речь, LLM выбирает один из 40 сценариев и доводит его до конца на моках…

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

О проекте

Команда: 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.md

Voice 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. Как работает — путь одной реплики

Пример из ТЗ: «Здравствуйте, я вчера оплатил, деньги списались, а полиса нет».

  1. Микрофон → STT. Браузер записывает реплику и отправляет аудио по WebSocket. Сервер распознаёт речь (gpt-4o-transcribe с подсказкой «только русский или казахский»; запасной — ElevenLabs Scribe). Если текст почти без кириллицы — распознаёт повторно другим провайдером.
  2. Триаж (код). Числа, телефоны, ИИН, номера полисов и относительные даты приводятся к нормальному виду: «вчера» → 2026-09-30 (дата «сегодня» по киту — 2026-10-01).
  3. LLM-роутер. Модель получает весь каталог сценариев, историю диалога и реплику и возвращает JSON: SC30 (деньги списаны, полис не выпущен) с уверенностью, альтернативы, язык, слоты (payment_date). Решение читается из потока, как только модель его дописала.
  4. Политика (код). Уверенность ≥ 0.75 — запуск сценария; 0.45–0.75 — переспрос с двумя вариантами; ниже 0.45 два раза подряд — оператор.
  5. Исполнитель сценария. LLM с инструментами — только действиями этого сценария. Спрашивает телефон, находит клиента (find_client), проверяет платёж (check_payment: 31 200 ₸, полис не выпущен) и по правилу сценария передаёт разговор специалисту (transfer_to_operator). Пока идут действия, клиент уже слышит «Сейчас проверю».
  6. TTS → динамик. Если реплика была голосовой, каждое готовое предложение ответа сразу озвучивается (ElevenLabs, запасной — OpenAI TTS) и играет в браузере потоком.
  7. Трассировка. Решение, действия и время этапов пишутся в 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/
LLMOpenAI gpt-4.1-mini — роутер (OPENAI_MODEL), gpt-4.1 — исполнитель сценария (EXECUTOR_MODEL)
STTOpenAI gpt-4o-transcribe (основной), ElevenLabs Scribe scribe_v2 с language_code=kaz (запасной)
TTSElevenLabs 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 и WebSocketapp/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.pyLLM с инструментами, защита необратимых действий, поток ответа по предложениям
Моки действийapp/backend.py31 действие, формулы цен и возвратов, ошибки в формате кита, preview на копии состояния
Системные ответыapp/responder.pySYS_*, передача оператору
Провайдеры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_MODELgpt-4.1-mini / gpt-4.1модели роутера и исполнителя
ELEVENLABS_API_KEY—TTS и запасной STT
STT_PROVIDER / TTS_PROVIDERopenai / elevenlabsосновной провайдер распознавания и озвучки
ROUTE_THRESHOLD / CLARIFY_THRESHOLD0.75 / 0.45пороги политики решений
SPECULATIVE_EXECUTORtrueисполнитель параллельно с роутером на репликах-продолжениях
NVIDIA_API_KEY—опциональный быстрый путь роутера

7. Как проверить решение

Сценарий для жюри (5 минут)

Откройте экран клиента и рядом /supervisor. Говорите в микрофон или пишите текстом.

  1. Клиент из базы, запрос из ТЗ. «Здравствуйте, я вчера оплатил полис, деньги списались, а полиса нет» → бот просит телефон → «Плюс семь семьсот один ноль ноль ноль ноль ноль ноль три». Ожидается: бот находит клиента, видит платёж 31 200 ₸ без выпущенного полиса и передаёт разговор специалисту. В трассировке — SC30, действия find_client, check_payment, transfer_to_operator.
  2. Казахский и данные клиента. «Сәлеметсіз бе, полисім әлі жарамды ма?» → «Телефоным плюс жеті жеті жүз бір нөл нөл нөл нөл нөл нөл сегіз». Ожидается: ответ на казахском, полис SQ-OGPO-103990 действует до 14 февраля 2027.
  3. Две темы и стык сценариев. «Выплату одобрили, но сумма почти вдвое меньше, чем посчитали на СТО» → SC19 (несогласие с решением), а не SC17 (статус).
  4. Необратимое действие. «Көлігімді саттым, КАСКО шартын бұзғым келеді» → телефон +7 701 000 00 10. Ожидается: бот называет возврат 163 800 ₸ и спрашивает подтверждение; в трассировке cancel_policy:preview. Только после «Иә, растаймын» — cancel_policy:execute.
  5. Вне тематики и неясный запрос. «Можно у вас взять кредит?» → вежливый отказ. «Мне по поводу машины» → переспрос с двумя вариантами.

Полный список реплик — 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.json40 сценариев + 3 системных намерения: описание, not_this_if, приоритет, слоты, действия, примеры ru/kk, стартовые репликипромпт роутера, исполнитель, ответы
slots.json43 слота: тип, формат, вопросы ru/kkвопросы клиенту, нормализация
actions.json31 действие, коды ошибок, очереди операторовмоки действий, инструменты исполнителя
knowledge_base.jsonофисы, продукты и формулы цен, клиники, правила урегулирования, документы, возвратырасчёты и ответы по фактам
mock_backend.json11 клиентов, 11 полисов, 4 заявления, 2 платежаидентификация клиента и ответы по его данным
dev_utterances.json, evaluate.py104 размеченные реплики и эталонный скрипт оценкиscripts/eval_router.py
dialogs_sample.json10 размеченных диалоговscripts/run_dialogs.py

Внешние API:

СервисДля чегоОбязателен
OpenAI APIроутер, исполнитель, STT gpt-4o-transcribe, запасной TTSда
ElevenLabs APITTS (стрим), запасной 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 замеряют его точность и задержку. В демо он не включён: бесплатный endpoint llama-3.1-8b-instruct помечен deprecated, а маленькие открытые модели слабо понимают казахский, поэтому точность и выигрыш по задержке с NVIDIA мы не замеряли. Метрика «Быстрый маршрут» в панели супервизора без ключа показывает 0 %.
  • Браузеры. Интерфейс проверялся в Chrome на desktop; Safari и iPhone отдельно не проверялись (для Safari есть запасное воспроизведение звука без MediaSource и определение формата записи mp4).
  • Перебивание только кнопкой. Голосом перебить робота во время ответа нельзя: нажатие на микрофон останавливает озвучку и начинает новую запись.
  • Приватность. Все данные синтетические; реальные персональные данные во внешние API не передаются.
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
44
Авторы
3
Файлы
68
Ветки
17

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

Beknur kachok 25Beknur Tanibergen 14KNari06 6

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

  • 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 комментариев

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

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