AAYMA
RU
Войти

Siqyr AI

Система, которая превращает запись совещания (рус./каз./смешанная речь) в протокол с поручениями: собственная STT, диаризация, LLM-извлечение с…

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

О проекте

Команда: Siqyr AI
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Доведённый продукт

Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)

Суть

Система, которая превращает запись совещания (рус./каз./смешанная речь) в протокол с поручениями: собственная STT, диаризация, LLM-извлечение с проверкой цитат, утверждение секретарём, реестр поручений, экспорт в DOCX/PDF и интеграция с Jira.

Как устроено

Аудио приводится через FFmpeg к 16 кГц mono; локальная pyannote Community-1 размечает говорящих, затем интервалы распознаёт собственная модель wav2vec2+CTC (alibiserikbay/kazakh-russian-mixed-stt, TorchScript на CPU, фрагменты до 18 с). Один структурированный вызов LLM с повторной попыткой извлекает сводку, решения и поручения; программные проверки (grounding.py, deadlines.py) отклоняют цитаты, которых нет в расшифровке, и неподтверждённые даты. Секретарь правит и утверждает неизменяемую редакцию (ревизии, 409 при конфликте), из неё строятся DOCX/PDF, задачи в Jira и напоминания. Также есть RAG-чат по встречам и бот для Google Meet.

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

  • wav2vec2 CTC greedy decoding
  • pyannote diarization
  • structured LLM extraction
  • citation grounding checks
  • deadline normalization
  • SSE progress
  • RAG with local embeddings + reranker
  • JWT department-scoped auth
  • Jira integration

Метрики

STT: 480,3 с аудио за 27,5 с (≈17,5× быстрее реального времени); диаризация на двух записях: 39 реплик/4 голоса и 45 реплик/5 голосов; DER не измерен

Особенности

Собственная смешанная каз./рус. STT-модель участника вместо внешнего API и полностью локальный контур (STT, диаризация, LLM). Поручения и сроки проходят программную проверку цитат по расшифровке, а LLM не меняет утверждённую редакцию. README честно разделяет mock-демо и реальные замеры. Есть eval-набор с dev/holdout-прогонами LLM.

Стек

Python · TypeScript · React · PyTorch/TorchScript · FFmpeg · Docker · Docker Compose

Модели

alibiserikbay/kazakh-russian-mixed-stt (wav2vec2) · pyannote Community-1 · Luna · Qwen


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

README

README.md

Siqyr AI

Siqyr AI

От встречи — к проверяемым поручениям.

Полная демонстрация · 2:27 · нажмите Play и включите звук в плеере

▶ Полное видео · 2:27 · со звуком
Короткое демо · 32 секунды · Презентация
Интерфейс продукта на вымышленных mock-данных.

Русский · Қазақша · Смешанная речь
Собственная STT · Диаризация · Проверка человеком · Протокол и контроль исполнения

Демо · STT · Диаризация · Результаты · Запуск

Siqyr AI помогает секретарю превратить запись совещания в согласованный протокол, а руководителю — видеть, кто, что и к какому сроку должен сделать. Система распознаёт речь, разделяет реплики по голосам, предлагает сводку и поручения. Секретарь проверяет цитату и аудиоисточник, исправляет спорные поля и утверждает результат.

Проект для кейса HackAlem AI «Система автопротоколирования совещаний с фиксацией поручений». Рабочий профиль рассчитан на развёртывание внутри инфраструктуры заказчика: аудио, STT, диаризация и LLM обрабатываются в заданном контуре.

Демо

Короткий обзор — в начале страницы. Ниже — полная демонстрация пользовательского пути.

▶ Смотреть демонстрацию Siqyr AI — 2:27

Запись → голоса и текст → проверка поручений → утверждённый протокол → контроль исполнения.

Открыть MP4 · Презентация PPTX · Папка с видеодемо

В видео показан frontend на заполненных mock-данных вымышленного проекта «Самал»: загрузка, говорящие, проверка срока, утверждение, экспорт, поручения, чат и запись разговора. Режим подписан MOCK; обработка и ответы моделируются в браузере. Отдельные результаты реального запуска STT приведены ниже.

Что получает команда

Для когоПольза
СекретарьЧерновик сводки и поручений, цитаты и переход к записи, ручная правка и утверждение
РуководительОбщий реестр: ответственный, срок, статус, просроченные и ближайшие задачи
ИсполнительКонкретное поручение с контекстом; после утверждения — задача в Jira по действию секретаря
ИТ-службаЛокальные модели, явная конфигурация внешних сервисов, разграничение доступа по департаментам

Пользовательский путь

  1. Добавить встречу. Загрузить файл или записать разговор, указать язык, дату и участников.
  2. Получить черновик. Расшифровка с голосами и таймкодами, сводка, решения и поручения.
  3. Проверить источник. Прослушать спорную реплику, подтвердить имя, уточнить формулировку или срок.
  4. Утвердить редакцию. Сохранить проверенный снимок, из которого строятся итоговые документы.
  5. Перейти к исполнению. Скачать DOCX/PDF, работать с реестром, подключить напоминания и Jira.

Наша STT-модель

Распознавание речи — собственная разработка участника команды. Используется alibiserikbay/kazakh-russian-mixed-stt: модель семейства wav2vec2 с CTC-декодированием, предназначенная для русского, казахского и переключения между ними внутри разговора. Модель обучена до хакатона; в проекте она встроена в процесс подготовки и проверки протокола.

ХарактеристикаРеализация
Рабочий recognizerСмешанная модель asr/rukk; интерфейс принимает ru, kk, rukk
ВыполнениеTorchScript через torch.jit.load, локальный CPU
Подготовка аудиоFFmpeg → 16 кГц, mono, float32
ДекодированиеЖадный CTC с соответствующим tokens.lst, без внешнего STT API
Длинные репликиРазбиение около пауз на фрагменты до 18 секунд
РезультатТекст реплики, её начало и конец на исходной записи, метка голоса
Лицензия опубликованной STTApache-2.0

Модель работает и даёт полезную основу для протокола. В проверенных записях читаются основные темы и ключевые инструкции, многие числовые показатели и сроки. В отдельном акустическом тесте на Mac 480,3 секунды аудио распознаны за 27,5 секунды — примерно в 17,5 раза быстрее длительности записи.

Этот замер относится только к акустической модели: загрузка весов, декодирование файла, диаризация, LLM и экспорт в него не входят. Имена и специальные термины требуют проверки. Два измеренных аудиопримера преимущественно русскоязычные; отдельная репрезентативная оценка казахской и смешанной речи ещё нужна. Подробности теста STT.

Код: распознавание · декодирование и разбиение аудио.

Диаризация: кто и когда говорил

