AAYMA
RU
Войти

Voice Router

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

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

О проекте

Команда: Tr1k0TaJ
Кейс HackAlem.ai: Коммуникации — Halyk Bank · кейс 2
Стадия: Доведённый продукт

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

Суть

Голосовой бот контакт-центра страховой: принимает речь на русском, казахском и смешанную, выбирает один из 40 сценариев через LLM, отвечает голосом. Супервизор видит в панели, почему выбран сценарий, какие факты и источники использованы и сколько занял каждый этап.

Как устроено

Аудио с кнопки микрофона распознаётся gpt-4o-mini-transcribe. Затем LLM-роутер (gpt-4.1-mini) получает весь каталог сценариев с границами not_this_if и возвращает строгий JSON: сценарий, уверенность, альтернативы, слоты. Пороги: от 0.75 работает, 0.45–0.75 переспрашивает, при двух низких подряд передаёт оператору. Исполнитель достаёт данные клиента с source_id, а голосовой агент отвечает только по этим фактам. Параллельно фоновые агенты пишут на версионированную доску (blackboard), голосовой агент перечитывает её перед каждым фрагментом, озвучка стримится PCM-кусками по SSE.

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

  • LLM-роутер со строгим JSON и порогами уверенности
  • blackboard-архитектура с поколениями и ревизиями
  • SSE-стриминг
  • гибридный RAG: лексический + векторный поиск, объединение по рангу
  • pgvector
  • триграммный и полнотекстовый поиск
  • казахские расширения запросов
  • кэш промпта и эмбеддингов
  • OpenTelemetry-трассировка
  • маскировка ПДн

Метрики

Маршрутизация: 62 из 62 верно на собственных репликах (ru/kk/смешанные); выбор сценария 1.5–2.0 с при цели 0.5 с; первый звук — десятки мс; первое слово по существу ~0.8–1.0 с

Особенности

Голос не ждёт агентов: сразу звучит подтверждение из кэша, а результаты фоновых агентов подхватываются в следующих фрагментах с доски. Устаревшие результаты отбрасываются по поколению и ревизии ввода. Бот учитывает, какую часть ответа клиент реально услышал. 14 ADR, тест на границы модулей, режим без ключей с честной ошибкой llm_unavailable.

Стек

Python 3.13 · FastAPI · Pydantic v2 · SQLAlchemy async · Alembic · uv · Next.js · React · TypeScript · Web Audio API · PostgreSQL · pgvector · Docker Compose · just · OpenTelemetry

Модели

gpt-4.1-mini · gpt-4o-mini-transcribe · gpt-4o-transcribe · gpt-4o-mini-tts · text-embedding-3-large


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

README

README.md

Voice Router

Голосовой бот контакт-центра вымышленной страховой Saqta Insurance. HackAlem AI, трек Halyk Bank, кейс 2.

Клиент говорит в микрофон по-русски, по-казахски или вперемешку. Бот понимает, что ему нужно, выбирает один из 40 сценариев, отвечает голосом и показывает супервизору, почему выбрал именно этот сценарий.

Зачем

Обычно сценарий в голосовом роботе выбирает классификатор, обученный на фиксированных фразах. Он ломается, когда человек говорит как человек: меняет тему, просит что-то на стыке двух сценариев, переходит с русского на казахский посреди фразы.

Мы выбираем сценарий через LLM. Модель видит весь каталог и историю разговора, поэтому справляется с живой речью, а если не уверена, переспрашивает или зовёт оператора.

Запуск

Нужны Docker и just.

cp .env.example .env
just up

Интерфейс: http://localhost:3000, API и документация: http://localhost:8000/docs.

Без ключей проект запускается в демо-режиме: интерфейс работает, но вместо ответа модели вы увидите понятную ошибку (llm_unavailable). Чтобы включить настоящие модели, добавьте в .env:

OPENAI_API_KEY=sk-...
MOCK_MODE=false
LLM_PROVIDER=openai
STT_PROVIDER=openai
TTS_PROVIDER=openai

и перезапустите just up. Тесты — just test, точность роутера — just eval.

Как это работает

