Files
LLM-infa/README.md
jze9 e87f6cd215 Фоновые задачи: плейлисты, длинные лекции, вкладка настроек
- таблица 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>
2026-07-14 15:01:11 +05:00

91 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`.