Локальная pyannote Community-1 выделяет акустические голоса и интервалы их речи. В текущем пайплайне сначала определяется разметка говорящих, затем соответствующие интервалы поступают в STT. Это позволяет связать текст и поручения с конкретным участком исходной записи.

  • Реплики с таймкодами. Сохраняются начало и конец речевого интервала; переход из поручения ведёт к исходным секундам аудио.
  • Наложения видны. Одновременная речь нескольких голосов отмечается OVERLAP.
  • Неизвестный голос сохраняется. Если диаризация недоступна, STT может вернуть текст с UNKNOWN, требующим проверки.
  • Имя подтверждает человек. SPEAKER_00 — акустическая метка; предложенную связь с именем участника проверяет секретарь. Биометрическая идентификация личности не заявляется.
  • Ответственный может не выступать. Поручение внешнему юристу или отделу не требует отдельной голосовой метки.

На двух интеграционных записях получены 39 реплик / 4 голоса и 45 реплик / 5 голосов, отдельно отмечены наложения. Быстрые смены говорящих иногда сливаются; на первой записи в письменном протоколе указаны пять участников. Число голосов не является метрикой точности диаризации: проверенный DER пока не измерен.

Код: backend/stt/diarize.py · отчёт по интеграционным тестам.

Поручения, которым можно проверить источник

После распознавания LLM формирует сводку, решения и список действий. Для поручения сохраняются формулировка, ответственный, дословный срок, вычисленная дата при достаточных основаниях, цитаты и индексы исходных реплик.

СитуацияПоведение системы
Имя не удалось установитьИсполнитель остаётся неизвестным; возможные кандидаты требуют подтверждения
Срок перенесли и согласовалиСохраняется согласованный срок вместе с источниками изменения
В речи противоречивые датыСохраняются альтернативы и причина проверки
Нет подтверждённой даты встречиОтносительный срок сохраняется текстом, дата не выдумывается
Цитата отсутствует в расшифровкеПроверка источника отклоняет неподтверждённую ссылку
Секретарь исправляет результатПравка сохраняется отдельно; raw-транскрипт остаётся неизменным

Извлечение использует один структурированный вызов LLM с дополнительной попыткой исправить невалидный ответ. Цитаты и сроки проходят программные проверки. После утверждения LLM больше не меняет результат: документы формируются из неизменяемой утверждённой редакции. Параллельные правки защищены номером ревизии и ответом 409 при конфликте.

Код: runner · проверка цитат · сроки · контракт API.

Возможности продукта

Покрытие обязательного ТЗ: русский STT и основной путь от записи до PDF/DOCX работают; казахская и смешанная речь поддерживаются моделью, но репрезентативный аудиозамер ещё нужен. Диаризация даёт голоса и таймкоды, а связь голоса с человеком подтверждает секретарь. Доступны поручения, саммари, реестр и напоминания. Google Meet поддержан экспериментальным ботом с ручным входом; ботов Teams и Zoom, интеграции с СЭД и голосовой биометрии пока нет. Матрица требований и доказательств.

ВозможностьЧто реализовано
Файл или микрофонЗагрузка аудио/видео до 100 МБ с проверкой контейнера; браузерная запись WebM-чанками
Серверный reviewСводка, решения, голоса, поручения, причины проверки, источники, правка и утверждение
DOCX и PDFЭкспорт утверждённой версии с поддержкой казахских букв; локальные примеры имеют отдельный клиентский экспорт
Реестр порученийОтветственные, даты, фильтры, статусы и отметка исполнения; утверждённые поля защищены от произвольной правки
НапоминанияПроверка сроков и просрочек; на сервере — SMTP/Resend и копия куратору при настройке почты, в локальном UI — напоминания внутри приложения
Чат по встречамИстория диалогов, поиск фрагментов, ответ с источниками; локальные embeddings, reranker и LLM требуют подготовки моделей
JiraЯвное создание задач после утверждения: срок, цитата, ссылка на аудио и PDF; проверено со сценарной записью
Google MeetОтдельный модуль бота, уведомление о записи, сохранение аудио и передача в API; вход тестового аккаунта требует ручного участия
Доступ и ролиПользователи, департаменты, роли, профиль; backend-адаптеры Keycloak и ЭЦП требуют настройки инфраструктуры заказчика
Ход обработкиSSE-этапы, состояние проверки и явные режимы real, mock, replay; frontend читает поток с Bearer-авторизацией

Чат сохраняет связь с материалами встречи. API отбирает доступные фрагменты, локальные BGE-M3 embeddings и BGE reranker уточняют релевантность, LLM формирует ответ с ссылками на источники. Индекс и история находятся на сервере; внутренний AI-сервис доступен через Unix socket. Подробнее — docs/RAG.md. В презентационном видео ответ чата подготовлен заранее и подписан MOCK.

Архитектура

Два режима LLM

КонтурМодельДанные
Закрытый рабочийЛокальная qwen3:4b через Ollama; qwen3:1.7b можно выбрать вручнуюАудио, транскрипт и поручения остаются внутри контура. LLM_PROVIDER=local; облачного fallback нет.
Закрытый серверныйQwen 27B на NVIDIA-сервере в инфраструктуре заказчикаAPI подключается к внутреннему OpenAI-совместимому endpoint через DOCKER_LLM_BASE_URL и LLM_ALLOWED_HOSTS; данные остаются в разрешённом контуре. Точный артефакт модели и производительность в этом репозитории ещё не зафиксированы.
Открытый тестовыйgpt-6-luna через OpenAI APIТолько полностью вымышленные данные, разрешённые серверным SHA-256 manifest (LLM_PROVIDER=dev_openai). Реальные записи сюда не отправляются.

Режим задаётся в .env; контракт и интерфейс одинаковы. Качество моделей различается, см. результаты.

flowchart LR
    A["Файл / микрофон / Meet"] --> B["Локальные диаризация + STT"]
    B --> C["Сводка и поручения с источниками"]
    C --> D["Проверка и утверждение"]
    D --> E["DOCX / PDF · Реестр · Jira"]
    B --> F["Чат по материалам встреч"]

Frontend: React + TypeScript, Mantine, TanStack Query, Dexie. Backend: FastAPI, SQLModel, SQLite, очередь обработки и SSE. Аудио: FFmpeg, PyTorch/TorchScript, pyannote. LLM: единый клиент с явным профилем и адресом сервера.

Рабочий аудиопуть: FFmpeg → диаризация → разбиение речевых интервалов → STT → извлечение → review → экспорт. VAD-артефакт входит в комплект STT-модели, но текущий engine.py не вызывает отдельный ONNX VAD; разбиение использует интервалы диаризации и тихие участки сигнала.

Архитектура · Стек и запуск · Журнал решений

Результаты

Здесь разделены скорость акустической модели, поведение диаризации и извлечение поручений. Результаты получены на небольших тестовых наборах и не являются общей оценкой точности продукта.

