# 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/` (`.txt` — полный текст, `_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`.