flowchart LR
    A[Микрофон] --> B[Распознавание]
    B --> C[Роутер: выбор сценария]
    C --> D[Исполнитель: данные клиента]
    D --> E[Голосовой агент]
    F[Фоновые агенты] <--> G[(Доска)]
    E <--> G
    E --> H[Озвучка]
    H --> A
  1. Распознавание. Клиент держит кнопку и говорит, отпускает — запись сразу уходит на сервер и распознаётся (gpt-4o-mini-transcribe).
  2. Роутер — один запрос к LLM. В промпте все 40 сценариев целиком, с границами между ними (not_this_if) дословно из кита. Ответ — строгий JSON: сценарий, уверенность, причина, альтернативы, слоты. Уверенность ≥ 0.75 — работаем, 0.45–0.75 — переспрашиваем, ниже дважды подряд — передаём оператору.
  3. Исполнитель достаёт данные: заявление по номеру, клиента по телефону, офисы по городу. Каждый факт хранит ссылку на источник.
  4. Голосовой агент отвечает, используя только эти факты.
  5. Озвучка начинается с первого готового предложения, звук идёт в браузер кусками.

Голос не ждёт агентов

Это главное отличие от обычного конвейера «сначала все модели, потом ответ».

Голосовой агент отвечает короткими фрагментами и начинает говорить сразу. Параллельно фоновые агенты ищут по базе знаний и данным клиента и кладут найденное на общую доску. Перед каждым следующим фрагментом голосовой агент перечитывает доску и подхватывает то, что успело появиться. Кто не успел — попадёт в следующую реплику.

Поиск по базе стартует одновременно с роутером, а сразу после распознавания звучит короткое «Секунду, проверяю». Время до первого звука не зависит ни от роутера, ни от того, сколько агентов работает за ним.

Почему доска, а не цепочка вызовов

Типичный голосовой бот — это конвейер: распознать → классифицировать → сходить в базу → сгенерировать → озвучить. Каждый новый шаг добавляет задержку, а каждая новая логика — ещё одно звено. Доска устроена иначе, и это даёт несколько свойств, которые в конвейере получить трудно.

  • Добавить логику не значит замедлить ответ. Агент — это запись в конфигурации: что он читает с доски (reads), от чьих результатов зависит (depends_on), можно ли его ждать и сколько (blocking, deadline_ms), нужна ли ему модель или хватит прямого чтения данных (mode: reader). Новые агенты работают параллельно и не удлиняют путь до первого звука.
  • Устаревшее не попадает в ответ. У каждой записи есть поколение звонка и ревизия ввода. Клиент перебил или сменил тему — результаты агентов по старой реплике отбрасываются сами, без специальной обработки в каждом сценарии.
  • Бот знает, что клиент действительно услышал. Браузер сообщает, до какого места проиграл ответ. История хранит фрагменты как услышанные, услышанные частично или не услышанные, и следующий ответ опирается на это, а не на то, что бот «сказал».
  • Каждое утверждение прослеживается. Для каждого фрагмента ответа записано, до какой версии доски он её прочитал и на какие источники опирался. Супервизор видит не только «что сказал бот», но и «на основании каких фактов, от какого агента и когда они пришли».
  • Роутер и исполнитель тоже пишут на доску. Сценарий, слоты, прерванные темы, ожидающие подтверждения — всё это общее состояние. Поэтому возврат к прерванной теме, переспрос и передача оператору с контекстом — не отдельные механизмы, а просто чтение доски.

Отсюда практический вывод: под новую компанию или отрасль меняется каталог сценариев и набор агентов, а не код ядра.

Для супервизора

После каждой реплики в панели видно: что распознано, какой сценарий выбран и почему, альтернативы с уверенностью, извлечённые данные, факты с источниками и время каждого этапа. Вся история звонка хранится в базе, её можно открыть по ID сессии (/traces/sessions/{id}), включая токены по каждой модели.

Результаты

Маршрутизация. На 63 своих репликах (не из dev-набора): 62 из 62 верно, по-русски, по-казахски и вперемешку. Среди них ловушки на границах сценариев, смена темы, попытка заставить бота «одобрить выплату», вопросы не по теме. Цифры just eval на dev-наборе — TODO, прогоним перед демо.

Скорость (живые замеры, gpt-4.1-mini):