ПроверкаПодтверждённый результатГраница измерения
Скорость STT на Mac480,3 с аудио → 27,5 с акустического inference; RTF ≈ 0,057Без загрузки, диаризации и остального пайплайна
Аудио + диаризацияДва прогона: 39 и 45 реплик, 4 и 5 голосовых меток, отмечены наложенияЕсть слияния коротких реплик; DER не измерен
Извлечение v112/12 валидных ответов, 9/9 ожидаемых поручений по сопоставлению источников, 0 лишних12 вымышленных стенограмм; точное совпадение ключевых слов действия 7/9
Сложные случаи v2Строгая проверка 6/12, смысловая 8/12; повтор после исправлений 4/5Имена, переносы сроков, наложения, внешние исполнители
Проверки защитной логики25/25 проверок v1 и 2/2 v2Парсинг, источники, ошибки ответов и поведение после утверждения
Интеграционный real-smokeКороткая вымышленная запись прошла через STT/диаризацию/Luna, review, утверждение и DOCX/PDF в API и UIНе измеряет точность на реальных встречах
Длинная вымышленная запись 2:50API: 34 сегмента, source_mode=real, обработка до review за 225,6 с; после ручной проверки 4 поручения утверждены и экспортированы в DOCX/PDFПервый сырой черновик раздробил 4 основных поручения на 21 карточку; исправленный промпт на том же тексте дал 10, автоматическое качество ещё недостаточно

Результаты извлечения v1/v2 получены на gpt-6-luna в разрешённом synthetic-dev профиле. Исторический локальный qwen3:4b после корректировки промпта дал 8/12 валидных ответов и 4/9 ожидаемых поручений: выбор LLM влияет на итоговое качество.

Качество STT оцениваем по аудио, а не по красивому демо. Основные темы, инструкции и многие сроки распознаются полезно для черновика. Надёжный WER пока не установлен: приложенные письменные протоколы расходятся с дословной речью. Диагностические 28,75% и 12,35% не представляем как точность распознавания. Для казахской и смешанной речи нужен отдельный вручную проверенный корпус.

Источники: STT · интеграционные прогоны · извлечение v1 · сложные случаи v2 · локальный baseline.

Модели и лицензии

КомпонентМодельГде работает
STTalibiserikbay/kazakh-russian-mixed-stt (Apache-2.0): wav2vec2 + CTC, казахский, русский и смешанная речь за один проход, жадное декодирование, 16 кГц. Обучена участником команды до хакатонаCPU, локально
VAD-артефактvad.onnx из репозитория STT; текущий аудиопуть его не вызываетВ комплекте модели
Диаризацияpyannote/speaker-diarization-community-1 — gated: нужно принять условия на Hugging FaceCPU, локально
LLM, рабочий профильOllama: qwen3:4b, резерв qwen3:1.7bloopback
LLM, разработкаgpt-6-luna через OpenAI API — только на полностью вымышленных стенограммахвнешний API

После подготовки моделей размеры и SHA-256 весов записываются в локальные models/stt/manifest.json и models/diarization/manifest.json. Сами веса в git не попадают. Веса STT занимают около 756 МБ.

Закрытый контур и приватность

  • Аудио остаётся на сервере обработки. FFmpeg, STT и pyannote выполняются локально; рабочая LLM размещается на loopback или явно разрешённом внутреннем хосте.
  • Назначение LLM задаётся явно. Пустой или недопустимый адрес блокирует real-путь. Автоматического перехода на облачный провайдер при ошибке нет.
  • Внешний synthetic-dev отделён. dev_openai разрешён для встроенного вымышленного примера либо тестового файла, чей SHA-256 проверен по серверному manifest. Клиентский synthetic=true не даёт такого разрешения.
  • Доступ ограничивается департаментом. Сервер проверяет права на встречи, источники, утверждение и экспорт; секреты хранятся вне Git.
  • Интеграции включаются отдельно. Для рабочего контура — внутренние Jira Data Center и SMTP. Облачные сервисы допускаются только для разрешённых вымышленных сценариев разработки.
  • Участники уведомляются о записи. Подтверждение предусмотрено в интерфейсе записи, бот Meet сообщает об этом в чате.

run_local.sh отключает телеметрию библиотек и Agents tracing; --offline запрещает скачивание моделей и требует локальный LLM endpoint. Развёртывание с переносом образов и моделей описано в инструкции для закрытого контура. Физический тест полного сценария при отключённой сети ещё не зафиксирован.

Быстрый старт (ноутбук, без Docker)

Нужно заранее: Python 3.12+, Node.js 22.18+, Git Bash на Windows. Для реальной обработки ещё FFmpeg и Ollama. Сеть нужна только на время установки.

bash scripts/setup.sh                      # .venv, зависимости по lock, .env из .env.example, npm ci, preflight

Если lock не ставится на вашей платформе, повторите с --no-lock.

По умолчанию конфигурация включает mock STT и mock-агентов: пайплайн проходит на синтетическом совещании без моделей. Для серверного пространства со входом в .env задайте:

AUTH_MODE=local
JWT_SECRET=<случайная строка от 32 символов>
BOOTSTRAP_ADMIN_USER=admin
BOOTSTRAP_ADMIN_PASSWORD=<пароль от 12 символов>

Для отдельного frontend без API можно выбрать «Продолжить локально» на экране входа; в этом режиме данные хранятся в браузере и серверное распознавание не запускается.

Администратор создаётся при первом запуске, после этого удалите bootstrap-пароль из .env. Учётки на каждую роль (test.admin, test.secretary, test.viewer и др.) создаёт python scripts/seed_test_users.py, он же печатает общий пароль. Подробнее: docs/AUTH.md.

bash scripts/run_local.sh --offline        # API 127.0.0.1:8000 + фронтенд 127.0.0.1:5174, ничего не скачивает
bash scripts/demo_e2e.sh                   # сквозная проверка через API: запуск → правка → утверждение → DOCX + PDF

Откройте http://127.0.0.1:5174. run_local.sh сначала запускает scripts/preflight.py и проверяет, что порты свободны. --api-only поднимает только API, --port меняет порт. Остановка — Ctrl+C.

На Windows вместо .venv/bin/... используйте .venv/Scripts/....

Реальная обработка на локальных моделях

Один раз, с сетью:

bash scripts/setup.sh --with-stt           # torch CPU, onnxruntime, pyannote.audio, CLI hf
.venv/bin/hf auth login                    # токен HF не хранится в git; заранее примите условия pyannote на huggingface.co

Перед скачиванием весов впишите в .env локальные модели: MODEL_MAIN=qwen3:4b, MODEL_FAST=qwen3:1.7b. Скрипт делает ollama pull именно для этих имён.

bash scripts/setup.sh --download-models    # ollama pull, веса STT и диаризации в models/, manifest с SHA-256

Затем в .env: STT_MODE=real, AGENT_MODE=real, LLM_PROVIDER=local, LLM_BASE_URL=http://127.0.0.1:11434/v1. Запустите ollama serve и bash scripts/run_local.sh --offline. Своя запись через API:

bash scripts/demo_e2e.sh --file запись.wav --meeting-date 2026-09-23 --mode real

Подготовка моделей выполняется до запуска; рабочий запрос не скачивает веса автоматически. Отсутствие необходимых компонентов отражается проверками готовности и ошибками обработки. --offline дополнительно запрещает LLM не на loopback.

Docker

