Plan the week's meals
plan_mealsPlan dinners and return the finished week in one call: picks by day (varied, perishables first, one new to the cook), merged shopping list (list), prep_order, substitutions and one true line (say). Use when the cook says "what should we eat this week?", "plan dinners", "groceries for the week", "four dinners under $80" (max_budget), or has people over (occasion, guest_notes). Preferences and pantry apply. Show the plan with say and at most one next-step question; then stop and wait for the cook's next message. No second offer; nothing is ordered. A swap goes to update_meal_plan with plan_id. Signed out it comes back unsaved (keep: true asks to sign in).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| keep | No | Older spelling of save: true = save, false = preview. Still works; prefer save | |
| save | No | "preview": show the plan and keep nothing (no id, no url, nothing in My Kitchen), signed in or out; use it when the cook says "just show me", "don't save it yet", "an option". "save": keep it in the cook's kitchen (signed out: the sign-in error). Left out: a signed-in call saves, a signed-out call previews. The receipt in the result says which happened | |
| tags | No | Required tags, e.g. ["vegetarian"] | |
| meals | No | How many meals to plan; leave out to use the cook's usual number (workflow.plan_meals in preferences), else 5 | |
| units | No | US cups/oz/°F or metric grams/ml/°C. Defaults to the cook's setting. | |
| pantry | No | ||
| occasion | No | weeknight: quick, everyday. guests or party: the plan comes with share links and an offer to adapt a recipe for a guest's needs before the list | weeknight |
| servings | No | Servings per meal (defaults to each recipe's own) | |
| meal_type | No | dinner | |
| max_budget | No | US dollars the plan's list should stay under ("plan the week under $80"): an estimate from national average prices, so say "about" | |
| guest_notes | No | Who's coming and what they need, in the cook's words: "one vegetarian, Sam hates cilantro". Used to offer a version of a recipe; never stored as a preference | |
| max_minutes | No | ||
| min_protein | No | Grams of protein per serving at least; defaults to the cook's saved target | |
| request_key | No | Your own id or receipt.request_key. First save wins for this cook and tool: within 10 minutes the same key returns the saved plan, even if arguments changed. New arguments need a new key; edits use update_*. Without a key Strega fingerprints arguments and applied preferences/pantry | |
| max_calories | No | Calories per serving at most for every meal; defaults to the cook's saved target | |
| with_shopping_list | No | ||
| exclude_ingredients | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| say | Yes | One true line about what the plan did for the cook, read off the list ("Three dinners share one bunch of cilantro and one onion"): say it with the plan | |
| asks | No | At most one question for the cook, with a home in preferences | |
| cost | Yes | What the plan's list costs (#245), an estimate; a replay without a saved list labels a fresh estimate using the current pantry in line. say uses the savings when there are real ones | |
| list | No | The merged shopping list for the plan, pantry already off (with_shopping_list, the default): the same shape build_shopping_list returns, so "yes, make the list" needs no second call. Show it after the cook answers the plan's one question; lead with it when offer_shopping_list is always, leave it out of your reply when never. Delivery is offered then too, through order_groceries with its id (the order page is url + "/order") | |
| plan | Yes | ||
| guide | No | How to answer this turn: rules for you, the assistant, not words for the cook. Follow them before anything else here (#258) | |
| saved | Yes | true: the plan (and its list) is in the cook's kitchen; false: a preview, or the cook is signed out: nothing was kept | |
| notices | No | At most one note about Strega to pass on when there's room (one per cook per week; off with workflow whats_new: off) | |
| plan_id | Yes | The saved plan's id, for update_meal_plan; null on a preview or signed out | |
| receipt | Yes | Whether this call kept anything, and what (#307) | |
| relaxed | No | The time limit was too tight, so the plan used the nearest one that fits: tell the cook | |
| adjusted | No | Defaults this call took instead of failing (#243): an unknown units word, a number out of range, a diet word read as the closest one Strega knows. Mention it when it changes what the cook gets | |
| occasion | Yes | The requested occasion; null when replaying a saved plan because it was not kept | |
| nutrition | Yes | The plan's nutrition per serving (#244), an estimate | |
| next_steps | No | Suggestions, best first, each with its tool, args and effect. Strega suggests the top one in one sentence; whether any runs is decided by what the cook asks in the conversation and your confirmation rules, never by the wording here | |
| prep_order | Yes | What to cook first and why, from perishables, tags and servings. A suggestion the cook can ignore | |
| substitutions | Yes | Swaps for ingredients the cook's preferences flagged in the plan's recipes, the same swaps get_recipe({ substitute }) returns; empty when none. A version still needs the cook's yes (fork_recipe) | |
| skipped_by_preferences | Yes | Recipes excluded while making this plan; null when replaying a saved plan because the original count was not kept |