# Plan för vidareutveckling av Microservice Importer ## Dokumentstatus (2026-05-10) Detta dokument riktar sig till utvecklare och driftansvariga för microservice-importer. Teknisk referens finns i [TEKNISK_BESKRIVNING.md](TEKNISK_BESKRIVNING.md). ### Senast avklarat i angränsande flöden - Regelbaserad kvittotolkning har stärkts för multipack, enheter och svårare radformat. - Bröd- och rostbrödklassning har utökade guardrails för att minska felaktig kategorisering. - Klientens granskningsflöde och sessionpersistens i Flutter är implementerat, vilket minskar avbrott mellan parse och spara. - Kvittokategorisering: nya regler för pasta, grädde, ägg, juice, godis och potatis samt justerad AI-guardrail. - Testinfrastruktur: parametriserade enhetstester för kvittoimport och CI/CD-pipeline med automatiserad testkörning på push. - PDF-parsning stabiliserad med `require()` och `pdfjs-dist/legacy/build/pdf.js` som fallback. - Retry-logik förbättrad för 429/503. - Reproducerbart bygge via `package-lock.json` och `npm ci`. - `looksLikeReceiptProductLine()` filtrerar bort PDF-rader utan siffra innan Mistral-anrop. ## Status (2026-05-10) — Driftsatt och integrerad med recipe-app `microservice-importer` körs som intern tjänst (`importer-api`) i `recipe-app/compose.yml`. Alla importflöden är delegerade och driftsatta. | Endpoint | Funktion | Status | |---|---|---| | `POST /api/quick-import` | URL-skrapning (ICA, generisk), PDF, OCR-bild | ✅ Driftsatt | | `POST /api/recipes/parse-markdown` | Markdown → ingrediensstruktur (utan DB) | ✅ Driftsatt | | `POST /api/receipt-import/parse` | Kvittobild/PDF → `ParsedReceiptItem[]` via Mistral AI | ✅ Driftsatt | | `GET /api/health` | Hälsokontroll (används av Docker healthcheck) | ✅ Driftsatt | **Serverstruktur:** ``` /opt/containers/ microservice-importer/ ← klonas och pullas separat recipe-app/ compose.yml ← bygger importer-api från ../microservice-importer deploy.sh ``` **Deploy:** ```bash cd /opt/containers/microservice-importer && git pull cd /opt/containers/recipe-app && git pull && ./deploy.sh ``` --- ## Nästa steg ### Hög prioritet - **Kvittoimport Fas 6b** — Granskningssteg och bulk-spara i Flutter-klienten (backend-logiken är klar) ### Medel prioritet - **Fler webbplats-parsers** — Specifika parsers för t.ex. Tasteline, Köket.se, Arla - **Swagger/OpenAPI** — Automatisk API-dokumentation via `@nestjs/swagger` - **Testtäckning** — Utökad enhetstesttäckning för parsers och `receipt-parsing.service.ts` ### Låg prioritet / Framtida - **Caching** — Cacha skrapade sidor för att minska belastning på externa webbplatser - **Puppeteer** — Hantera JavaScript-renderade receptsidor - **Word-dokument** — Stöd för `.docx`-import --- ## AI-optimering: Mistral-modell och pipeline Nuläget är att `mistral-small-2603` används för bildinput (vision). För PDF-flödet extraheras text först via `pdf-parse` eller `pdfjs-dist`; därefter körs regelbaserad parsning och AI bara för kvarvarande rader. ### Implementerad optimering: AI sist i pipeline (PDF) Kvittopipelinen för PDF ser nu ut: ```text PDF → pdf-parse / pdfjs-dist → preprocessPdfLines → isIgnoredReceiptLine → ruleBasedParseLine → looksLikeReceiptProductLine → AI ``` `looksLikeReceiptProductLine(line)` filtrerar bort rader som saknar siffra innan Mistral-anropet. Enbart rader med namnliknande text och minst ett tal skickas till AI. ### Modellval för olika deluppgifter | Uppgift | Rekommenderad modell | Motivering | |---|---|---| | Kvittoparsning (hela bilden) | `mistral-small-2603` | Vision-förmåga krävs för bild-input | | Tolka OCR-text | `mistral-small-latest` eller mindre | Enklare uppgift när text redan extraherats | | Kategorisering av enskild produktrad | `open-mistral-nemo` (7B) | Klassificering utan vision | För bild-input krävs alltid en vision-kapabel modell. --- ## Framtida förbättringar - Schemalagd uppdatering av kategorier om det visar sig nödvändigt igen. ## Nuvarande implementering - Ingen separat manuell kategoriuppdatering via Flutter-UI finns längre. - Kvittoparsningen använder i stället nuvarande regler, retry-logik och filtrering i backend. --- ## Arkitektur-noteringar - Tjänsten är helt stateless och saknar databas - Den exponeras bara på `recipe-internal`-nätverket - `MISTRAL_API_KEY` injiceras via env - Alpine Docker-image använder `tesseract-ocr`, `tesseract-ocr-data-swe`, `tesseract-ocr-data-eng` - Host-port 3001 är upptagen av `wetty`, så `importer-api` exponeras aldrig till host ## Referenser - [README.md](README.md) - [TEKNISK_BESKRIVNING.md](TEKNISK_BESKRIVNING.md) ## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.