From 609995732b2c712d46996e183996bcbb07d92dec Mon Sep 17 00:00:00 2001 From: Piotr Oleszczyk Date: Tue, 3 Mar 2026 00:50:49 +0100 Subject: [PATCH] feat(routines): add minimize_products option for batch suggestions --- backend/innercontext/api/routines.py | 14 +++++++++++--- frontend/src/lib/api.ts | 1 + .../src/routes/routines/suggest/+page.server.ts | 3 ++- frontend/src/routes/routines/suggest/+page.svelte | 12 ++++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/backend/innercontext/api/routines.py b/backend/innercontext/api/routines.py index 56d41b4..290a252 100644 --- a/backend/innercontext/api/routines.py +++ b/backend/innercontext/api/routines.py @@ -97,6 +97,7 @@ class SuggestBatchRequest(SQLModel): to_date: date notes: Optional[str] = None include_minoxidil_beard: bool = False + minimize_products: Optional[bool] = None class DayPlan(SQLModel): @@ -273,7 +274,9 @@ def _build_products_context(session: Session, time_filter: Optional[str] = None) product_ids = [p.id for p in products] inventory_rows = ( session.exec( - select(ProductInventory).where(col(ProductInventory.product_id).in_(product_ids)) + select(ProductInventory).where( + col(ProductInventory.product_id).in_(product_ids) + ) ).all() if product_ids else [] @@ -291,7 +294,7 @@ def _build_products_context(session: Session, time_filter: Optional[str] = None) p.inventory = inv_by_product.get(p.id, []) ctx = p.to_llm_context() entry = ( - f" - id={ctx['id']} name=\"{ctx['name']}\" brand=\"{ctx['brand']}\"" + f' - id={ctx["id"]} name="{ctx["name"]}" brand="{ctx["brand"]}"' f" category={ctx.get('category', '')} recommended_time={ctx.get('recommended_time', '')}" f" targets={ctx.get('targets', [])}" ) @@ -552,12 +555,17 @@ def suggest_batch( dates_str = "\n".join(date_range_lines) notes_line = f"\nKONTEKST OD UŻYTKOWNIKA: {data.notes}\n" if data.notes else "" + minimize_line = ( + "\nOGRANICZENIA:\n - Minimalizuj liczbę unikalnych produktów (używaj tych samych produktów wielokrotnie)\n" + if data.minimize_products + else "" + ) prompt = ( f"Zaproponuj plan pielęgnacji AM + PM dla każdego dnia z zakresu:\n{dates_str}\n\n" "DANE WEJŚCIOWE:\n" f"{skin_ctx}\n{grooming_ctx}\n{history_ctx}\n{products_ctx}\n{objectives_ctx}" - f"{notes_line}\n" + f"{notes_line}{minimize_line}" "\nZwróć JSON zgodny ze schematem." ) diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 75717c7..684b5be 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -150,6 +150,7 @@ export const suggestBatch = (body: { to_date: string; notes?: string; include_minoxidil_beard?: boolean; + minimize_products?: boolean; }): Promise => api.post('/routines/suggest-batch', body); export const getGroomingSchedule = (): Promise => diff --git a/frontend/src/routes/routines/suggest/+page.server.ts b/frontend/src/routes/routines/suggest/+page.server.ts index 311e247..99fd7ac 100644 --- a/frontend/src/routes/routines/suggest/+page.server.ts +++ b/frontend/src/routes/routines/suggest/+page.server.ts @@ -42,6 +42,7 @@ export const actions: Actions = { const to_date = form.get('to_date') as string; const notes = (form.get('notes') as string) || undefined; const include_minoxidil_beard = form.get('include_minoxidil_beard') === 'on'; + const minimize_products = form.get('minimize_products') === 'on'; if (!from_date || !to_date) { return fail(400, { error: 'Daty początkowa i końcowa są wymagane.' }); @@ -54,7 +55,7 @@ export const actions: Actions = { } try { - const batch = await suggestBatch({ from_date, to_date, notes, include_minoxidil_beard }); + const batch = await suggestBatch({ from_date, to_date, notes, include_minoxidil_beard, minimize_products }); return { batch, from_date, to_date }; } catch (e) { return fail(502, { error: (e as Error).message }); diff --git a/frontend/src/routes/routines/suggest/+page.svelte b/frontend/src/routes/routines/suggest/+page.svelte index f0ef4ce..d21a9dc 100644 --- a/frontend/src/routes/routines/suggest/+page.svelte +++ b/frontend/src/routes/routines/suggest/+page.svelte @@ -286,6 +286,18 @@

{m["suggest_minoxidilToggleHint"]()}

+
+ +
+ +

Ogranicz liczbę różnych produktów

+
+