- таблица jobs + очередь с воркером: POST /jobs сразу отвечает, элементы
плейлиста обрабатываются последовательно, есть отмена и живой прогресс
(скачивание %, минуты распознанного Vosk-аудио)
- expand_url: плейлист раскрывается в список видео
- keep_video=false теперь качает только аудио (для 4-5ч лекций)
- настройки (LLM-ключ, модель, длина выжимки, хранение видео, путь Vosk)
хранятся в Postgres: переживают перезапуск и перезагрузку страницы
- длина выжимки прокидывается в LLM-промпт ({n} предложений)
- UI: вкладки «Главная»/«Настройки», карточка задач с автообновлением
каждые 3 сек, прогресс-бар, отмена, библиотека обновляется по мере
готовности элементов
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
91 lines
4.4 KiB
Markdown
91 lines
4.4 KiB
Markdown
# LLM-infa
|
||
|
||
Пайплайн: **YouTube → скачивание видео → текст речи → LLM-выжимка → Postgres**.
|
||
|
||
Скачивает видео (yt-dlp), достаёт текст из субтитров (или распознаёт речь через Vosk,
|
||
если субтитров нет), сокращает текст до краткой выжимки (через любой
|
||
OpenAI-совместимый LLM API или встроенный экстрактивный алгоритм) и складывает всё
|
||
в базу: пути к видео, полному тексту и выжимке.
|
||
|
||
## Состав
|
||
|
||
| Сервис | Порт | Что делает |
|
||
|--------|------|------------|
|
||
| `api` | 8000 | FastAPI: пайплайн, каталог видео, проверка LLM |
|
||
| `web` | 8550 | Flet UI: запуск пайплайна и библиотека результатов |
|
||
| `db` | 5433→5432 | Postgres 15, таблица `videos` |
|
||
|
||
Файлы складываются в `data/videos/` (mp4) и `data/text/` (`<uuid>.txt` — полный
|
||
текст, `<uuid>_summary.txt` — выжимка); в БД хранятся пути и метаданные.
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
# 1. Модель Vosk для распознавания без субтитров (однократно, ~90 МБ)
|
||
mkdir -p models && cd models
|
||
curl -LO https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip
|
||
unzip vosk-model-small-ru-0.22.zip && rm vosk-model-small-ru-0.22.zip && cd ..
|
||
|
||
# 2. Поднять стек
|
||
docker compose up -d --build
|
||
```
|
||
|
||
UI: http://localhost:8550 · API-доки: http://localhost:8000/docs
|
||
|
||
## LLM для выжимки
|
||
|
||
LLM не разворачивается в контейнере — указывается любой внешний
|
||
OpenAI-совместимый эндпоинт. Два способа:
|
||
|
||
1. **В `.env`** (используется по умолчанию для всех запросов):
|
||
```
|
||
LLM_BASE_URL=https://openrouter.ai/api/v1
|
||
LLM_API_KEY=sk-...
|
||
LLM_MODEL=anthropic/claude-haiku-4.5
|
||
```
|
||
2. **Через UI / поле `llm` в запросе** — на каждый запрос отдельно.
|
||
|
||
Если LLM не настроена, работает встроенная экстрактивная суммаризация
|
||
(выбор ключевых предложений, без нейросети).
|
||
|
||
## Плейлисты и длинные лекции
|
||
|
||
Обработка идёт через фоновые задачи: `POST /jobs` сразу возвращает id, элементы
|
||
плейлиста обрабатываются по очереди, прогресс виден в UI (скачивание %,
|
||
минуты распознанного аудио, номер видео в плейлисте). Если в настройках
|
||
выключено «Сохранять видео», для лекций качается только аудиодорожка —
|
||
в разы быстрее и легче.
|
||
|
||
Настройки (ключ LLM, модель, длина выжимки, хранение видео) сохраняются
|
||
в Postgres — переживают перезапуск контейнеров и перезагрузку страницы.
|
||
Вкладка «Настройки» в UI.
|
||
|
||
## API
|
||
|
||
```bash
|
||
# фоновая задача: видео или плейлист
|
||
curl -X POST localhost:8000/jobs/ \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{"url": "https://www.youtube.com/playlist?list=..."}'
|
||
curl localhost:8000/jobs/ # статусы и прогресс
|
||
|
||
# синхронно, одно видео (для коротких роликов)
|
||
curl -X POST localhost:8000/pipeline/process \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{"url": "https://youtu.be/...", "summary_max_sentences": 10}'
|
||
|
||
# каталог обработанных видео (фильтры: ?q=, ?section_id=, ?method=)
|
||
curl localhost:8000/videos/
|
||
|
||
# настройки
|
||
curl -X PUT localhost:8000/settings/ -H 'Content-Type: application/json' \
|
||
-d '{"llm_base_url": "https://openrouter.ai/api/v1", "llm_api_key": "sk-...", "llm_model": "..."}'
|
||
```
|
||
|
||
## Заметки
|
||
|
||
- Старый код (users/subscriptions/media-convert) лежит в `api_legacy/` и в
|
||
сборку не входит.
|
||
- Если Docker Desktop не тянет образы (TLS timeout к registry), использовать
|
||
системный демон: `docker context use default`.
|