Фоновые задачи: плейлисты, длинные лекции, вкладка настроек
- таблица 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>
This commit is contained in:
59
api/route/app_settings.py
Normal file
59
api/route/app_settings.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""Настройки приложения (LLM-ключи, дефолты пайплайна) — живут в Postgres,
|
||||
переживают перезапуск контейнеров и перезагрузку страницы.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter
|
||||
from pydantic import BaseModel
|
||||
|
||||
from api.db.setting import get_all_settings, set_settings
|
||||
|
||||
|
||||
router = APIRouter(prefix="/settings", tags=["settings"])
|
||||
|
||||
_KEYS = (
|
||||
"llm_base_url",
|
||||
"llm_api_key",
|
||||
"llm_model",
|
||||
"summary_max_sentences",
|
||||
"keep_video",
|
||||
"vosk_model_path",
|
||||
)
|
||||
|
||||
|
||||
class SettingsPayload(BaseModel):
|
||||
llm_base_url: str | None = None
|
||||
llm_api_key: str | None = None
|
||||
llm_model: str | None = None
|
||||
summary_max_sentences: int | None = None
|
||||
keep_video: bool | None = None
|
||||
vosk_model_path: str | None = None
|
||||
|
||||
|
||||
@router.get("/")
|
||||
async def get_settings():
|
||||
db = await get_all_settings()
|
||||
return {
|
||||
"llm_base_url": db.get("llm_base_url", ""),
|
||||
"llm_api_key": db.get("llm_api_key", ""),
|
||||
"llm_model": db.get("llm_model", ""),
|
||||
"summary_max_sentences": int(db.get("summary_max_sentences") or 15),
|
||||
"keep_video": db.get("keep_video", "1") != "0",
|
||||
"vosk_model_path": db.get("vosk_model_path", "models/vosk-model-small-ru-0.22"),
|
||||
}
|
||||
|
||||
|
||||
@router.put("/")
|
||||
async def put_settings(body: SettingsPayload):
|
||||
values: dict[str, str] = {}
|
||||
for key in _KEYS:
|
||||
v = getattr(body, key)
|
||||
if v is None:
|
||||
continue
|
||||
if key == "keep_video":
|
||||
values[key] = "1" if v else "0"
|
||||
else:
|
||||
values[key] = str(v)
|
||||
if values:
|
||||
await set_settings(values)
|
||||
return await get_settings()
|
||||
Reference in New Issue
Block a user