О проекте
Команда: Butaq2.0
Кейс HackAlem.ai: Коммуникации — Halyk Bank · кейс 2
Стадия: Доведённый продукт
Задача кейса: «Voice Router»: голосовой AI, маршрутизирующий звонки в контакт-центре страховой компании
Суть
Голосовой AI-помощник страховой компании: понимает запрос клиента на русском или казахском, выбирает сценарий, уточняет слоты, выполняет симулированные действия и отвечает голосом; есть панель администратора и телефонный вход через SignalWire.
Как устроено
Голос идёт между браузером и GPT-Live по WebRTC (или входящий звонок через SignalWire), реплики передаются Router-агенту вместе с контекстом и каталогом сценариев из PostgreSQL. Router определяет язык, намерение, слоты и отложенные темы; код проверяет ID и порог уверенности и выбирает route/clarify/handoff. Детерминированный Workflow валидирует слоты и запускает action adapters (необратимые действия только после preview и подтверждения), Resolution-агент формирует ответ по фактам; в интерфейсе видны причина выбора, уверенность и альтернативы.
Ключевые решения
- OpenAI Agents SDK
- Router/Workflow/Resolution multi-agent
- извлечение слотов
- порог уверенности route/clarify/handoff
- стек тем (активная и отложенные)
- barge-in прерывание
- WebRTC realtime voice
- SignalWire/Twilio телефония
- WebAuthn passkey
- InsightFace face login
Особенности
Задеплоенный сайт и реальный телефонный номер для звонка боту. LLM-маршрутизация отделена от детерминированного workflow, необратимые действия проходят через preview и явное подтверждение. Сценарии, промпты и порог уверенности редактируются из админки без перезапуска, есть дополнительные наборы данных (auto/health/travel).
Стек
Python · FastAPI · Pydantic · Uvicorn · Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · Radix UI · PostgreSQL 16 · SQLAlchemy · Alembic · Docker Compose · Caddy · SignalWire · ONNX Runtime · pytest
Модели
gpt-5.6-terra · gpt-live-1 · gpt-live-transcribe · gpt-transcribe · gpt-4o-mini-tts
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-fb68e683-butaq2-0.
README
README.md🌐 Сайт: https://owlpeer.com/
📞 Позвонить Butaq: +1 (201) 231-1497
🎬 Демо: Открыть демо
Butaq — голосовой AI-помощник страховой службы
Клиент описывает проблему своими словами — Butaq выбирает сценарий, уточняет детали и отвечает на русском или казахском языке.
Проект для кейса Voice Router: голосовой маршрутизатор обращений в страховую компанию. Он помогает клиенту разобраться с полисом, оплатой, возвратом или страховым случаем, а команде контакт-центра — настраивать сценарии и видеть, почему AI выбрал конкретное направление обращения.
Голосовой интерфейс · Главная · Быстрый запуск · Проверка для жюри · Ограничения
Хакатонный прототип с синтетическими страховыми данными. Реализованы диалог, маршрутизация, чтение, расчёты и симуляция действий без изменения реальной страховой системы. Изменение договоров, платежи и фактическое соединение с оператором не выполняются.
Какую проблему решает
Страховые обращения часто похожи по формулировке, но требуют разных действий: проверить статус выплаты, оспорить её сумму или сообщить о новом страховом случае. В одном разговоре клиент может менять тему, возвращаться к предыдущему вопросу и переключаться между русским и казахским.
Butaq сопоставляет запрос с каталогом сценариев через LLM, учитывает контекст беседы и запрашивает уточнение при недостаточной уверенности. Для демонстрации доступны браузерный диалог и панель администратора; для входящих телефонных звонков реализован отдельный адаптер.
Что реализовано
| Возможность | Что доступно в текущей версии |
|---|---|
| Голосовой диалог | Страница /voice/, микрофон, голосовой ответ и текстовые подписи через GPT-Live и WebRTC |
| Текстовый ввод | Сообщения в интерфейсе, в том числе во время голосового сеанса; отдельный HTTP API |
| Русский и казахский | Инструкции агентам и примеры данных для двух языков, смешанной речи и переключения языка |
| AI и workflow | Router выбирает сценарий и извлекает слоты; детерминированный Workflow проверяет параметры и подтверждение; Resolution готовит ответ по фактам и результатам действий |
| Контекст | Активная и отложенные темы, извлечённые параметры, продолжение и смена сценария |
| Прерывание | Остановка воспроизведения и отмена незавершённой работы при прерывании разговора |
| Объяснение решения | Сценарий, причина выбора, уверенность, альтернативы и времена этапов в ответе API; карточки решения в интерфейсе |
| Работа с данными | Чтение, расчёты и синтетическая симуляция 31 действия стартового набора; необратимые действия требуют preview и явного подтверждения |
| Администрирование | Редактирование сценариев, промптов, модели, workflow-политик и порога уверенности; импорт JSON-каталога |
| Вход администратора | Токен, passkey через WebAuthn и распознавание лица через InsightFace |
| Телефонный адаптер | Входящий звонок SignalWire → GPT-Live → общий сервис Router/Resolution; выключен по умолчанию |
Как работает решение
Пример входного запроса: «Хочу оформить ОГПО».
- Ввод. Пользователь начинает голосовой разговор или вводит текст. В основном голосовом режиме звук идёт между браузером и GPT-Live по WebRTC; сервер управляет сеансом и получает события разговора.
- Выбор сценария. Страховой вопрос передаётся Router вместе с контекстом беседы и актуальным каталогом из PostgreSQL. Агент определяет язык, намерение, параметры и возможные отложенные темы.
- Проверка решения. Код проверяет структурированный ответ, допустимость ID и порог уверенности. Результат —
route(выбран сценарий),clarify(нужно уточнение) илиhandoff(нужна помощь оператора). - Выполнение сценария. Workflow валидирует собранные слоты, запрашивает недостающие и запускает зарегистрированные action adapters. Необратимые действия сначала получают preview и явное подтверждение. Resolution формирует ответ только по данным и результатам;
simulateне изменяет исходный mock backend. - Результат. Пользователь получает объяснение; голосовой слой озвучивает ответ, интерфейс показывает подписи и решение маршрутизатора. Следующая реплика использует контекст текущего сеанса.
Для файлового API путь отдельный: аудиофайл → транскрипция → Router → Resolution → синтез речи. Для текста через HTTP синтез включается параметром synthesize.
Технологии
| Область | Технологии из репозитория |
|---|---|
| Backend | Python ≥ 3.10; Docker-образ на Python 3.12; FastAPI, Pydantic, Uvicorn |
| Frontend | TypeScript, Next.js 16, React 19, Tailwind CSS 4, Radix UI, Lucide, OGL |
| AI-агенты | OpenAI API, OpenAI Agents SDK; модель Router/Resolution задаётся настройками |
| Основной голосовой режим | GPT-Live, WebRTC, WebSocket для управления и событий |
| Дополнительный аудиопайплайн | OpenAI transcription/TTS, Web Audio API, AudioWorklet |
| Хранение | PostgreSQL 16, SQLAlchemy, Alembic |
| Аутентификация администратора | WebAuthn, InsightFace, ONNX Runtime |
| Телефония | SignalWire cXML, SIP/TLS, OpenAI Live; пакет telephony/ |
| Развёртывание и проверки | Docker Compose, Caddy, pytest, Node.js test runner, TypeScript typecheck |
Модели по умолчанию в .env.example:
| Назначение | Переменная | Значение |
|---|---|---|
| Router и Resolution | ROUTER_MODEL | gpt-5.6-terra |
| Голосовой разговор в браузере | MULTI_AGENT_LIVE_MODEL | gpt-live-1 |
| Потоковая транскрипция дополнительного WebSocket-режима | MULTI_AGENT_TRANSCRIBE_MODEL | gpt-live-transcribe |
| Распознавание загруженного аудио | V2V_TRANSCRIBE_MODEL | gpt-transcribe |
| Отдельный синтез речи | V2V_TTS_MODEL | gpt-4o-mini-tts |
Это значения конфигурации проекта. Для запуска требуется доступ к выбранным моделям в используемом аккаунте API.
Архитектура проекта
flowchart LR
B[Браузер: голос и текст] <-->|WebRTC: аудио| L[OpenAI GPT-Live]
B <-->|HTTP / WebSocket| C[Caddy]
A[Панель администратора] --> C
C <--> F[FastAPI]
F <-->|Управление голосовым сеансом| L
F --> S[RouterService]
S --> R[Router: выбор сценария]
R --> V[Проверка решения]
V --> W[Workflow: слоты, подтверждение, симуляция действий]
W --> Q[Resolution: ответ по проверенным данным]
Q --> S
S <--> D[(PostgreSQL: каталог и настройки)]
P[SignalWire: входящий звонок] --> T[Телефонный адаптер]
T <--> L
T --> S
Два агента используют общий сервис для браузера, HTTP-запросов и телефонии. Каталог и настройки сохраняются в PostgreSQL; изменения администратора учитываются при следующем обращении. Контекст активных разговоров хранится в памяти процесса backend.
app/ FastAPI, API, сервис маршрутизации
├── api/ Текст, голос, потоковые сеансы, администрирование
├── db/ Модели БД, репозиторий, миграции Alembic
├── phone/ Адаптер входящих звонков SignalWire
└── data/ Демокаталог и дополнительные синтетические наборы
multi-agent/src/multi_agent/ Router, Resolution, контекст, инструменты, Live
v2v/ Общий клиент OpenAI и аудиопайплайн
faceid/ Распознавание лица и хранение шаблонов
telephony/ Библиотека телефонии и её тесты
frontend/ Next.js: главная, /voice/, /admin/, /telephony/
case_2/voice_router_dataset/ Отдельный датасет кейса Saqta Insurance
tests/ Тесты приложения и интеграции с PostgreSQL
Описание AI-пайплайна — в multi-agent/README.md, подключения звонков — в docs/telephony.md.
Установка и запуск
1. Подготовить окружение
Нужны Docker с Compose v2, доступ к интернету для сборки и ключ OpenAI API. Команды выполняются из корня клонированного репозитория. Локальные Python и Node.js для Docker-запуска не требуются.
# Для новой установки. Если .env уже существует, отредактируйте его.
cp .env.example .env
Заполните в .env:
V2V_API_KEY=ваш-ключ-api
ROUTER_ADMIN_TOKEN=ваш-длинный-случайный-токен
POSTGRES_PASSWORD=ваш-пароль-postgresql
Для локального запуска оставьте ROUTER_WEBAUTHN_ORIGIN=http://localhost:3000, localhost в FRONTEND_ORIGINS и TELEPHONY_ENABLED=false. Полный список настроек с пояснениями — в .env.example. Ключи хранятся на backend; .env не следует добавлять в Git.
2. Собрать и запустить
docker compose up --build -d
docker compose ps
Эквивалентная команда при установленном Make — make up.
Compose запускает PostgreSQL, backend и frontend под Caddy. Backend автоматически применяет миграции. При старте пустой каталог заполняется полным стартовым набором из case_2/voice_router_dataset/; существующий каталог и правки сохраняются.
3. Открыть приложение
| Страница или сервис | Локальный адрес |
|---|---|
| Главная | http://localhost:3000/ |
| Голосовой и текстовый интерфейс | http://localhost:3000/voice/ |
| Панель администратора | http://localhost:3000/admin/ |
| Swagger UI | http://localhost:8000/docs |
| Проверка backend | http://localhost:8000/health |
| PostgreSQL для локальных инструментов | localhost:5433, база butaq, пользователь butaq |
Для первого входа в панель используйте ROUTER_ADMIN_TOKEN. После входа можно зарегистрировать passkey или лицо. Микрофону и камере нужно разрешение браузера; для голосового режима используйте localhost или HTTPS.
Compose также занимает порты 80 и 443 для Caddy. Они должны быть свободны, как и 3000, 8000 и 5433.
4. Управлять сервисами
docker compose logs --tail=100 backend # Диагностика backend
docker compose logs -f # Логи всех сервисов
docker compose down # Остановка с сохранением тома БД
После изменения .env пересоздайте backend: docker compose up -d --build backend. Значения ROUTER_MODEL и ROUTER_CONFIDENCE_THRESHOLD из окружения инициализируют только пустые настройки: на существующей базе меняйте их через /admin/settings/.
Для своего публичного домена обновите frontend/Caddyfile, FRONTEND_ORIGINS и ROUTER_WEBAUTHN_ORIGIN. Последний должен точно совпадать с origin браузера для passkey и операций администратора с cookie.
Как проверить решение
Демонстрация для жюри
Сценарий рассчитан на стартовый каталог case_2/voice_router_dataset/ и настроенный ключ API.
-
Проверьте доступность backend и загрузку каталога:
curl -fsS http://localhost:8000/health # {"status":"ok"} curl -fsS http://localhost:8000/router/scenarios # На новой установке — массив из 40 сценариев. -
Откройте http://localhost:3000/voice/. При первом обращении загрузится стартовый каталог из 40 сценариев. Нажмите Talk to Butaq и скажите: «Хочу оформить ОГПО». Агент последовательно запросит регион, тип машины, ИИН водителей, госномер и телефон, покажет preview и попросит подтверждение. Карточка справа отображает собранные слоты и действия.
-
Проверьте собранные слоты, preview и подтверждение в панели трассировки. Смените язык на казахский и тему разговора, затем вернитесь к отложенному вопросу.
-
Убедитесь, что результат обозначен как синтетический, без обещания реального выпуска полиса или соединения с оператором.
Успешный /health подтверждает ответ процесса, но не проверяет доступ к моделям или передачу аудио.
Проверка через API без микрофона
curl -sS http://localhost:8000/router/text \
-H 'Content-Type: application/json' \
-d '{"session_id":"jury-demo","text":"Хочу оформить ОГПО","synthesize":false}'
Ответ содержит transcript, reply, action, scenario_id, confidence, reason, alternatives, pending_scenario_ids, language и timings. Workflow также возвращает workflow_status, collected_slots, missing_slots, confirmation_required, action_trace и completed. Для продолжения разговора используйте тот же session_id, для нового — другое значение. synthesize:false отключает озвучку; обращения к LLM остаются платными.
| API | Назначение |
|---|---|
POST /router/text | Текстовый запрос; опциональная озвучка |
POST /router/voice | Аудиофайл в поле audio и session_id, формат multipart/form-data |
WS /router/live | Управление основным WebRTC-разговором и события интерфейса |
WS /router/stream | Дополнительный потоковый протокол для текста и аудио |
GET /router/scenarios | Активный каталог |
GET /router/sessions/{session_id} | Контекст браузерного/текстового сеанса |
POST /router/admin/catalog/import-files | Импорт каталога с авторизацией администратора |
Тесты и оценка
Для локальных тестов нужны Python с venv, Node.js (в Docker используется версия 22) и npm. Установка Python-зависимостей может потребовать компилятор и CMake для InsightFace; состав системных зависимостей указан в Dockerfile backend.
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e '.[dev]'
TELEPHONY_ENABLED=false python -m pytest -q
Без TEST_DATABASE_URL тесты с PostgreSQL пропускаются. Для их запуска на локальной БД из Compose подставьте пароль из .env (специальные символы в URL нужно кодировать):
TEST_DATABASE_URL='postgresql+psycopg://butaq:YOUR_POSTGRES_PASSWORD@localhost:5433/butaq' \
TELEPHONY_ENABLED=false python -m pytest -q
Тесты БД создают и удаляют отдельную схему. Основной набор использует заглушки AI и аудио; он проверяет логику приложения, а не качество реальных ответов моделей.
# Из корня репозитория: проверки frontend в отдельном подкаталоге.
(cd frontend && npm ci && npm run typecheck && npm run test:voice)
# Библиотека телефонии имеет отдельный набор тестов.
(cd telephony && TELEPHONY_ENABLED=false PYTHONPATH=. python -m pytest -q)
# Просмотр демонабора без API-вызовов.
python app/data/demo/evaluate.py --limit 48
# Официальный live-прогон: 104 реплики и 10 диалогов, платные вызовы модели.
python case_2/voice_router_dataset/evaluate_live.py \
--base-url http://localhost:8000 --dialogs --report /tmp/butaq-live-report.json
Результаты отдельных разработческих прогонов сохранены в multi-agent/evals/. Они не являются оценкой на скрытом наборе жюри и не подтверждают гарантированную точность или задержку.
Подробная последовательность настройки, импорта и демонстрации приведена в demo runbook, а проверка по исходному ТЗ — в матрице соответствия.
Данные и интеграции
- При первом запуске backend пустая база атомарно заполняется всеми JSON-данными из
case_2/voice_router_dataset/: 40 сценариями, 43 слотами, 31 действием, knowledge base, синтетическим backend, 104 тестовыми репликами и 10 диалогами. Повторный запуск не перезаписывает правки; после seed источником истины становится PostgreSQL. - В
app/data/prod/{auto,health,travel}/лежат три независимых синтетических набора (авто-, медицинское и туристическое страхование). Они не загружаются автоматически: администратор может импортировать один согласованный набор черезPOST /router/admin/catalog/import-files. Подробности — в описании данных. - Внешний OpenAI API нужен для распознавания речи, работы агентов и озвучки; доступность и стоимость зависят от выбранных моделей и учётной записи. InsightFace при первом использовании загружает локальную модель распознавания лиц. Исходный шаблон главной страницы также использует внешние медиа- и шрифтовые ресурсы.
- Интеграция с SignalWire/OpenAI для входящих звонков описана в docs/telephony.md, и включается через
TELEPHONY_ENABLED=trueпосле настройки credentials и вебхуков.
Для смены набора откройте /admin/import/ и загрузите согласованные JSON-файлы, включая сценарии, слоты, действия, knowledge base и mock backend. Импорт заменяет активный каталог и справочные данные; для экспериментов используйте отдельный экземпляр. Настройки модели и промпты сохраняются.
Главная страница использует внешние медиаресурсы; сведения об исходных шаблонах и лицензиях находятся в frontend/ATTRIBUTION.md.
Ограничения
- Демонстрационные операции. Workflow выполняет чтение, расчёты, preview и симуляцию действий.
simulateне изменяет mock backend и не выполняет оплату, выпуск, отмену, отправку или запись в реальной системе. - Передача оператору.
handoffсообщает о необходимости помощи человека; фактический перевод звонка и исходящие звонки не реализованы. - Зависимость от провайдеров. Голосовой режим требует совместимого браузера, разрешения на микрофон, сети и доступных моделей. Наличие адаптера SignalWire и тестов с заглушками не подтверждает успешный реальный звонок.
- Память сеансов. Активные разговоры и звонки хранятся в одном процессе и теряются при перезапуске. Общего хранилища сеансов для нескольких backend-процессов нет.
- Качество и измерения. Уверенность — оценка модели, а не откалиброванная вероятность. Нет подтверждённой метрики на скрытом наборе жюри или гарантии задержки. В Live-режиме времена Router/Resolution не равны времени до первого слышимого ответа; нули для отдельных STT/TTS-этапов не означают мгновенное распознавание и озвучку.
- Аутентификация по лицу. Сопоставление изображения само по себе не подтверждает присутствие живого человека. Проверки OpenAI assist опциональны и выключены по умолчанию; также доступен вход по passkey.
- Разные наборы данных. Демоидентификаторы
DEMO-*и сценарииS*относятся к каталогу Butaq. Они не совпадают сSC*и записями Saqta. Используйте примеры и проверки именно активного каталога; новый набор действий требует совместимых action adapters.
Развёрнутая версия
В конфигурации Caddy и документации развёртывания телефонии указан домен owlpeer.com:
Адреса подтверждаются конфигурацией репозитория. Текущая доступность сервера, состав загруженного каталога и работоспособность платных AI-вызовов при подготовке этого README не проверялись. Для воспроизводимой демонстрации используйте локальный запуск и сценарий проверки выше.
Авторы коммитов
История коммитов
- 2026-09-23 17:53adddda1masssss
- 2026-09-23 17:52Merge origin/main and reconcile README documentationa1masssss
- 2026-09-23 17:50adddda1masssss
- 2026-09-23 17:49feat: add observations and enhance README with project details and featuresBeknur
- 2026-09-23 17:48commitelitekbtu
- 2026-09-23 17:48feat: enhance workflow management and validation in multi-agent systemelitekbtu
- 2026-09-23 17:45Merge pull request #10 from BAITC-Hacks/fix-frointtttttttttAlmas Issakov
- 2026-09-23 17:44bigy fix02a1masssss
Все коммиты (44)
- 2026-09-23 17:33bigy fixa1masssss
- 2026-09-23 17:30Merge pull request #9 from BAITC-Hacks/frontAlmas Issakov
- 2026-09-23 17:30add numbera1masssss
- 2026-09-23 17:26feat: Add Twilio compatibility webhooks and improve SignalWire integrationBeknur
- 2026-09-23 17:21Merge pull request #8 from BAITC-Hacks/frontAlmas Issakov
- 2026-09-23 17:20addd front telefoniiiiiishshsa1masssss
- 2026-09-23 17:09Merge pull request #7 from BAITC-Hacks/liveBeknur
- 2026-09-23 17:08feat: Enhance live conversation handling with typed message verification and reading aloudBeknur
- 2026-09-23 16:58Merge pull request #6 from BAITC-Hacks/frontAlmas Issakov
- 2026-09-23 16:56fixa1masssss
- 2026-09-23 16:52feat: Implement native GPT-Live voice sessions with enhanced context handlingBeknur
- 2026-09-23 16:33readmeelitekbtu
- 2026-09-23 16:29Merge pull request #5 from BAITC-Hacks/frontSatbaldiyev Turarbek
- 2026-09-23 16:28fix fo4nta1masssss
- 2026-09-23 16:17Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fb68e683-butaq2-0elitekbtu
- 2026-09-23 16:16prompt updelitekbtu
- 2026-09-23 16:13Merge origin/main: combine streaming updates with telephony integrationa1masssss
- 2026-09-23 16:12add telephonhyyyyyyyyyyya1masssss
- 2026-09-23 16:00Merge pull request #4 from BAITC-Hacks/droBeknur
- 2026-09-23 16:00Implement real-time transcription service with audio streaming and event handlingBeknur
- 2026-09-23 15:39feat: migrate from gpt-6-luna to gpt-5.6-terra across configuration and evaluation filesBeknur
- 2026-09-23 15:32feat: update model to gpt-6-luna and enhance demo record handlingBeknur
- 2026-09-23 15:14fixelitekbtu
- 2026-09-23 15:09add scenario dataa1masssss
- 2026-09-23 15:02feat: normalize topic transitions and enhance validation in orchestratorBeknur
- 2026-09-23 15:00Merge pull request #3 from BAITC-Hacks/newBeknur
- 2026-09-23 14:51feat: add demo record lookup and scenario knowledge toolsBeknur
- 2026-09-23 14:28add scenaarioa1masssss
- 2026-09-23 14:00front x backa1masssss
- 2026-09-23 13:58feat: Add Makefile for project management and update README for usage instructionselitekbtu
- 2026-09-23 13:42Merge pull request #2 from BAITC-Hacks/feat/v2vSatbaldiyev Turarbek
- 2026-09-23 13:42backelitekbtu
- 2026-09-23 13:27add fronta1masssss
- 2026-09-23 13:21Merge pull request #1 from BAITC-Hacks/feat/v2vBeknur
- 2026-09-23 13:20feat: Add RouterDatabase and RouterService for scenario management and routingelitekbtu
- 2026-09-23 13:14feat: Implement v2v voice-to-voice library with pipeline and realtime capabilitieselitekbtu
Структура репозитория (255 файлов)
.claude/homunculus/observations.jsonl .dockerignore .env.example .gitignore MULTI-AGENT.md Makefile PLAN.md README.md TZ.md VOICE_ROUTER_PLAN.md alembic.ini app/__init__.py app/api/__init__.py app/api/admin_auth.py app/api/dependencies.py app/api/live.py app/api/routes.py app/api/streaming.py app/data/README.md app/data/demo/README.md app/data/demo/dev_utterances.json app/data/demo/dialogs_sample.json app/data/demo/evaluate.py app/data/demo/knowledge_base.json app/data/demo/mock_backend.json app/data/demo/scenarios.json app/data/prod/auto/README.md app/data/prod/auto/dev_utterances.json app/data/prod/auto/dialogs_sample.json app/data/prod/auto/evaluate.py app/data/prod/auto/knowledge_base.json app/data/prod/auto/mock_backend.json app/data/prod/auto/scenarios.json app/data/prod/health/README.md app/data/prod/health/dev_utterances.json app/data/prod/health/dialogs_sample.json app/data/prod/health/evaluate.py app/data/prod/health/knowledge_base.json app/data/prod/health/mock_backend.json app/data/prod/health/scenarios.json app/data/prod/travel/README.md app/data/prod/travel/dev_utterances.json app/data/prod/travel/dialogs_sample.json app/data/prod/travel/evaluate.py app/data/prod/travel/knowledge_base.json app/data/prod/travel/mock_backend.json app/data/prod/travel/scenarios.json app/db/__init__.py app/db/migrations/env.py app/db/migrations/script.py.mako app/db/migrations/versions/0001_router_config.py app/db/migrations/versions/0002_admin_passkeys.py app/db/models.py app/db/repository.py app/demo_catalog.py app/main.py app/phone/__init__.py app/phone/api.py app/phone/carrier.py app/phone/runtime.py app/phone/service.py app/phone/settings.py app/services/__init__.py app/services/voice_router.py case_2/voice_router_dataset/README.kz.md case_2/voice_router_dataset/README.md case_2/voice_router_dataset/README.ru.md case_2/voice_router_dataset/actions.json case_2/voice_router_dataset/dev_utterances.json case_2/voice_router_dataset/dialogs_sample.json case_2/voice_router_dataset/evaluate.py case_2/voice_router_dataset/evaluate_live.py case_2/voice_router_dataset/knowledge_base.json case_2/voice_router_dataset/mock_backend.json case_2/voice_router_dataset/scenarios.json case_2/voice_router_dataset/slots.json docker-compose.yml dockerfiles/backend.Dockerfile docs/demo-runbook.md docs/telephony.md docs/tz-compliance.md faceid/__init__.py faceid/backends.py faceid/client.py faceid/config.py faceid/images.py faceid/matching.py faceid/quality.py faceid/router.py faceid/schemas.py faceid/service.py faceid/sql.py faceid/store.py frontend/.21st/DESIGN.md frontend/.21st/design.json frontend/.dockerignore frontend/.gitignore frontend/AGENTS.md frontend/ATTRIBUTION.md frontend/CLAUDE.md frontend/Caddyfile frontend/Dockerfile frontend/README.md frontend/app/admin/admin.css frontend/app/admin/import/page.tsx frontend/app/admin/layout.tsx frontend/app/admin/page.tsx frontend/app/admin/scenarios/page.tsx frontend/app/admin/settings/page.tsx frontend/app/globals.css frontend/app/layout.tsx frontend/app/page.tsx frontend/app/telephony/page.tsx frontend/app/voice/page.tsx frontend/components.json frontend/components/admin/admin-workspace.tsx frontend/components/admin/face-capture.tsx frontend/components/admin/login-background.tsx frontend/components/templates/velorah/cta.tsx frontend/components/templates/velorah/feature.tsx frontend/components/templates/velorah/fonts.ts frontend/components/templates/velorah/footer.tsx frontend/components/templates/velorah/hero.tsx frontend/components/templates/velorah/hls-video.tsx frontend/components/templates/velorah/navbar.tsx frontend/components/templates/velorah/primitives.tsx frontend/components/templates/velorah/statement.tsx frontend/components/templates/velorah/styles.tsx frontend/components/templates/velorah/tagline.tsx frontend/components/templates/velorah/velorah.tsx frontend/components/ui/button.tsx frontend/components/ui/demo.tsx frontend/components/ui/video-background.tsx frontend/components/ui/voice-powered-orb.tsx frontend/components/voice/voice-session.tsx frontend/components/voice/voice-workspace.tsx frontend/hooks/use-voice-session.ts frontend/lib/admin-api.ts frontend/lib/utils.ts frontend/lib/voice-api.ts frontend/lib/voice-audio.ts frontend/lib/voice-live.ts frontend/lib/voice-stream.ts frontend/licenses/hirael-asme-MIT.txt frontend/licenses/hirael-mindloop-MIT.txt frontend/next-env.d.ts frontend/next.config.mjs frontend/package-lock.json frontend/package.json frontend/playwright.config.ts frontend/postcss.config.mjs frontend/public/media/admin-login-asme.jpg frontend/public/media/admin-login-asme.mp4 frontend/public/media/telephony-asme.jpg frontend/public/media/telephony-asme.mp4 frontend/public/media/voice-mindloop.jpg frontend/public/media/voice-mindloop.mp4 frontend/public/voice-capture.worklet.js frontend/tests/e2e/tz-flow.spec.ts frontend/tests/voice-live.test.mjs frontend/tests/voice-stream.test.mjs frontend/tsconfig.json image.png multi-agent/README.md multi-agent/SPRINTS.md multi-agent/evals/browser-streaming-smoke.json multi-agent/evals/language-fixed-terra-replay.jsonl multi-agent/evals/live-api-smoke.jsonl multi-agent/evals/live-native-smoke.json multi-agent/evals/live-streaming-smoke.jsonl multi-agent/evals/live-transcription-smoke.jsonl multi-agent/evals/luna-low-development-replay.jsonl multi-agent/evals/terra-live-api-smoke.jsonl multi-agent/evals/terra-low-development-replay.jsonl multi-agent/src/multi_agent/__init__.py multi-agent/src/multi_agent/context.py multi-agent/src/multi_agent/contracts.py multi-agent/src/multi_agent/identifiers.py multi-agent/src/multi_agent/live.py multi-agent/src/multi_agent/orchestrator.py multi-agent/src/multi_agent/prompts.py multi-agent/src/multi_agent/sdk.py multi-agent/src/multi_agent/simulation.py multi-agent/src/multi_agent/streaming.py multi-agent/src/multi_agent/tools.py multi-agent/src/multi_agent/transcription.py multi-agent/src/multi_agent/workflow.py multi-agent/tests/test_live.py multi-agent/tests/test_live_api.py multi-agent/tests/test_orchestrator.py multi-agent/tests/test_sdk.py multi-agent/tests/test_streaming.py multi-agent/tests/test_streaming_api.py multi-agent/tests/test_tools.py multi-agent/tests/test_transcription.py multi-agent/tests/test_voice_context.py multi-agent/tests/test_workflow.py pyproject.toml telephony/.dockerignore telephony/.env.example telephony/.gitignore telephony/Dockerfile telephony/README.md telephony/docker-compose.yml telephony/example_app.py telephony/pyproject.toml telephony/requirements-dev.txt telephony/requirements.txt telephony/telephony/__init__.py telephony/telephony/agents.py telephony/telephony/application.py telephony/telephony/config.py telephony/telephony/delegation.py telephony/telephony/domain.py telephony/telephony/langchain.py telephony/telephony/langgraph.py telephony/telephony/memory.py telephony/telephony/openai_live.py telephony/telephony/ports.py telephony/telephony/responses.py telephony/telephony/router.py telephony/telephony/runner.py telephony/telephony/runtime.py telephony/telephony/schemas.py telephony/telephony/session_graph.py telephony/telephony/tools.py telephony/telephony/twilio.py telephony/tests/__init__.py telephony/tests/conftest.py telephony/tests/test_api.py telephony/tests/test_delegation.py telephony/tests/test_finalization.py telephony/tests/test_openai_live.py telephony/tests/test_openai_telephony.py telephony/tests/test_runtimes.py telephony/tests/test_session_graph.py telephony/tests/test_units.py tests/__init__.py tests/test_admin_auth.py tests/test_app.py tests/test_database.py tests/test_dataset_packs.py tests/test_demo_catalog.py tests/test_native_runtime.py tests/test_phone.py tests/test_router.py v2v/__init__.py v2v/audio.py v2v/client.py v2v/config.py v2v/pipeline.py v2v/realtime.py v2v/router.py v2v/schemas.py v2v/sessions.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.