AAYMA
RU
Войти

Protokol

Локальный помощник секретаря: из записи совещания (RU/KK/смешанная речь) делает стенограмму с диаризацией и проект протокола с поручениями…

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

О проекте

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

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

Суть

Локальный помощник секретаря: из записи совещания (RU/KK/смешанная речь) делает стенограмму с диаризацией и проект протокола с поручениями, ответственными и сроками, привязанными к цитатам. Подтверждённый протокол экспортируется в PDF и DOCX.

Как устроено

ffmpeg приводит запись к 16 kHz mono, Silero VAD выделяет речь, язык определяется по окнам. RU/EN-окна распознаёт faster-whisper large-v3-turbo, KK-окна дообученная казахская Whisper, на выходе таймкоды слов. Диаризация на CPU: pyannote segmentation-3.0 и ERes2Net через sherpa-onnx, затем совмещение слов и говорящих, данные хранятся в PostgreSQL. Агент (OpenAI Agents SDK поверх локальной Qwen3.5-4B в Ollama) читает встречу инструментами get_meeting и read_transcript и возвращает JSON протокола. Сервер проверяет цитаты и метки говорящих, пересчитывает относительные сроки от даты встречи. Человек подтверждает проект, экспорт через ReportLab и python-docx.

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

  • Silero VAD
  • per-window language routing
  • speaker diarization
  • word-level alignment
  • tool calling
  • citation verification
  • relative deadline parsing
  • outbound network guard

Метрики

Все группы поручений из эталонных протоколов найдены на двух записях организаторов (10/10 и 6/6)

Особенности

Полностью локальный стек: ASR, диаризация и LLM работают на машине пользователя, исходящие соединения блокирует guard, счётчик блокировок виден в /api/health. Язык определяется по окнам, и запись маршрутизируется между русской и казахской Whisper. Каждое поручение связано с сегментом стенограммы и говорящим. Точность оценена по эталонным протоколам организаторов.

Стек

Python · FastAPI · PostgreSQL · SQLAlchemy · Alembic · OpenAI Agents SDK · CTranslate2 · ONNX Runtime · sherpa-onnx · React · TypeScript · Vite · Docker Compose · ReportLab · python-docx

Модели

faster-whisper-large-v3-turbo · kazakh-whisper-large-v3-turbo · Qwen3.5-4B (Ollama) · Qwen3-4B-Instruct-2507 · pyannote segmentation-3.0 · 3D-Speaker ERes2Net · Silero VAD


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

README

README.md

Protokol

Локальный помощник для секретаря совещания и руководителя: превращает запись встречи в стенограмму с говорящими и проект протокола — саммари, решения, поручения, ответственные и сроки. Каждое поручение связано с фрагментом стенограммы. Человек проверяет проект, подтверждает его и скачивает PDF или DOCX. Аудио и текст обрабатываются на машине пользователя.

Что реализовано

ТребованиеСтатусПроверка
Распознавание речи✅ Загрузка аудио/видео, локальная обработка, таймкоды словtests/speech/test_asr.py, POST /api/domain/meetings/{id}/transcribe
Русский язык✅ Проверен на двух записях организаторов; остаются ошибки имёнАудит
Казахский язык✅ Отдельная дообученная модель Whisper large-v3-turbo для казахского; ограничение: короткие казахские реплики внутри русской речи иногда распознаются как русские (см. разбор смешанной речи)tests/speech/test_asr.py, разбор смешанной речи
Смешанная RU/KK-речь⚠️ Выбор языка по окнам; переключение внутри предложения не решеноapp/speech/asr.py
Поручения, ответственные, сроки✅ Все группы поручений из эталонных протоколов найдены на обеих записях организаторов (10/10 и 6/6); отдельные ошибки содержания перечислены в аудитеtests/domain/test_service.py, аудит
Диаризация и привязка к людям✅ Говорящие разделены, каждое поручение привязано к говорящему (owner_speaker_id) и к цитате из стенограммы (source_segment_ids); имена говорящих задаются в интерфейсе, автоматической идентификации по голосу нетtests/speech/test_diarize.py, tests/speech/test_align.py
PDF/DOCX✅ Экспорт подтверждённого протокола с кириллицей, таблицей и стенограммойtests/domain/test_exports.py, Docker-проверка

