- pyproject.toml: add [tool.ruff] config suppressing E402/W293 globally, F841/E741/E702 in tests, E741 in scripts - inventory.py: split semicolon import (E702) - recipes.py: fix logger -> log (F821 undefined name) - shopping.py: rename l -> lnk in list comprehension (E741) - format_conversion.py: noqa F841 on CUDA flag (used as future hook) - backfill_keywords.py: rename done -> _done (F841) - ingest_purplecarrot.py: drop == True comparison (E712) - Auto-fix: I001 import sorting, F401 unused imports across all files
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
"""Pydantic schemas for visual label capture (kiwi#79)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import List, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class LabelCaptureResponse(BaseModel):
|
|
"""Extraction result returned after the user photographs a nutrition label."""
|
|
barcode: str
|
|
product_name: Optional[str] = None
|
|
brand: Optional[str] = None
|
|
serving_size_g: Optional[float] = None
|
|
calories: Optional[float] = None
|
|
fat_g: Optional[float] = None
|
|
saturated_fat_g: Optional[float] = None
|
|
carbs_g: Optional[float] = None
|
|
sugar_g: Optional[float] = None
|
|
fiber_g: Optional[float] = None
|
|
protein_g: Optional[float] = None
|
|
sodium_mg: Optional[float] = None
|
|
ingredient_names: List[str] = Field(default_factory=list)
|
|
allergens: List[str] = Field(default_factory=list)
|
|
confidence: float = 0.0
|
|
needs_review: bool = True # True when confidence < REVIEW_THRESHOLD
|
|
|
|
|
|
class LabelConfirmRequest(BaseModel):
|
|
"""User-confirmed extraction to save to the local product cache."""
|
|
barcode: str
|
|
product_name: Optional[str] = None
|
|
brand: Optional[str] = None
|
|
serving_size_g: Optional[float] = None
|
|
calories: Optional[float] = None
|
|
fat_g: Optional[float] = None
|
|
saturated_fat_g: Optional[float] = None
|
|
carbs_g: Optional[float] = None
|
|
sugar_g: Optional[float] = None
|
|
fiber_g: Optional[float] = None
|
|
protein_g: Optional[float] = None
|
|
sodium_mg: Optional[float] = None
|
|
ingredient_names: List[str] = Field(default_factory=list)
|
|
allergens: List[str] = Field(default_factory=list)
|
|
confidence: float = 0.0
|
|
# When True the confirmed product is also added to inventory
|
|
location: str = "pantry"
|
|
quantity: float = 1.0
|
|
auto_add: bool = True
|
|
|
|
|
|
class LabelConfirmResponse(BaseModel):
|
|
"""Result of confirming a captured product."""
|
|
ok: bool
|
|
barcode: str
|
|
product_id: Optional[int] = None
|
|
inventory_item_id: Optional[int] = None
|
|
message: str
|