О проекте
Команда: Overfitting
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Полностью офлайн-система протоколирования совещаний: загрузка записи, подготовка аудио, локальная транскрипция и диаризация, анализ через Ollama (темы, проблемы, поручения, сроки), ручная проверка и экспорт DOCX/PDF.
Как устроено
FastAPI принимает MP4/M4A/MP3/WAV/WebM до 200 МиБ и 15 минут, FFprobe/FFmpeg готовят WAV mono 16 кГц; faster-whisper large-v3 и pyannote speaker-diarization-community-1 дают стенограмму, которая выравнивается с говорящими. Qwen3:8b через Ollama строит саммари, темы, проблемы и поручения с проверкой JSON и ссылок на реплики, модуль deadlines обрабатывает сроки; всё хранится в SQLite. Пользователь редактирует стенограмму и поручения, затем экспорт DOCX/PDF (LibreOffice); запуск через Docker только на loopback.
Ключевые решения
- faster-whisper large-v3
- pyannote diarization
- выравнивание реплик и говорящих
- Ollama JSON-валидация
- ссылки поручений на реплики
- human review
- DOCX/PDF через LibreOffice
Особенности
Акцент на приватности: полностью локальные модели, отсутствие внешних API, привязка к 127.0.0.1, отказ от CDN-скриптов. Корневой README описывает устаревший каркас без моделей, а рабочая версия лежит в zip-архиве и дублирующих подпапках, что запутывает проверку.
Стек
Python 3.12 · FastAPI · SQLite · React · TypeScript · Vite · pnpm · FFmpeg · Docker · Ollama
Модели
faster-whisper large-v3 · pyannote speaker-diarization-community-1 · Qwen3:8b (Ollama)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-66a8613c-overfitting.
README
README.mdHackAlem AI — локальное автопротоколирование совещаний
Для проверки проекта скачайте HackAlem-jury-submission.zip. Внутри находится актуальный рабочий проект: исходный код, Docker-конфигурация, подробный
README.mdиRUNBOOK.mdдля запуска и демонстрации.
Архив не содержит записей,
.env, токенов и весов моделей. Для полноценного прогона подготовьте их локально по инструкции внутри архива.
Архивный каркас
Прототип локального автопротоколирования по PLAN.MD. Сейчас работает путь загрузка → сохранение → проверка длительности → подготовка WAV → готово к локальным моделям. Распознавание и генерация протокола ещё не подключены.
Что уже сделано
- FastAPI и Pydantic: контракты встречи, файла, задачи, реплики, говорящего, темы, показателя, проблемы, поручения и экспорта.
- SQLite: десять таблиц, внешние ключи, каскадное удаление связанных строк, ограничение одной задачи
preparing_audio. SQL-модели находятся вbackend/app/schema.sql; ORM не используется. - Реальная загрузка MP4/M4A/MP3/WAV/WebM: UUID встречи, нормализация исходного имени, техническое имя файла, серверный лимит 200 МиБ (209715200 байт). Пустой или неподдерживаемый файл отклоняется; частичная загрузка очищается.
- FFprobe проверяет аудиодорожку и длительность до 900 секунд; FFmpeg создаёт WAV mono, 16 кГц, PCM 16-bit. Выходной WAV проверяется повторно. Ошибки безопасно сохраняются в задаче, stderr программ не логируется.
- FastAPI BackgroundTasks последовательно выполняет подготовку в одном процессе. Статусы:
queued,preparing_audio,ready_for_models,failed.ready_for_modelsне означает готовый транскрипт. - React отправляет файл, показывает ошибки сервера и опрашивает статус раз в 2 секунды до завершения. На экране результата — честная карточка об отсутствии моделей. Нет демонстрационных транскриптов и поручений.
- Удаление завершённой/ошибочной встречи удаляет её каталог и строки SQLite. Для
queued/preparing_audioвозвращается409. Пути из БД не используются для удаления; ссылки и Windows junction запрещены. - Собранный frontend раздаётся FastAPI. Запуск через
python -m backend.appпривязан к127.0.0.1; access log отключён. sourcesотвечает за загрузку,processing/audio.py— за переиспользуемую подготовку локального аудио;exportingостаётся заглушкой.
Подготовка и запуск
Нужны Python 3.12, Node.js 22.12+ (проверено на 24.19), pnpm 11 и локальные FFmpeg/FFprobe. GPU и модели для этого этапа не нужны. Первичная установка зависимостей требует сети; рабочий тракт использует только локальные файлы. Запускайте команды из корня репозитория.
Windows PowerShell:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r backend/requirements-dev.txt
Copy-Item .env.example .env
Set-Location frontend
pnpm install --frozen-lockfile
pnpm build
Set-Location ..
.\.venv\Scripts\python.exe -m backend.app
Если .env уже существует, сохраните его настройки и не выполняйте повторное копирование. До запуска укажите пути к установленным программам, например:
FFMPEG_PATH=C:/Tools/ffmpeg/bin/ffmpeg.exe
FFPROBE_PATH=C:/Tools/ffmpeg/bin/ffprobe.exe
Оба файла должны существовать. Пути с пробелами допустимы: команды передаются списком аргументов без shell. Проверка установки в PowerShell:
& 'C:/Tools/ffmpeg/bin/ffmpeg.exe' -version
& 'C:/Tools/ffmpeg/bin/ffprobe.exe' -version
Без этих программ сервер и UI запускаются, но загруженная задача завершается failed с кодом ffmpeg_missing или ffprobe_missing и понятным сообщением. После настройки перезапустите сервер и загрузите запись заново.
Linux / Brev:
python3.12 -m venv .venv
.venv/bin/python -m pip install -r backend/requirements-dev.txt
cp .env.example .env
cd frontend
pnpm install --frozen-lockfile
pnpm build
cd ..
.venv/bin/python -m backend.app
Откройте http://127.0.0.1:8000. Сборку нужно выполнить до запуска backend; после первой сборки перезапустите сервер. Без сборки корневой URL возвращает 503 с пояснением. OpenAPI доступен на /openapi.json; Swagger/ReDoc отключены, чтобы не подгружать скрипты с CDN.
Для разработки frontend: в каталоге frontend выполните pnpm dev, оставив backend запущенным. Vite слушает 127.0.0.1:5173, /api проксируется на 127.0.0.1:8000. При изменении порта backend поправьте proxy в frontend/vite.config.ts.
Для удалённой машины используйте SSH-туннель с компьютера разработчика (замените USER и HOST):
ssh -N -L 127.0.0.1:8000:127.0.0.1:8000 USER@HOST
Не открывайте публичный порт и не создавайте публичную ссылку.
Конфигурация
.env.example содержит только примеры, .env исключён из Git. Существующие переменные процесса имеют приоритет. Относительные пути разрешаются от корня репозитория.
| Переменная | Назначение |
|---|---|
DATA_DIR, DATABASE_PATH | Локальный каталог и SQLite; создаются при запуске |
FRONTEND_DIST, PORT | Сборка интерфейса и порт backend; адрес запуска фиксирован на loopback |
WHISPER_MODEL_PATH | Будущий локальный каталог faster-whisper large-v3 |
PYANNOTE_MODEL_PATH | Будущий локальный каталог speaker-diarization-community-1 |
OLLAMA_BASE_URL, OLLAMA_MODEL | Будущий локальный Ollama и qwen3:8b |
FFMPEG_PATH, FFPROBE_PATH | Используемые локальные программы; имя в PATH либо абсолютный путь |
LIBREOFFICE_PATH | Будущий локальный экспорт PDF |
HF_TOKEN | Только подготовка весов; оставить пустым в рабочем окружении |
HF_HUB_OFFLINE, TRANSFORMERS_OFFLINE | Флаги будущего офлайн-запуска моделей |
Переменные моделей и LibreOffice пока документируют будущую конфигурацию: приложение не загружает модели и не обращается к Ollama. Команд загрузки моделей здесь ещё нет: они будут добавлены после реализации и проверки соответствующего этапа. До подготовки pyannote необходимо принять условия модели; токен не сохраняется в Git.
Все создаваемые пути хранения, включая DATABASE_PATH, должны находиться внутри DATA_DIR. При изменении DATA_DIR поправьте и DATABASE_PATH в .env; если переменная DATABASE_PATH не задана, база создаётся внутри выбранного DATA_DIR. Каталог встречи: DATA_DIR/<UUID>/source.<расширение>, подготовленное аудио: DATA_DIR/<UUID>/audio.wav; будущие результаты также должны храниться там. Временные multipart-файлы находятся в DATA_DIR/.uploads и закрываются после запроса. Ссылки и junction внутри хранилища не поддерживаются. Хранилище должно быть доступно на запись только доверенному локальному пользователю приложения.
При старте выполняется миграция старой таблицы задач без удаления встреч. Старые processing/ready становятся failed с кодом legacy_state, поскольку у них нет подтверждённого подготовленного WAV. Прерванные queued/preparing_audio становятся failed с кодом interrupted; автоматического повтора нет. Запускайте один экземпляр приложения, один Uvicorn worker, без --reload во время обработки.
API
PLAN.MD задаёт операции, но не URL. В каркасе выбраны следующие маршруты:
| Метод и путь | Назначение / текущее поведение |
|---|---|
GET /api/health | 200: сервер работает, processing=audio_preparation, models=not_connected |
POST /api/meetings | Multipart: file, title, необязательные meeting_date и timezone; 202 с meeting_id, ID задачи, status=queued |
GET /api/meetings/{id}/status | 200: статус, безопасные message и error_code; неизвестный ID — 404 |
GET /api/meetings/{id}/result | 200: метаданные встречи, задача, models_connected=false; транскрипта нет |
PATCH /api/meetings/{id} | Правки говорящих, реплик, поручений и флаг утверждения; 501 |
GET /api/meetings/{id}/exports/{format} | docx или pdf; 501 |
DELETE /api/meetings/{id} | Удаление встречи; 204, активная задача/небезопасный путь — 409, неизвестный ID — 404 |
Ошибки загрузки: пустой файл — 400, размер — 413, расширение — 415, неверные метаданные/multipart — 422, ошибка записи — 500. Проверка размера выполняется при чтении multipart без зависимости от Content-Length и повторяется при сохранении. Формат контейнера, аудиодорожка и длительность проверяются в фоне; ошибки видны через status/result с status=failed. Диагностика программ, приватные пути и содержимое записей в ответы не включаются. Неизвестные API-маршруты возвращают 404.
Проверка загрузки: откройте интерфейс, выберите разрешённую обезличенную запись и нажмите «Загрузить запись». При доступных программах ожидайте ready_for_models. Эквивалентный запрос из PowerShell (замените путь на существующий файл):
curl.exe -X POST http://127.0.0.1:8000/api/meetings -F "title=Проверка подготовки" -F "file=@C:/Recordings/approved.wav"
Возьмите meeting_id из ответа:
curl.exe http://127.0.0.1:8000/api/meetings/MEETING_ID/status
curl.exe http://127.0.0.1:8000/api/meetings/MEETING_ID/result
curl.exe -X DELETE http://127.0.0.1:8000/api/meetings/MEETING_ID
Проверки
.\.venv\Scripts\python.exe -m unittest discover -s backend/tests -v
Set-Location frontend
pnpm test
pnpm build
На Linux замените путь Python на .venv/bin/python. Backend-тесты создают временную SQLite и искусственные байты/тишину без речи. Они проверяют сохранение, ограничения размера/формата/длительности, ошибки FFmpeg/FFprobe, параметры конвертации, статусы, сериализацию задач, миграцию и безопасное удаление. Настоящие FFmpeg, записи, GPU и модели для тестов не нужны: запуск программ подменяется. Это не проверка качества распознавания. React-тесты проверяют отправку файла, сообщения сервера, опрос/остановку/повтор, результат и удаление. Starlette закреплён в зависимостях, поскольку локальный ограниченный multipart-парсер расширяет его API.
Временные backend-фикстуры создаются и очищаются внутри игнорируемого data/.test-tmp. Если системный диск Windows заполнен и frontend-тесты падают с ENOSPC, перед их запуском задайте TEMP/TMP для текущего PowerShell из корня проекта:
New-Item -ItemType Directory -Force data/.test-tmp | Out-Null
$env:TEMP = (Resolve-Path data/.test-tmp).Path
$env:TMP = $env:TEMP
Это меняет окружение только текущего процесса PowerShell и его дочерних программ.
Следующие этапы
- Подготовить локальные веса Whisper large-v3 в формате CTranslate2 для faster-whisper по
WHISPER_MODEL_PATH, включая конфигурацию и токенизатор. - Подготовить полный локальный комплект
pyannote/speaker-diarization-community-1поPYANNOTE_MODEL_PATH: конфигурацию и все используемые веса. Принять условия модели на этапе подготовки; в рабочем тракте токен и сеть не нужны. Установить совместимые faster-whisper/CTranslate2, pyannote.audio/PyTorch и GPU runtime. Реализовать ASR и диаризацию с временными метками, объединение по времени и проверку работы без сети на согласованных русской, казахской и смешанной записях. Никаких live-адаптеров и WebSocket в первой версии. - Ollama: структурированные темы, факты, проблемы, поручения. Проверять ссылки на реплики, неоднозначности и сроки; говорящий и ответственный — отдельные сущности. Нормализовать относительный срок только при известной дате и часовом поясе, сохраняя исходную формулировку.
- Реальное сохранение правок, сопоставление имён, утверждение и переход к месту записи; подключить UI к рабочим API.
- DOCX через python-docx и PDF через локальный LibreOffice только из утверждённого состояния. Синие заголовки, светлые шапки таблиц, темы и приложение-транскрипт; проверить длинный текст, кириллицу и казахские символы.
- Расширять миграции и тесты при подключении новых результатов. Удаление каталога встречи и связанных строк уже реализовано.
- Проверить три согласованные обезличенные записи: русскую, казахскую, смешанную. При необходимости сравнить распознавание с локальной Sybyrla по плану.
Ограничения и закрытый контур
ASR, диаризация, LLM-анализ, редактирование и оба экспорта отсутствуют. Подготовка аудио требует установленного FFmpeg/FFprobe. Одна задача обрабатывается за раз; отдельной очереди и отмены нет. Тайм-аут FFprobe — 30 секунд, FFmpeg — 300 секунд. Список прошлых встреч и восстановление выбранной встречи в UI после обновления страницы пока отсутствуют; сохранённая встреча доступна по API с её UUID. Файловая система и SQLite не образуют общей транзакции: при ошибке удаления строка сохраняется, удаление можно повторить. При аварийном завершении процесса во время загрузки может потребоваться ручная очистка неполного каталога.
Для будущего полного тракта план требует GPU от 22 ГБ VRAM, RAM от 32 ГБ и 60 ГБ свободного диска (A10G/L4 или лучше). Проверки GPU и моделей в этой сессии не выполнялись. При нехватке VRAM этапы должны последовательно освобождать GPU.
Аудио, транскрипты, саммари и поручения не отправляются во внешние AI/API и не пишутся в логи. Brev — облачная демонстрационная среда, не закрытый контур заказчика; допускаются только обезличенные и согласованные записи. Для закрытого контура заранее подготовьте зависимости, веса и шрифты и проверьте работу при заблокированном исходящем доступе. Аутентификация, live-конференции, рассылки, СЭД, дашборд исполнения и голосовая идентификация не реализованы.
Авторы коммитов
История коммитов
- 2026-09-23 17:56docs: direct judges to the working project archiveoleg-berger
- 2026-09-23 17:54build: refresh jury submission archiveoleg-berger
- 2026-09-23 17:54docs: point judges to the submission archiveoleg-berger
- 2026-09-23 17:52feat: finalize review workflow and secure offline deploymentoleg-berger
- 2026-09-23 17:51build: add jury submission archiveoleg-berger
- 2026-09-23 17:50docs: add jury quick-start guideoleg-berger
- 2026-09-23 17:47feat: завершить проверку транскрипта и подготовку к серверному прогонуoleg-berger
- 2026-09-23 17:45updatesoleg-berger
Все коммиты (19)
- 2026-09-23 17:29feat: add human review and local DOCX/PDF exportoleg-berger
- 2026-09-23 17:09Add dockeroleg-berger
- 2026-09-23 17:02feat: добавить локальный анализ транскрипта через Ollama - Интегрировать Qwen3:8b с проверкой JSON и ссылок на реплики. - Сохранять саммари, темы, проблемы и поручения в SQLite. - Добавить статус analoleg-berger
- 2026-09-23 16:56feat: добавить локальную транскрипцию и диаризациюoleg-berger
- 2026-09-23 16:56feat: add local transcript, diarization and meeting analysisoleg-berger
- 2026-09-23 16:55updateoleg-berger
- 2026-09-23 15:23Реализована локальная загрузка и подготовка аудио - Сохранение встреч в SQLite и UUID-каталогах. - Проверка формата, размера до 200 МБ и длительности до 15 минут. - Подготовка WAV mono/16 кГц/PCM 16-boleg-berger
- 2026-09-23 14:47A frame was builtoleg-berger
- 2026-09-23 14:14make planoleg-berger
- 2026-09-23 10:29doleg-berger
- 2026-09-23 10:28testoleg-berger
Структура репозитория (197 файлов)
.env.example .gitignore AGENTS.md HackAlem-jury-submission.zip PLAN.MD README.md _jury-archive-check/hackalem-prototype/.dockerignore _jury-archive-check/hackalem-prototype/.env.example _jury-archive-check/hackalem-prototype/.gitignore _jury-archive-check/hackalem-prototype/AGENTS.md _jury-archive-check/hackalem-prototype/Dockerfile _jury-archive-check/hackalem-prototype/PLAN.MD _jury-archive-check/hackalem-prototype/README.md _jury-archive-check/hackalem-prototype/RUNBOOK.md _jury-archive-check/hackalem-prototype/backend/__init__.py _jury-archive-check/hackalem-prototype/backend/app/__init__.py _jury-archive-check/hackalem-prototype/backend/app/__main__.py _jury-archive-check/hackalem-prototype/backend/app/api.py _jury-archive-check/hackalem-prototype/backend/app/config.py _jury-archive-check/hackalem-prototype/backend/app/database.py _jury-archive-check/hackalem-prototype/backend/app/errors.py _jury-archive-check/hackalem-prototype/backend/app/exporting/__init__.py _jury-archive-check/hackalem-prototype/backend/app/exporting/documents.py _jury-archive-check/hackalem-prototype/backend/app/main.py _jury-archive-check/hackalem-prototype/backend/app/processing/__init__.py _jury-archive-check/hackalem-prototype/backend/app/processing/adapters.py _jury-archive-check/hackalem-prototype/backend/app/processing/alignment.py _jury-archive-check/hackalem-prototype/backend/app/processing/analysis.py _jury-archive-check/hackalem-prototype/backend/app/processing/audio.py _jury-archive-check/hackalem-prototype/backend/app/processing/contracts.py _jury-archive-check/hackalem-prototype/backend/app/processing/deadlines.py _jury-archive-check/hackalem-prototype/backend/app/processing/offline.py _jury-archive-check/hackalem-prototype/backend/app/processing/ollama.py _jury-archive-check/hackalem-prototype/backend/app/repository.py _jury-archive-check/hackalem-prototype/backend/app/schema.sql _jury-archive-check/hackalem-prototype/backend/app/schemas.py _jury-archive-check/hackalem-prototype/backend/app/service.py _jury-archive-check/hackalem-prototype/backend/app/sources/__init__.py _jury-archive-check/hackalem-prototype/backend/app/sources/media.py _jury-archive-check/hackalem-prototype/backend/app/sources/multipart.py _jury-archive-check/hackalem-prototype/backend/app/sources/storage.py _jury-archive-check/hackalem-prototype/backend/requirements-dev.txt _jury-archive-check/hackalem-prototype/backend/requirements-ml.txt _jury-archive-check/hackalem-prototype/backend/requirements.txt _jury-archive-check/hackalem-prototype/backend/tests/__init__.py _jury-archive-check/hackalem-prototype/backend/tests/helpers.py _jury-archive-check/hackalem-prototype/backend/tests/test_alignment.py _jury-archive-check/hackalem-prototype/backend/tests/test_analysis_pipeline.py _jury-archive-check/hackalem-prototype/backend/tests/test_api.py _jury-archive-check/hackalem-prototype/backend/tests/test_audio.py _jury-archive-check/hackalem-prototype/backend/tests/test_container.py _jury-archive-check/hackalem-prototype/backend/tests/test_deadlines.py _jury-archive-check/hackalem-prototype/backend/tests/test_documents.py _jury-archive-check/hackalem-prototype/backend/tests/test_media.py _jury-archive-check/hackalem-prototype/backend/tests/test_ml_adapters.py _jury-archive-check/hackalem-prototype/backend/tests/test_ml_pipeline.py _jury-archive-check/hackalem-prototype/backend/tests/test_ollama.py _jury-archive-check/hackalem-prototype/backend/tests/test_review.py _jury-archive-check/hackalem-prototype/backend/tests/test_skeleton.py _jury-archive-check/hackalem-prototype/backend/tests/test_storage.py _jury-archive-check/hackalem-prototype/backend/tests/test_transcript_edits.py _jury-archive-check/hackalem-prototype/backend/tests/test_worker.py _jury-archive-check/hackalem-prototype/compose.yaml _jury-archive-check/hackalem-prototype/docker/healthcheck.py _jury-archive-check/hackalem-prototype/docker/start.py _jury-archive-check/hackalem-prototype/frontend/index.html _jury-archive-check/hackalem-prototype/frontend/package.json _jury-archive-check/hackalem-prototype/frontend/pnpm-lock.yaml _jury-archive-check/hackalem-prototype/frontend/pnpm-workspace.yaml _jury-archive-check/hackalem-prototype/frontend/src/App.test.tsx _jury-archive-check/hackalem-prototype/frontend/src/App.tsx _jury-archive-check/hackalem-prototype/frontend/src/ReviewControls.test.tsx _jury-archive-check/hackalem-prototype/frontend/src/ReviewControls.tsx _jury-archive-check/hackalem-prototype/frontend/src/TranscriptEditor.tsx _jury-archive-check/hackalem-prototype/frontend/src/api.test.ts _jury-archive-check/hackalem-prototype/frontend/src/api.ts _jury-archive-check/hackalem-prototype/frontend/src/main.tsx _jury-archive-check/hackalem-prototype/frontend/src/styles.css _jury-archive-check/hackalem-prototype/frontend/tsconfig.json _jury-archive-check/hackalem-prototype/frontend/vite.config.ts _jury-archive-check/hackalem-prototype/frontend/vitest.config.ts backend/__init__.py backend/app/__init__.py backend/app/__main__.py backend/app/api.py backend/app/config.py backend/app/database.py backend/app/errors.py backend/app/exporting/__init__.py backend/app/main.py backend/app/processing/__init__.py backend/app/processing/audio.py backend/app/repository.py backend/app/schema.sql backend/app/schemas.py backend/app/service.py backend/app/sources/__init__.py backend/app/sources/multipart.py backend/app/sources/storage.py backend/requirements-dev.txt backend/requirements.txt backend/tests/__init__.py backend/tests/helpers.py backend/tests/test_api.py backend/tests/test_audio.py backend/tests/test_skeleton.py backend/tests/test_storage.py backend/tests/test_worker.py frontend/index.html frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml frontend/src/App.test.tsx frontend/src/App.tsx frontend/src/api.test.ts frontend/src/api.ts frontend/src/main.tsx frontend/src/styles.css frontend/tsconfig.json frontend/vite.config.ts frontend/vitest.config.ts hack-66a8613c-overfitting/.dockerignore hack-66a8613c-overfitting/.env.example hack-66a8613c-overfitting/.gitignore hack-66a8613c-overfitting/AGENTS.md hack-66a8613c-overfitting/Dockerfile hack-66a8613c-overfitting/PLAN.MD hack-66a8613c-overfitting/README.md hack-66a8613c-overfitting/RUNBOOK.md hack-66a8613c-overfitting/backend/__init__.py hack-66a8613c-overfitting/backend/app/__init__.py hack-66a8613c-overfitting/backend/app/__main__.py hack-66a8613c-overfitting/backend/app/api.py hack-66a8613c-overfitting/backend/app/config.py hack-66a8613c-overfitting/backend/app/database.py hack-66a8613c-overfitting/backend/app/errors.py hack-66a8613c-overfitting/backend/app/exporting/__init__.py hack-66a8613c-overfitting/backend/app/exporting/documents.py hack-66a8613c-overfitting/backend/app/main.py hack-66a8613c-overfitting/backend/app/processing/__init__.py hack-66a8613c-overfitting/backend/app/processing/adapters.py hack-66a8613c-overfitting/backend/app/processing/alignment.py hack-66a8613c-overfitting/backend/app/processing/analysis.py hack-66a8613c-overfitting/backend/app/processing/audio.py hack-66a8613c-overfitting/backend/app/processing/contracts.py hack-66a8613c-overfitting/backend/app/processing/deadlines.py hack-66a8613c-overfitting/backend/app/processing/offline.py hack-66a8613c-overfitting/backend/app/processing/ollama.py hack-66a8613c-overfitting/backend/app/repository.py hack-66a8613c-overfitting/backend/app/schema.sql hack-66a8613c-overfitting/backend/app/schemas.py hack-66a8613c-overfitting/backend/app/service.py hack-66a8613c-overfitting/backend/app/sources/__init__.py hack-66a8613c-overfitting/backend/app/sources/media.py hack-66a8613c-overfitting/backend/app/sources/multipart.py hack-66a8613c-overfitting/backend/app/sources/storage.py hack-66a8613c-overfitting/backend/requirements-dev.txt hack-66a8613c-overfitting/backend/requirements-ml.txt hack-66a8613c-overfitting/backend/requirements.txt hack-66a8613c-overfitting/backend/tests/__init__.py hack-66a8613c-overfitting/backend/tests/helpers.py hack-66a8613c-overfitting/backend/tests/test_alignment.py hack-66a8613c-overfitting/backend/tests/test_analysis_pipeline.py hack-66a8613c-overfitting/backend/tests/test_api.py hack-66a8613c-overfitting/backend/tests/test_audio.py hack-66a8613c-overfitting/backend/tests/test_container.py hack-66a8613c-overfitting/backend/tests/test_deadlines.py hack-66a8613c-overfitting/backend/tests/test_documents.py hack-66a8613c-overfitting/backend/tests/test_media.py hack-66a8613c-overfitting/backend/tests/test_ml_adapters.py hack-66a8613c-overfitting/backend/tests/test_ml_pipeline.py hack-66a8613c-overfitting/backend/tests/test_ollama.py hack-66a8613c-overfitting/backend/tests/test_review.py hack-66a8613c-overfitting/backend/tests/test_skeleton.py hack-66a8613c-overfitting/backend/tests/test_storage.py hack-66a8613c-overfitting/backend/tests/test_transcript_edits.py hack-66a8613c-overfitting/backend/tests/test_worker.py hack-66a8613c-overfitting/compose.yaml hack-66a8613c-overfitting/docker/healthcheck.py hack-66a8613c-overfitting/docker/start.py hack-66a8613c-overfitting/frontend/index.html hack-66a8613c-overfitting/frontend/package.json hack-66a8613c-overfitting/frontend/pnpm-lock.yaml hack-66a8613c-overfitting/frontend/pnpm-workspace.yaml hack-66a8613c-overfitting/frontend/src/App.test.tsx hack-66a8613c-overfitting/frontend/src/App.tsx hack-66a8613c-overfitting/frontend/src/ReviewControls.test.tsx hack-66a8613c-overfitting/frontend/src/ReviewControls.tsx hack-66a8613c-overfitting/frontend/src/TranscriptEditor.tsx hack-66a8613c-overfitting/frontend/src/api.test.ts hack-66a8613c-overfitting/frontend/src/api.ts hack-66a8613c-overfitting/frontend/src/main.tsx hack-66a8613c-overfitting/frontend/src/styles.css hack-66a8613c-overfitting/frontend/tsconfig.json hack-66a8613c-overfitting/frontend/vite.config.ts hack-66a8613c-overfitting/frontend/vitest.config.ts hackalem-source.tar.gz
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.