Пути app/ и tests/ в таблице относятся к backend/. Статусы поручений в интерфейсе сохраняются только в текущем браузере и не изменяют PDF/DOCX.

Скриншоты

01 — Подтверждённый протокол с кнопками экспорта PDF и DOCX.

Подтверждённый протокол и экспорт

02 — Стенограмма с подтверждающими фрагментами и шагами агента.

Стенограмма, подтверждения и шаги агента

03 — Доска статусов поручений с индикатором локальной работы и сетевой защиты.

Статусы поручений и индикатор локальной работы

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

Запись → ffmpeg, 16 kHz mono → Silero VAD → определение языка окна
       → RU/EN Whisper turbo или Kazakh Whisper → таймкоды слов
       → диаризация на CPU → совмещение слов и говорящих → PostgreSQL
       → инструменты get_meeting / read_transcript → проект протокола
       → проверка цитат и сроков → подтверждение человеком → PDF / DOCX

В режиме Qwen агент читает встречу и стенограмму через инструменты, затем возвращает структурированный JSON. Сервер проверяет, что цитаты принадлежат встрече и прочитаны в текущем запуске, сверяет метки говорящих и рассчитывает распознанные относительные сроки от даты встречи. Это не доказывает смысловую правильность каждого поля — проект требует просмотра.

Трассировка SDK отключена. Модели речи открываются только с локального диска. Защита исходящих соединений и счётчик блокировок отображаются в /api/health. Это прикладная защита Python, а не независимый сетевой аудит; соединение с локальной базой Docker необходимо для работы приложения.

Технологии и модели

КомпонентНазначение / размер на дискеЛицензия и источник
deepdml/faster-whisper-large-v3-turbo-ct2RU/EN ASR, около 1,6 GiBMIT
shyngys879/kazakh-whisper-large-v3-turbo, локальный CT2Казахский ASR, около 782 MiBApache-2.0
pyannote segmentation-3.0 ONNXСегментация голосов; вместе с ERes2Net около 46 MiBMIT, веса
3D-Speaker ERes2Net ONNXПредставления голосов и кластеризацияApache-2.0
Silero VAD ONNXДетектор речи, около 632 KiBMIT
Qwen3.5-4B через OllamaЖивое извлечение протокола, 3,4 GBApache-2.0
Qwen3-4B-Instruct-2507 Q4_K_MДополнительный локальный вариант, 2,5 GBApache-2.0

backend/scripts/get_models.sh получает RU-модель с Hugging Face, VAD и ONNX-модели диаризации из публичных релизов sherpa-onnx. make models скачивает публичные модели и конвертирует казахскую модель из Hugging Face в CT2. Веса не входят в Git. Лицензия весов pyannote — MIT; среды sherpa-onnx — Apache-2.0.

Основные библиотеки: Python 3.12 (PSF); FastAPI, Pydantic, OpenAI Agents SDK, faster-whisper, CTranslate2, ONNX Runtime, SQLAlchemy, Alembic, python-docx (MIT); asyncpg и sherpa-onnx (Apache-2.0); ReportLab (BSD); React и Vite (MIT), TypeScript (Apache-2.0). PostgreSQL — PostgreSQL License, Ollama — MIT. Лицензия ffmpeg зависит от сборки (LGPL/GPL). Шрифты DejaVu и их уведомление находятся в backend/app/domain/fonts/. Код Protokol — MIT; лицензии моделей и зависимостей действуют отдельно. Версии закреплены в backend/uv.lock и frontend/pnpm-lock.yaml.

Архитектура