cp .env.example .env
docker compose up --build                  # WITH_STT=1 / WITH_RAG=1 в .env — образ с torch, STT и RAG

Приложение — http://localhost:5173 (nginx отдаёт фронт и /api), API напрямую — http://127.0.0.1:8000/api/health. Развёртывание в закрытом контуре заказчика (локальные STT, LLM в Ollama, RAG-чат, перенос образов без интернета) — infra/README.md. Основной проверенный путь — локальный запуск без Docker.

Развёртывание в закрытом контуре

Сначала на машине с интернетом скачайте веса STT, диаризации, RAG и Qwen и соберите образы. Перенесите образы, models/ и репозиторий на сервер заказчика. На сервере заполните .env: STT_MODE=real, AGENT_MODE=real, LLM_PROVIDER=local, MODEL_MAIN=qwen3:4b, MODEL_FAST=qwen3:1.7b, WITH_STT=1, WITH_RAG=1, COMPOSE_PROFILES=llm, AUTH_MODE=local или корпоративный вход. Секреты в Git не добавляйте.

docker load -i siqyr-images.tar.gz
docker compose up -d --no-build --wait
curl -s http://127.0.0.1:8000/api/health

Ожидается ready: true и пустой список problems. Пользователи открывают адрес web из PUBLIC_APP_URL; LLM и база доступны только внутри сети. Полная последовательность подготовки образов, настройки HTTPS и корпоративного входа — в инструкции по развёртыванию.

Для Qwen 27B на отдельном NVIDIA-сервере укажите внутренний адрес модели в DOCKER_LLM_BASE_URL и её хост в LLM_ALLOWED_HOSTS; профиль Ollama llm тогда не требуется. Проверьте доступность сервера и точный идентификатор загруженной модели перед запуском real-пайплайна.

Настройка

Все параметры — в .env.example, секретов в нём нет. .env не коммитится.

ПеременнаяПо умолчаниюСмысл
STT_MODE, AGENT_MODEmockreal — локальные STT и LLM; любой mock-этап помечает результат source_mode=mock
DEMO_MODE, REPLAY_RUN_IDlivereplay — повтор сохранённого прогона, помечен source_mode=replay
LLM_PROVIDERlocallocal — только loopback или хосты из LLM_ALLOWED_HOSTS; dev_openai — встроенный образец или проверенная вымышленная тестовая запись
DEV_OPENAI_AUDIO_MANIFESTпустоСерверный JSON с SHA-256 разрешённых вымышленных записей; без него загрузки не передаются внешней LLM
LLM_BASE_URLпустообязателен для AGENT_MODE=real; пусто — real-запуск останавливается, облачного fallback нет
MODEL_MAIN, MODEL_FASTgpt-6-lunaдля локального профиля задайте явно, например qwen3:4b и qwen3:1.7b
STT_MODEL_DIR, DIARIZATION_MODEL_DIRmodels/stt, models/diarizationвеса; в git только manifest
STT_LANGrukkrukk — смешанная речь, kk, ru
DATA_DIRdata/runtimeSQLite, загрузки, экспорт; удалить папку — удалить все данные
MAX_UPLOAD_MB, MAX_QUEUE100, 3лимит файла (413) и очереди при одном worker (429)
AUTH_MODEdisabledlocal — логин и пароль, keycloak — только корпоративный токен, hybrid — оба; disabled — без входа, для API-демо и тестов
JWT_SECRET, BOOTSTRAP_ADMIN_*пустообязательны при входе по паролю
KEYCLOAK_ISSUER, KEYCLOAK_AUDIENCE, ECP_VERIFY_URLпустокорпоративный вход и ЭЦП, см. docs/AUTH.md
SMTP_* или RESEND_API_KEYпустопочта для напоминаний; без неё напоминания видны только в /api/notifications
NOTIFY_EMAILS, NOTIFY_CCпусто{"имя из протокола": "email"} и куратор в копии
REMINDER_INTERVAL_SEC, REMIND_DAYS_BEFORE300, 1частота проверки сроков и за сколько дней напоминать
DEMO_TODAY, APP_UTC_OFFSETпусто, 5сдвиг «сегодня» для показа просрочки; часовой пояс Астаны
JIRA_URL, JIRA_TOKEN, JIRA_PROJECT, JIRA_BOARD_ID, JIRA_USERSпустоJira Data Center (PAT); Cloud — только с JIRA_ALLOW_CLOUD=1 и сценарной записью
PDF_FONT_PATHпоиск DejaVu Sans / ArialTTF с буквами ә ғ қ ң ө ұ ү һ і

Для тестовой загрузки в dev_openai укажите путь к локальному JSON с version: 1 и files: [{"sha256": "...", "allow_dev_openai": true, "synthetic": true}]. SHA-256 считается по байтам исходного аудио; список создаёт владелец сервера. Флаг или имя файла, переданные браузером, не разрешают облачную обработку.

Проверить почту: python -m backend.app.mailer [email protected].

Проверка

.venv/bin/python -m pytest                 # backend и eval, mock STT и агенты, без сети
npm --prefix frontend run check            # архитектурные границы, типы, тесты, сборка
bash scripts/demo_e2e.sh                   # живой API: SSE-этапы → правка revision → approve → DOCX + PDF
bash scripts/demo_e2e.sh --jira            # то же + задачи Jira (нужны JIRA_* в .env)

Браузерный E2E подтвердил путь вход → загрузка → сервер → правка → утверждение → DOCX/PDF на короткой вымышленной записи с реальными STT и Luna. На записи 2:50 review выполнялся через API; экспорт проверен также чтением текста PDF. История проверок — в docs/STATUS.md.

Ограничения

  • Длинная запись 2:50 прошла через API до экспорта; полный review этой записи выполнялся через API, не через клики в браузере. Короткий real-сценарий через браузер проверен отдельно.
  • Автоматическое извлечение из длинной смешанной речи дробит один результат на подшаги и повторы. Черновик требует исключения лишних карточек секретарём; 4 итоговых поручения получены после такой ручной проверки.
  • Диаризация сливает быстрые смены говорящих: на записи №1 четыре голоса при пяти людях. Имена и связь голоса с человеком подтверждает секретарь; биометрической идентификации нет.
  • Локальная LLM qwen3:4b заметно слабее gpt-6-luna на том же наборе. Качество зависит от выбранной модели и железа.
  • Относительные сроки без подтверждённой даты совещания остаются текстом. Уверенность модели (confidence) не калибрована и всегда null.
  • Бот Meet зависит от разметки Google Meet и требует ручного входа тестового аккаунта. Бота для Teams и Zoom нет.
  • Нет интеграции с СЭД. Выдержки ответственным формируются, но по почте не рассылаются — письма уходят только как напоминания о сроках.
  • Одна очередь и один worker: прототип для одного ноутбука или сервера, не промышленное развёртывание.

Структура

