AI Pipeline
Dokumentasjon av Impulse AI sin AI-pipeline — fra workload-registrering og modellvalg til prompt-design og kostnadsovervaking. All AI-funksjonalitet drives av Anthropic Claude (via Vercel AI SDK) for tekstgenerering og Voyage AI for embedding-generering.
Arkitekturoversikt
heading.anchorLabelapps/api/src/ai/├── infrastructure/ # AI SDK, Anthropic-konfigurasjon, Voyage-klient│ ├── ai-sdk.ts # Vercel AI SDK wrapper med logging og tracking│ ├── anthropic/│ │ └── config.ts # Modell-IDer, priser, timeouts, token-grenser│ ├── voyage/│ │ ├── client.ts # Voyage AI HTTP-klient│ │ └── embedding.ts # Embedding-tjeneste (generering + sok)│ ├── access/ # Tier-basert tilgangskontroll│ ├── tracking/ # Brukssporing til ai_usage-tabell│ └── safety/ # Innholdsvalidering├── registry/│ ├── workloads.ts # Sentralt register over alle AI-workloads│ ├── types.ts # WorkloadType, WorkloadConfig, ModelTier│ └── service.ts # Workload-utforing├── shared/│ ├── prompt-builder.ts # Prompt-konstruksjon med konvensjoner│ ├── conventions.ts # Spraklige og stilistiske regler│ ├── static-labels.ts # Statiske stegnavn (fallback)│ ├── schemas/ # Zod-skjemaer for strukturerte outputs│ └── concept-types.ts # Domene-spesifikke konsepttyper├── impulses/│ └── classification/ # Impulsklassifisering og anrikning├── sessions/│ ├── step-guidance.ts # 5-stegs veiledningsgenerering│ └── session-summary.ts # Oppsummeringsgenerering├── check-ins/│ └── assessment/ # Sjekk-inn AI-vurdering└── insights/ ├── pulse.ts # Pulsanalyse (rask regenerering) ├── narrative.ts # Narrativ innsikt (dypere analyse) ├── embedding-analytics.ts # Embedding-basert monstergjenkjenning └── transformation-distillation.ts # TransformasjonsekstraktModellvalg
heading.anchorLabelAI-konfigurasjon er sentralisert i apps/api/src/ai/infrastructure/anthropic/config.ts. Alle modell-tier defaulter til Claude Sonnet 4.6, med mulighet for override via miljøvariabler.
Tre modell-tier
heading.anchorLabel| Tier | Standard modell | Formaal | Override-variabel |
|---|---|---|---|
| fast | claude-sonnet-4-6 | Strukturert klassifisering der presisjon > prosekvalitet | AI_MODEL_FAST |
| balanced | claude-sonnet-4-6 | Brukervennlig kreativ tekst der sprakkvalitet ER produktet | AI_MODEL_BALANCED |
| quality | claude-sonnet-4-6 | Hoyinnsats langform-innhold som krever dyp resonnering | AI_MODEL_QUALITY |
Konfigurasjon
heading.anchorLabelexport const AI_CONFIG = { models: { fast: process.env.AI_MODEL_FAST || 'claude-sonnet-4-6', balanced: process.env.AI_MODEL_BALANCED || 'claude-sonnet-4-6', quality: process.env.AI_MODEL_QUALITY || 'claude-sonnet-4-6', }, tokenLimits: { classification: 1024, // Impulsanrikning guidance: 500, // Sesjonsveiledning insight: 1500, // Innsiktgenerering summary: 3000, // Sesjonsdokument }, temperature: { classification: 0.4, // Balansert for anrikningskvalitet guidance: 0.7, // Moderat for naturlig sprak creative: 0.8, // Hoy for dokumentgenerering }, defaultTimeout: 30000, // 30 sekunder longRunningTimeout: 60000, // 60 sekunder maxRetries: 3,}Workload-register
heading.anchorLabelAlle AI-workloads er registrert i WORKLOAD_REGISTRY — en sentral kilde til sannhet for konfigurasjon, modellvalg og kostnadsestimater.
Registrerte workloads
heading.anchorLabel| Workload | Kategori | Tier | maks tokens | Temp | Kostnad/kall |
|---|---|---|---|---|---|
classify_enrichment | impulse | balanced | 400 | 0.4 | ~$0.004 |
classify_analytical | impulse | fast | 1024 | 0.2 | ~$0.002 |
check_in_assess | check_in | balanced | 512 | 0.4 | ~$0.002 |
guidance | session | balanced | 500 | 0.7 | ~$0.003 |
summary | session | quality | 3000 | 0.8 | ~$0.010 |
insight | insight | quality | 1500 | 0.7 | ~$0.005 |
Impulsklassifisering
heading.anchorLabelNar en bruker fanger en impuls, kjores to AI-workloads asynkront via BullMQ:
1. Analytisk klassifisering (classify_analytical)
heading.anchorLabelStrukturert analyse med classification, confidence, lag og omrader. Bruker fast-tier.
Output:
- Classification (contraction/expansion) med confidence score
- Primaert og sekundaert transformasjonslag
- Relevante livsomrader med relevans-score
- Innholdsvalidering (valid/low_confidence/gibberish)
2. Kreativ anrikning (classify_enrichment)
heading.anchorLabelBrukervennlig tekst: tittel, sammendrag og sesjonshook. Bruker balanced-tier.
Output:
- Tittel (3-8 ord)
- Sammendrag (3-5 setninger, empatisk)
- Sesjonshook (kort invitasjon til prosessering)
Begge resultater kombineres i impulses.ai_analysis JSONB-kolonnen.
Sesjonsveiledning
heading.anchorLabelSteg-for-steg AI-veiledning (guidance)
heading.anchorLabelHver av de 5 sesjonsstegene far personlig AI-veiledning basert pa brukerens impuls.
Prompt-spesifikasjoner:
| Egenskap | Verdi |
|---|---|
| Lengde | 50-80 ord, 4-6 setninger |
| Tone | Varm-direkte (“klok venn”) |
| Stil | Flytende prosa, ingen punktlister |
| Tilnærming | Invitasjoner (“Legg merke til…”, “Kjenn…”) — IKKE kommandoer |
| Sprak | Brukerens sprakpreferanse eller detektert fra impulstekst |
Forbudte monstre:
- Sporsmaalstegn i veiledningstekst
- Sjekklister eller sekvensielle instruksjoner
- Klinisk/terapeutisk sprak
- Tall, vurderinger, skalaer
Contraction-steg
heading.anchorLabel| Steg | Formaal | Kjernemekanisme |
|---|---|---|
| C1: Feel | Somatisk bevissthet | Apent invitasjon til a kjenne kroppen |
| C2: Own | Erkjenn energi-investering | ”Jeg innrommer at jeg nyter folelsen av a tenke at…” |
| C3: Shift | Tilstand definerer virkelighet | ”Din tilstand definerer din virkelighet” (MA vaere med) |
| C4: Envision | Visualiser ny tilstand | Kroppsforankring — forankre ny folelse i kroppen |
| C5: Release | Slipp og affirmer | Personlig affirmering + slipp gammel moenster |
Expansion-steg
heading.anchorLabel| Steg | Formaal | Kjernemekanisme |
|---|---|---|
| E1: Feel | Kjenn intensjonen | Kroppen som sannhetsdetektor — baerer dette ekte energi? |
| E2: Own | Klar motivasjon | Apent sporsmaal “Hvorfor er dette viktig for deg?” |
| E3: Shift | Tilstand definerer virkelighet | Identisk med C3 (bevisst designvalg) |
| E4: Envision | Identitetsvisjon | ”Se hvem du ER nar dette allerede er sant” |
| E5: Release | Slipp med tillit | Losrivelse med overveldende selvtillit |
Sesjonoppsummering (summary)
heading.anchorLabelEtter fullfort sesjon genererer quality-tier en komplett oppsummering med:
- Tittel og sammendrag
- Utgangspunkt og ny forstaelse
- Gjennombrudd (lista)
- Neste steg (handlingsanbefalinger)
- Steg-for-steg prosessgjennomgang
- Refleksjon
Sjekk-inn vurdering
heading.anchorLabelBE->DO->RECEIVE filosofi
heading.anchorLabelSjekk-inn-funksjonen (check_in_assess) vurderer brukerens navaerende tilstand basert pa BE->DO->RECEIVE-rammeverket:
- BE (vaere): Endre indre tilstand
- DO (gjore): Handle fra riktig tilstand
- RECEIVE (motta): Motta det du onsker
Vurderingens jobb: Avsløre hva brukerens GJORING (DO) skaper i deres VAEREN (BE) — tilstanden de ikke kan se fordi de er inni den.
Tre utfall
heading.anchorLabel| Klassifisering | Farge | Beskrivelse |
|---|---|---|
| Positive | .brand | Brukeren er i en god tilstand |
| Contraction | .classContraction | Sammentrekning oppdaget — kan konverteres til impuls |
| Expansion | .classExpansion | Utvidelse oppdaget — kan konverteres til impuls |
Contraction/expansion-sjekk-inn kan konverteres til impulser via convertToImpulse-funksjonen, som kobler den nye impulsen til sjekk-innen via source_check_in_id.
Innsiktgenerering
heading.anchorLabelInnsikter genereres i to faser:
Pulse (rask regenerering)
heading.anchorLabelpulse.ts genererer raske oppdateringer nar nye impulser fanges. Bruker quality-tier.
Narrative (dypere analyse)
heading.anchorLabelnarrative.ts genererer dypere narrative innsikter basert pa embedding-analytics. Krever at impulse-embedding er ferdig for denne kjores (to-fase regenerering).
Embedding-basert analytikk
heading.anchorLabelembedding-analytics.ts bruker Voyage AI embeddings og pgvector for:
- Omradefordeling (hvilke livsomrader dominerer)
- Lagfordeling (fysisk, emosjonell, mental, spirituell)
- Balanse mellom contraction og expansion
- Semantisk klynging av lignende impulser
Transformasjons-destillering
heading.anchorLabeltransformation-distillation.ts ekstra vekstmonstre fra fullforte sesjoner for dypere innsikter.
Embedding-arkitektur
heading.anchorLabelVoyage AI
heading.anchorLabelEmbedding-generering bruker Voyage AI (voyage-3-lite) for 512-dimensjonale vektorer.
| Egenskap | Verdi |
|---|---|
| Modell | voyage-3-lite |
| Dimensjoner | 512 |
| Lagring | pgvector vector(512) |
| Likhetsmatrise | Cosine similarity |
| Standard terskel | 0.7 |
Hva embeddes?
heading.anchorLabel| Innholdstype | Tabell | Kolonne |
|---|---|---|
| Impulstekst | impulses | embedding |
| Sesjonsrefleksjon + nokkelfunn | sessions | embedding |
| Sjekk-inn-innhold | check_ins | embedding |
To-fase regenerering
heading.anchorLabelNar en ny impuls fanges, kjores embedding og innsiktregenerering i sekvens:
- Embedding-fase:
embedImpulsegenererer vektor via Voyage AI - Regen-fase: Narrative-innsikter regenereres ETTER embedding er komplett
AI SDK-integrasjon
heading.anchorLabelImpulse AI bruker Vercel AI SDK (@ai-sdk/anthropic) som tynt lag over Anthropic API.
Hva AI SDK hhandterer
heading.anchorLabel- Zod-til-JSON-Schema konvertering
- Responsvalidering mot skjema
- Anthropic prompt caching (kostnadsreduksjon)
- Automatisk retry pa HTTP-feil (429, 500, 503)
Hva vi hhandterer selv
heading.anchorLabel- Timeout-retry: AI SDK retrier ikke pa
AbortError— vi implementerer egen timeout-retry - Brukssporing: Logging til
ai_usage-tabell etter hvert kall - Tier-basert tilgang: Sjekk av abonnement for AI-tilgang
- Workload-routing: Valg av riktig modell og konfigurasjon per workload
// Forenklet workload-utforingconst result = await executeWorkload<MySchema>({ system: buildSystemPrompt(context), prompt: buildUserPrompt(input), model: AI_CONFIG.models.balanced, maxTokens: 500, temperature: 0.7, workloadType: 'guidance', userId: user.id,})Kostnadsmodell
heading.anchorLabelPriser per modell
heading.anchorLabel| Modell | Input (per 1M tokens) | Output (per 1M tokens) |
|---|---|---|
claude-sonnet-4-6 | $3.00 | $15.00 |
claude-haiku-4-5 | $1.00 | $5.00 |
Estimert kostnad per operasjon
heading.anchorLabel| Operasjon | Estimert kostnad |
|---|---|
| Impulsklassifisering (analytisk + kreativ) | ~$0.006 |
| Sesjonsveiledning (5 steg) | ~$0.015 |
| Sesjonoppsummering | ~$0.010 |
| Sjekk-inn-vurdering | ~$0.002 |
| Innsiktgenerering | ~$0.005 |
| Komplett sesjonssyklus | ~$0.056 |
Kostnadsovervaking
heading.anchorLabelAll AI-bruk logges i ai_usage-tabellen med:
workload_type: Type operasjonmodel: Modell bruktprompt_tokens/completion_tokens: Tokenforbrukestimated_cost: Beregnet kostnad i USDduration_ms: Tidsforbrukuser_id,impulse_id,session_id: Kontekstkobling
Rate Limiting
heading.anchorLabelAI-bruk begrenses per bruker basert pa abonnementstier:
| Egenskap | Verdi |
|---|---|
| Per-minutt-grense | 100 requests |
| Tidsvindu | 15 minutter |
| Manedlig sporing | ai_rate_limits-tabell |
Kvoter for impulsfangst og sjekk-inn konfigureres via subscription_config-tabellen og sjekkes med check_impulse_quota() PostgreSQL-funksjonen.