FastAPI обслуживает загрузку, обработку и экспорт; PostgreSQL хранит встречи, сегменты, говорящих, проекты и подтверждения. React показывает запись, стенограмму, доказательства и результат. DomainModule связывает обработку встреч с исполнением агента, а DomainAdapter — данные протокола с интерфейсом. Подробности: архитектура, API, локальный Qwen.

Установка и запуск

Два пути: Docker — воспроизводимая демонстрация без LLM; dev — живой локальный Qwen. В обоих распознавание аудио настоящее и требует весов речи. LLM-путь требует Ollama на хосте и не контейнеризирован.

Веса речи

Установите uv и Python 3.12, затем из корня репозитория выполните:

make install
make models

make models скачивает публичные модели и конвертирует shyngys879/kazakh-whisper-large-v3-turbo из Hugging Face в CT2 int8, если казахских весов ещё нет. Для конвертации нужны около 4 GB Python-пакетов и несколько минут; команда конвертации сегодня не была повторно проверена на чистой машине, проверен только синтаксис скрипта. Готовые локальные веса также можно скопировать в backend/models/. Структура полного комплекта:

backend/models/
  ru-turbo-ct2/       model.bin, config.json, tokenizer.json,
                     preprocessor_config.json, vocabulary.json
  kk-turbo-ct2/       те же пять файлов
  vad/silero_vad.onnx
  diarization/sherpa-onnx-pyannote-segmentation-3-0/model.onnx
  diarization/3dspeaker_speech_eres2net_base_sv_zh-cn_3dspeaker_16k.onnx

Полный комплект весов занимает около 2,4 GiB; установка требует интернета, подготовленные модели при обработке сеть не используют. Если казахская модель отсутствует, приложение один раз предупреждает при её первом использовании в обработке записи и направляет казахские окна в русскую многоязычную модель с низким качеством. /api/health показывает kazakh_model_present: false; models_present: true означает наличие RU-модели, VAD и диаризации и не требует казахских весов. Если конвертация не завершилась, уже скачанных RU/VAD/диаризации достаточно для русскоязычных образцов.

Docker: без Ollama

Нужны Docker Engine с Compose, make, curl, свободные порты 5433 и 8080. Для CLI-проверки нужны Bash, jq и od (coreutils). При первой сборке скачиваются образы и зависимости; требуется место для весов и Python/CUDA-библиотек, даже при CPU-обработке.

cp .env.example .env
mkdir -p backend/media
# До запуска выполните make install models или скопируйте готовые веса в backend/models/.
OPENAI_MODEL=scripted:auto make stack
curl -fsS http://localhost:8080/api/health

Откройте http://localhost:8080/#/app. Ожидается model: scripted:auto, models_present: true, provenance.enabled: true. Compose монтирует локальные models, media, samples; ASR работает на CPU. Для загрузки/конвертации весов через make models на хосте нужны uv и Python 3.12; конвертация требует около 4 GB пакетов и нескольких минут и сегодня не перепроверялась на чистой машине. Обе записи организаторов русскоязычные и работают без казахской модели; тогда kazakh_model_present: false, а казахские окна обрабатываются RU-моделью с низким качеством. Адрес http://localhost:11434/v1 нужен для проверки конфигурации при запуске; scripted-режим к нему не обращается. Явное значение OPENAI_MODEL исключает влияние настроек оболочки. Создание backend/media до запуска контейнера сохраняет права текущего пользователя для файлов CLI-проверки.

Dev: локальный Qwen

Dev-путь проверен на Linux (Arch) и требует CUDA-пакетов из pyproject; на macOS используйте Docker-путь, он работает без GPU.

Нужны Python 3.12, uv, Node 22.13+, pnpm, ffmpeg, Docker для PostgreSQL и Ollama на этой же машине. Установите в Ollama qwen3.5:4b, затем:

make install
cd frontend && pnpm install --frozen-lockfile && cd ..
make demo
make llm
OPENAI_MODEL=protokol-qwen3.5:4b make api
# В другом терминале:
make web

