• v0.7.1 9350719516

    feat(recipes): LLM style classifier (#27) + cooked leftovers shelf-life (#112)
    Some checks failed
    CI / Backend (Python) (push) Waiting to run
    CI / Frontend (Vue) (push) Waiting to run
    Mirror / mirror (push) Has been cancelled
    Release / release (push) Has been cancelled

    pyr0ball released this 2026-04-25 23:18:16 -07:00 | 46 commits to main since this release

    Style classifier (kiwi#27):

    • app/services/recipe/style_classifier.py: LLM prompt with curated vocab,
      cf-orch/LLMRouter fallback, JSON + regex tag extraction
    • POST /recipes/saved/{recipe_id}/classify-style: Paid/BYOK tier gate,
      fetches recipe from corpus, returns {suggested_tags:[...]}
    • SaveRecipeModal.vue: "Suggest tags" button with loading state; merges
      LLM suggestions into existing tags without overwriting user's choices
    • 403/empty list silently ignored — button is a no-op when tier not met

    Cooked leftovers shelf-life (kiwi#112):

    • app/services/leftovers_predictor.py: deterministic FDA/USDA lookup table
      with shortest-component-wins for proteins and dish-type override for
      assembled dishes; special entries for ceviche (2d, acid != heat),
      fermented/cured (kimchi 14d, confit/lardo 7d), soups, rice, pasta, etc.
    • POST /recipes/{recipe_id}/leftovers: free tier, no gate
    • RecipeDetailPanel.vue: shelf-life section appears after "I cooked this"
      with fridge/freeze days, freeze-by advice, per-instance dismiss; calm
      framing per no-panic UX policy
    • LeftoversResponse Pydantic schema added to recipe.py
    Downloads