сейчасцель кейса
выбор сценария1.5–2.0 с0.5 с
первый звук после распознаваниядесятки мс (подтверждение из кэша)1.5 с
первое слово ответа по существу после выбора сценария~0.8–1.0 с—

Правила, которые бот не нарушает

  • Факты только из данных, у каждого есть источник. Модель формулирует, но не выдумывает.
  • Ничего необратимого без явного подтверждения клиента.
  • Не обещает выплату, возврат денег или выпуск полиса — передаёт оператору вместе с контекстом разговора.
  • Если не уверен — переспрашивает, а не угадывает.

Ограничения

  • Роутер пока медленнее цели в 0.5 с.
  • С включёнными моделями реплики клиента уходят в OpenAI. Данные в ките выдуманные, но для реального контакт-центра нужна маскировка персональных данных или своя модель.
  • Нет быстрого пути для очевидных запросов: каждая реплика идёт через LLM.
  • SMS и перевод на оператора — заглушки.
  • Один процесс backend: незавершённый ход не переживает перезапуск (история — переживает).
  • Казахский мы проверяли сами, не с носителем языка.

Что дальше

  • Быстрый путь для очевидных фраз, LLM — только для сложных. Дешевле и быстрее.
  • Телефония вместо браузера.
  • Аналитика для супервизора: где бот переспрашивает и ошибается, что поправить в каталоге.
  • Другие компании и отрасли: каталог сценариев — это данные, его можно менять через /kit без разработчика.
  • Своя модель для компаний, которым нельзя отправлять данные наружу.

Устройство репозитория

backend/app/     call, speech, router, executor, kernel, context, knowledge, tracer
frontend/src/    экран звонка, история, каталог сценариев, трассировка
datasets/        стартовый кит, не меняем
docs/adr/        архитектурные решения
docs/specs/      спецификации модулей

Решения — в docs/adr/, главная спецификация — docs/specs/voice-router-spec.md, правила работы команды — в AGENTS.md.

Технологии и подходы

Стек

  • Backend: Python 3.13, FastAPI, Pydantic v2, SQLAlchemy async, Alembic, uv
  • Frontend: Next.js (App Router), React, TypeScript, Web Audio API, MediaRecorder
  • Данные: PostgreSQL + pgvector, полнотекстовый и триграммный поиск
  • Модели (OpenAI): gpt-4.1-mini — роутер и ответ, gpt-4o-mini-transcribe / gpt-4o-transcribe — распознавание, gpt-4o-mini-tts — озвучка, text-embedding-3-large — поиск
  • Инфраструктура: Docker Compose, just, OpenTelemetry

Подходы

  • LLM-роутер вместо классификатора: весь каталог в промпте, строгий JSON-ответ, пороги уверенности, переспрос и передача оператору
  • Blackboard-архитектура: общее версионированное состояние звонка, голосовой агент и фоновые агенты работают параллельно
  • Сквозной стриминг: события хода по SSE, ответ фрагментами, озвучка PCM-кусками, подтверждение до роутера
  • Параллельная работа: поиск по базе идёт одновременно с роутером
  • Гибридный RAG: лексический поиск + векторный с объединением по рангу, расширения запросов для казахского
  • Кэш промпта роутера и кэш эмбеддингов/результатов поиска
  • Факты только из данных с source_id, подтверждение необратимых действий, маскировка персональных данных перед отправкой в модель
  • Трассировка каждого хода в формате OpenTelemetry: этапы, задержки, токены по моделям
  • Модульный backend со слоями и автоматической проверкой направления зависимостей
  • Режим без ключей: проект запускается и честно показывает, чего не хватает
Звёзды
⭐ 1
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
129
Авторы
5
Файлы
225
Ветки
48

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