Откройте http://localhost:5173/#/app. make llm создаёт локальное имя protokol-qwen3.5:4b с контекстом 16 384 токена, переиспользуя установленные веса. Если исходной модели ещё нет: ollama pull qwen3.5:4b (загрузка весов, не передача аудио или текста). Подробности — в LOCAL_LLM.md.

STT_DEVICE=auto выбирает CUDA при наличии, иначе CPU; для явного выбора задайте STT_DEVICE=cpu или STT_DEVICE=cuda перед make api. CPU использует int8. На машине с 6 GB VRAM ASR и LLM обрабатываются последовательно.

Как проверить

Сначала: демонстрация без языковой модели

  1. Запустите Docker-командой выше; Ollama не нужен.
  2. Откройте http://localhost:8080/#/app → «Новая запись», выберите backend/samples/sovechanie_2.mp3, укажите название и дату 2026-09-23, нажмите «Загрузить».
  3. Нажмите «Транскрибировать» и дождитесь готовности. На проверенной машине CPU занял 472 секунды (7 мин 52 с). Проверьте стенограмму; при необходимости задайте имена в разделе «Говорящие» до формирования проекта.
  4. Нажмите «Сформировать протокол», просмотрите цитаты, затем «Подтвердить протокол» → «Скачать PDF» или «Скачать DOCX».

Scripted-режим выбирает не более трёх цитат с распознанным сроком, без LLM. В проверенном Docker-прогоне записи №2 получилась одна строка, статус verified, PDF на две страницы. Это проверка всей цепочки, но не полноты извлечения Qwen. Результаты.

CLI-эквивалент загружает новую запись, не сбрасывая существующие встречи:

API=http://localhost:8080 make smoke

Ответы, времена, PDF и DOCX сохраняются под backend/media/verification/. Отдельные curl-запросы — в API.md.

Затем: живая модель

Выполните make llm, запустите dev API с OPENAI_MODEL=protokol-qwen3.5:4b, проверьте /api/health на порту 8000 и повторите шаги в интерфейсе на 5173. CLI: API=http://localhost:8000 make smoke. Проверенный Qwen-прогон записи №1 сформировал 11 строк за 30,5 секунды после готовой стенограммы. Сохранены оба состояния одного запуска: JSON предложения содержит detail.run.status = proposed (имя файла не означает подтверждение), а полный RunDetail после подтверждения, повторно полученный через API после восстановления исходной БД, содержит run.status = verified, application.status = verified и проверки сохранения в application.verification. Предложение используется для оценки извлечения; второй файл подтверждает применение. Файлы этого подтверждённого запуска: PDF и DOCX. Экспорт дополнительно проверен в Docker-сценарии выше. Число строк может меняться при новом запуске.

Ручная оценка двух организаторских записей: 10/10 и 6/6 групп поручений имеют соответствие, создано 11 и 8 строк. Это покрытие групп, не «100% точность»: ошибки перечислены в accuracy-summary.md.

python3 evaluation/organizer/check_samples.py --source-dir evaluation/organizer/source

Проверка исходников дала PASS для обеих записей: четыре размера/SHA-256 совпали, 10 и 6 групп совпали с таблицами DOCX. Она проверяет происхождение файлов и эталонные строки, а не качество ASR/Qwen. Исходные протоколы не подаются модели.

Для записи №1 длительностью 274,25 с речевой конвейер занял 86,726 с на GPU (≈87 с) и 522,162 с на CPU (≈522 с). GPU — RTX 3060 Laptop 6 GB; CPU — Ryzen 5 5600H. Время включает загрузку моделей, VAD, ASR, диаризацию и совмещение, исключает генерацию протокола, БД и экспорт. Диаризация всегда на CPU. Измерения.

cd backend
uv run pytest -q
uv run ruff check .
cd ../frontend
pnpm lint
pnpm build

