79 lines
5.4 KiB
Markdown
79 lines
5.4 KiB
Markdown
# 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).
|