# 2. Classifier Agent (AI Nhẹ — Router)

Classifier đóng vai trò **Lễ tân**: đọc tin nhắn khách, phân loại ý định, quyết định gọi Tool hay trả lời trực tiếp (Early Exit).

## Input

Classifier nhận 3 input mỗi turn:

| Input | Nguồn | Mục đích |
|---|---|---|
| `message` | Tin nhắn mới nhất từ khách | Ý định hiện tại |
| `insight_json` | Redis (device_id) | Bộ nhớ khách hàng — biết khách ở Mode nào |
| `chat_history` | Redis (5 tin gần nhất) | Ngữ cảnh hội thoại |

## Output: ClassifierOutput Schema

```python
class ClassifierOutput(BaseModel):
    reasoning: str          # Lý luận tại sao gọi/không gọi tool
    tool_name: str | None   # "lead_search_tool" hoặc null (Early Exit)
    lead_search_args: ClassifierLeadSearchArgs | None
    ai_response: str | None # Câu trả lời khi Early Exit
    product_ids: list[str] | None  # Mã SKU nếu khách hỏi trúng mã
```

Classifier **bắt buộc** dùng `with_structured_output()` — output là JSON chuẩn, không phải text tự do. Điều này loại bỏ hoàn toàn rủi ro ảo giác ở bước routing.

## Early Exit — Khi nào không cần gọi Tool?

| Tình huống | tool_name | ai_response |
|---|---|---|
| Khách chào "Hi", "Alo", "Chào shop" | `null` | "Dạ chào bạn! Mình là Stylist Canifa..." |
| Khách hỏi chung "Có gì mới không?" | `null` | "Dạ tuần này Canifa có bộ sưu tập..." |
| Khách nói "Cảm ơn", "Bye" | `null` | "Dạ không có gì ạ, hẹn gặp lại!" |
| Khách tâm sự "Hôm nay mệt quá" | `null` | "Dạ bạn nghỉ ngơi nhé, khi nào..." |

**Lợi ích Early Exit:** Tiết kiệm 1 lần gọi Tool + 1 lần gọi Stylist = giảm latency 50-70% cho các tin nhắn đơn giản.

## Dual-Lane Search Args

Khi Classifier quyết định gọi Tool, nó xuất `ClassifierLeadSearchArgs` gồm **2 lane**:

```python
class ClassifierLeadSearchArgs(BaseModel):
    literal: LiteralSearchArgs    # Lane 1: Nguyên văn
    inferred: InferredSearchArgs  # Lane 2: Suy luận cấu trúc
```

Chi tiết 2 lane này được giải thích ở trang **Split Query & Cascading Search**.

File tham chiếu: `graph.py` — hàm `_classifier_node()`