backend/app       API: FastAPI + SQLModel + SQLite, SSE, review, экспорт, авторизация, напоминания, Jira
backend/stt       распознавание речи, VAD и диаризация
backend/agents    propose()/execute(), grounding цитат, разбор сроков, промпты, mock-раннер
backend/shared    общий контракт (Pydantic-схемы)
frontend          веб-интерфейс: React 19 + TypeScript + Vite + Mantine + Dexie
meet_bot          бот для Google Meet: Playwright, запись удалённых аудиотреков
scripts           setup, run_local, preflight, demo_e2e, seed_test_users
eval              синтетические наборы, эталоны, сырые ответы моделей и отчёты
tests             pytest для API, авторизации, контракта, почты, Jira
models            manifest весов (сами веса не в git)
data              синтетические демо-данные; runtime/ создаётся при запуске
infra             Dockerfile фронтенда, nginx, заметки по деплою
docs              задача, контракт, архитектура, решения, статус

Документация

ДокументО чём
docs/CONTRACT.mdвсе маршруты API, схемы, коды ошибок, что не реализовано
docs/ARCHITECTURE.md, docs/STACK.mdархитектура и выбор технологий
docs/DECISIONS.mdжурнал решений с обоснованием
docs/AUTH.mdвход, роли, Keycloak, ЭЦП
docs/DEMO.mdсценарий демонстрации
docs/STT_RESULTS.mdскорость STT и границы оценки качества
docs/RAG.mdчат, источники и подготовка локальных моделей
docs/DATA.mdданные, их происхождение и ограничения
docs/AI_USAGE.mdкак команда использовала ИИ-инструменты и API
eval/README.mdкак устроена и запускается оценка
frontend/README.md, meet_bot/README.md, infra/README.mdфронтенд, бот, деплой

Команда

  • Meiirlan — бэкенд, инфраструктура, интеграция
  • Nurdaulet — фронтенд, демо
  • Alibi — AI: распознавание речи, агенты, eval

Презентационный ролик использует явно обозначенный вымышленный сценарий. Исходные записи, персональные данные, ключи и веса моделей не включаются в документационный пакет.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
94
Авторы
5
Файлы
376
Ветки
6

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

GwenBleidd 43Alibi 30m.nurdaulet 18akenoowww 2GwenBleidd 1

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

  • 2026-09-23 17:58docs: embed full voiced demo player firstAlibi
  • 2026-09-23 17:58Update README.mdakenoowww
  • 2026-09-23 17:55docs: record completed long synthetic pipeline runAlibi
  • 2026-09-23 17:54Merge branch 'main' of https://github.com/BAITC-Hacks/hack-58ee0d93-siqyr-aim.nurdaulet
  • 2026-09-23 17:54docs: describe NVIDIA Qwen server optionAlibi
  • 2026-09-23 17:54fixm.nurdaulet
  • 2026-09-23 17:53docs: lead README with animated demo highlightsAlibi
  • 2026-09-23 17:53docs: autoplay demo preview at top of READMEAlibi