Последняя проверка backend: 200 passed; Ruff и ESLint чистые. Предыдущий прогон дал 222 passed; после удаления Docker-подключения к LLM удалены и 23 соответствующие проверки, затем добавлена проверка работы без казахских весов. Тестам API нужна PostgreSQL на 5433 (отдельная agent_workspace_test); тесты с маркером models требуют локальных весов и без них пропускаются. Проверка без ASR: uv run pytest -q -m 'not models'.

Проверка чистого клона — выполнена

23 сентября проверен коммит 94f6888 в /tmp/protokol-check: отдельный Docker-проект protokol-check, новая база protokol-check_pgdata, скопированные локальные веса. make stack завершился успешно; health показал scripted:auto, models_present: true, включённую защиту и ноль блокировок. Новый smoke-скрипт загрузил запись №2, распознал её за 455 секунд, подтвердил одно поручение (verified) и скачал PDF (54 281 байт, 2 страницы) и DOCX (39 681 байт, корректный архив). Затем git pull --rebase, pnpm install --frozen-lockfile, pnpm build и pnpm lint прошли в клоне. Это полный прогон из чистого checkout и новой БД; веса и кэш Docker были локальными.

При повторной проверке на той же машине сначала остановите первый стек командой docker compose --profile app down (без удаления томов): контейнеры и порты двух экземпляров совпадают. Из чистого клона с размещёнными весами выполните:

cp .env.example .env
mkdir -p backend/media
COMPOSE_PROJECT_NAME=protokol-check OPENAI_MODEL=scripted:auto make stack
API=http://localhost:8080 make smoke

Данные и интеграции

Записи sovechanie_1.mp3 и sovechanie_2.mp3 предоставлены организаторами. Два смешанных RU/KK/EN-файла записаны командой. Загруженные записи остаются в backend/media/, результаты — в локальной PostgreSQL. Облачных API для аудио и текста нет; СЭД, почта, Teams и Zoom не подключены. Установка зависимостей и публичных весов требует интернета, обработка — нет. blocked_external_connections: 0 означает отсутствие зарегистрированных блокировок, а не доказательство отсутствия любого сетевого трафика.

Ограничения

Интерфейс не предупреждает об отсутствии казахской модели; признак kazakh_model_present виден только в /api/health.

  • При аудите обнаружены один неверный исполнитель, один дубликат, искажённые распознаванием имена, некоторые цитаты на другое высказывание и пропущенное позднее изменение срока. Проект требует проверки этих полей.
  • Короткие казахские реплики иногда маршрутизируются в русскую модель; возможна потеря регистра и пунктуации. Переключение языка внутри фразы и наложение голосов обрабатываются ненадёжно.
  • Диаризация пакетная, не потоковая; возможны объединённые реплики и лишние метки. Имена говорящих появляются только после ручного переименования в UI. Ответственный из поручения не используется для автоматического называния голоса.
  • Сроки считаются от указанной даты встречи. Для формулировок только с неделей используется соглашение о пятнице; неразобранная дата остаётся пустой. Позднее уточнение не всегда заменяет ранний срок.
  • У 4B-модели ограничен контекст; длинная встреча может не поместиться. Повреждённый JSON отклоняется. Приложение формирует проект, а не юридически выверенный итог.
  • Статусы поручений локальны для браузера. Редактирование поручений через API и совместные статусы не реализованы. Подтверждённая запись защищена от повторной транскрипции.
  • WER и DER не заявляются: нет вручную проверенной временной разметки, а протоколы организаторов местами расходятся с записью. Приложение проверено как локальная демонстрация, без многопользовательской авторизации.

Дорожная карта

Улучшить сохранение финальных сроков, устранение повторов и смысловую проверку цитат; собрать размеченный набор казахской и смешанной речи; добавить серверные статусы и редактирование поручений. Следующие интеграции: СЭД, напоминания и рассылка ответственным, голосовая идентификация с согласия участников, Teams/Zoom. Эти функции пока не реализованы.

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

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

