О проекте
Команда: 01husky
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Система автопротоколирования совещаний. Запись загружается файлом, с микрофона или ботом в Meet/Zoom/Teams, затем идут транскрипция, разделение спикеров, черновик поручений с цитатой-основанием и срок. Протокол утверждает секретарь, выгружается в PDF/DOCX, передаётся в имитацию СЭД, поручения ведутся на канбан-доске с напоминаниями.
Как устроено
Аудио нормализуется и обрабатывается фоновой задачей Celery: офлайн-транскрипция faster-whisper, диаризация, локальная модель готовит поручения и саммари. Каждое поручение привязано к исходной реплике-цитате. Секретарь сопоставляет SPEAKER_XX с участниками, уточняет исполнителей и даты, утверждает протокол. Дальше экспорт DOCX/PDF, уведомления и beat-задача напоминаний (due_soon/overdue). Боты для Meet/Zoom/Teams работают в браузере через Playwright.
Ключевые решения
- faster-whisper
- диаризация спикеров
- извлечение поручений с цитатой-основанием
- Celery beat-напоминания
- WebSocket live-ingest
- Playwright-боты для Meet/Zoom/Teams
- экспорт DOCX/PDF
- mock SED-адаптер
Особенности
Полный цикл от записи до контроля исполнения поручений. Есть боты-участники видеовстреч, голосовые эталоны участников и режим без моделей (pnpm mock) для быстрой проверки жюри. README построен по критериям оценки и честно отделяет готовое от демо.
Стек
Python · FastAPI · Celery · Alembic · PostgreSQL · Next.js 15 · next-intl · shadcn/ui · Playwright · Docker Compose · pnpm
Модели
faster-whisper
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-66c85e8f-01husky.
README
README.mdИз совещания в протокол: кто делает, что и к какому сроку
Русский · Қазақша · Смешанная речь
HackAlem AI · команда 01husky
Для жюри · Демо Видео · Возможности · Попробовать · Разработчикам и ИИ
Секретарь проверяет поручения по исходным репликам, уточняет ответственных и утверждает протокол. Исполнители получают задачи, руководитель видит сроки и статус работы.
Демо Видео
https://github.com/user-attachments/assets/8aec9702-6772-4f75-bc86-cb9ea3ab2fc2
Смотреть на Google Drive · Скачать MP4 · 44 с · 1080p.
Обзор сценария: от записи совещания до проверки протокола и контроля поручений.
Для жюри
Кейс: система автопротоколирования совещаний с фиксацией поручений. После встречи секретарю нужно собрать договорённости из записи, уточнить исполнителей и даты, затем проконтролировать выполнение. При переключении русского и казахского внутри фразы важно сохранить смысл и связь поручения с репликой. Для организаций с закрытым контуром обработка должна оставаться локальной.
| Критерий | Максимум | Что предлагает Kenes AI | Где посмотреть |
|---|---|---|---|
| Ценность решения | 25 | Секретарь проверяет черновик по цитатам; исполнитель видит своё поручение и срок; руководитель отслеживает просрочку. Пользу можно проверить по времени подготовки протокола и числу исправлений в пилоте. | Проверка поручений · Контроль исполнения |
| Результат и качество решения | 20 | Демосценарий доведён от загрузки записи до утверждения, документа и статуса задачи. Локальный пайплайн распознаёт речь, разделяет спикеров и формирует черновики поручений и саммари. Результат проверяет секретарь. | Возможности · Образец PDF · Что готово |
| Инновационность | 15 | Акцент проекта: работа со смешанной RU/KK-речью, цитата-основание у поручения и проверка человеком перед утверждением. Локальная обработка входит в требования к развёртыванию. | Языки · Цитаты и сроки · Данные и голос |
| Потенциал развития и масштабирования | 20 | Пилот в одной организации, затем подключение её СЭД и расширение на другие команды. API, очередь обработки и ML-библиотека выделены в отдельные модули. | Развитие после хакатона · Архитектура |
| Презентация, демо и ответы на вопросы | 20 | Видео объясняет путь встречи; записи интерфейса показывают каждый пункт функциональных требований. Есть режим запуска без моделей, готовый протокол и ответы о границах прототипа. | Демо Видео · Попробовать · Вопросы о продукте |
| Итого | 100 | Вес критериев из регламента хакатона |
Возможности
Интерфейс показан на демонстрационных данных. Модели в этих записях не запускаются; готовность компонентов описана в разделе «Что готово».
От записи встречи до выполненного поручения. Демонстрации охватывают 13 пунктов функциональных требований, а также выбор источника записи, саммари и контроль сроков.
Запись · Языки · Проверка · Документы · Исполнение · Данные и голос
01. Добавьте запись совещания
Файл, микрофон или бот во встрече
При создании совещания выберите источник: готовый файл, запись с микрофона или ссылку на Meet, Zoom, Teams. В ролике показан выбор режима. Для подключения бота нужен допуск организатора; ограничения платформ перечислены в разделе «Что готово».

Загрузка и этапы обработки
Загрузите аудио и проследите путь до транскрипта. В этой записи стадии и готовый текст возвращает деморежим.

02. Проверьте смысл на обоих языках
Русский
Нажмите цитату в поручении Динары: в транскрипте подсветится исходная реплика. Рядом видны исполнитель и дата.

Қазақша
Поручение Айбека связано с казахской репликой. Формулировку срока «ертеңге дейін» можно сверить с календарной датой.

Переключение языка внутри фразы
Откройте реплики с отметкой RU + KZ и проверьте контекст целиком. Языковые примеры в этих GIF взяты из готового демотранскрипта; по ним нельзя оценивать точность распознавания.

03. Проверьте черновик перед утверждением
Поручение, ответственный и календарный срок
Сверьте задачу с цитатой, проверьте исполнителя и откройте календарь. «До пятницы» требует конкретной даты. Локальная модель формирует черновик поручений для проверки секретарём. В этой записи использован заранее подготовленный пример.

Кто говорил и кто отвечает
Назначьте Тимура для несопоставленного спикера. Автор реплики и исполнитель поручения могут быть разными людьми, поэтому их можно проверить отдельно.

Саммари совещания
Откройте краткое содержание и отредактируйте формулировку перед выпуском протокола. В деморежиме исходное саммари подготовлено заранее.

Утверждение секретарём
Уточните ответственного, подтвердите протокол и проверьте уведомления. Ролик объединяет эти действия в один сценарий.

04. Передайте результат участникам
PDF и DOCX на нужном языке
Выберите язык документа и формат выгрузки. В записи используются демонстрационные файлы; образец PDF и DOCX отдельно сформированы рабочим backend-экспортом из примера про склад.

Передача в СЭД
Отправьте утверждённый протокол и получите регистрационный номер. В демонстрации используется имитация СЭД. Для внедрения потребуется адаптер системы документооборота организации.

05. Следите за выполнением
Статусы и доска поручений
Отфильтруйте задачи в работе, отметьте завершённую и перейдите на доску. Счётчики отражают изменение статуса.

