# Дьяк — система управления протоколами встреч Frappe 16 приложение для загрузки аудиозаписей встреч, автоматической транскрибации и диаризации (через внешний микросервис) и структурированного ведения протокола. ## Установка > Предполагается, что Frappe 16 + bench уже установлен. ```bash # 1. Положить эту папку (`dyak/`) в `frappe-bench/apps/` cd ~/frappe-bench/apps # (скопируйте/распакуйте сюда содержимое архива — должен получиться # каталог frappe-bench/apps/dyak/ с setup.py внутри) # 2. Зарегистрировать приложение в bench cd ~/frappe-bench bench --site <ваш_сайт> install-app dyak # 3. Применить фикстуры (создаёт роль Dyak User) bench --site <ваш_сайт> migrate # 4. (опционально) собрать assets bench build --app dyak # 5. Перезапустить bench restart ``` После установки в Desk появится модуль **Дьяк** с doctype'ами: * **Meeting Record** (`MR-YYYY-#####`) — основной документ встречи. * **Dyak Settings** (Singleton) — настройки сервиса транскрибации и LLM. * 8 child-tables: Meeting Participant, Action Item, Decision, Problem, Open Question, Schedule Change, Help Request, External Reference. ## Конфигурация В **Dyak Settings** заполните: | Поле | Значение по умолчанию | | --- | --- | | URL сервиса | `http://192.168.1.112:8000` | | Модель Whisper | `large-v3` | | Язык | `ru` | | Подсказка | (термины, разделённые запятыми) | | Количество спикеров | `0` (автоопределение) | ## Поток работы ``` Черновик └─[кнопка «Транскрибировать»]──▶ В обработке └─(background job)──────▶ Расшифровано ├─[кнопка «Назначить спикеров»] ├─[AI: задачи / резюме / анализ — заглушки] └─[кнопка «На проверку»]──────▶ Проверено └─[«Утвердить»]──▶ Утверждено ``` При ошибке транскрибации статус возвращается в **Черновик**, трейсбек пишется в Error Log. ## Архитектура ``` dyak/ ├── api/ │ ├── transcribe.py # whitelisted transcribe() + фоновый _run_transcription() │ └── ai.py # заглушки extract_action_items, generate_summary, analyze_meeting ├── dyak/doctype/ │ ├── meeting_record/ # JSON + .py + .js (формовая логика) │ ├── dyak_settings/ # Singleton с настройками │ └── meeting_<...>/ # 8 child-tables └── hooks.py ``` ### Микросервис транскрибации `POST {service_url}/process` — multipart/form-data: ``` file аудиофайл language ru код языка initial_prompt str подсказка (опц.) num_speakers int 0 = auto model str tiny|base|...|large-v3|turbo (опц.) ``` Ответ: ```json { "language": "ru", "duration": 197.6, "processing_time": 18.2, "speakers": {"SPEAKER_01": 113.5, "SPEAKER_02": 41.2}, "num_speakers": 3, "utterances": [ {"speaker": "SPEAKER_01", "start": 0.0, "end": 94.6, "text": "..."} ] } ``` Полный ответ кладётся в `Meeting Record.utterances_json` и используется для рендеринга чат-диалога с цветами по спикерам. ## Точки расширения * `dyak/api/ai.py` — заменить `msgprint` на реальные LLM-вызовы (Anthropic/OpenAI/Ollama по `Dyak Settings.llm_provider`), заполняющие `summary`, `action_items`, `decisions`, `problems`, `open_questions`, `help_requests`, `external_references`, `meeting_topics`, `meeting_mood`. * Расписание автоматической транскрибации сразу после загрузки — можно добавить через `doc_events` в `hooks.py` (например, `Meeting Record: after_insert`).