# Plan: Separat Admin-AI huvudtabb + AI-insyn för Kvitto/Flyer ## Mål - Flytta ut `AI` från `Admin > Databas` till en egen huvudtabb i admin (samma nivå som `Users` och `Database`). - På nya `AI`-fliken visa två underflikar: - `Kvitto` (AI-funktioner för receipt-import) - `Flyer` (AI-funktioner för flyer-import) - Ge admin insyn i: - Prompt (vad modellen fick) - Output (vad modellen returnerade) - Per import/sessionshistorik ## Nuvarande läge (verifierat) - Huvudtabbar i admin definieras i: - `flutter/lib/features/admin/presentation/admin_screen.dart` - `flutter/lib/core/ui/app_shell.dart` - `AI` ligger idag som intern databas-tab i: - `flutter/lib/features/admin/presentation/admin_database_panel.dart` - Nuvarande `AdminAiPanel` visar bara modellinfo: - `flutter/lib/features/admin/presentation/admin_ai_panel.dart` - Flyer har sessions-API och sparar parsat resultat, men ingen API-yta för prompt/output: - `backend/src/flyer-import/flyer-import.controller.ts` - `backend/src/flyer-import/dto/flyer-import.response.ts` - Receipt-import har ingen sessionhistorik i recipe-api och ingen prompt/output i svar: - `backend/src/receipt-import/receipt-import.controller.ts` - `backend/src/receipt-import/dto/parsed-receipt-item.dto.ts` ## UX-förslag (enkelt och snyggt) - Ny huvudflik `AI` i admin med tydlig struktur: - Topp: två chips/segmenterade knappar `Kvitto` och `Flyer` - Innehåll: 2-kolumnslayout på desktop, enkel stack på mobil - Vänster: lista med senaste importer (tid, användare, fil, status) - Höger: detaljer för vald import - Detaljvyn har tre kort: 1. **Prompt** (monospace, copy-knapp, expand/collapse) 2. **Model Output** (formatterad JSON, copy-knapp) 3. **Sammanfattning** (modell, duration, chunk/retry, warnings) - Filter högst upp: - Källa: Kvitto/Flyer - Period: senaste 24h / 7d / 30d - Endast fel - Default-beteende: - Välj senaste import automatiskt - Visa läs-only data (ingen redigering av prompt i denna iteration) ## Föreslagen implementation ### 1) Flutter: ny Admin-huvudtabb AI 1. Utöka enum och query-hantering: - `AdminViewTab` får `ai` - query-stöd: `?tab=ai` 2. Uppdatera admin-title chips i `AppShell`: - Lägg till `AI` bredvid `Användare` och `Databas` 3. Rendra ny panel i `AdminScreen`: - `AdminAiPanel` blir panel för huvudtabben 4. Ta bort AI från `AdminDatabasePanel` interna tabs Berörda filer: - `flutter/lib/features/admin/presentation/admin_screen.dart` - `flutter/lib/core/ui/app_shell.dart` - `flutter/lib/features/admin/presentation/admin_database_panel.dart` ### 2) Flutter: bygg om `AdminAiPanel` till AI-observability 1. Inför underflikar `Kvitto` / `Flyer` 2. Lägg till vänster lista + höger detalj 3. Lägg till komponenter: - `PromptCard` (text/copy) - `OutputJsonCard` (pretty JSON/copy) - `TraceMetaCard` (modell, tid, status) 4. Lägg till `adminRepository`-metoder för att hämta traces Berörda filer: - `flutter/lib/features/admin/presentation/admin_ai_panel.dart` - `flutter/lib/features/admin/data/admin_repository.dart` - `flutter/lib/core/api/api_paths.dart` - ev. nya domänmodeller under `flutter/lib/features/admin/domain/` ### 3) Backend: exponera AI trace-data (admin-only) 1. Lägg till admin-endpoints för trace-lista + detalj 2. Returnera prompt/output samt metadata 3. Begränsa åtkomst till admin Föreslagen API-yta: - `GET /ai/traces?source=receipt|flyer&limit=...&cursor=...` - `GET /ai/traces/:id` ### 4) Datalagring för prompt/output För stabil UX behövs persistens, inte bara loggar. Föreslagen modell: - Ny Prisma-tabell `AiTrace` - `id`, `source` (`receipt`/`flyer`), `userId`, `sessionId?`, `model`, `prompt`, `rawOutput`, `normalizedOutput`, `status`, `error`, `durationMs`, `createdAt` Integration: - Flyer: skapa trace i `AiFlyerParserService` vid varje AI-anrop/chunk (sammanfatta till en sessionsrad eller flera child-rader) - Receipt: recipe-api behöver trace från importer-service eller egen instrumentation av prompt/output ## Viktig teknisk avgränsning (receipt) - I nuvarande repo byggs flyer-prompt i `recipe-api` och är enkel att visa. - Receipt-AI sker i importer-flöde; prompt/output finns sannolikt inte i recipe-api idag. - Därför två realistiska steg: 1. **Steg 1 (snabbt):** full trace-visning för Flyer + modellinfo för Kvitto 2. **Steg 2:** utöka receipt/importer så prompt/output skickas eller lagras som trace och visas i samma UI ## Säkerhet - Endast admin får läsa traces. - Prompt/output kan innehålla känslig text från uppladdade filer: - visa som read-only - möjlighet till maskning av persondata i senare steg - paginering + kort retention (t.ex. 30 dagar) rekommenderas ## Testplan - Flutter widget-test: - Ny huvudtabb `AI` syns och route `?tab=ai` fungerar - Underflikar `Kvitto`/`Flyer` växlar korrekt - Prompt/output renderas och copy-knappar fungerar - Backend tester: - admin-only behörighet på trace-endpoints - lista/detalj svarar korrekt - trace skapas för flyer parse-flöde - Regression: - Admin `Users`/`Database` fungerar oförändrat ## Genomförandeordning 1. Flytta AI till huvudtabb i Flutter (utan backend-ändring först) 2. Bygg ny AI-panelstruktur med underflikar 3. Inför backend trace-endpoints + Prisma-migration 4. Koppla Flyer trace end-to-end 5. Koppla Receipt trace (beroende på importer-instrumentation) 6. Sluttest + docs ## Rekommenderat beslut inför implementation - Implementera i två faser för låg risk: - Fas A: Ny UX + full Flyer-insyn direkt - Fas B: Receipt prompt/output när importer-trace är tillgänglig