# 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-клиента: ```json {"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-клиент: ```bash 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 разовый вызов** — крон/скрипты: ```bash 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).