Impulse AI Docs
Intern dokumentasjon
Hopp til innhold

AI Feilhåndtering

Dokumentasjon av hvordan Impulse AI håndterer feil i AI-workloads — fra Anthropic API-overload (529) til nettverksproblemer. Designprinsipp: AI-feil skal aldri fryse appen. Brukeren skal alltid forstå hva som skjer og kunne handle.

Feilkategorier

heading.anchorLabel

AI-feil klassifiseres i to kategorier i apps/api/src/queues/base/error-handling.ts:

KategoriHTTP-koderHandling
Retryable429, 503, 529Automatisk retry med backoff
Non-retryable400, 401, 500Umiddelbar feil til bruker

Meldingsbasert deteksjon fanger også: overloaded, rate limit, too many requests, temporarily unavailable, timeout.

Retry-arkitektur (to lag)

heading.anchorLabel

AI-workloads har to uavhengige retry-lag som kjører i serie:

Lag 1: AI SDK (HTTP-nivå)

heading.anchorLabel

Konfigurert i apps/api/src/ai/infrastructure/anthropic/config.ts:

  • Max retries: 3 (totalt 4 forsøk)
  • Backoff: Eksponentiell (AI SDK default)
  • Timeout: 30s per forsøk (standard), 60s for langvarige

Hvis alle 4 forsøk feiler, kastes feilen videre til køen.

Lag 2: BullMQ (kø-nivå)

heading.anchorLabel

Konfigurert i apps/api/src/queues/base/bullmq-job-queue.ts:

  • Max attempts: 3
  • Backoff-delays: 30s, 60s, 120s
  • Total worst case: 4 × 3 = 12 API-kall over ~4 minutter
Forsøk 1: AI SDK prøver 4 ganger → feiler
↓ (venter 30s)
Forsøk 2: AI SDK prøver 4 ganger → feiler
↓ (venter 60s)
Forsøk 3: AI SDK prøver 4 ganger → feiler
→ Endelig feil → SSE sender error-event

SSE-kommunikasjon til klient

heading.anchorLabel

Retry-status kommuniseres til iOS via Server-Sent Events. Endepunkt: GET /api/v1/sessions/:id/summary/status.

EventBetydningKlient-handling
queuedJobb venter i køSpinner
processingAI generererSpinner
retryingMidlertidig feil, prøver igjenSpinner + statusmelding
completedDokument klartVis sammendrag
errorEndelig feil etter alle retriesFeilmelding + retry-knapp
idleIngen jobb funnetRe-subscribe etter 2s

SSE retrying-event (data)

heading.anchorLabel
{
"session_id": "abc-123",
"attempt": 1,
"next_retry_at": "2026-04-07T12:01:30.000Z",
"message": "Retrying in 60s (attempt 2/3)..."
}

Implementert i iosApp/Features/Sessions/Unified/UnifiedSessionView.swift.

Tilstander i completing-laget

heading.anchorLabel
┌─────────────────────────────────────┐
│ Normal: Spinner + "Sammenstiller │
│ innsiktene" │
│ │
│ Retry: Spinner + "AI-tjenesten │
│ er opptatt. Prøver igjen │
│ automatisk..." │
│ │
│ Error: Feilmelding + "Prøv │
│ igjen"-knapp │
│ │
│ Alltid: "Jeg ser dette senere" │
│ (dismiss-knapp) │
└─────────────────────────────────────┘

Timeout og dismiss

heading.anchorLabel
  • 30s hard timeout: Etter 30s stopper spinneren, men SSE-forbindelsen holdes åpen
  • “Jeg ser dette senere”: Dismisser til impulsdetal. SSE fortsetter i bakgrunnen — når dokumentet er klart, er det tilgjengelig fra impulsdetal-visningen
  • Manuell retry: POST /api/v1/sessions/:id/summary/retry re-køer jobben

State-variabler

heading.anchorLabel
@State private var isSummaryLoading: Bool // Spinner synlig
@State private var summaryError: Bool // Feilvisning aktiv
@State private var summaryRetryAttempt: Int? // Retry-nummer (nil = normal)

Feilvisning (AIWorkloadErrorView)

heading.anchorLabel

Gjenbrukbar komponent i iosApp/Components/AIWorkloadErrorView.swift.

Brukes av session summary, step guidance og classification. Viser:

  • Advarselikon
  • Kontekstspesifikk melding
  • Ghost CTA retry-knapp (accent-farget)

Feilmeldinger er lokalisert i alle 16 språk:

NøkkelENNB
ai_workload_summary_errorWe couldn’t create your session summary…Vi klarte ikke å lage sammendraget ditt…
ai_workload_guidance_errorWe couldn’t generate the guidance…Vi klarte ikke å generere veiledningen…
ai_service_busy_retryingThe AI service is busy. Retrying automatically…AI-tjenesten er opptatt. Prøver igjen automatisk…
ai_workload_retry_buttonTry againPrøv igjen
session_see_laterI’ll see this laterJeg ser dette senere
FilAnsvar
apps/api/src/queues/base/error-handling.tsFeilklassifisering og retry-config
apps/api/src/queues/base/bullmq-job-queue.tsBullMQ retry-logikk og SSE-bridge
apps/api/src/queues/sessions/session-summary.tsSession summary worker
apps/api/src/routes/sessions/summary-status.tsSSE-endepunkt
shared/.../models/SSEEvent.ktKMP SSE-modeller (inkl. Retrying)
shared/.../parsers/SummarySSEEventParser.ktKMP SSE-parser
iosApp/Services/APIService.swiftiOS SSE wrapper
iosApp/Features/Sessions/Unified/UnifiedSessionView.swiftiOS completing-lag
iosApp/Components/AIWorkloadErrorView.swiftGjenbrukbar feilvisning

Designprinsipper

heading.anchorLabel
  1. Aldri frys UI: Brukeren skal alltid kunne handle (dismiss, retry)
  2. Transparent kommunikasjon: Vis hva som skjer (“prøver igjen automatisk”)
  3. Bakgrunnsprosessering: AI fortsetter i bakgrunnen selv etter dismiss
  4. Progressiv forverring: Normal → retry-info → feilmelding → manuell retry
  5. SSE som sanntidskanal: Alle statusoverganger kommuniseres i sanntid