Все коммиты (94)
  • 2026-09-23 17:52docs: feature video, model modes and closed deploymentAlibi
  • 2026-09-23 17:51docs: present Siqyr AI workflow, STT and diarization resultsAlibi
  • 2026-09-23 17:49Merge branch 'main' of https://github.com/BAITC-Hacks/hack-58ee0d93-siqyr-aiGwenBleidd
  • 2026-09-23 17:49pptx addedGwenBleidd
  • 2026-09-23 17:47Merge branch 'main' of https://github.com/BAITC-Hacks/hack-58ee0d93-siqyr-aim.nurdaulet
  • 2026-09-23 17:46added demo videom.nurdaulet
  • 2026-09-23 17:44feat(onprem): one LLM and server policy for protocols, RAG and the UIGwenBleidd
  • 2026-09-23 17:44feat(infra): docker compose for the customer's closed networkGwenBleidd
  • 2026-09-23 17:39Allow verified fictional audio in dev Luna pipelineAlibi
  • 2026-09-23 17:30feat(frontend): bind meeting review, approval and assignments to the APIGwenBleidd
  • 2026-09-23 17:24docs(criteria): requirements matrix matches the current mainGwenBleidd
  • 2026-09-23 17:22docs(readme): UI now shows server draft, approval, export and registryGwenBleidd
  • 2026-09-23 17:22feat(frontend): server protocol review, approval, export and assignment registryGwenBleidd
  • 2026-09-23 17:19fixm.nurdaulet
  • 2026-09-23 17:14Merge branch 'main' of https://github.com/BAITC-Hacks/hack-58ee0d93-siqyr-aim.nurdaulet
  • 2026-09-23 17:13fixm.nurdaulet
  • 2026-09-23 17:13fix(app): restore post-merge health and chat boundariesm.nurdaulet
  • 2026-09-23 17:07Merge branch 'main' of https://github.com/BAITC-Hacks/hack-58ee0d93-siqyr-aiGwenBleidd
  • 2026-09-23 17:07readme updatedGwenBleidd
  • 2026-09-23 17:06Merge branch 'main' of https://github.com/BAITC-Hacks/hack-58ee0d93-siqyr-aim.nurdaulet
  • 2026-09-23 17:06fixm.nurdaulet
  • 2026-09-23 17:02feat(api): short-lived token for /events so EventSource works with loginGwenBleidd
  • 2026-09-23 17:02docs(status): browser E2E of upload → review → approve → exportGwenBleidd
  • 2026-09-23 17:01updatedm.nurdaulet
  • 2026-09-23 16:53feat(frontend): department roles from /api/auth/me in the sessionGwenBleidd
  • 2026-09-23 16:53feat(auth): test accounts for every role in one scriptGwenBleidd
  • 2026-09-23 16:47docs(contract): add AI v0.2 fields to CONTRACT and JSON SchemaGwenBleidd
  • 2026-09-23 16:44fix(upload): restore sending uploaded files to the backendGwenBleidd
  • 2026-09-23 16:37feat(recording): participants for microphone recordings, editable until finishGwenBleidd
  • 2026-09-23 16:35Merge pull request #3 from BAITC-Hacks/codex/ai-implementationGwenBleidd
  • 2026-09-23 16:32Hand off tested AI integration and current sync readinessAlibi
  • 2026-09-23 16:31Merge branch 'main' of https://github.com/BAITC-Hacks/hack-58ee0d93-siqyr-aim.nurdaulet
  • 2026-09-23 16:31fixed conflictsm.nurdaulet
  • 2026-09-23 16:31feat(reminders): send reminder emails through Resend with only RESEND_API_KEYGwenBleidd
  • 2026-09-23 16:30Record independent AI quality baseline and regressionsAlibi
  • 2026-09-23 16:30redesign && frontend updatedm.nurdaulet
  • 2026-09-23 16:29Ground AI identities and deadlines and preserve review evidenceAlibi
  • 2026-09-23 16:14Merge current main contract into AI implementationAlibi
  • 2026-09-23 16:14Merge api into main: email reminders over SMTPGwenBleidd
  • 2026-09-23 16:12feat(reminders): email due-soon and overdue reminders over SMTPGwenBleidd
  • 2026-09-23 16:12feat(upload): send uploaded recordings to POST /api/runsGwenBleidd
  • 2026-09-23 16:09redesignm.nurdaulet
  • 2026-09-23 16:04Document verified AI demo and integration gapAlibi
  • 2026-09-23 16:03Verify both demo exports end to endAlibi
  • 2026-09-23 16:03Find Unicode PDF fonts on macOSAlibi
  • 2026-09-23 15:56feat(recording): stream microphone chunks to the server in the modules layoutGwenBleidd
  • 2026-09-23 15:55Merge api into main: explicit recording formats on uploadGwenBleidd
  • 2026-09-23 15:55feat(upload): accept only recording formats, checked by container signatureGwenBleidd
  • 2026-09-23 15:55Update AI integration handoff with mock audio findingsAlibi
  • 2026-09-23 15:55Reject unapproved dates and pin synthetic eval inputsAlibi
  • 2026-09-23 15:54Restrict real LLM runs to approved destinationsAlibi
  • 2026-09-23 15:49Record final product Luna synthetic runsAlibi
  • 2026-09-23 15:49Record intermediate product Luna synthetic runsAlibi
  • 2026-09-23 15:49Record baseline Luna synthetic responsesAlibi
  • 2026-09-23 15:49Document Luna evaluation and guard source validationAlibi
  • 2026-09-23 15:48Use Luna and harden source-checked extractionAlibi
  • 2026-09-23 15:47Merge api into main: Jira integration, recording API, docsGwenBleidd
  • 2026-09-23 15:36feat(recording): stream browser recording to a server runGwenBleidd
  • 2026-09-23 15:36feat(jira): push approved assignments to Jira as issuesGwenBleidd
  • 2026-09-23 15:36docs: contract, decisions and status for v0.2, recording and JiraGwenBleidd
  • 2026-09-23 15:28Merge remote-tracking branch 'origin/main' into HEADGwenBleidd
  • 2026-09-23 15:27docs(meet-bot): record source commit in handoffGwenBleidd
  • 2026-09-23 15:27Merge remote-tracking branch 'origin/main' into HEADGwenBleidd
  • 2026-09-23 15:26Merge api into main while retaining current frontendGwenBleidd
  • 2026-09-23 15:25feat(meet-bot): add local Google Meet demo captureGwenBleidd
  • 2026-09-23 15:15Document AI integration results and backend requestsAlibi
  • 2026-09-23 15:14Record independent synthetic extraction measurementsAlibi
  • 2026-09-23 15:13Add isolated synthetic extraction evaluationAlibi
  • 2026-09-23 15:12Add source-checked meeting extraction runnerAlibi
  • 2026-09-23 15:05feat(app): integrate frontend workspace and local authm.nurdaulet
  • 2026-09-23 15:00Add local mixed STT and offline diarization adaptersAlibi
  • 2026-09-23 14:58feat(scripts): one-command setup/run, offline preflight, 503/429 guardsGwenBleidd
  • 2026-09-23 14:53feat(profile): add settings avatar and password rotationGwenBleidd
  • 2026-09-23 14:52feat(api): contract v0.2 — revisions, approved snapshot, evidence checks, audioGwenBleidd
  • 2026-09-23 14:34fix(demo): AUTH_MODE=disabled by default, CORS for :5174, plain compose env_fileGwenBleidd
  • 2026-09-23 14:32Merge origin/main (team execution plan) into mainGwenBleidd
  • 2026-09-23 14:31Merge branch 'api' into main: full API with authGwenBleidd
  • 2026-09-23 14:29fix(api): preserve assignment sources and require explicit LLM endpointGwenBleidd
  • 2026-09-23 14:28docs: define hackathon execution plan and acceptance criteriaAlibi
  • 2026-09-23 14:28docs: coordinate three contributors around existing frontendAlibi
  • 2026-09-23 14:13Merge pull request #1 from BAITC-Hacks/frontendakenoowww
  • 2026-09-23 14:06feat(auth): add department-scoped JWT and enterprise identity adaptersGwenBleidd
  • 2026-09-23 14:01build: integrate frontend with main repository layoutm.nurdaulet
  • 2026-09-23 13:55feat(api): full meeting-minutes API on mock agents and mock STTGwenBleidd
  • 2026-09-23 13:52feat: add SiqyrAI meeting workspace frontendm.nurdaulet
  • 2026-09-23 13:33initGwenBleidd
