Free tier: keyword extraction + FTS ingredient search + title probe search.
Paid tier / BYOK: same search, then LLM synthesis of a conversational answer
(8s timeout so an unresponsive model degrades gracefully to recipe list only).
- AskRequest / AskRecipeHit / AskResponse schemas in recipe.py
- _extract_ask_keywords(): tokenize question, strip stopwords
- _ask_in_thread(): two-pronged search (ingredient FTS + title LIKE)
merges by ID, computes pantry match_pct when pantry_items provided
- Endpoint registered before /{recipe_id} to avoid integer coercion on /ask
- LLM synthesis gated to paid/premium/ultra only (not "local" dev tier)
Closes #134 (backend)
|
||
|---|---|---|
| .. | ||
| api | ||
| core | ||
| db | ||
| mcp | ||
| models | ||
| services | ||
| staples | ||
| static | ||
| styles | ||
| tasks | ||
| utils | ||
| __init__.py | ||
| cloud_session.py | ||
| main.py | ||
| tiers.py | ||