| .. | ||
| assistant.py | ||
| catalog.json | ||
| connector.py | ||
| README.md | ||
Shkor Beauty Assistant
Beauty-ассистент магазина Shkor beauty: анализирует состояние кожи, подбирает продукты из каталога витрины, оформляет заказ с доставкой и выдаёт инструкции по применению. Подключается к любому агенту (LLM-бот, MCP-клиент, крон-скрипт, мобильное приложение).
Задача-источник: t-261005120225-672f52 (требования Alex). Каталог синхронизирован
с прототипом витрины ../shkor-beauty-prototype.html (t-261005115918-d38b36).
Состав
| Файл | Что это |
|---|---|
assistant.py |
Ядро: анализ кожи, рекомендации, заказы, инструкции. Один вход handle(request) -> dict |
connector.py |
Универсальный коннектор: STDIO (MCP-стиль), HTTP API, CLI, демо-чат |
catalog.json |
12 товаров витрины с мета-данными (concerns, actives, routine_step) |
orders.json |
Локальный леджер заказов (создаётся при первом заказе) |
Подключение любым агентом
1) STDIO, MCP-стиль — для Claude/любого MCP-клиента:
{"mcpServers": {"shkor": {"command": "python3", "args": ["/root/simbiot-harness/artifacts/shkor/connector.py"], "transport": "stdio"}}}
Протокол: построчный JSONL. {"method":"tools/list"} → список инструментов;
{"method":"tools/call","params":{"name":"analyze_skin","arguments":{...}},"id":1} → результат.
2) HTTP API — агент = любой HTTP-клиент:
connector.py --http 127.0.0.1:8791
curl -XPOST localhost:8791/call -d '{"name":"recommend","arguments":{"concerns":["dryness"]}}'
Роуты: GET /health, POST /tools/list, POST /call.
3) CLI разовый вызов — крон/скрипты:
connector.py --call analyze_skin --args '{"self_report":"стянутость и покраснения"}'
4) Живая проверка: connector.py --demo — полный сценарий: анализ → подбор → заказ → инструкция → статус.
Инструменты (7)
analyze_skin{self_report?, symptoms?, photo_report?}→ тип кожи, concerns, hydration-индекс, состояние барьера, фокус рутины.photo_report— принимаем отчёт vision-агента по селфи (JSON или текст): мержим с самоотчётом, источники считаем отдельно.recommend{concerns?, skin_type?, budget_max?}→ подобранные карточки с объяснением «почему».search{query?, category?}→ поиск по каталогу (бренд/название/актив/категория).place_order{items:[{id,qty}], delivery?, name?, phone?, address?, pay_method?, pay_link?}→ заказSB-XXXXXXXX, сумма, доставка. Платёж:cash_on_deliveryилиpay_linkот платёжного агента (Stripe/Альфа-Банк) — ассистент не хранит карты.check_order{order_id}→ статус заказа и доставки.delivery_options{cart_total?}→ курьер Минск / Европочта / самовывоз, бесплатно от 80 BYN.usage_instructions{product_ids}→ пошаговые инструкции, порядок нанесения, предостережения (ретинол только на ночь и не в один день с кислотами, SPF обязателен).
Пример потока агента
1. analyze_skin {"self_report": "кожа стянутая, лоб блестит, покраснения"}
→ {"skin_type":"combination","concerns":["dryness","redness","oiliness"],"barrier":"compromised",...}
2. recommend {"concerns":["dryness","redness"], "skin_type":"sensitive"}
→ пэды JMsolution, тонер Anua Centella 77%, сыворотка SKIN627
3. place_order {"items":[{"id":"p05","qty":1},{"id":"p03","qty":1}],"delivery":"minsk_courier"}
→ SB-XXXXXXXX, 111.0 BYN, доставка бесплатно (корзина ≥80), курьер сегодня/завтра
4. usage_instructions {"product_ids":["p05","p03"]}
→ тонер (шаг 2) → SPF (шаг 7), предупреждения
5. check_order {"order_id":"SB-XXXXXXXX"}
Границы (честно)
- Анализ — эвристический (словарь стеммов RU/EN + голосование по типу), НЕ постановка диагноза; в каждом ответе дисклеймер «не медицинская консультация».
- Оплата — заглушка
pending: реальный эквайринг подключает агент-хост черезpay_link(см. задачу по методам оплаты портала). - Каталог = витрина-прототип (12 SKU). При росте — заменить
catalog.jsonбез правок кода.
Запуск тестов: python3 connector.py --demo (создаёт тестовый заказ в orders.json).