Структура репозитория (376 файлов)
.agents/skills/agents-sdk-patterns/SKILL.md
.agents/skills/contract-guard/SKILL.md
.agents/skills/demo-check/SKILL.md
.agents/skills/status-update/SKILL.md
.agents/skills/status-update/agents/openai.yaml
.agents/skills/submission/SKILL.md
.agents/skills/submission/agents/openai.yaml
.agents/skills/synthetic-data/SKILL.md
.codex/agents/architect.toml
.codex/agents/docs_researcher.toml
.codex/agents/reviewer.toml
.codex/agents/scout.toml
.codex/agents/ui_tester.toml
.codex/config.toml
.dockerignore
.env.example
.gitattributes
.gitignore
AGENTS.md
README.md
Siqyr_AI_Presentation.pptx
artifacts/demo-video/SiqyrAI-demo-cover.jpg
artifacts/demo-video/SiqyrAI-demo-preview.gif
artifacts/demo-video/SiqyrAI-demo.mp4
artifacts/demo-video/SiqyrAI-highlights.gif
artifacts/demo-video/SiqyrAI-highlights.mp4
artifacts/demo-video/marketing/SiqyrAI-startup-demo.mp4
backend/Dockerfile
backend/__init__.py
backend/agents/AGENTS.md
backend/agents/__init__.py
backend/agents/deadlines.py
backend/agents/grounding.py
backend/agents/prompts/.gitkeep
backend/agents/prompts/extract.md
backend/agents/rag_service.py
backend/agents/runner.py
backend/agents/runner_mock.py
backend/agents/trusted_audio.py
backend/app/AGENTS.md
backend/app/__init__.py
backend/app/auth.py
backend/app/config.py
backend/app/db.py
backend/app/demo.py
backend/app/events.py
backend/app/exports.py
backend/app/jira.py
backend/app/limits.py
backend/app/llm.py
backend/app/mailer.py
backend/app/main.py
backend/app/media.py
backend/app/models.py
backend/app/pipeline.py
backend/app/profile.py
backend/app/profile_models.py
backend/app/rag.py
backend/app/rag_models.py
backend/app/rag_schemas.py
backend/app/readiness.py
backend/app/reminders.py
backend/app/review.py
backend/app/schemas.py
backend/app/seed.py
backend/requirements-rag.txt
backend/requirements-stt.txt
backend/requirements.lock.txt
backend/requirements.txt
backend/shared/__init__.py
backend/shared/schemas.py
backend/stt/AGENTS.md
backend/stt/__init__.py
backend/stt/audio.py
backend/stt/diarize.py
backend/stt/engine.py
data/README.md
data/samples/.gitkeep
data/seed/demo_meeting.json
data/seed/rag_openai_manifest.json
data/synthetic/.gitkeep
docker-compose.yml
docs/AI_USAGE.md
docs/ARCHITECTURE.md
docs/AUTH.md
docs/BACKEND_HANDOFF.md
docs/CONTRACT.md
docs/COORDINATION.md
docs/CRITERIA.md
docs/DATA.md
docs/DECISIONS.md
docs/DEMO.md
docs/PLAN.md
docs/RAG.md
docs/README_OUTLINE.md
docs/ROLES.md
docs/STACK.md
docs/STATUS.md
docs/STT_RESULTS.md
docs/TASK.md
docs/TRACKS.md
docs/handoffs/alibi.md
docs/handoffs/meet_bot.md
docs/handoffs/meiirlan.md
docs/handoffs/nurdaulet.md
docs/handoffs/sync-readiness.md
eval/.gitkeep
eval/README.md
eval/ai_quality_v2/README.md
eval/ai_quality_v2/check.py
eval/ai_quality_v2/expected.json
eval/ai_quality_v2/first_luna_authenticated_raw.json
eval/ai_quality_v2/first_luna_proposals_raw.json
eval/ai_quality_v2/first_luna_raw.json
eval/ai_quality_v2/inputs.json
eval/ai_quality_v2/manifest.json
eval/ai_quality_v2/regression_luna_5_raw.json
eval/ai_quality_v2/results_first_luna.md
eval/ai_quality_v2/results_regression_luna_5.md
eval/check.py
eval/expected.json
eval/inputs.json
eval/luna_dev_v2.json
eval/luna_product_dev_v2.json
eval/luna_product_dev_v2_scores.json
eval/luna_product_dev_v3.json
eval/luna_product_dev_v3_scores.json
eval/luna_product_dev_v4.json
eval/luna_product_dev_v4_scores.json
eval/luna_product_dev_v6.json
eval/luna_product_dev_v6_scores.json
eval/luna_product_holdout_v2.json
eval/luna_product_holdout_v2_scores.json
eval/luna_product_holdout_v3.json
eval/luna_product_holdout_v3_scores.json
eval/luna_product_holdout_v4.json
eval/luna_product_holdout_v4_scores.json
eval/luna_product_holdout_v6.json
eval/luna_product_holdout_v6_scores.json
eval/luna_sync_dev_v1.json
eval/luna_sync_dev_v1_scores.json
eval/luna_sync_holdout_v1.json
eval/luna_sync_holdout_v1_scores.json
eval/manifest.json
eval/native_dev.json
eval/native_dev_scores.json
eval/native_holdout.json
eval/native_holdout_scores.json
eval/openai_compatible_partial_dev.json
eval/qwen_dev_v2.json
eval/qwen_dev_v2_scores.json
eval/qwen_holdout_v2.json
eval/qwen_holdout_v2_scores.json
eval/results_first_measure.md
eval/results_luna_product.md
eval/results_luna_sync.md
eval/results_repeat.md
frontend/.env.example
frontend/.gitignore
frontend/AGENTS.md
frontend/README.md
frontend/docs/architecture.md
frontend/docs/frontend-auth.md
frontend/docs/verification.md
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/public/brand-mark.png
frontend/public/integrations/google-meet.png
frontend/public/integrations/jira.ico
frontend/scripts/check-architecture.mjs
frontend/src/app/App.tsx
frontend/src/app/composition/createAuthController.ts
frontend/src/app/composition/createHttpClient.ts
frontend/src/app/composition/createServices.ts
frontend/src/app/layout/Shell.module.css
frontend/src/app/layout/Shell.tsx
frontend/src/app/providers/AppProviders.tsx
frontend/src/app/providers/AuthenticatedWorkspace.tsx
frontend/src/app/providers/createQueryClient.ts
frontend/src/app/routing/AccessDenied.tsx
frontend/src/app/routing/GuestRoute.tsx
frontend/src/app/routing/SecurityRoute.tsx
frontend/src/app/routing/WorkspaceRedirect.tsx
frontend/src/app/routing/access.ts
frontend/src/app/routing/router.tsx
frontend/src/app/styles/global.css
frontend/src/app/styles/theme.ts
frontend/src/infrastructure/http/AxiosHttpClient.ts
frontend/src/infrastructure/persistence/DexieWorkspaceRepository.ts
frontend/src/infrastructure/persistence/WorkspaceDatabase.ts
frontend/src/infrastructure/persistence/demo/createDemoRecords.ts
frontend/src/infrastructure/persistence/demo/demo-content.json
frontend/src/main.tsx
frontend/src/modules/auth/application/AuthController.ts
frontend/src/modules/auth/application/AuthGateway.ts
frontend/src/modules/auth/domain/accessPolicy.ts
frontend/src/modules/auth/domain/auth.types.ts
frontend/src/modules/auth/domain/departmentAccess.ts
frontend/src/modules/auth/domain/returnPath.ts
frontend/src/modules/auth/infrastructure/ApiAuthGateway.ts
frontend/src/modules/auth/infrastructure/LocalWorkspaceAuthGateway.ts
frontend/src/modules/auth/infrastructure/UnconfiguredAuthGateway.ts
frontend/src/modules/auth/presentation/AuthProvider.tsx
frontend/src/modules/auth/presentation/authCopy.ts
frontend/src/modules/auth/presentation/components/LoginBackdrop.tsx
frontend/src/modules/auth/presentation/components/SessionStatus.tsx
frontend/src/modules/auth/presentation/pages/LoginPage.module.css
frontend/src/modules/auth/presentation/pages/LoginPage.tsx
frontend/src/modules/auth/presentation/useLoginModel.ts
frontend/src/modules/auth/presentation/usePermission.ts
frontend/src/modules/chat/application/ChatGateway.ts
frontend/src/modules/chat/infrastructure/ApiChatGateway.ts
frontend/src/modules/chat/presentation/pages/ChatPage.module.css
frontend/src/modules/chat/presentation/pages/ChatPage.tsx
frontend/src/modules/integrations/application/googleSession.ts
frontend/src/modules/integrations/presentation/pages/IntegrationsPage.module.css
frontend/src/modules/integrations/presentation/pages/IntegrationsPage.tsx
frontend/src/modules/meetings/application/MeetingExporter.ts
frontend/src/modules/meetings/application/MeetingRepository.ts
frontend/src/modules/meetings/application/MeetingService.ts
frontend/src/modules/meetings/domain/MeetingCatalog.ts
frontend/src/modules/meetings/domain/MeetingRecord.ts
frontend/src/modules/meetings/domain/mediaSource.ts
frontend/src/modules/meetings/domain/meeting.types.ts
frontend/src/modules/meetings/domain/participantLines.ts
frontend/src/modules/meetings/infrastructure/BrowserMeetingExporter.ts
frontend/src/modules/meetings/infrastructure/exportDocx.ts
frontend/src/modules/meetings/presentation/components/LiveConnecting.module.css
frontend/src/modules/meetings/presentation/components/LiveConnecting.tsx
frontend/src/modules/meetings/presentation/models/useMeetingModel.ts
frontend/src/modules/meetings/presentation/models/useMeetingsModel.ts
frontend/src/modules/meetings/presentation/models/useNewMeetingModel.ts
frontend/src/modules/meetings/presentation/pages/CallPage.module.css
frontend/src/modules/meetings/presentation/pages/CallPage.tsx
frontend/src/modules/meetings/presentation/pages/LiveMeetingPage.module.css
frontend/src/modules/meetings/presentation/pages/LiveMeetingPage.tsx
frontend/src/modules/meetings/presentation/pages/MeetingPage.module.css
frontend/src/modules/meetings/presentation/pages/MeetingPage.tsx
frontend/src/modules/meetings/presentation/pages/MeetingsPage.module.css
frontend/src/modules/meetings/presentation/pages/MeetingsPage.tsx
frontend/src/modules/meetings/presentation/pages/NewMeetingPage.module.css
frontend/src/modules/meetings/presentation/pages/NewMeetingPage.tsx
frontend/src/modules/meetings/presentation/useMeetingCommands.ts
frontend/src/modules/recording/application/Recorder.ts
frontend/src/modules/recording/application/RecordingGateway.ts
frontend/src/modules/recording/infrastructure/ApiRecordingGateway.ts
frontend/src/modules/recording/infrastructure/BrowserRecorder.ts
frontend/src/modules/recording/presentation/RecordingProgress.tsx
frontend/src/modules/recording/presentation/useOnDeviceTranscript.ts
frontend/src/modules/recording/presentation/useRecorder.ts
frontend/src/modules/runs/application/RunError.ts
frontend/src/modules/runs/application/RunGateway.ts
frontend/src/modules/runs/application/RunSync.ts
frontend/src/modules/runs/domain/mirror.ts
frontend/src/modules/runs/domain/review.ts
frontend/src/modules/runs/domain/run.types.ts
frontend/src/modules/runs/infrastructure/ApiRunGateway.ts
frontend/src/modules/runs/presentation/AssignmentReview.tsx
frontend/src/modules/runs/presentation/JiraPanel.tsx
frontend/src/modules/runs/presentation/RunMeetingPage.module.css
frontend/src/modules/runs/presentation/RunMeetingPage.tsx
frontend/src/modules/runs/presentation/SpeakerReview.tsx
frontend/src/modules/runs/presentation/runs.queries.ts
frontend/src/modules/runs/presentation/useRunMeetingModel.ts
frontend/src/modules/runs/presentation/useServerSync.ts
frontend/src/modules/settings/application/SettingsRepository.ts
frontend/src/modules/settings/application/SettingsService.ts
frontend/src/modules/settings/domain/settings.types.ts
frontend/src/modules/settings/presentation/models/useSettingsModel.ts
frontend/src/modules/settings/presentation/pages/SettingsPage.module.css
frontend/src/modules/settings/presentation/pages/SettingsPage.tsx
frontend/src/modules/settings/presentation/useSettingsCommands.ts
frontend/src/modules/tasks/application/TaskRepository.ts
frontend/src/modules/tasks/application/TaskService.ts
frontend/src/modules/tasks/domain/TaskBoard.ts
frontend/src/modules/tasks/domain/TaskRecord.ts
frontend/src/modules/tasks/domain/task.types.ts
frontend/src/modules/tasks/presentation/components/TaskEditor.module.css
frontend/src/modules/tasks/presentation/components/TaskEditor.tsx
frontend/src/modules/tasks/presentation/models/useTasksModel.ts
frontend/src/modules/tasks/presentation/pages/TasksPage.module.css
frontend/src/modules/tasks/presentation/pages/TasksPage.tsx
frontend/src/modules/tasks/presentation/useTaskCommands.ts
frontend/src/modules/workspace/application/WorkspaceRepository.ts
frontend/src/modules/workspace/application/WorkspaceServices.ts
frontend/src/modules/workspace/domain/workingRecords.ts
frontend/src/modules/workspace/presentation/WorkspaceProvider.tsx
frontend/src/modules/workspace/presentation/useWorkspace.ts
frontend/src/modules/workspace/presentation/useWorkspaceMutation.ts
frontend/src/modules/workspace/presentation/workspace.mutations.ts
frontend/src/modules/workspace/presentation/workspace.queries.ts
frontend/src/shared/application/HttpClient.ts
frontend/src/shared/domain/DomainError.ts
frontend/src/shared/domain/Identity.ts
frontend/src/shared/domain/LocalDate.ts
frontend/src/shared/domain/ownServer.ts
frontend/src/shared/lib/formatDate.ts
frontend/src/shared/presentation/saveBlob.ts
frontend/src/shared/presentation/useObjectUrl.ts
frontend/tests/api-auth.test.ts
frontend/tests/auth.test.ts
frontend/tests/copy-provenance.test.ts
frontend/tests/domain.test.ts
frontend/tests/live-progress.test.ts
frontend/tests/local-workspace.test.ts
frontend/tests/own-server.test.ts
frontend/tests/persistence.test.ts
frontend/tests/query-http.test.ts
frontend/tests/recording.test.ts
frontend/tests/roles.test.ts
frontend/tests/runs.test.ts
frontend/tests/upload.test.ts
frontend/tsconfig.app.json
frontend/tsconfig.json
frontend/tsconfig.node.json
frontend/tsconfig.tests.json
frontend/vite.config.ts
infra/README.md
infra/api-entrypoint.sh
infra/ml-constraints.txt
infra/nginx.conf
infra/web.Dockerfile
meet_bot/.gitignore
meet_bot/Dockerfile
meet_bot/README.md
meet_bot/__init__.py
meet_bot/__main__.py
meet_bot/bot.py
meet_bot/capture.js
meet_bot/config.py
meet_bot/import_run.py
meet_bot/lifecycle.py
meet_bot/requirements.txt
meet_bot/selectors.py
meet_bot/service.py
meet_bot/sinks.py
meet_bot/tests/fixtures/loopback.html
meet_bot/tests/test_core.py
meet_bot/tests/test_http_sink.py
meet_bot/tests/test_loopback.py
meet_bot/timeline.js
models/.gitignore
models/diarization/manifest.json
models/stt/manifest.json
prompts.md
pyproject.toml
railway.toml
scripts/.gitkeep
scripts/__init__.py
scripts/demo_e2e.py
scripts/demo_e2e.sh
scripts/download_rag_models.py
scripts/preflight.py
scripts/run_local.sh
scripts/seed_test_users.py
scripts/setup.sh
tests/conftest.py
tests/test_ai_quality.py
tests/test_api.py
tests/test_auth.py
tests/test_contract_v02.py
tests/test_health.py
tests/test_jira.py
tests/test_live_sse.py
tests/test_llm_contour.py
tests/test_mailer.py
tests/test_media.py
tests/test_profile.py
tests/test_readiness.py
tests/test_recording.py
tests/test_review_metadata.py
tests/test_seed_test_users.py
tests/test_services.py
tests/test_stream_token.py
tests/test_trusted_audio.py
Ветки (6)

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

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

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