simbiot-harness/artifacts/shkor/README.md

79 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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).