116 lines
5.3 KiB
Markdown
116 lines
5.3 KiB
Markdown
# 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](TEKNISK_BESKRIVNING.md).
|
|
|
|
### Senast avklarat i angränsande flöden
|
|
- Quality-gates tillagda (2026-05-12): `typecheck`, `audit:high`, `quality:ci` i `backend/package.json`. CI kör nu `npm ci`, typecheck, build och audit. 0 sårbarheter.
|
|
- Beroenden uppgraderade (2026-05-12): Nest 11-serien + multer 2.1.1 + `@types/express` 5 + 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()` 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.
|