refactor(backend): consolidate product LLM function tools

This commit is contained in:
Piotr Oleszczyk 2026-03-05 16:44:03 +01:00
parent b99b9ed68e
commit 40d26514a1
6 changed files with 172 additions and 380 deletions

View file

@ -5,11 +5,9 @@ from unittest.mock import patch
from sqlmodel import Session
from innercontext.api.products import (
_build_actives_tool_handler,
_build_inci_tool_handler,
_build_safety_rules_tool_handler,
_build_shopping_context,
_extract_requested_product_ids,
build_product_details_tool_handler,
)
from innercontext.models import (
Product,
@ -107,9 +105,7 @@ def test_suggest_shopping(client, session):
kwargs = mock_gemini.call_args.kwargs
assert "USER PROFILE:" in kwargs["contents"]
assert "function_handlers" in kwargs
assert "get_product_inci" in kwargs["function_handlers"]
assert "get_product_safety_rules" in kwargs["function_handlers"]
assert "get_product_actives" in kwargs["function_handlers"]
assert "get_product_details" in kwargs["function_handlers"]
def test_shopping_context_medication_skip(session: Session):
@ -154,11 +150,7 @@ def test_shopping_tool_handlers_return_payloads(session: Session):
payload = {"product_ids": [str(product.id)]}
inci_data = _build_inci_tool_handler([product])(payload)
assert inci_data["products"][0]["inci"] == ["Water", "Niacinamide"]
actives_data = _build_actives_tool_handler([product])(payload)
assert actives_data["products"][0]["actives"][0]["name"] == "Niacinamide"
safety_data = _build_safety_rules_tool_handler([product])(payload)
assert "context_rules" in safety_data["products"][0]
details = build_product_details_tool_handler([product])(payload)
assert details["products"][0]["inci"] == ["Water", "Niacinamide"]
assert details["products"][0]["actives"][0]["name"] == "Niacinamide"
assert "context_rules" in details["products"][0]

View file

@ -250,9 +250,7 @@ def test_suggest_routine(client, session):
kwargs = mock_gemini.call_args.kwargs
assert "USER PROFILE:" in kwargs["contents"]
assert "function_handlers" in kwargs
assert "get_product_inci" in kwargs["function_handlers"]
assert "get_product_safety_rules" in kwargs["function_handlers"]
assert "get_product_actives" in kwargs["function_handlers"]
assert "get_product_details" in kwargs["function_handlers"]
def test_suggest_batch(client, session):

View file

@ -4,15 +4,13 @@ from datetime import date, timedelta
from sqlmodel import Session
from innercontext.api.routines import (
_build_actives_tool_handler,
_build_day_context,
_build_grooming_context,
_build_inci_tool_handler,
_build_objectives_context,
_build_products_context,
_build_recent_history,
_build_safety_rules_tool_handler,
_build_skin_context,
build_product_details_tool_handler,
_contains_minoxidil_text,
_ev,
_extract_active_names,
@ -294,7 +292,9 @@ def test_get_available_products_respects_filters(session: Session):
assert "PM Cream" not in am_names
def test_build_inci_tool_handler_returns_only_available_ids(session: Session):
def test_build_product_details_tool_handler_returns_only_available_ids(
session: Session,
):
available = Product(
id=uuid.uuid4(),
name="Available",
@ -316,7 +316,7 @@ def test_build_inci_tool_handler_returns_only_available_ids(session: Session):
product_effect_profile={},
)
handler = _build_inci_tool_handler([available])
handler = build_product_details_tool_handler([available])
payload = handler(
{
"product_ids": [
@ -334,6 +334,8 @@ def test_build_inci_tool_handler_returns_only_available_ids(session: Session):
assert products[0]["id"] == str(available.id)
assert products[0]["name"] == "Available"
assert products[0]["inci"] == ["Water", "Niacinamide"]
assert "actives" in products[0]
assert "safety" in products[0]
def test_extract_requested_product_ids_dedupes_and_limits():
@ -373,7 +375,7 @@ def test_extract_active_names_uses_compact_distinct_names(session: Session):
assert names == ["Niacinamide", "Zinc PCA"]
def test_additional_tool_handlers_return_product_payloads(session: Session):
def test_product_details_tool_handler_returns_product_payloads(session: Session):
p = Product(
id=uuid.uuid4(),
name="Detail Product",
@ -388,8 +390,6 @@ def test_additional_tool_handlers_return_product_payloads(session: Session):
ids_payload = {"product_ids": [str(p.id)]}
actives_out = _build_actives_tool_handler([p])(ids_payload)
assert actives_out["products"][0]["actives"][0]["name"] == "Niacinamide"
safety_out = _build_safety_rules_tool_handler([p])(ids_payload)
assert "context_rules" in safety_out["products"][0]
details_out = build_product_details_tool_handler([p])(ids_payload)
assert details_out["products"][0]["actives"][0]["name"] == "Niacinamide"
assert "context_rules" in details_out["products"][0]