Source code for audia.ui.routes.settings

"""
/api/settings – Persist and retrieve user-configured pipeline settings.
Settings are stored in the SQLite DB as key-value pairs so they survive
server restarts and are pre-loaded by the frontend on every page open.
All endpoints accept an optional ?project= query parameter (defaults to "default").
"""

from __future__ import annotations

from fastapi import APIRouter, Query
from fastapi.responses import JSONResponse
from pydantic import BaseModel

from audia.config import DEFAULT_PROJECT
from audia.storage import get_session
from audia.storage.models import UserSetting

router = APIRouter()

_DEFAULTS: dict[str, str] = {
    "stt_model": "whisper-large-v3",
    "llm1_provider": "Anthropic",
    "llm1_model": "claude-opus-4-6",
    "llm2_provider": "Anthropic",
    "llm2_model": "claude-opus-4-6",
    "tts_backend": "edge-tts",
    "tts_voice": "en-US-AriaNeural",
}


def _proj(project: str | None) -> str:
    return (project or DEFAULT_PROJECT).strip() or DEFAULT_PROJECT


[docs] class SettingsBody(BaseModel): stt_model: str | None = None llm1_provider: str | None = None llm1_model: str | None = None llm2_provider: str | None = None llm2_model: str | None = None tts_backend: str | None = None tts_voice: str | None = None
@router.get("", summary="Get saved UI pipeline settings") async def get_ui_settings(project: str | None = Query(None)) -> JSONResponse: """Return the user-saved pipeline settings merged with defaults.""" with get_session(_proj(project)) as session: rows = session.query(UserSetting).all() stored = {r.key: r.value for r in rows} return JSONResponse({**_DEFAULTS, **stored}) @router.put("", summary="Save UI pipeline settings") async def save_ui_settings(body: SettingsBody, project: str | None = Query(None)) -> JSONResponse: """Persist the provided settings; omitted fields are left unchanged.""" updates = body.model_dump(exclude_none=True) with get_session(_proj(project)) as session: for key, value in updates.items(): row = session.get(UserSetting, key) if row: row.value = str(value) else: session.add(UserSetting(key=key, value=str(value))) session.commit() return JSONResponse({"saved": True})