feat: Enhance quantity rules for receipt parsing and update prompt structure

This commit is contained in:
Nils-Johan Gynther
2026-05-03 07:36:27 +02:00
parent 1bb0eedd4f
commit 3a4d73da18
@@ -10,27 +10,44 @@ const MISTRAL_API_URL = 'https://api.mistral.ai/v1/chat/completions';
const RECEIPT_IMPORT_MODEL = 'mistral-small-2603'; const RECEIPT_IMPORT_MODEL = 'mistral-small-2603';
const MAX_RETRIES = 3; const MAX_RETRIES = 3;
const QUANTITY_RULES = `
Regler för quantity och unit:
1. LÖSVIKT (chark, kött, ost, frukt/grönt vägt på kassabandet): quantity=faktisk vikt/volym från kvittot, unit=kg/g/l etc.
Exempel: "BLANDFÄRS 20%" köpt 0.997 kg → quantity=0.997, unit="kg"
2. FÖRPACKAD VARA med storlek i namnet (mejeri, dryck, konserver, flingor): quantity=antal köpta förpackningar, unit="förp".
Exempel: "VISPGRÄDDE 5DL" köpt 1 → quantity=1, unit="förp"
Exempel: "MJÖLK 1,5L" köpt 3 → quantity=3, unit="förp"
3. MULTIPACK (NxYg/NxYml i namnet = flera innerförpackningar ihopsatta till ett ytteremballage): quantity=1, unit="förp". Räkna INTE upp N som quantity.
Exempel: "BACON 3X120G" (ett storpack med tre 120g-paket, ett köp på kvittot) → quantity=1, unit="förp"
Exempel: "YOGHURT 4X150G" → quantity=1, unit="förp"
4. FÖRPACKAT INNEHÅLL (bröd, kex, chips — förpackning med flera enheter inuti): quantity=antal köpta förpackningar, unit="förp".
Exempel: "BRIOCHE SESAM" (förpackning med hamburgerbröd) köpt 2 → quantity=2, unit="förp"
Exempel: "CORNFLAKES 500G" köpt 1 → quantity=1, unit="förp"
5. LÖSA STYCKVAROR (enstaka frukt, enstaka bröd köpt i lösvikt per styck): quantity=antal, unit="st".
Exempel: "BANAN" köpt 1 st löst → quantity=1, unit="st"
`;
const IMAGE_PROMPT = `Du är en kvittoläsare. Analysera detta kvitto och returnera ENDAST en JSON-array med alla köpta varor. const IMAGE_PROMPT = `Du är en kvittoläsare. Analysera detta kvitto och returnera ENDAST en JSON-array med alla köpta varor.
Varje vara ska ha följande fält: Varje vara ska ha följande fält:
- "rawName": varans namn som det står på kvittot (sträng) - "rawName": varans namn som det står på kvittot (sträng)
- "quantity": antal eller mängd som ett tal (t.ex. 1, 2, 0.5) - "quantity": antal köpta enheter som ett tal
- "unit": enhet — välj ett av: "st", "kg", "g", "l", "dl", "cl", "ml", "förp", "pak", "burk", "flaska" - "unit": enhet — välj ett av: "st", "kg", "g", "l", "dl", "cl", "ml", "förp", "pak", "burk", "flaska"
- "price": pris i SEK som ett tal, eller null - "price": pris i SEK som ett tal, eller null
- "brand": märke eller leverantör om det tydligt framgår av varunamnet (t.ex. "Arla", "ICA", "Oatly"), annars null - "brand": märke eller leverantör om det tydligt framgår av varunamnet (t.ex. "Arla", "ICA", "Oatly"), annars null
- "origin": ursprungsland om det framgår av varunamnet (t.ex. "Brasilien", "Sverige", "Italien"), annars null - "origin": ursprungsland om det framgår av varunamnet (t.ex. "Brasilien", "Sverige", "Italien"), annars null
${QUANTITY_RULES}
Returnera BARA JSON-arrayen utan markdown-formatering.`; Returnera BARA JSON-arrayen utan markdown-formatering.`;
const TEXT_PROMPT = (text: string) => const TEXT_PROMPT = (text: string) =>
`Du är en kvittoläsare. Nedan följer rå text från ett kvitto. Analysera texten och returnera ENDAST en JSON-array med alla köpta varor. `Du är en kvittoläsare. Nedan följer rå text från ett kvitto. Analysera texten och returnera ENDAST en JSON-array med alla köpta varor.
Varje vara ska ha följande fält: Varje vara ska ha följande fält:
- "rawName": varans namn som det står på kvittot (sträng) - "rawName": varans namn som det står på kvittot (sträng)
- "quantity": antal eller mängd som ett tal (t.ex. 1, 2, 0.5) - "quantity": antal köpta enheter som ett tal
- "unit": enhet — välj ett av: "st", "kg", "g", "l", "dl", "cl", "ml", "förp", "pak", "burk", "flaska" - "unit": enhet — välj ett av: "st", "kg", "g", "l", "dl", "cl", "ml", "förp", "pak", "burk", "flaska"
- "price": pris i SEK som ett tal, eller null - "price": pris i SEK som ett tal, eller null
- "brand": märke eller leverantör om det tydligt framgår av varunamnet (t.ex. "Arla", "ICA", "Oatly"), annars null - "brand": märke eller leverantör om det tydligt framgår av varunamnet (t.ex. "Arla", "ICA", "Oatly"), annars null
- "origin": ursprungsland om det framgår av varunamnet (t.ex. "Brasilien", "Sverige", "Italien"), annars null - "origin": ursprungsland om det framgår av varunamnet (t.ex. "Brasilien", "Sverige", "Italien"), annars null
${QUANTITY_RULES}
Returnera BARA JSON-arrayen utan markdown-formatering. Returnera BARA JSON-arrayen utan markdown-formatering.
Kvittotext: Kvittotext: