Client Request
    ↓
[Cache Check] → HIT? → Return ngay
    ↓ MISS
[Load History + User Insight]
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🌊 STREAMING BẮT ĐẦU
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
async for event in graph.astream():
    ├─ LLM gọi tools (nếu cần)
    ├─ Tools return data
    ├─ LLM bắt đầu sinh JSON response (streaming tokens)
    │
    └─ Bắt được event["ai_response"] với content streaming:
       ↓
       Accumulate tokens: '{"ai_response": "text...", "product_ids": ["SK'
       ↓
       ⚡ REGEX: Match ngay khi detect được pattern "product_ids": [...]
       ├─ Regex match: "ai_response": "..." ✅
       ├─ Regex match: "product_ids": ["SKU1", "SKU2"] ✅
       └─ user_insight: {...} ← VẪN ĐANG STREAM, CHƯA CÓ!
       ↓
       🚨 BREAK NGAY! TRẢ RESPONSE, KHÔNG ĐỢI user_insight!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ↓
⚡ RESPONSE TRẢ NGAY:
{
  "ai_response": "...",
  "product_ids": ["SKU1", "SKU2"]
}
    ↓ (Background tasks)
    ├─ 💾 Save user_insight to Redis
    ├─ 💾 Cache response
    └─ 📝 Save history