Files
microservice-importer/next_steps_MSImporter.md
T
Nils-Johan Gynther 4596b80408
Test Suite / test (24.15.0) (push) Has been cancelled
fix: update documentation status and enhance technical description for microservice importer
2026-05-11 16:41:20 +02:00

5.0 KiB

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.

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:

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:

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

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.