AAYMA
RU
Войти

HackAlem AI — локальное автопротоколирование совещаний

Полностью офлайн-система протоколирования совещаний: загрузка записи, подготовка аудио, локальная транскрипция и диаризация, анализ через Ollama…

Рабочий MVP
Команда «Overfitting» 6💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

HackAlem 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/health200: сервер работает, processing=audio_preparation, models=not_connected
POST /api/meetingsMultipart: file, title, необязательные meeting_date и timezone; 202 с meeting_id, ID задачи, status=queued
GET /api/meetings/{id}/status200: статус, безопасные message и error_code; неизвестный ID — 404
GET /api/meetings/{id}/result200: метаданные встречи, задача, 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 и его дочерних программ.

Следующие этапы

  1. Подготовить локальные веса Whisper large-v3 в формате CTranslate2 для faster-whisper по WHISPER_MODEL_PATH, включая конфигурацию и токенизатор.
  2. Подготовить полный локальный комплект pyannote/speaker-diarization-community-1 по PYANNOTE_MODEL_PATH: конфигурацию и все используемые веса. Принять условия модели на этапе подготовки; в рабочем тракте токен и сеть не нужны. Установить совместимые faster-whisper/CTranslate2, pyannote.audio/PyTorch и GPU runtime. Реализовать ASR и диаризацию с временными метками, объединение по времени и проверку работы без сети на согласованных русской, казахской и смешанной записях. Никаких live-адаптеров и WebSocket в первой версии.
  3. Ollama: структурированные темы, факты, проблемы, поручения. Проверять ссылки на реплики, неоднозначности и сроки; говорящий и ответственный — отдельные сущности. Нормализовать относительный срок только при известной дате и часовом поясе, сохраняя исходную формулировку.
  4. Реальное сохранение правок, сопоставление имён, утверждение и переход к месту записи; подключить UI к рабочим API.
  5. DOCX через python-docx и PDF через локальный LibreOffice только из утверждённого состояния. Синие заголовки, светлые шапки таблиц, темы и приложение-транскрипт; проверить длинный текст, кириллицу и казахские символы.
  6. Расширять миграции и тесты при подключении новых результатов. Удаление каталога встречи и связанных строк уже реализовано.
  7. Проверить три согласованные обезличенные записи: русскую, казахскую, смешанную. При необходимости сравнить распознавание с локальной 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-конференции, рассылки, СЭД, дашборд исполнения и голосовая идентификация не реализованы.

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

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

oleg-berger 20

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

  • 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 комментариев

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

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