server/docs/features/live_ai_assistent.md
vegard 4b56560bf9 Lokalt utviklingsmiljø, Whisper-benchmark, AI Gateway og repostruktur
- Sett opp docker-compose.dev.yml med PostgreSQL, Redis, Caddy og Whisper
- Benchmarket faster-whisper (small/medium/large-v3) med norsk tale
- Besluttet medium + initial_prompt som standard, SRT som master-format
- Ny feature-spec: AI Gateway (LiteLLM) med BYOK og Promptfoo-testing
- Definert dataklassifisering (kritisk/gjenskapbar/avledet/flyktig)
- Konkretisert backup-strategi med pg_dump, rsync og restore-prosedyre
- Splittet repos: sidelinja/server (kode) + sidelinja/sidelinja (innhold)
- Oppdatert lokal.md: utviklingsmiljø for kode, ikke prod-replika
- Dokumentert transkripsjonspipeline: Whisper SRT → Git → PG (avledet)
- Live AI-assistent: small-modell, flyktig logg med 30d TTL

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 14:51:15 +01:00

2.9 KiB

Feature Spec: Live AI-Assistent i Studio

Filsti: docs/features/live_ai_assistent.md

1. Konsept

En "virtuell co-host" som lytter på innspillingen i sanntid. Når programlederne nevner spesifikke personer eller organisasjoner, slår systemet opp i Kunnskapsgrafen og dytter relevante "Faktoider" til skjermen deres umiddelbart.

2. Arkitektur & Dataflyt

Denne funksjonen krever lav forsinkelse og asynkron prosessering.

  1. Lydkilde (SvelteKit + LiveKit): SvelteKit-appen bruker livekit-client. I tillegg til å sende høykvalitetslyd til de andre deltakerne, rutes en komprimert lydstrøm (via WebSockets eller LiveKit sine egne server-side hooks) til en lokal Rust-tjeneste.
  2. Transkripsjon (Rust + Whisper): Rust-tjenesten mater lyden inn i faster-whisper-server (Systran/faster-whisper-small) i chunks på ~5 sekunder. small er valgt for latency — den prosesserer ~5x raskere enn sanntid, noe som gir <1s forsinkelse per chunk. Ingen initial_prompt — hastighet prioriteres over navnenøyaktighet.
  3. Entity Extraction & Oppslag (Rust + PostgreSQL): Rust-tjenesten analyserer tekststrømmen for egennavn (Named Entity Recognition). Den gjør et lynraskt asynkront oppslag i PostgreSQL: SELECT * FROM factoids JOIN actors... WHERE actor.name = $1.
  4. Sanntids-Push (SpacetimeDB): Hvis et treff finnes, dytter Rust-tjenesten faktoiden inn i SpacetimeDB som et event: LiveFactoidEvent.
  5. Visning (SvelteKit): Studio-grensesnittet lytter på SpacetimeDB. Når LiveFactoidEvent inntreffer, popper faktoiden lydløst opp i en egen boks på skjermen.

2.1 Lagringsstrategi

Live-transkripsjonen er flyktig arbeidsdata — ikke en del av det permanente datasettet. Den lagres i PostgreSQL som en feilsøkingslogg med TTL (standard 30 dager, konfigurerbart):

live_transcription_log (
    id SERIAL,
    session_id UUID,        -- knytter chunks til en innspillingssesjon
    chunk_timestamp TIMESTAMPTZ,
    chunk_text TEXT,
    matched_entities TEXT[], -- hvilke entiteter NER fant
    pushed_factoids UUID[], -- hvilke faktoider ble pushet til frontend
    created_at TIMESTAMPTZ DEFAULT now()
)

En nattlig jobbkø-jobb sletter rader eldre enn TTL. Dette gir mulighet til å feilsøke kjeden chunk → entity match → factoid push ("hvorfor dukket den faktoiden opp?") uten å akkumulere data over tid.

Den endelige, kvalitetssikrede transkripsjonen av hele episoden lages etterpå via medium + initial_prompt gjennom Podcastfabrikkens pipeline (se podcastfabrikken.md).

3. Utviklingsfaser (For Claude Code)

  • Fase 1: Ikke bygg live-lyd enda. Bygg funksjonaliteten der grensesnittet lytter på SpacetimeDB, og lag et dummy-script i Rust som dytter test-faktoider inn i SpacetimeDB for å verifisere UI-et.
  • Fase 2: Koble Whisper til et offline lydopptak og kjør NER/oppslag mot PostgreSQL.
  • Fase 3: Koble sammen LiveKit-strømmen og Whisper.