# 3. Stylist Agent (AI Nặng — Best Seller)

Stylist đóng vai trò **chốt sale**: nhận data sản phẩm từ Tool, lịch sử hội thoại, và InsightJSON để sinh câu trả lời tư vấn thuyết phục.

## Input

| Input | Nguồn | Mục đích |
|---|---|---|
| `tool_results` | ProductSearchEngine | Danh sách SP có stock + outfit context |
| `insight_json` | Redis (InsightJSON cũ) | Biết khách ở Mode nào → chọn đúng Tone |
| `STAGE` + `tone_directive` | Classifier Output | Ép Stylist bơm đúng giọng |
| `chat_history` | Redis | Ngữ cảnh hội thoại |
| `STYLIST_SYSTEM_PROMPT` | prompts.py | Guardrails + quy tắc ứng xử |

## Output: StylistOutput Schema

```python
class StylistOutput(BaseModel):
    ai_response: str           # Câu trả lời tư vấn (max 200 từ)
    product_ids: list[str]     # Danh sách SKU đã đề cập
    user_insight: InsightJSON  # InsightJSON cập nhật
```

## Guardrails (Rào chắn)

Stylist bị ràng buộc bởi `STYLIST_SYSTEM_PROMPT` với các quy tắc nghiêm ngặt:

| Quy tắc | Lý do |
|---|---|
| Không tự ý đề cập giảm giá nếu không có trong data | Tránh hứa hão → khách claim → rủi ro pháp lý |
| Không chèo kéo ở Mode 5 (Retention) | Khách đã từ chối → chèo kéo gây phản cảm |
| Không quăng list SP ở Mode 1 (Browse) | Khách chưa sẵn sàng → spam SP = mất khách |
| Tối đa 200 từ mỗi response | Tin nhắn dài → khách không đọc → mất tương tác |
| Ưu tiên gợi ý combo (áo + quần + phụ kiện) | Tăng AOV (Average Order Value) |
| Không dùng emoji quá 2 cái | Giữ tone chuyên nghiệp |

## Cách Stylist cập nhật InsightJSON

Mỗi turn, Stylist phân tích tin nhắn khách và cập nhật:

```python
# Ví dụ: Khách nói "Cho anh xem áo khoác dạ đi Sapa, budget 800k"
# Stylist cập nhật InsightJSON:
{
    "USER": "Anh (nam)",
    "TARGET": "Cho bản thân",
    "GOAL": "Đi du lịch Sapa",
    "CONSTRAINS": "Budget 800k",
    "STAGE": "CONSIDERING",      # Nhảy từ IDENTIFYING → CONSIDERING
    "STAGE_NUM": 3,
    "TONE": "Persuasive",
    "LATEST_PRODUCT_INTEREST": "Áo khoác dạ",
    "LAST_ACTION": "Yêu cầu tìm SP cụ thể"
}
```

File tham chiếu: `graph.py` — hàm `_stylist_node()`, `prompts.py` — `STYLIST_SYSTEM_PROMPT`
