5.3 KiB
5.3 KiB
Plan för vidareutveckling av Microservice Importer
Dokumentstatus (2026-05-12)
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
- Quality-gates tillagda (2026-05-12):
typecheck,audit:high,quality:ciibackend/package.json. CI kör nunpm ci, typecheck, build och audit. 0 sårbarheter. - Beroenden uppgraderade (2026-05-12): Nest 11-serien + multer 2.1.1 +
@types/express5 + Nest CLI 11. - 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()ochpdfjs-dist/legacy/build/pdf.jssom fallback. - Retry-logik förbättrad för 429/503.
- Reproducerbart bygge via
package-lock.jsonochnpm 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_KEYinjiceras 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-apiexponeras aldrig till host