Baltabay Zhanybek 16rashidulybekzat 6

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

  • 2026-09-23 17:46README: platform note and Kazakh model flagBaltabay Zhanybek
  • 2026-09-23 17:38Frontend: hero demo stage fits the action-item sceneBaltabay Zhanybek
  • 2026-09-23 17:33Models: Kazakh model conversion and Russian fallback when absentBaltabay Zhanybek
  • 2026-09-23 17:23README: requirement status reflects implemented scopeBaltabay Zhanybek
  • 2026-09-23 17:21Docs: screenshots and confirmed protocol exportsBaltabay Zhanybek
  • 2026-09-23 17:16Verified clean Docker clone and confirmed Qwen evidenceBaltabay Zhanybek
  • 2026-09-23 16:55README, license, docs and cleanup for ProtokolBaltabay Zhanybek
  • 2026-09-23 16:40Docker: scripted demo stack with local speech modelsBaltabay Zhanybek
Все коммиты (22)
  • 2026-09-23 16:12Frontend: keep meeting runs attached and complete protocol reviewrashidulybekzat
  • 2026-09-23 16:06Local LLM: 16k-context model alias, speaker validation, local model guideBaltabay Zhanybek
  • 2026-09-23 15:44Frontend: Protokol Russian interface, offline indicators and browser checksrashidulybekzat
  • 2026-09-23 15:31Frontend: upload, transcription polling, speaker names, exports and local task statusesrashidulybekzat
  • 2026-09-23 15:22Frontend: meeting protocol adapter, endpoint helpers and fixturesrashidulybekzat
  • 2026-09-23 15:18Export confirmed protocol as PDF and DOCX with Cyrillic fontsBaltabay Zhanybek
  • 2026-09-23 15:17Protocol agent: transcript evidence, validated actions and working scripted confirmationBaltabay Zhanybek
  • 2026-09-23 14:53test: add organizer meeting references and local verificationrashidulybekzat
  • 2026-09-23 14:45Meetings: upload, background transcription, speaker attribution and transcript APIBaltabay Zhanybek
  • 2026-09-23 14:44Speech: speaker alignment and conservative RU/KK spoken deadlinesBaltabay Zhanybek
  • 2026-09-23 14:44Speech: local RU/KK recognition, language windows, word timestamps and diarizationBaltabay Zhanybek
  • 2026-09-23 14:34Local model runtime: provenance guard, CUDA preload, Ollama routing, model install scriptBaltabay Zhanybek
  • 2026-09-23 13:59Add project scaffoldingBaltabay Zhanybek
  • 2026-09-23 13:18first commitrashidulybekzat
Структура репозитория (225 файлов)
.env.example
.github/workflows/ci.yml
.gitignore
LICENSE
Makefile
README.md
backend/.dockerignore
backend/.python-version
backend/Dockerfile
backend/alembic.ini
backend/alembic/README
backend/alembic/env.py
backend/alembic/script.py.mako
backend/alembic/versions/20260923_e0ab44d8ac4d_initial_schema.py
backend/alembic/versions/20260923_protokol_domain.py
backend/app/__init__.py
backend/app/api/__init__.py
backend/app/api/deps.py
backend/app/api/health.py
backend/app/api/middleware.py
backend/app/api/runs.py
backend/app/api/schemas.py
backend/app/boot.py
backend/app/config.py
backend/app/core/__init__.py
backend/app/core/agent_runtime.py
backend/app/core/apply_service.py
backend/app/core/context.py
backend/app/core/contracts.py
backend/app/core/errors.py
backend/app/core/events.py
backend/app/core/llm.py
backend/app/core/read_models.py
backend/app/core/run_registry.py
backend/app/core/run_service.py
backend/app/core/serialization.py
backend/app/core/services.py
backend/app/core/status.py
backend/app/core/tooling.py
backend/app/db/__init__.py
backend/app/db/base.py
backend/app/db/engine.py
backend/app/db/models.py
backend/app/domain/__init__.py
backend/app/domain/api.py
backend/app/domain/examples.py
backend/app/domain/exports.py
backend/app/domain/fonts/DejaVuSans-Bold.ttf
backend/app/domain/fonts/DejaVuSans.ttf
backend/app/domain/fonts/LICENSE
backend/app/domain/instructions.py
backend/app/domain/models.py
backend/app/domain/repo.py
backend/app/domain/schemas.py
backend/app/domain/scripts.py
backend/app/domain/seed.py
backend/app/domain/service.py
backend/app/domain/tools.py
backend/app/domain/transcribe_job.py
backend/app/main.py
backend/app/speech/__init__.py
backend/app/speech/align.py
backend/app/speech/asr.py
backend/app/speech/audio.py
backend/app/speech/cuda.py
backend/app/speech/deadlines.py
backend/app/speech/diarize.py
backend/app/speech/guard.py
backend/evals/README.md
backend/evals/__init__.py
backend/evals/results/.gitkeep
backend/evals/runner.py
backend/evals/scenarios.py
backend/pyproject.toml
backend/samples/README.md
backend/samples/mixed-ru-kk-en-1.m4a
backend/samples/mixed-ru-kk-en-2.m4a
backend/samples/sovechanie_1.mp3
backend/samples/sovechanie_2.mp3
backend/scripts/__init__.py
backend/scripts/configure_ollama.sh
backend/scripts/entrypoint.sh
backend/scripts/get_models.sh
backend/scripts/seed.py
backend/scripts/smoke.sh
backend/tests/__init__.py
backend/tests/api/__init__.py
backend/tests/api/conftest.py
backend/tests/api/test_api.py
backend/tests/api/test_upload_limit.py
backend/tests/conftest.py
backend/tests/core/__init__.py
backend/tests/core/conftest.py
backend/tests/core/scripted.py
backend/tests/core/test_apply_service.py
backend/tests/core/test_contracts.py
backend/tests/core/test_events.py
backend/tests/core/test_llm_routing.py
backend/tests/core/test_run_service.py
backend/tests/core/test_tooling.py
backend/tests/domain/__init__.py
backend/tests/domain/conftest.py
backend/tests/domain/test_audio_paths.py
backend/tests/domain/test_exports.py
backend/tests/domain/test_meetings_api.py
backend/tests/domain/test_schemas.py
backend/tests/domain/test_scripts.py
backend/tests/domain/test_service.py
backend/tests/domain/test_tools.py
backend/tests/fixtures/meeting_10s.wav
backend/tests/speech/__init__.py
backend/tests/speech/conftest.py
backend/tests/speech/test_align.py
backend/tests/speech/test_asr.py
backend/tests/speech/test_deadlines.py
backend/tests/speech/test_diarize.py
backend/tests/speech/test_guard.py
backend/uv.lock
docker-compose.yml
docs/API.md
docs/ARCHITECTURE.md
docs/FRONTEND_HANDOFF.md
docs/LOCAL_LLM.md
docs/SUBMISSION.md
docs/screenshots/01-protocol-confirmed.png
docs/screenshots/02-transcript-evidence-timeline.png
docs/screenshots/03-status-board.png
evaluation/docker-smoke.json
evaluation/mixed-language-1.json
evaluation/mixed-language-2.json
evaluation/mixed-language.md
evaluation/organizer/README.md
evaluation/organizer/accuracy-2-meeting.json
evaluation/organizer/accuracy-2-run.json
evaluation/organizer/accuracy-meeting-1.md
evaluation/organizer/accuracy-meeting-2.md
evaluation/organizer/accuracy-summary.md
evaluation/organizer/accuracy-transcript-1.json
evaluation/organizer/accuracy-transcript-2.json
evaluation/organizer/accuracy-transcript-meeting-1.json
evaluation/organizer/accuracy-transcription.md
evaluation/organizer/check_samples.py
evaluation/organizer/meeting-2-deadlines-second-pass.txt
evaluation/organizer/meeting-2-disputed-deadlines.wav
evaluation/organizer/qwen-live-verified.json
evaluation/organizer/references.json
evaluation/organizer/results/qwen-live-confirmed.json
evaluation/organizer/results/qwen-live-protocol.docx
evaluation/organizer/results/qwen-live-protocol.pdf
evaluation/organizer/source-check.json
evaluation/organizer/source/Протокол_совещания№1.docx
evaluation/organizer/source/Протокол_совещания№2.docx
evaluation/organizer/source/Совещание №1.mp3
evaluation/organizer/source/Совещание №2.mp3
evaluation/performance/sample1-cpu.json
evaluation/performance/summary.json
frontend/.dockerignore
frontend/.gitignore
frontend/.nvmrc
frontend/Dockerfile
frontend/README.md
frontend/e2e/meeting-flow.spec.ts
frontend/eslint.config.js
frontend/index.html
frontend/nginx.conf
frontend/package.json
frontend/playwright.config.ts
frontend/pnpm-lock.yaml
frontend/pnpm-workspace.yaml
frontend/src/App.tsx
frontend/src/api/client.test.ts
frontend/src/api/client.ts
frontend/src/api/types.ts
frontend/src/config.ts
frontend/src/dashboard/Dashboard.test.tsx
frontend/src/dashboard/Dashboard.tsx
frontend/src/dashboard/components/AgentPanel.tsx
frontend/src/dashboard/components/ApplyPanel.tsx
frontend/src/dashboard/components/CaseHeader.tsx
frontend/src/dashboard/components/CaseList.tsx
frontend/src/dashboard/components/ChangeList.tsx
frontend/src/dashboard/components/ChangesTable.tsx
frontend/src/dashboard/components/EvidenceDrawer.test.tsx
frontend/src/dashboard/components/EvidenceDrawer.tsx
frontend/src/dashboard/components/NeedsInputForm.test.tsx
frontend/src/dashboard/components/NeedsInputForm.tsx
frontend/src/dashboard/components/StartCard.tsx
frontend/src/dashboard/components/StatusCards.test.tsx
frontend/src/dashboard/components/StatusCards.tsx
frontend/src/dashboard/components/Timeline.tsx
frontend/src/dashboard/components/TopBar.test.tsx
frontend/src/dashboard/components/TopBar.tsx
frontend/src/dashboard/components/Workspace.tsx
frontend/src/dashboard/dashboard.css
frontend/src/dashboard/model/adapter.ts
frontend/src/dashboard/model/changes.ts
frontend/src/dashboard/model/phase.test.ts
frontend/src/dashboard/model/phase.ts
frontend/src/dashboard/model/runs.test.ts
frontend/src/dashboard/model/runs.ts
frontend/src/dashboard/model/timeline.test.ts
frontend/src/dashboard/model/timeline.ts
frontend/src/dashboard/route.test.ts
frontend/src/dashboard/route.ts
frontend/src/dashboard/useRun.test.tsx
frontend/src/dashboard/useRun.ts
frontend/src/domain/MeetingPanel.test.tsx
frontend/src/domain/MeetingPanel.tsx
frontend/src/domain/api.test.ts
frontend/src/domain/api.ts
frontend/src/domain/meeting-panel.css
frontend/src/domain/protokol.test.ts
frontend/src/domain/protokol.ts
frontend/src/domain/status.ts
frontend/src/landing/Landing.test.tsx
frontend/src/landing/Landing.tsx
frontend/src/landing/landing.css
frontend/src/main.tsx
frontend/src/styles/tokens.css
frontend/src/test/fakeApi.ts
frontend/src/test/fakeEventSource.ts
frontend/src/test/fixtures.ts
frontend/src/test/setup.ts
frontend/tsconfig.json
frontend/vite.config.ts

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

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

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