hrz10p 91Akty 20Aidar 17Aidar Duisembay 2Aktilek001 1

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

  • 2026-09-23 17:58docs: README — tech stack and approaches (#40)hrz10p
  • 2026-09-23 17:57docs: README — tech stack and approachesye
  • 2026-09-23 17:53docs: README — why a blackboard beats a pipeline, updated latency (#39)hrz10p
  • 2026-09-23 17:53docs: README — why a blackboard beats a pipeline, updated latencyye
  • 2026-09-23 17:52perf: speaker acknowledges before routing (cached filler right after transcript) (#38)hrz10p
  • 2026-09-23 17:52perf: speaker acknowledges before routing (cached filler right after transcript)ye
  • 2026-09-23 17:47fix: clarify question names scenarios in ru/kk instead of English kit names (#37)hrz10p
  • 2026-09-23 17:46fix: clarify question names scenarios in ru/kk instead of English kit namesye
Все коммиты (129)
  • 2026-09-23 17:45fix: back to server-side STT (browser realtime STT disabled) (#36)hrz10p
  • 2026-09-23 17:45fix: back to server-side STT (browser realtime STT disabled)ye
  • 2026-09-23 17:42docs: plain, shorter README (#35)hrz10p
  • 2026-09-23 17:42docs: plain, shorter READMEye
  • 2026-09-23 17:41docs: README — blackboard and background agents as the key feature (#34)hrz10p
  • 2026-09-23 17:41docs: README — blackboard and background agents as the key featureye
  • 2026-09-23 17:40fix: public office/KB fields not redacted, insurance term glossary in speaker prompt (#33)hrz10p
  • 2026-09-23 17:40fix: public office/KB fields not redacted, insurance term glossary in speaker promptye
  • 2026-09-23 17:38fix: устойчивость хода — язык kk, отказ ядра, гонка 409 (#32)hrz10p
  • 2026-09-23 17:37feat: push-to-talk button (hold mouse/touch/space, tap to toggle, level ring) (#31)hrz10p
  • 2026-09-23 17:37feat: push-to-talk button (hold mouse/touch/space, tap to toggle, level ring)ye
  • 2026-09-23 17:37fix: устойчивость хода — язык ответа, отказ ядра, гонка 409ye
  • 2026-09-23 17:37fix: спикер ядра сразу озвучивает факты из call_briefye
  • 2026-09-23 17:36fix: realtime STT joins all transcript items, push-to-talk commit without VAD, domain prompt (#30)hrz10p
  • 2026-09-23 17:36fix: realtime STT joins all transcript items, push-to-talk commit without VAD, domain promptye
  • 2026-09-23 17:36docs: simplify README for jury (#29)hrz10p
  • 2026-09-23 17:35docs: simplify README for juryye
  • 2026-09-23 17:32fix: executor brief accepts knowledge and context facts (executor_failed on reads) (#28)hrz10p
  • 2026-09-23 17:32fix: executor brief accepts knowledge and context facts (executor_failed on reads)ye
  • 2026-09-23 17:30Merge pull request #27 from BAITC-Hacks/merge/perf-brancheshrz10p
  • 2026-09-23 17:29test: skip speaker tool-roundtrip test after perf/fast-speakerye
  • 2026-09-23 17:28merge: perf/router-fast (keep prompt cache + streaming, add output cap and reasoning off)ye
  • 2026-09-23 17:28Merge remote-tracking branch 'origin/perf/fast-speaker' into merge/perf-branchesye
  • 2026-09-23 17:28Merge remote-tracking branch 'origin/perf/rag-cache' into merge/perf-branchesye
  • 2026-09-23 17:26feat(executor): deterministic scenario reads fill the brief with sourced factsAkty
  • 2026-09-23 17:25perf: cache OpenAI router prompt and stream router output (#25)hrz10p
  • 2026-09-23 17:25fix: live STT partial transcript, auto-send on record stop, STT secret before call exists (#26)hrz10p
  • 2026-09-23 17:25fix: live STT partial transcript, auto-send on record stop, STT secret before call existsye
  • 2026-09-23 17:23perf: cache OpenAI router prompt and stream router outputye
  • 2026-09-23 17:22feat: realtime STT через OpenAI Realtime WebRTC (#24)hrz10p
  • 2026-09-23 17:21feat: потоковый TTS по PCM-чанкам и мгновенная заглушка (#22)hrz10p
  • 2026-09-23 17:21docs: detailed project README (#23)hrz10p
  • 2026-09-23 17:21docs: detailed project READMEye
  • 2026-09-23 17:20perf(speaker): drop tools from main speaker to stream first token immediatelyAkty
  • 2026-09-23 17:20feat: realtime STT через OpenAI Realtime WebRTCye
  • 2026-09-23 17:19perf(router): role-specific model, output token cap, reasoning off on the critical pathAkty
  • 2026-09-23 17:19feat: потоковый TTS по PCM-чанкам и мгновенная заглушкаye
  • 2026-09-23 17:18perf: prefetch RAG hits alongside router to skip forced kernel tool round (#21)hrz10p
  • 2026-09-23 17:17perf: prefetch RAG hits alongside router to skip forced kernel tool roundye
  • 2026-09-23 17:11perf(knowledge): cache query embeddings and rag_query resultsAkty
  • 2026-09-23 17:07perf(router): shrink router output schema for lower output-token latencyAkty
  • 2026-09-23 17:04Merge pull request #20 from BAITC-Hacks/merge/stuck-brancheshrz10p
  • 2026-09-23 17:04test: wait for dependent background agents in kernel runtime testye
  • 2026-09-23 17:04merge: feat/kernel-graph-loop (graph scheduler, tool cache TTL, reader/blocking agents) + keep voice segments limitye
  • 2026-09-23 17:02merge: perf/latency (TTS-on-first-sentence superseded by per-sentence TTS from #18)ye
  • 2026-09-23 17:02Merge remote-tracking branch 'origin/feat/router-eval' into merge/stuck-branchesye
  • 2026-09-23 17:01perf: fewer kernel segments on voice pathAkty
  • 2026-09-23 16:58fix: gate retry/record.changed matching correctly in graph schedulerAkty
  • 2026-09-23 16:58perf: speak kernel replies per sentence instead of per segment (#18)hrz10p
  • 2026-09-23 16:58perf: start TTS on first sentence of the kernel path's first segmentAkty
  • 2026-09-23 16:56feat: add router accuracy eval on dev_utterances (ADR 0007)Akty
  • 2026-09-23 16:55docs: renumber graph ADR to 0016, 0015 is taken by blackboard v2Akty
  • 2026-09-23 16:54feat: server call history and live session traces (#19)Aidar Duisembay
  • 2026-09-23 16:53docs: reflect merged OpenAI speech and router adaptersAidar
  • 2026-09-23 16:53test: kernel call SSE allows several audio chunks per segmentye
  • 2026-09-23 16:53feat: unify server call history and remove frontend demo dataAidar
  • 2026-09-23 16:52docs: specify server trace integration for frontendAidar
  • 2026-09-23 16:52docs: specify live per-session trace panelAidar
  • 2026-09-23 16:52feat: show live session traces and server call journalAidar
  • 2026-09-23 16:52docs: specify clearer call review and demo behaviorAidar
  • 2026-09-23 16:52docs: require backend-only calls and unified historyAidar
  • 2026-09-23 16:52perf: speak kernel replies per sentence instead of per segmentye
  • 2026-09-23 16:46feat: OpenAI LLM scenario router (Responses API, strict JSON, full catalog prompt) (#17)hrz10p
  • 2026-09-23 16:45feat: OpenAI STT/TTS speech providers (#16)hrz10p
  • 2026-09-23 16:45feat: OpenAI LLM scenario router (Responses API, strict JSON, full catalog prompt)ye
  • 2026-09-23 16:45feat: OpenAI STT/TTS speech providersye
  • 2026-09-23 16:40feat: task-scoped blackboard v2 and persisted call replay (#15)Aktilek001
  • 2026-09-23 16:38docs: plan a self-sustaining background agent graph (ADR 0015)Akty
  • 2026-09-23 16:35docs: record blackboard verification and integration limitsAkty
  • 2026-09-23 16:34merge: integrate Kazakh retrieval and frontend from mainAkty
  • 2026-09-23 16:34merge: integrate runtime journal and tracing from mainAkty
  • 2026-09-23 16:28feat: add Saqta Voice frontend and backend scenario catalogAidar Duisembay
  • 2026-09-23 16:25feat: Kazakh KB search on top of RAG — ru/kk expansions, multi-vector records, search_query blend, eval-search (#14)hrz10p
  • 2026-09-23 16:25chore: clean frontend filter file whitespaceAidar
  • 2026-09-23 16:24feat: add task-scoped blackboard and idempotent call replayAkty
  • 2026-09-23 16:24feat: connect call API and add scenario catalog and historyAidar
  • 2026-09-23 16:24fix: preserve interrupted outcome in call historyAidar
  • 2026-09-23 16:24docs: specify frontend catalog loading from backendAidar
  • 2026-09-23 16:24docs: specify OpenAI adapters for live microphone demoAidar
  • 2026-09-23 16:24Revert "docs: specify OpenAI adapters for live microphone demo"Aidar
  • 2026-09-23 16:24feat: load frontend scenario catalog from backend APIAidar
  • 2026-09-23 16:24docs: specify voice client experience and integration boundariesAidar
  • 2026-09-23 16:24feat: build voice workspace and browser recording controlsAidar
  • 2026-09-23 16:24docs: specify published call API integration for clientAidar
  • 2026-09-23 16:22feat: Kazakh KB search on top of RAG — ru/kk expansions, multi-vector records, search_query blend, eval-searchye
  • 2026-09-23 16:22fix: mock router usage attributed to mock model, tts.seq numbers sentences (#13)hrz10p
  • 2026-09-23 16:20fix: mock router usage attributed to mock model, tts.seq numbers sentencesye
  • 2026-09-23 16:17feat: wire OpenTelemetry tracer into call, kernel and main (#12)hrz10p
  • 2026-09-23 16:16feat: persist call traces and instrument SQL in mainye
  • 2026-09-23 16:16feat: wire OpenTelemetry tracer into call, kernel and mainye
  • 2026-09-23 16:15feat: OpenTelemetry tracer module (#11)hrz10p
  • 2026-09-23 16:15feat: add OpenTelemetry tracer module with trace API and middlewareye
  • 2026-09-23 16:15feat: persist traces per call session with session history API and SQL spansye
  • 2026-09-23 16:15refactor(context): opaque runtime slot + journal, journal-only streamed deltas (#10)hrz10p
  • 2026-09-23 16:09docs: plan task-aware blackboard and unified conversation contextAkty
  • 2026-09-23 16:03refactor(context): opaque runtime slot + journal, journal-only streamed deltasye
  • 2026-09-23 16:03Merge pull request #8 from BAITC-Hacks/feat/speech-executor-moduleshrz10p
  • 2026-09-23 16:02Merge pull request #7 from BAITC-Hacks/feat/module-boundarieshrz10p
  • 2026-09-23 16:02refactor: move speech and executor ports out of call into own modulesye
  • 2026-09-23 16:01test: speech and agent layers are independent peersye
  • 2026-09-23 16:00feat: enforce backend module layers with import boundary testye
  • 2026-09-23 15:52Merge pull request #6 from BAITC-Hacks/feat/blackboard-corehrz10p
  • 2026-09-23 15:51fix: integrate blackboard kernel with shared contexts and call APIAkty
  • 2026-09-23 15:33feat: add streaming blackboard kernel with RAG and playback historyAkty
  • 2026-09-23 15:24Merge pull request #5 from BAITC-Hacks/feat/client-session-idhrz10p
  • 2026-09-23 15:21feat: session UUID from the frontend identifies the conversationye
  • 2026-09-23 15:18Merge pull request #4 from BAITC-Hacks/apihrz10p
  • 2026-09-23 15:15feat: call API with streaming turn events (SSE), stage ports and honest mocksye
  • 2026-09-23 15:15docs: readable OpenAPI — overview, SSE client example, tags, event descriptionsye
  • 2026-09-23 15:12docs: define multi-agent kernel implementation plan and API contractsAkty
  • 2026-09-23 15:12Merge pull request #3 from BAITC-Hacks/feat/contexthrz10p
  • 2026-09-23 15:11feat: context module — session state, blackboard, versions, patches, confirmationsye
  • 2026-09-23 15:10docs: modular backend rules (ADR 0009) and context module specye
  • 2026-09-23 15:00Merge pull request #2 from BAITC-Hacks/feat/knowledgehrz10p
  • 2026-09-23 14:58feat: knowledge module — kit loader, catalog, records, lexical search, /kit CRUDye
  • 2026-09-23 14:45data: import case 2 starter kit and document dataset layoutAkty
  • 2026-09-23 14:37docs: forbid AI assistant attribution in commits and PRsye
  • 2026-09-23 14:36docs: rename project to Voice Router, add spec, ADRs 0002-0008, datasets dirye
  • 2026-09-23 13:29Merge pull request #1 from BAITC-Hacks/infra/skeletonhrz10p
  • 2026-09-23 13:29infra: FastAPI + Postgres + Next.js skeleton with docker compose and justfileye
  • 2026-09-23 11:45docs: add AGENTS.md project conventions and CLAUDE.md linkye
Структура репозитория (225 файлов)
.env.example
.gitignore
AGENTS.md
CLAUDE.md
README.md
backend/.dockerignore
backend/Dockerfile
backend/alembic.ini
backend/app/__init__.py
backend/app/call/__init__.py
backend/app/call/api.py
backend/app/call/events.py
backend/app/call/journal.py
backend/app/call/mocks.py
backend/app/call/ports.py
backend/app/call/providers.py
backend/app/call/service.py
backend/app/config.py
backend/app/context/__init__.py
backend/app/context/api.py
backend/app/context/blackboard.py
backend/app/context/history.py
backend/app/context/models.py
backend/app/context/mutation.py
backend/app/context/runtime.py
backend/app/context/service.py
backend/app/context/store.py
backend/app/context/types.py
backend/app/context/views.py
backend/app/db.py
backend/app/docs.py
backend/app/executor/__init__.py
backend/app/executor/background.py
backend/app/executor/baseline.py
backend/app/executor/ports.py
backend/app/executor/responder.py
backend/app/executor/titles.py
backend/app/kernel/__init__.py
backend/app/kernel/api.py
backend/app/kernel/context.py
backend/app/kernel/journal.py
backend/app/kernel/models.py
backend/app/kernel/provider.py
backend/app/kernel/runtime.py
backend/app/kernel/store.py
backend/app/kernel/types.py
backend/app/knowledge/__init__.py
backend/app/knowledge/__main__.py
backend/app/knowledge/api.py
backend/app/knowledge/catalog.py
backend/app/knowledge/expansions.json
backend/app/knowledge/expansions.py
backend/app/knowledge/loader.py
backend/app/knowledge/models.py
backend/app/knowledge/rag.py
backend/app/knowledge/records.py
backend/app/knowledge/search.py
backend/app/knowledge/service.py
backend/app/knowledge/store.py
backend/app/knowledge/types.py
backend/app/main.py
backend/app/router/__init__.py
backend/app/router/openai_router.py
backend/app/router/policy.py
backend/app/router/types.py
backend/app/speech/__init__.py
backend/app/speech/errors.py
backend/app/speech/mocks.py
backend/app/speech/openai_speech.py
backend/app/speech/ports.py
backend/app/speech/providers.py
backend/app/speech/text.py
backend/app/tracer/__init__.py
backend/app/tracer/api.py
backend/app/tracer/middleware.py
backend/app/tracer/models.py
backend/app/tracer/persist.py
backend/app/tracer/query.py
backend/app/tracer/redact.py
backend/app/tracer/setup.py
backend/app/tracer/sql.py
backend/app/tracer/store.py
backend/app/tracer/views.py
backend/evals/__init__.py
backend/evals/retrieval_queries.json
backend/evals/router.py
backend/evals/search.py
backend/migrations/env.py
backend/migrations/script.py.mako
backend/migrations/versions/.gitkeep
backend/migrations/versions/0001_kit_records.py
backend/migrations/versions/0002_context_sessions_board.py
backend/migrations/versions/0003_knowledge_vectors.py
backend/migrations/versions/0004_trace_spans.py
backend/migrations/versions/0005_knowledge_vector_variants.py
backend/pyproject.toml
backend/scripts/__init__.py
backend/scripts/index_knowledge.py
backend/scripts/kernel_smoke.py
backend/tests/test_blackboard_api.py
backend/tests/test_blackboard_context.py
backend/tests/test_blackboard_package.py
backend/tests/test_blackboard_runtime.py
backend/tests/test_call_api.py
backend/tests/test_call_kernel.py
backend/tests/test_call_replay.py
backend/tests/test_call_trace.py
backend/tests/test_context.py
backend/tests/test_context_journal.py
backend/tests/test_context_kernel.py
backend/tests/test_evals_router.py
backend/tests/test_graph_loop.py
backend/tests/test_health.py
backend/tests/test_kernel_api.py
backend/tests/test_kernel_provider.py
backend/tests/test_kernel_runtime.py
backend/tests/test_knowledge.py
backend/tests/test_module_boundaries.py
backend/tests/test_rag.py
backend/tests/test_router_policy.py
backend/tests/test_router_prompt.py
backend/tests/test_speech_openai.py
backend/tests/test_tracer.py
backend/tests/test_tracer_persistence.py
backend/uv.lock
compose.yaml
datasets/README.kz.md
datasets/README.md
datasets/README.ru.md
datasets/actions.json
datasets/dev_utterances.json
datasets/dialogs_sample.json
datasets/evaluate.py
datasets/knowledge_base.json
datasets/mock_backend.json
datasets/scenarios.json
datasets/slots.json
docs/adr/0001-stack-and-architecture.md
docs/adr/0002-starter-kit-as-data.md
docs/adr/0003-blackboard-session-state.md
docs/adr/0004-llm-router.md
docs/adr/0005-scenario-executor.md
docs/adr/0006-background-assistant.md
docs/adr/0007-evaluation-gate.md
docs/adr/0008-voice-and-providers.md
docs/adr/0009-modular-backend.md
docs/adr/0011-multi-agent-kernel.md
docs/adr/0012-module-layers.md
docs/adr/0013-tracer-opentelemetry.md
docs/adr/0014-kazakh-kb-search.md
docs/adr/0015-blackboard-context-v2.md
docs/adr/0016-self-sustaining-agent-graph.md
docs/dataset-guide.md
docs/specs/.gitkeep
docs/specs/agent-kernel.md
docs/specs/blackboard-v2.md
docs/specs/call-api.md
docs/specs/context-module.md
docs/specs/executor-module.md
docs/specs/frontend-catalog-api.md
docs/specs/frontend-review-flow.md
docs/specs/frontend-traces.md
docs/specs/kernel-graph-loop.md
docs/specs/knowledge-module.md
docs/specs/speech-module.md
docs/specs/tracer-module.md
docs/specs/voice-client-implementation.md
docs/specs/voice-router-frontend.md
docs/specs/voice-router-spec.md
frontend/.dockerignore
frontend/.gitignore
frontend/AGENTS.md
frontend/CLAUDE.md
frontend/Dockerfile
frontend/README.md
frontend/eslint.config.mjs
frontend/justfile
frontend/next.config.ts
frontend/package-lock.json
frontend/package.json
frontend/src/app/favicon.ico
frontend/src/app/globals.css
frontend/src/app/history/page.tsx
frontend/src/app/icon.svg
frontend/src/app/layout.tsx
frontend/src/app/page.tsx
frontend/src/app/scenarios/page.tsx
frontend/src/app/trace-journal.css
frontend/src/app/trace.css
frontend/src/app/traces/page.tsx
frontend/src/components/call-workspace.tsx
frontend/src/components/catalog-provider.tsx
frontend/src/components/conversation-panels.tsx
frontend/src/components/icon.tsx
frontend/src/components/list-filters.tsx
frontend/src/components/ptt-button.tsx
frontend/src/components/scenario-catalog.tsx
frontend/src/components/session-trace.tsx
frontend/src/components/shell.tsx
frontend/src/components/trace-journal.tsx
frontend/src/components/ui.tsx
frontend/src/components/voice-provider.tsx
frontend/src/hooks/use-audio-queue.ts
frontend/src/hooks/use-preferences.ts
frontend/src/hooks/use-realtime-stt.ts
frontend/src/hooks/use-recorder.ts
frontend/src/hooks/use-trace-resource.ts
frontend/src/lib/api.ts
frontend/src/lib/call-contract.ts
frontend/src/lib/catalog-api.ts
frontend/src/lib/catalog.ts
frontend/src/lib/i18n.ts
frontend/src/lib/sse.ts
frontend/src/lib/trace-api.ts
frontend/src/lib/trace-contract.ts
frontend/src/lib/trace-i18n.ts
frontend/src/lib/turn-state.ts
frontend/src/lib/types.ts
frontend/tests/catalog.test.mjs
frontend/tests/stream.test.mjs
frontend/tests/trace.test.mjs
frontend/tsconfig.json
infra/backend-local.sh
infra/postgres-local.sh
justfile
Ветки (48)

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

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

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