fix(cost): korrekt Gemini 3.5 Flash Lite priser i kod + docs

gemini.ts estimateCostUsd: 2.5-Flash-priser (0.075/0.30) -> 3.5-Flash-Lite standard (0.30/2.50). Pessimistiska per-bild-estimat 0.0015->0.004, OCR 0.001->0.002. docs/10: Claude-modelltabell + kostnad-per-uppgift omskrivna till Gemini. 36/36 gront.
This commit is contained in:
Claude
2026-08-17 18:41:45 +00:00
parent ecc3c6395e
commit 0ff3396d6e
2 changed files with 36 additions and 38 deletions
+31 -33
View File
@@ -3,44 +3,41 @@
Priser verifierade 2026-08-02 (BenchLM, uppdaterad 2026-08-01, samt korsläst mot Priser verifierade 2026-08-02 (BenchLM, uppdaterad 2026-08-01, samt korsläst mot
publika prislistor). **Kontrollera mot Anthropics officiella prissida innan avtal.** publika prislistor). **Kontrollera mot Anthropics officiella prissida innan avtal.**
> **RÄTTELSE (kontrollerad mot koden 2026):** Appen använder **Gemini 3.5 Flash Lite** för > **Faktisk modell (kontrollerad mot koden):** All bildanalys, OCR och receptgenerering körs på
> bildanalys/OCR (`GEMINI_MODEL`-default i `apps/api/src/config.ts` + `packages/ai-contracts/src/gemini.ts`), > **Gemini 3.5 Flash Lite** (`GEMINI_MODEL`-default i `apps/api/src/config.ts` +
> INTE Claude. Aktuellt standard-pris: **$0,30/1M input, $2,50/1M output** → **≈ $0,003 (0,03 kr) > `packages/ai-contracts/src/gemini.ts`). Priserna nedan är verifierade mot Google (2026) och
> per skanning** i medelkvalitet. Claude-tabellen nedan är arv och överskattar AI-kostnaden ~3,3×. > speglar `estimateCostUsd` i koden.
> OBS: kodens egen `estimateCostUsd` använder gamla 2.5-Flash-priser ($0,075/$0,30) och
> UNDERSKATTAR därmed faktisk spend ~48× — bör rättas i koden.
## Aktuella modeller och listpriser (USD per miljon tokens, in/ut) ## Aktuella modeller och listpriser (USD per miljon tokens, in/ut)
| Modell | Input | Output | Roll i appen | | Modell | Input | Output | Roll i appen |
| ---------------- | ----- | ----------------------- | ----------------------------------------------------------- | | ------------------------------------- | ----- | ------ | -------------------------------------------------------------- |
| Claude Haiku 4.5 | $1 | $5 | Arbetshäst: bildanalys, OCR, normalisering, craving-parsing | | Gemini 3.5 Flash Lite (standard) | $0,30 | $2,50 | Arbetshäst: all bildanalys, OCR, receptstrukturering (Skiva 1) |
| Claude Sonnet 5 | $2 | $10 (t.o.m. 2026-08-31) | Fallback vid låg confidence; receptstrukturering; veckoplan | | Gemini 3.5 Flash Lite (batch) | $0,15 | $1,25 | Asynkrona nattjobb: minnesuppdatering, batch-generering |
| Claude Opus 5 | $5 | $25 | Endast evals/svåraste moderering inte i volymflöden | | Premium-eskalering (Skiva 2, framtid) | | | Större modell vid låg confidence (spec §33) ej i volym ännu |
| Claude Fable 5 | $10 | $50 | Används ej i volymflöden |
Hävstänger: cache-träffar 10 % av inputpris; Batch API 50 % (perfekt för nattliga Hävstänger: batch-tier 50 %; context caching sänker upprepad input; AAMOS-specialistmodeller
minnes-/träningsjobb). AAMOS specialistmodeller ersätter över tid externa anrop för ersätter över tid externa anrop för de vanligaste bilduppgifterna (spec §33) → kostnaden nedan
de vanligaste bilduppgifterna (spec §33) → kostnaden nedan är ett tak, inte ett golv. är ett tak, inte ett golv.
## Kostnad per uppgift (ANTAGANDEN markerade) ## Kostnad per uppgift
Antaget: bild ≈ 1 500 tokens (A1), systemprompt+kontext 1 000 in / strukturerad output Antaget: bild ≈ 1 000 tokens (Gemini-tiling, A1), systemprompt+kontext ≈ 5001 000 in,
800 ut (A2), 80 % av anropen klaras av Haiku, 20 % eskalerar till Sonnet (A3), strukturerad JSON-output 4001 200 ut (A2), växelkurs 10,50 SEK/USD (A4). All bildanalys på
växelkurs 10,50 SEK/USD (A4). Gemini 3.5 Flash Lite standard-tier ingen modell-eskalering i Skiva 1.
| Uppgift | Tokens (in/ut) | Haiku | Sonnet | Blandad (80/20) | | Uppgift | Tokens (in/ut) | Kostnad (Gemini 3.5 Flash Lite) |
| ------------------------------- | -------------- | --------------- | ------ | -------------------- | | ------------------------------- | -------------- | ------------------------------- |
| Kyl-/skafferibild (2 bilder) | 4 000 / 800 | $0,008 | $0,016 | **$0,010 ≈ 0,10 kr** | | Kyl-/skafferibild (2 bilder) | 4 000 / 800 | **$0,003 ≈ 0,03 kr** |
| Kvitto | 3 000 / 1 000 | $0,008 | $0,016 | $0,010 | | Kvitto | 3 000 / 1 000 | $0,003 |
| Tallriksfoto | 2 500 / 500 | $0,005 | $0,010 | $0,006 | | Tallriksfoto | 2 500 / 500 | $0,002 |
| Näringsetikett/datum | 2 000 / 400 | $0,004 | $0,008 | $0,005 | | Näringsetikett/datum | 2 000 / 400 | $0,002 |
| Receptstrukturering (text) | 2 500 / 1 200 | | $0,017 | $0,017 | | Receptstrukturering (text) | 2 500 / 1 200 | $0,004 |
| Veckoplan | 3 000 / 800 | | $0,014 | $0,014 | | Veckoplan | 3 000 / 800 | $0,003 |
| Minnesuppdatering (batch, natt) | 4 000 / 600 | $0,0035 (batch) | | $0,0035 | | Minnesuppdatering (batch, natt) | 4 000 / 600 | $0,0014 (batch-tier) |
**Tumregel: ≈ $0,003 ≈ 0,03 kr per AI-skanning.** Deterministiska flöden **Tumregel: ≈ $0,003 ≈ 0,03 kr per AI-skanning.** Deterministiska flöden (rekommendationer,
(rekommendationer, nutrition, streckkod, FEFO) kostar $0. nutrition, streckkod, FEFO) kostar $0.
## Kostnad per användartyp och månad ## Kostnad per användartyp och månad
@@ -77,9 +74,10 @@ intäkt sjunker från ~12 % till ~4 %. Firebase Auth tillkommer först vid 60 00
## Känslighet ## Känslighet
Dubbla bildstorleken (A1) → +60 % på skanningskostnad. Halverad Haiku-andel (A3) → Dubbla bildstorleken (A1) → +~30 % (fler bild-tokens). Fler upptäckta varor per bild → mer,
+50 %. Bevaka därför: tokens/bild i verklig trafik, eskaleringsandel, kostnad per eftersom output ($2,50/1M) dominerar över input ($0,30/1M). Bevaka därför: tokens/bild och
uppgiftstyp (finns i scan_jobs.cost_usd → adminpanelen) med larm på dagsbudget (§58). output-tokens i verklig trafik, kostnad per uppgiftstyp (usageMetadata → ai_usage_counters /
scan_jobs.cost_usd → adminpanelen) med larm på dagsbudget (§58).
## Scenario: 100 000 trial-användare dag 1 (onboarding-toppen) ## Scenario: 100 000 trial-användare dag 1 (onboarding-toppen)
@@ -93,7 +91,7 @@ upp alla 25 på bilder i **medelkvalitet** via **Gemini 3.5 Flash Lite** (~$0,00
| Firebase Auth (100k MAU) | 50k gratis + 50k × $0,0055 | $275/mån ≈ 2 900 kr/mån | | Firebase Auth (100k MAU) | 50k gratis + 50k × $0,0055 | $275/mån ≈ 2 900 kr/mån |
| **Totalt onboarding-månaden** | | **≈ $7 775 ≈ 82 000 kr** | | **Totalt onboarding-månaden** | | **≈ $7 775 ≈ 82 000 kr** |
AI står för ~97 %, men hela toppen är nu ~3,3× lägre än det gamla Claude-antagandet AI står för ~97 %, men hela toppen är nu ~3,3× lägre än den tidigare felräkningen
(263 000 kr → 79 000 kr) eftersom Flash Lite är långt billigare per token. (263 000 kr → 79 000 kr) eftersom Flash Lite är långt billigare per token.
Efter trial om alla faller till gratis (5 skanningar/mån): 100 000 × 5 × $0,003 + Firebase Efter trial om alla faller till gratis (5 skanningar/mån): 100 000 × 5 × $0,003 + Firebase
+4 -4
View File
@@ -115,10 +115,10 @@ function requestOnce(
} }
/** Estimated max cost per image call in USD (pessimistic). */ /** Estimated max cost per image call in USD (pessimistic). */
const COST_ESTIMATE_PER_IMAGE_USD = 0.0015; const COST_ESTIMATE_PER_IMAGE_USD = 0.004;
/** Estimated max cost per simple OCR image call in USD. */ /** Estimated max cost per simple OCR image call in USD. */
const COST_ESTIMATE_PER_OCR_IMAGE_USD = 0.001; const COST_ESTIMATE_PER_OCR_IMAGE_USD = 0.002;
export interface BudgetStore { export interface BudgetStore {
/** Return current daily spend in USD. */ /** Return current daily spend in USD. */
@@ -1013,8 +1013,8 @@ Språk: ${lang}.`;
} }
private estimateCostUsd(inputTokens: number, outputTokens: number): number { private estimateCostUsd(inputTokens: number, outputTokens: number): number {
// Gemini 2.5 Flash pricing (Aug 2025): ~$0.075/1M input, $0.30/1M output. // Gemini 3.5 Flash Lite standard-tier pricing (2026): $0.30/1M input, $2.50/1M output.
return inputTokens * 0.075e-6 + outputTokens * 0.3e-6; return inputTokens * 0.3e-6 + outputTokens * 2.5e-6;
} }
private async isOverBudget(estimateUsd: number): Promise<boolean> { private async isOverBudget(estimateUsd: number): Promise<boolean> {