Срочность и направление
Уточните срочность и направление поручения, затем отберите задачи по закупкам. Так руководитель может просмотреть работу конкретной команды.

Уведомления с поручениями
После утверждения откройте уведомление и перейдите к задачам. В записи показаны уведомления внутри приложения на демоданных.

Ближайшие сроки и просрочка
Посмотрите, какие задачи требуют внимания: срок подходит или уже прошёл. Даты и уведомления в GIF подготовлены заранее; работа фоновых напоминаний проверяется отдельно.

06. Управляйте данными и участниками
Голосовой эталон участника
Откройте карточку участника и запишите эталон. API и интерфейс записи готовы; распознавание личности по тембру ещё не подключено. В GIF используется тестовый микрофон.

Локальные модели и удаление аудио
Посмотрите сведения о моделях и удалите исходное аудио, сохранив транскрипт. Ролик показывает управление записью; условия закрытого контура и текущие ограничения описаны в разделе «On-premise и приватность».

Режим записи и ограничения каждого ролика · Статичные экраны и тёмная тема
Попробовать за минуту
Интерфейс запускается без backend и ML-моделей. Нужны Node.js 20+ и pnpm:
cd frontend
pnpm install
pnpm mock
Откройте http://localhost:3000. Вход: [email protected], пароль любой. Данные хранятся в браузере; ?reset-mocks в адресе сбрасывает их к исходному состоянию.
Запуск полного стека описан в разделе «Запуск».
Развитие после хакатона
Первый пилот: секретарь и одна команда в организации с двуязычными совещаниями. На согласованных записях нужно проверить точность поручений и сроков, число ручных исправлений и время подготовки протокола. Измеренных показателей экономии времени пока нет.
| Этап | Что добавляем | Как проверяем результат |
|---|---|---|
| Повысить качество обработки | Сократить пропуски и дубликаты поручений, уточнить привязку имён и сроков, подключить голосовые эталоны | Сверить задачи, цитаты, даты и спикеров с ручной разметкой RU/KK-записей |
| Внедрить в одну организацию | Настроить её справочник участников, направления и адаптер СЭД | Провести путь от совещания до зарегистрированного документа с секретарём |
| Подключить больше команд | Настроить очередь, число worker-процессов, хранение и доступы | Измерить время ожидания и обработки при параллельных встречах; проверить разграничение доступа |
| Расширить сценарии | Подключение по календарю, потоковый транскрипт, эскалация просрочки руководителю | Проверить востребованность на пилоте и надёжность каждого нового сценария |
Разделение API, очереди и ML-библиотеки даёт основу для этих изменений. Масштабирование ещё требует нагрузочных проверок. Для новых организаций понадобятся отдельная проверка изоляции данных и настройка интеграций.
Вопросы о продукте
Что подтверждают эти демонстрации? Видеоролик объясняет сценарий продукта, записи интерфейса показывают действия пользователя на демонстрационных данных. Реальный локальный пайплайн формирует транскрипт, метки спикеров, черновики поручений и саммари. Сервер сохраняет результат, правки и утверждение, формирует документы.
В чём преимущество такого подхода? Секретарь проверяет поручение рядом с исходной цитатой, различает автора реплики и исполнителя, уточняет календарный срок. После утверждения работа продолжается в списке задач и на доске. Специализацию на RU/KK и локальной обработке нужно подтвердить пилотом; сравнительного исследования конкурентов пока нет.
Можно ли доверять поручению без проверки? Черновик проверяет секретарь до утверждения. Цитата и ссылка на реплику помогают обнаружить неверное имя или срок. Локальная модель уже формирует черновики, но может пропускать поручения или создавать смысловые дубликаты. Проверку секретарём сохраняем до утверждения.
Что нужно для внедрения? Оценить качество извлечения на записях организации, проверить полный on-premise запуск, подключить СЭД организации и провести пилот на её записях. Требования к гостевому входу бота зависят от платформы и допуска организатора.
Пример протокола
Смоделированное совещание, 23 сентября 2026 года. Команда обсуждает бюджет и запуск склада. В одной реплике участники переключаются между русским и казахским:
[00:14] Серик: «Айбек, подготовь обновлённую смету по складу до пятницы. Керек болса, Данамен бірге отырыңдар.»
[00:22] Айбек: «Жақсы, пятницаға дейін жасаймын. Данамен бүгін кездесемін.»
Секретарь получает черновик с поручениями. Относительные сроки («до пятницы», «бүгін») пересчитаны в даты от дня встречи:
| Фрагмент реплики | Поручение | Ответственный | Срок |
|---|---|---|---|
| «подготовь обновлённую смету по складу до пятницы» | Подготовить смету склада | Айбек | 25.09.2026 |
| «Данамен бүгін кездесемін» | Встретиться с Даной по смете | Айбек | 23.09.2026 |
| «согласуй с юристами договор аренды до конца следующей недели» | Согласовать договор аренды | Дана | 04.10.2026 |
| «передай айтишникам заявку на подключение склада, срок конец месяца» | Передать заявку в ИТ | Айбек | 30.09.2026 |
Каждое поручение хранит цитату и номер реплики, поэтому его можно сверить с исходным контекстом. После подтверждения секретарь скачивает протокол, а ответственные получают уведомления. В PDF входят саммари, таблица поручений и приложение с репликами по спикерам.
Происхождение примера. Данные взяты из детерминированной фикстуры
pipeline.fake, участники вымышлены. DOCX/PDF сформированы рабочим сервисом экспорта backend. Пример показывает формат протокола и связь данных; качество моделей на нём не измерялось. Как пересобрать образец.
Что готово
| Возможность | Статус | Подробности |
|---|---|---|
| Backend: авторизация, совещания, поручения, участники, уведомления | Готово | FastAPI + Celery, 112 тестов, end-to-end HTTP smoke |
| Веб-интерфейс: все экраны, RU/KK, тёмная тема | Готово | Работает с настоящим backend (pnpm dev) и в деморежиме (pnpm mock) |
| Три источника записи: файл, микрофон, бот | Готово | Загрузка файла, live-запись через WebSocket, очередь для бота |
| Экспорт протокола DOCX / PDF на RU и KK | Готово | python-docx + LibreOffice; образец |
| Проверка секретарём и утверждение протокола | Готово | Правка спикеров, ответственных, сроков; статусы поручений |
| Дашборд, канбан, напоминания о сроках | Готово | Celery beat раз в час отмечает due_soon и overdue |
| СЭД | Прототип | MockSED выдаёт регистрационный номер; интерфейс SEDClient готов для реальной СЭД |
| Распознавание речи RU / KK / смешанной | Готово | Локальный faster-whisper large-v3-turbo, CPU int8, без сети |
| Маскирование телефонов и ИИН | Готово | Применяется до сохранения транскрипта |
| Диаризация (кто говорит) | Готово | Локально: pyannote segmentation 3.0 + NeMo TitaNet (sherpa-onnx) |
| Бот-участник Microsoft Teams | Частично | Живой гостевой вход подтверждён; путь записи из Chromium в Whisper проверен в контейнере |
| Бот-участник Google Meet / Zoom | Частично | Адаптеры готовы; на тестовых встречах сервер отказал гостевому входу. Для Zoom нужен официальный RTMS (отчёт) |
| Docker Compose on-premise | Частично | Конфигурация готова, bot-worker проверен в Compose; полный прогон стека ещё не подтверждён |
| Извлечение поручений и саммари локальной LLM | Частично | Локальная Qwen3:8b через Ollama; проверка цитат и сроков, черновики для проверки человеком |
| Контекстные имена спикеров и гости | Частично | Явная передача слова / самопредставление; неизвестные названные люди добавляются как гости |
| Узнавание участника по голосовому эталону | В работе | API и UI загрузки эталона есть; модель не подключена |
Реальный пайплайн возвращает транскрипт, метки speaker1, speaker2, поручения-черновики и саммари. Явная передача слова или самопредставление может связать голос с именем (источник llm, не голосовой эталон). Неоднозначные имена остаются для ручной привязки; порядок списка участников не используется. Коррекция коротких сдвигов границы спикера уменьшает разрывы внутри предложения, но не гарантирует точность диаризации. Извлечение может пропускать поручения или оставлять смысловые дубликаты.
Для разработчиков и ИИ-агентов
Архитектура · Стек · Запуск · API · Приватность · Тесты · Структура репозитория · Сценарий защиты
Начните с текущего статуса и спецификации контрактов. Инструкции модулей: frontend, backend, pipeline, bots.
Записи интерфейса. Режим pnpm mock, встроенные демонстрационные данные; backend и модели в записи не запускались. Версия приложения и методика записи, метаданные отдельных сценариев.
Архитектура
flowchart LR
subgraph Источники
W[Браузер<br/>файл · микрофон]
B[Бот Playwright<br/>Meet · Zoom · Teams]
end
W -->|REST / WebSocket| API
B -->|POST /meetings/id/audio<br/>токен одной встречи| API
API[FastAPI api<br/>auth · meetings · tasks<br/>participants · export] -->|Celery / Redis| WK
API <--> DB[(PostgreSQL)]
subgraph WK[worker: pipeline.process]
direction TB
S1[Whisper STT] --> S2[Диаризация] --> S3[Маскирование<br/>ИИН / телефонов] --> S4[Поручения + саммари<br/>Qwen3:8b · Ollama]
end
WK -->|MeetingResult| DB
BEAT[beat: check_deadlines<br/>каждый час] --> DB
API --> EXP[DOCX / PDF · СЭД]
Все модели работают внутри контура: faster-whisper, sherpa-onnx и Ollama. Веса скачиваются заранее отдельным шагом, без аудио и текста.
Поток данных: запись → data/audio/<id>/audio.wav (ffmpeg, 16 kHz mono) → Celery process_meeting → pipeline.process() возвращает MeetingResult (контракт) → сегменты, карта спикеров, черновики поручений и саммари сохраняются в БД → секретарь проверяет → «Подтвердить протокол» → уведомления ответственным, экспорт DOCX/PDF, отправка в СЭД → beat следит за сроками.
Границы модулей:
pipeline/: библиотека без веб-сервера и БД. Функцияprocess(audio_path, meeting_date, participants, directions, output_language, progress) -> MeetingResult.PIPELINE_FAKE=1подменяет её детерминированной заглушкой, поэтому backend и frontend работают без ML-моделей.backend/: FastAPI + Celery. Хранение, API, экспорт, уведомления, СЭД. Пайплайн вызывается как библиотека.frontend/: Next.js, обращается только к REST API.bots/: отдельный процесс в изолированном контейнере. Загружает запись с временным токеном конкретной встречи.
Стек
| Слой | Технологии |
|---|---|
| Пайплайн | Python 3.12, faster-whisper (large-v3-turbo), sherpa-onnx (pyannote segmentation 3.0 + NeMo TitaNet), Ollama (Qwen3:8b), pydantic v2 |
| Backend | FastAPI, SQLAlchemy 2, Alembic, PostgreSQL 16, Celery 5 + Redis, python-docx, LibreOffice, ffmpeg |
| Frontend | Next.js 15 (App Router), React 19, TypeScript, Tailwind v4, shadcn/ui, TanStack Query, next-intl (ru / kk) |
| Бот | Playwright (Chromium), Xvfb, PulseAudio, ffmpeg |
| Инфраструктура | Docker Compose, uv, pnpm |
Запуск
Docker Compose
Нужен Docker с Compose v2. LLM по умолчанию: qwen3:8b; локальный запуск проверен на Mac с 16 ГБ RAM. Подготовка весов, приватность и ограничения описаны в локальной LLM.
cp .env.example .env # затем замените SECRET_KEY случайным значением
docker compose up -d --build
При старте сервис api применяет миграции и загружает справочники и демо-участников. Сервисы worker и beat ждут его healthcheck.
- Swagger: http://localhost:8000/docs
- Просмотр таблиц БД: http://localhost:8000/admin
- Вход:
[email protected]/admin123 - Frontend запускается отдельно:
cd frontend && pnpm install && pnpm dev, затем http://localhost:3000
По умолчанию Compose работает с PIPELINE_FAKE=1: результат детерминированный, ML-модели не нужны. Образ worker с ML-зависимостями и томом весов пока не собран. Настоящее распознавание проверено при локальном запуске без Docker.
Для подготовки LLM внутри контейнера: docker compose exec ollama ollama pull qwen3:8b.
Веса скачиваются заранее; обработка не обращается к облачным моделям.
Локально с настоящим Whisper (macOS)
Проверенная инструкция: docs/local-development.md. Скрипт поднимает отдельные PostgreSQL и Redis, генерирует пароли и запускает API с Celery. Модели диаризации описаны в docs/local-diarization.md.
brew install postgresql@16 redis ffmpeg uv
uv sync --project backend --extra stt
backend/.venv/bin/python scripts/local_dev.py setup
Реальный пайплайн также требует запущенную Ollama с подготовленной Qwen3:8b: инструкция локальной LLM. Без модели обработка возвращает явную ошибку.
Ручной запуск backend с fake-пайплайном
Нужны Python 3.12, uv, PostgreSQL 16, Redis, ffmpeg и LibreOffice (для PDF). Не смешивайте эту конфигурацию с .env, который создаёт local_dev.py.
createuser -P protocol # пароль protocol
createdb -O protocol protocol
createdb -O protocol protocol_test
cp .env.example .env
# в .env замените хосты на localhost:
# DATABASE_URL=postgresql+psycopg://protocol:protocol@localhost:5432/protocol
# REDIS_URL=redis://localhost:6379/0
# OLLAMA_URL=http://localhost:11434
# удалите DATA_DIR и OUTBOX_DIR (будут использованы значения внутри backend/)
cd backend
uv sync
uv run alembic upgrade head
uv run python -m app.seed
uv run uvicorn app.main:app --reload --port 8000
В соседних терминалах:
cd backend && uv run celery -A app.tasks.celery_app:celery_app worker --loglevel=info
cd backend && uv run celery -A app.tasks.celery_app:celery_app beat --loglevel=info
Без Redis и worker обработку можно выполнять в процессе API: CELERY_EAGER=1 uv run uvicorn app.main:app.
Пайплайн на произвольной записи:
cd pipeline
uv sync --extra stt
PIPELINE_FAKE=0 uv run python -m pipeline.cli /path/to/meeting.m4a --date 2026-09-23
Сценарий демо
Четыре минуты на защиту. Сюжет: поручение Айбеку о смете проходит путь от исходной фразы до протокола и уведомления.
| Время | Действие ведущего | Что видит жюри |
|---|---|---|
| 0:00–0:30 | Прочитать две реплики из примера выше: в поручении есть человек, срок «до пятницы» и смена языка | Смысл, который система должна сохранить |
| 0:30–1:20 | Открыть поручение о смете рядом с цитатой. Показать дату встречи и срок 25 сентября, затем «бүгін» и дату 23 сентября | Связь поручения с репликой, пересчёт сроков в даты |
| 1:20–2:00 | Поправить ответственного или срок, утвердить протокол | Секретарь проверяет черновик до отправки исполнителям |
| 2:00–3:00 | Открыть PDF: таблица поручений, затем приложение с репликами | Документ, который можно передать участникам |
| 3:00–4:00 | Показать уведомление ответственному и переход поручения в «выполнено» на доске. Если остаётся время, показать отправку в MockSED | Контроль исполнения после совещания |
Подготовка ведущего и режимы показа
- Интерфейс на моках (
pnpm mock): все экраны и сценарии работают без сервера. Подходит, чтобы показать продукт целиком. - Backend с fake-пайплайном: авторизация, хранение, правки, подтверждение, уведомления и экспорт выполняет настоящий backend. Распознавание, диаризацию и извлечение заменяет фиксированный результат.
- Настоящая обработка аудио: загрузить запись по сценарию, дату 23.09.2026 и участников. Назвать использованные модели и фактическое время обработки. На случай задержки держать готовый PDF и объяснить, откуда он.
Перед защитой:
- Открыть README, PDF и запущенный API. Для прогона backend использовать отдельную тестовую БД, как в
smoke_backend.py. - Для показа через UI добавить участников Серик, Дана и Айбек: эти имена есть в фикстуре, а seed содержит другой состав.
- Выбрать режим: fake или настоящая локальная обработка. Если идёт запись, предупредить участников о записи и транскрибации ИИ.
- Проверить отображение казахских символов, ссылки на цитаты, подтверждение и экспорт.
Напоминание о просрочке показывается на отдельном примере с прошедшей датой и запуском check_deadlines. Смену даты в демо-данных нужно объяснить жюри.
Проверка backend через curl
Полный сценарий без frontend, на PIPELINE_FAKE=1. Автоматизированная версия: backend/scripts/smoke_backend.py. Скрипт поднимает изолированный uvicorn на отдельной схеме PostgreSQL.
API=http://localhost:8000/api/v1
curl -s $API/health
# тестовое аудио: любой файл или сгенерированный тон
ffmpeg -y -f lavfi -i "sine=frequency=440:duration=5" -ac 1 -ar 16000 sample.wav
# логин, cookie в файл
curl -s -c c.txt -X POST $API/auth/login -H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"[скрыто]"}'
# участники и направления из seed
curl -s -b c.txt $API/participants | python3 -m json.tool | head -30
curl -s -b c.txt $API/directions
# голосовой эталон первому участнику
PID=$(curl -s -b c.txt $API/participants | python3 -c 'import json,sys; print(json.load(sys.stdin)[0]["id"])')
curl -s -b c.txt -X POST $API/participants/$PID/voiceprint -F "[email protected]"
# совещание из файла (PIPELINE_FAKE=1 обрабатывает мгновенно, иначе смотрите status/progress_pct)
MID=$(curl -s -b c.txt -X POST $API/meetings \
-F title="Оперативное совещание" -F meeting_date=2026-09-23 \
-F participant_ids=$PID -F "[email protected]" | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
curl -s -b c.txt $API/meetings/$MID | python3 -m json.tool
# поправить спикера, подтвердить протокол
curl -s -b c.txt -X PUT $API/meetings/$MID/speakers -H 'Content-Type: application/json' \
-d "[{\"speaker\":\"SPEAKER_00\",\"participant_id\":$PID}]"
curl -s -b c.txt -X POST $API/meetings/$MID/confirm
# экспорт и СЭД
curl -s -b c.txt "$API/meetings/$MID/export?format=docx&lang=ru" -o protocol.docx
curl -s -b c.txt "$API/meetings/$MID/export?format=pdf&lang=kk" -o protocol.pdf
curl -s -b c.txt -X POST $API/meetings/$MID/sed
# дашборд и статусы
curl -s -b c.txt "$API/tasks?status=confirmed"
curl -s -b c.txt $API/tasks/stats
TID=$(curl -s -b c.txt "$API/tasks?meeting_id=$MID" | python3 -c 'import json,sys; print(json.load(sys.stdin)[0]["id"])')
curl -s -b c.txt -X PATCH $API/tasks/$TID -H 'Content-Type: application/json' -d '{"status":"in_progress"}'
# уведомления
curl -s -b c.txt $API/notifications
curl -s -b c.txt $API/notifications/unread-count
# live-запись: создать совещание, затем браузер шлёт бинарные чанки в ws://localhost:8000/api/v1/meetings/{id}/live
curl -s -b c.txt -X POST $API/meetings/live -H 'Content-Type: application/json' \
-d "{\"title\":\"Live\",\"meeting_date\":\"2026-09-23\",\"participant_ids\":[$PID]}"
# бот (нужны bot-worker, разрешённый гостевой вход и допуск организатора)
curl -s -b c.txt -X POST $API/meetings/bot -H 'Content-Type: application/json' \
-d "{\"title\":\"Meet\",\"meeting_date\":\"2026-09-23\",\"platform\":\"meet\",\"url\":\"https://meet.google.com/abc-defg-hij\",\"participant_ids\":[$PID]}"
API
Префикс /api/v1, интерактивная схема на http://localhost:8000/docs. Аутентификация: JWT в httpOnly cookie access_token. Роли user и admin. Совещание может создать любой вошедший пользователь; редактируют создатель и администратор, участники видят. Ответственный меняет статус своего поручения.
Эндпоинты
| Группа | Эндпоинты |
|---|---|
| auth | POST /auth/register, POST /auth/login, POST /auth/logout, GET /auth/me |
| participants | GET/POST /participants, PATCH/DELETE /participants/{id}, POST/DELETE /participants/{id}/voiceprint |
| directions | GET /directions, POST /directions, PATCH /directions/{id} (admin) |
| meetings | POST /meetings (multipart), POST /meetings/live, WS /meetings/{id}/live, POST /meetings/bot, POST /meetings/{id}/audio, GET /meetings, GET /meetings/{id}, PATCH /meetings/{id}, PUT /meetings/{id}/speakers, POST /meetings/{id}/confirm, POST /meetings/{id}/reprocess, GET /meetings/{id}/export?format=docx|pdf&lang=ru|kk, POST /meetings/{id}/sed, DELETE /meetings/{id}/audio, DELETE /meetings/{id} |
| tasks | GET /tasks?status=&assignee_id=&direction_id=&urgency=&meeting_id=&mine=1, GET /tasks/stats, POST /tasks, PATCH /tasks/{id}, DELETE /tasks/{id} |
| notifications | GET /notifications?unread=1, GET /notifications/unread-count, POST /notifications/{id}/read, POST /notifications/read-all |
Гости. Секретарь может добавить участника по имени и email до его регистрации. Поручения назначаются на участника. Когда человек регистрируется с тем же email, участник и его поручения привязываются к аккаунту автоматически.
Жизненный цикл поручения: draft (после пайплайна) → confirmed (протокол утверждён) → in_progress → done. Если срок прошёл, beat ставит overdue; из него поручение переводится в in_progress или done.
On-premise и приватность
По условиям кейса аудио и текст нельзя передавать во внешние облачные API. Это ограничение соблюдается и при разработке, и на демо.
- Локальные модели по умолчанию.
.env.exampleзадаётSTT_BACKEND=local,LLM_PROVIDER=ollama,HF_HUB_OFFLINE=1. Пайплайн не обращается к облачным провайдерам. Веса скачиваются отдельным шагом без аудио и текста. - Без внешних запросов из интерфейса. Шрифты собираются вместе с приложением, аналитики и CDN нет.
- Минимум персональных данных. Телефоны и ИИН маскируются до сохранения транскрипта.
DELETE /meetings/{id}/audioудаляет запись после обработки, транскрипт и поручения сохраняются. - Изолированный бот. Бот получает токен только для загрузки записи одной встречи, с ограниченным сроком действия. Chromium работает без root в отдельном контейнере. Приватные сетевые адреса и переходы за пределы домена платформы заблокированы.
- Секреты хранятся в
.env, который исключён из git. Перед развёртыванием задаётся случайныйSECRET_KEY.
Материалы в docs/demo/ содержат вымышленные имена и смоделированный разговор. Реальные записи в репозиторий не входят.
Тесты
GitHub Actions в репозитории хакатона отключены. Проверка перед каждым PR выполняется локально:
./scripts/check.sh # ruff, pytest backend / pipeline / bots, HTTP smoke
./scripts/check.sh --compose # плюс весь стек docker compose: тесты и smoke в контейнерах
./scripts/check.sh --compose-only # только стек docker compose, PostgreSQL на хосте не нужен
По отдельности
cd pipeline && uv run pytest # контракт, fake-пайплайн, диаризация
cd backend && uv run pytest # API, Celery-задачи, напоминания, экспорт (нужны Postgres protocol_test, ffmpeg, soffice)
cd backend && uv run ruff check . && uv run ruff format --check .
cd backend && uv run python scripts/smoke_backend.py # end-to-end через настоящий HTTP
cd bots && uv run pytest # CLI, жизненный цикл бота, HTML-фикстуры в браузере
cd frontend && pnpm lint && pnpm test # eslint, vitest
Тесты backend используют PIPELINE_FAKE=1 и CELERY_EAGER=1: пайплайн заменяется заглушкой, Celery-задачи выполняются в процессе без Redis.
Структура репозитория
frontend/ Next.js: экраны, i18n ru/kk, моки для офлайн-демо
backend/ FastAPI, Celery, Alembic, экспорт DOCX/PDF, СЭД-адаптер
app/routers/ auth, participants, directions, meetings, tasks, notifications, exports
app/services/ audio, access, speakers, notify, export, sed/
app/tasks/ celery_app, process_meeting, reminders, run_bot
pipeline/ ML-пайплайн как библиотека
pipeline/models.py контракт MeetingResult
pipeline/fake.py детерминированная заглушка (PIPELINE_FAKE=1)
pipeline/real.py STT → диаризация → маскирование
pipeline/stt/ локальный faster-whisper
bots/ Playwright-бот для Meet / Zoom / Teams
docs/ спецификация, демо-протокол, инструкции запуска, исследование ботов
scripts/ check.sh (локальный CI), local_dev.py
docker-compose.yml, .env.example
Полная проектная спецификация описывает контракты между модулями и экраны.
Команда 01husky
| Участник | Зона ответственности |
|---|---|
| Эмир | Frontend: интерфейс, дизайн-система, i18n, моки |
| Ардак | Backend и ML-пайплайн: API, очереди, экспорт, STT, диаризация |
| Никита | Бот-участник: Meet, Zoom, Teams, bot-runtime |
Работа ведётся в ветках feat/<task> от develop. PR идут в develop, после интеграционной проверки develop вливается в main.
Ограничения и развитие
Сейчас:
- Локальная Qwen3:8b извлекает поручения и саммари из транскрипта. Возможны пропуски, смысловые дубликаты и ошибки привязки имён; черновик проверяет секретарь. Методика и ограничения: локальная LLM.
- СЭД подключена через mock-адаптер с интерфейсом
SEDClient.push_protocol(). Адаптер для конкретной системы (Documentolog, Directum) реализуется по этому интерфейсу. - Бот входит во встречу как гость, поэтому нужен допуск организатора. Подробности: bots/README.md и исследование способов подключения.
- При live-записи транскрипт появляется после нажатия «Стоп».
- Уведомления работают внутри приложения.
Дальше:
- Повышение полноты извлечения поручений, устранение смысловых дубликатов и оценка качества на размеченных RU/KK-записях.
- Стриминговое распознавание во время совещания.
- Дообучение Whisper на казахских корпусах (ISSAI KSC2) для шала-казахской речи.
- Узнавание участников по голосу, в том числе без эталона: кластеризация по совещаниям организации.
- Контроль исполнения: эскалация руководителю при повторной просрочке, отчёт по исполнительской дисциплине.
- Интеграция с календарём: бот подключается к встрече по расписанию. Уведомления в email и Telegram.
Авторы коммитов
История коммитов
- 2026-09-23 17:51Merge pull request #15 from BAITC-Hacks/feat/readme-video-heroNikita Yurtayev
- 2026-09-23 17:51docs: embed GitHub-hosted video playerNowmaker
- 2026-09-23 17:50docs: move demo video to README heroNowmaker
- 2026-09-23 17:45Merge pull request #14 from BAITC-Hacks/feat/readme-contest-showcaseNikita Yurtayev
- 2026-09-23 17:44docs: present contest showcase with inline demosNowmaker
- 2026-09-23 17:29Merge pull request #13 from BAITC-Hacks/developArdak Tursunbayev
- 2026-09-23 17:29Merge pull request #12 from BAITC-Hacks/feat/pipelineArdak Tursunbayev
- 2026-09-23 17:28Merge develop into feat/pipeline and reconcile pipeline documentationArdak
Все коммиты (98)
- 2026-09-23 17:27Merge pull request #11 from BAITC-Hacks/feat/update-readme-and-docsTozare
- 2026-09-23 17:27feat(pipeline): extract local tasks and resolve speaker guestsArdak
- 2026-09-23 17:25docs: polish READMEs for the jury, add demo video and UI screenshotsTozare
- 2026-09-23 17:07docs(bots): scope isolated Meet account authentication probeNowmaker
- 2026-09-23 17:02spec: define verified speaker names and automatic guestsArdak
- 2026-09-23 17:01Merge pull request #10 from BAITC-Hacks/nikitaTozare
- 2026-09-23 16:52docs(bots): record Open-mode and clean Chrome admission checksNowmaker
- 2026-09-23 16:48docs(bots): record Meet permission denial in Linux runtimeNowmaker
- 2026-09-23 16:42Merge remote-tracking branch 'origin/develop' into nikitaNowmaker
- 2026-09-23 16:41feat(frontend): add kanban board and by-deadline views to tasksTozare
- 2026-09-23 16:41docs(bots): record fresh-image transcription verificationNowmaker
- 2026-09-23 16:40fix(bots): enable Chromium sandbox in Docker runtimeNowmaker
- 2026-09-23 16:37ci: compose-only mode and gitignored port override for scripts/check.shAkitamex
- 2026-09-23 16:36Merge pull request #9 from BAITC-Hacks/feat/add-kanbanTozare
- 2026-09-23 16:34feat(frontend): add kanban board and by-deadline views to tasksTozare
- 2026-09-23 16:29fix(bots): preserve explicit reasons on combined access error pagesNowmaker
- 2026-09-23 16:25fix(bots): handle Meet media prompt after join requestNowmaker
- 2026-09-23 16:22Merge remote-tracking branch 'origin/develop' into nikitaNowmaker
- 2026-09-23 16:21fix(bots): restore Meet prejoin and report ambiguous access refusalsNowmaker
- 2026-09-23 16:14Merge pull request #8 from BAITC-Hacks/nikitaArdak Tursunbayev
- 2026-09-23 16:11Merge pull request #7 from BAITC-Hacks/feat/pipelineArdak Tursunbayev
- 2026-09-23 16:09docs(bots): update develop synchronization checkpointNowmaker
- 2026-09-23 16:09Merge remote-tracking branch 'origin/develop' into nikitaNowmaker
- 2026-09-23 16:09docs(bots): record live blockers and integration handoffNowmaker
- 2026-09-23 16:08Merge remote-tracking branch 'origin/develop' into nikitaNowmaker
- 2026-09-23 16:08feat(pipeline): add offline speaker diarization and anonymous labelsArdak
- 2026-09-23 16:03feat(bots): add guest adapters with silent branded media and scoped callbacksNowmaker
- 2026-09-23 16:00Merge pull request #6 from BAITC-Hacks/feat/fe-be-integrationTozare
- 2026-09-23 15:58feat(frontend): integrate with backend API contractTozare
- 2026-09-23 15:58spec: align §7 with implemented backendTozare
- 2026-09-23 15:58docs(frontend): update CLAUDE.md for real-backend modeTozare
- 2026-09-23 15:55style(admin): use Kenes AI name and light wordmarkArdak
- 2026-09-23 15:55Merge remote-tracking branch 'origin/develop' into feat/pipelineArdak
- 2026-09-23 15:52spec: define three-platform guest bot contract and isolated runtimeNowmaker
- 2026-09-23 15:46feat(backend): add read-only local database admin panelArdak
- 2026-09-23 15:41Merge pull request #5 from BAITC-Hacks/feat/pipelineArdak Tursunbayev
- 2026-09-23 15:38Merge pull request #4 from BAITC-Hacks/feat/update-logoTozare
- 2026-09-23 15:37feat(frontend): rebrand to Kenes AI, add error pages and localized toastsTozare
- 2026-09-23 15:36spec: assign backend ownership and require local processingArdak
- 2026-09-23 15:36feat(pipeline): integrate offline STT with local PostgreSQL stackArdak
- 2026-09-23 15:24Merge remote-tracking branch 'origin/develop' into nikitaNowmaker
- 2026-09-23 15:22Merge pull request #3 from BAITC-Hacks/feat/add-frontend-dashboardTozare
- 2026-09-23 15:22docs: plan combined backend and pipeline completionArdak
- 2026-09-23 15:16fix(frontend): responsive layout for mobile, tablet and small desktopTozare
- 2026-09-23 15:14docs: adopt Kenes AI working project nameNowmaker
- 2026-09-23 15:14feat(pipeline): add offline faster-whisper transcriptionArdak Tursunbayev
- 2026-09-23 15:13fix(pipeline): satisfy CLI lint checksArdak
- 2026-09-23 15:13merge: sync feat/pipeline with developArdak
- 2026-09-23 15:13docs: plan GIF and video demo around mixed-language dialogueNowmaker
- 2026-09-23 15:11Merge pull request #1 from BAITC-Hacks/nikitaArdak Tursunbayev
- 2026-09-23 15:08docs: showcase bilingual meeting demo with downloadable protocolNowmaker
- 2026-09-23 15:05feat(frontend): Loom-inspired visual themeTozare
- 2026-09-23 15:03ci: replace GitHub Actions with local scripts/check.shAkitamex
- 2026-09-23 14:59fix(backend): recover from protocol persistence failuresNowmaker
- 2026-09-23 14:58feat(pipeline): add offline faster-whisper transcriptionArdak
- 2026-09-23 14:55docs: record Compose verification blocker and frontend ownershipNowmaker
- 2026-09-23 14:54ci: drop frontend probe, frontend lives in Emir's branchAkitamex
- 2026-09-23 14:50chore: drop frontend scaffold, Emir owns frontend end to endAkitamex
- 2026-09-23 14:50ci: verify clean Compose stack and real Celery processingNowmaker
- 2026-09-23 14:48fix(backend): handle long protocols, document controls and export failuresNowmaker
- 2026-09-23 14:47feat(frontend): scaffold Next.js 15 + shadcn/ui with Хаттама design tokensTozare
- 2026-09-23 14:47feat(frontend): API client, query hooks, i18n and stateful mocksTozare
- 2026-09-23 14:47feat(frontend): all spec §8 screensTozare
- 2026-09-23 14:46docs: reconcile README with auto-migrating compose, dynamic ids, implementation statusAkitamex
- 2026-09-23 14:45test(backend): negative state and access scenarios for meetings, live, botAkitamex
- 2026-09-23 14:41fix(backend): serialize duplicate notification creation across transactionsNowmaker
- 2026-09-23 14:40feat: scaffold frontend (Next.js, next-intl, typed API client) and bots packageAkitamex
- 2026-09-23 14:38test(backend): add isolated curl workflow from registration to SEDNowmaker
- 2026-09-23 14:34fix(backend): escape percent-encoded database URLs in AlembicNowmaker
- 2026-09-23 14:32chore(infra): initialize database before starting API and workersNowmaker
- 2026-09-23 14:31docs: project README with architecture, setup, demo scenario, curl checksAkitamex
- 2026-09-23 14:30feat(backend): add protocol downloads and idempotent mock SED deliveryNowmaker
- 2026-09-23 14:30chore(infra): configure bot callback and document fontsNowmaker
- 2026-09-23 14:29feat(backend): notifications API (list, unread count, read, read-all)Akitamex
- 2026-09-23 14:28feat(backend): deadline reminders beat task (due_soon, overdue)Akitamex
- 2026-09-23 14:27feat(backend): live websocket ingest, bot meetings, bot audio callbackAkitamex
- 2026-09-23 14:25feat(backend): export localized DOCX and PDF meeting protocolsNowmaker
- 2026-09-23 14:25feat(backend): speaker mapping, protocol confirm, notifications service, real seed participantsAkitamex
- 2026-09-23 14:23feat(backend): tasks API with filters, stats, status transitionsAkitamex
- 2026-09-23 14:22feat(backend): process_meeting celery task persists pipeline resultAkitamex
- 2026-09-23 14:20feat(backend): meetings CRUD, audio normalize, access rules, celery skeletonAkitamex
- 2026-09-23 14:18feat(backend): participants, voiceprint enroll, directionsAkitamex
- 2026-09-23 14:16feat(backend): auth register/login/logout/me, guest participant claimAkitamex
- 2026-09-23 14:15feat(backend): models, alembic 0001, seed, db test fixturesAkitamex
- 2026-09-23 14:15Update README.mdArdak Tursunbayev
- 2026-09-23 14:13feat(backend): app skeleton, config, db, security, deps, healthAkitamex
- 2026-09-23 14:12feat(pipeline): contract models, fake implementation, cliAkitamex
- 2026-09-23 14:05spec: develop branch and PR workflowAkitamex
- 2026-09-23 14:04spec: swap owners, Emir frontend, Nikita backendAkitamex
- 2026-09-23 14:01spec: meeting protocol system designAkitamex
Структура репозитория (325 файлов)
.dockerignore .env.example .gitignore README.md _claude/council/2026-09-23-kenes-meeting-bots.md backend/Dockerfile backend/README.md backend/alembic.ini backend/alembic/env.py backend/alembic/script.py.mako backend/alembic/versions/0001_initial.py backend/app/__init__.py backend/app/admin_assets/app.js backend/app/admin_assets/brand.css backend/app/admin_assets/index.html backend/app/admin_assets/kenes-ai-light.svg backend/app/admin_assets/style.css backend/app/config.py backend/app/db.py backend/app/deps.py backend/app/i18n.py backend/app/main.py backend/app/models/__init__.py backend/app/models/direction.py backend/app/models/enums.py backend/app/models/meeting.py backend/app/models/notification.py backend/app/models/participant.py backend/app/models/task.py backend/app/models/user.py backend/app/routers/__init__.py backend/app/routers/admin.py backend/app/routers/auth.py backend/app/routers/directions.py backend/app/routers/exports.py backend/app/routers/meetings.py backend/app/routers/notifications.py backend/app/routers/participants.py backend/app/routers/tasks.py backend/app/schemas/__init__.py backend/app/schemas/auth.py backend/app/schemas/common.py backend/app/schemas/meeting.py backend/app/schemas/notification.py backend/app/schemas/participant.py backend/app/schemas/task.py backend/app/security.py backend/app/seed.py backend/app/services/__init__.py backend/app/services/access.py backend/app/services/audio.py backend/app/services/bot_tokens.py backend/app/services/export.py backend/app/services/guests.py backend/app/services/notify.py backend/app/services/processing.py backend/app/services/sed/__init__.py backend/app/services/sed/base.py backend/app/services/sed/mock.py backend/app/services/speakers.py backend/app/tasks/__init__.py backend/app/tasks/celery_app.py backend/app/tasks/process_meeting.py backend/app/tasks/reminders.py backend/app/tasks/run_bot.py backend/pyproject.toml backend/scripts/build_demo_protocol.py backend/scripts/smoke_backend.py backend/tests/__init__.py backend/tests/agent_b/conftest.py backend/tests/agent_b/test_bootstrap.py backend/tests/agent_b/test_bot_security.py backend/tests/agent_b/test_bot_worker.py backend/tests/agent_b/test_exports_api.py backend/tests/agent_b/test_notify_concurrency.py backend/tests/agent_b/test_process_failures.py backend/tests/conftest.py backend/tests/helpers.py backend/tests/test_admin.py backend/tests/test_auth.py backend/tests/test_confirm.py backend/tests/test_export.py backend/tests/test_guests.py backend/tests/test_health.py backend/tests/test_live_bot.py backend/tests/test_local_pipeline.py backend/tests/test_meetings.py backend/tests/test_negative_states.py backend/tests/test_notifications.py backend/tests/test_participants.py backend/tests/test_process_meeting.py backend/tests/test_reminders.py backend/tests/test_tasks.py backend/uv.lock bots/README.md bots/bots/__init__.py bots/bots/assets/README.md bots/bots/assets/camera.png bots/bots/assets/kenes-ai-light.svg bots/bots/base.py bots/bots/browser.py bots/bots/cli.py bots/bots/media.py bots/bots/meet.py bots/bots/teams.py bots/bots/urls.py bots/bots/zoom.py bots/entrypoint.sh bots/pyproject.toml bots/runtime/PLAYWRIGHT_LICENSE bots/runtime/README.md bots/runtime/seccomp_profile.json bots/scripts/audio_smoke.py bots/scripts/render_camera.py bots/tests/test_browser.py bots/tests/test_cli.py bots/tests/test_lifecycle.py bots/tests/test_media.py bots/tests/test_urls.py bots/uv.lock demo/Kenes-AI-Demo-v2.mp4 docker-compose.yml docs/demo/README.md docs/demo/checklist/README.md docs/demo/checklist/deadline-reminders.gif docs/demo/checklist/language-kk.gif docs/demo/checklist/language-mixed.gif docs/demo/checklist/language-ru.gif docs/demo/checklist/manifest.json docs/demo/checklist/meeting-sources.gif docs/demo/checklist/meeting-summary.gif docs/demo/checklist/notifications.gif docs/demo/checklist/on-premise.gif docs/demo/checklist/protocol-export.gif docs/demo/checklist/sed-handoff.gif docs/demo/checklist/speaker-mapping.gif docs/demo/checklist/speech-processing.gif docs/demo/checklist/task-classification.gif docs/demo/checklist/task-dashboard.gif docs/demo/checklist/task-extraction.gif docs/demo/checklist/voiceprint.gif docs/demo/kenes-overview.gif docs/demo/media-storyboard.md docs/demo/meeting-evidence.gif docs/demo/meeting-evidence.png docs/demo/protocol-preview.png docs/demo/protocol-review.gif docs/demo/protocol.docx docs/demo/protocol.pdf docs/local-development.md docs/local-diarization.md docs/local-llm.md docs/meeting-bot-access.md docs/screenshots/demo-frame-followup.png docs/screenshots/demo-frame-pipeline.png docs/screenshots/demo-frame-store.png docs/screenshots/demo-video-cover.png docs/screenshots/login.png docs/screenshots/meeting-detail-dark.png docs/screenshots/meeting-detail.png docs/screenshots/meetings-new.png docs/screenshots/meetings.png docs/screenshots/tasks-board.png docs/screenshots/tasks.png docs/superpowers/plans/2026-09-23-backend-pipeline-plan.md docs/superpowers/specs/2026-09-23-meeting-protocol-design.md frontend/.env.example frontend/.gitignore frontend/.prettierrc frontend/CLAUDE.md frontend/README.md frontend/components.json frontend/eslint.config.mjs frontend/messages/kk.json frontend/messages/ru.json frontend/mocks/db.ts frontend/mocks/handlers.ts frontend/mocks/pdf.ts frontend/mocks/seed.ts frontend/mocks/transport.ts frontend/next.config.ts frontend/package.json frontend/pnpm-lock.yaml frontend/postcss.config.mjs frontend/public/brand/kenes-ai-dark.svg frontend/public/brand/kenes-ai-light.svg frontend/src/app/(app)/admin/directions/page.tsx frontend/src/app/(app)/error.tsx frontend/src/app/(app)/layout.tsx frontend/src/app/(app)/meetings/[id]/page.tsx frontend/src/app/(app)/meetings/new/page.tsx frontend/src/app/(app)/meetings/page.tsx frontend/src/app/(app)/participants/page.tsx frontend/src/app/(app)/tasks/page.tsx frontend/src/app/(auth)/layout.tsx frontend/src/app/(auth)/login/page.tsx frontend/src/app/(auth)/register/page.tsx frontend/src/app/error.tsx frontend/src/app/global-error.tsx frontend/src/app/globals.css frontend/src/app/icon.svg frontend/src/app/layout.tsx frontend/src/app/not-found.tsx frontend/src/app/page.tsx frontend/src/components/brand/privacy-badge.tsx frontend/src/components/brand/seal-stamp.tsx frontend/src/components/brand/wordmark.tsx frontend/src/components/common/badges.tsx frontend/src/components/common/bits.tsx frontend/src/components/common/date-picker.tsx frontend/src/components/common/error-screen.tsx frontend/src/components/common/field.tsx frontend/src/components/common/level-meter.tsx frontend/src/components/common/segment.ts frontend/src/components/meeting/actions-bar.tsx frontend/src/components/meeting/confirm-action.tsx frontend/src/components/meeting/lang-mix.tsx frontend/src/components/meeting/pipeline-stepper.tsx frontend/src/components/meeting/speaker-ribbon.tsx frontend/src/components/meeting/speakers-panel.tsx frontend/src/components/meeting/summary-panel.tsx frontend/src/components/meeting/task-card.tsx frontend/src/components/meeting/tasks-panel.tsx frontend/src/components/meeting/transcript.tsx frontend/src/components/meetings/meeting-row.tsx frontend/src/components/meetings/source-icon.tsx frontend/src/components/new-meeting/bot-pane.tsx frontend/src/components/new-meeting/record-pane.tsx frontend/src/components/new-meeting/upload-pane.tsx frontend/src/components/notifications/bell.tsx frontend/src/components/participants/guest-dialog.tsx frontend/src/components/participants/participant-picker.tsx frontend/src/components/participants/voiceprint-sheet.tsx frontend/src/components/providers/providers.tsx frontend/src/components/shell/app-header.tsx frontend/src/components/shell/auth-guard.tsx frontend/src/components/shell/connection-status.tsx frontend/src/components/shell/locale-toggle.tsx frontend/src/components/shell/theme-toggle.tsx frontend/src/components/tasks/task-selects.tsx frontend/src/components/tasks/task-views.tsx frontend/src/components/ui/alert-dialog.tsx frontend/src/components/ui/avatar.tsx frontend/src/components/ui/badge.tsx frontend/src/components/ui/button.tsx frontend/src/components/ui/calendar.tsx frontend/src/components/ui/card.tsx frontend/src/components/ui/checkbox.tsx frontend/src/components/ui/command.tsx frontend/src/components/ui/dialog.tsx frontend/src/components/ui/dropdown-menu.tsx frontend/src/components/ui/input-group.tsx frontend/src/components/ui/input.tsx frontend/src/components/ui/label.tsx frontend/src/components/ui/popover.tsx frontend/src/components/ui/progress.tsx frontend/src/components/ui/radio-group.tsx frontend/src/components/ui/scroll-area.tsx frontend/src/components/ui/select.tsx frontend/src/components/ui/separator.tsx frontend/src/components/ui/sheet.tsx frontend/src/components/ui/skeleton.tsx frontend/src/components/ui/sonner.tsx frontend/src/components/ui/switch.tsx frontend/src/components/ui/table.tsx frontend/src/components/ui/tabs.tsx frontend/src/components/ui/textarea.tsx frontend/src/components/ui/toggle-group.tsx frontend/src/components/ui/toggle.tsx frontend/src/components/ui/tooltip.tsx frontend/src/hooks/use-locale-switch.ts frontend/src/hooks/use-notify.ts frontend/src/i18n/config.ts frontend/src/i18n/request.ts frontend/src/lib/api/client.ts frontend/src/lib/api/download.ts frontend/src/lib/api/errors.ts frontend/src/lib/api/queries/auth.ts frontend/src/lib/api/queries/directions.ts frontend/src/lib/api/queries/keys.ts frontend/src/lib/api/queries/meetings.ts frontend/src/lib/api/queries/notifications.ts frontend/src/lib/api/queries/participants.ts frontend/src/lib/api/queries/tasks.ts frontend/src/lib/api/schema.gen.ts frontend/src/lib/api/types.ts frontend/src/lib/audio/use-recorder.ts frontend/src/lib/format.test.ts frontend/src/lib/format.ts frontend/src/lib/utils.ts frontend/tsconfig.json frontend/vitest.config.ts pipeline/.gitignore pipeline/README.md pipeline/pipeline/__init__.py pipeline/pipeline/assignees.py pipeline/pipeline/cli.py pipeline/pipeline/deadlines.py pipeline/pipeline/diarization.py pipeline/pipeline/download_diarization_models.py pipeline/pipeline/download_model.py pipeline/pipeline/extract.py pipeline/pipeline/fake.py pipeline/pipeline/identity.py pipeline/pipeline/llm.py pipeline/pipeline/models.py pipeline/pipeline/privacy.py pipeline/pipeline/real.py pipeline/pipeline/settings.py pipeline/pipeline/speaker_alignment.py pipeline/pipeline/stt/__init__.py pipeline/pipeline/stt/local_whisper.py pipeline/pyproject.toml pipeline/requirements-local.txt pipeline/tests/test_diarization.py pipeline/tests/test_extract.py pipeline/tests/test_fake.py pipeline/tests/test_identity.py pipeline/tests/test_local.py pipeline/transcribe_local.py pipeline/uv.lock scripts/check.sh scripts/local_dev.py scripts/local_llm.py scripts/smoke_local_stt.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.
