# Cơ chế Live Stream với SSE (Server-Sent Events)

Hệ thống Realtime Monitor loại bỏ hoàn toàn việc sử dụng Polling liên tục từ phía client, thay vào đó ứng dụng công nghệ **SSE (Server-Sent Events)** để đẩy (push) dữ liệu một chiều từ Server về Client một cách tối ưu. Mặc dù tiêu đề trước đây có nhắc tới WebSocket, nhưng kiến trúc thực tế đã sử dụng StreamingResponse của FastAPI qua chuẩn SSE để đơn giản hóa giao thức.

## Logic Hoạt Động Cốt Lõi

1. **Khởi tạo kết nối**: Client gửi request GET tới endpoint `/api/live-monitor/stream` cùng các tham số `window_minutes` và `interval_seconds`.
2. **Snapshot đầu tiên**: Server lấy dữ liệu snapshot hiện tại từ Langfuse REST API và trả về qua sự kiện `type: snapshot`.
3. **Vòng lặp sự kiện (Event Loop)**: Mỗi `interval_seconds` (mặc định là 4s), server sẽ ngầm kiểm tra lại snapshot mới bằng cách gọi API của Langfuse.
4. **Cơ chế Signature (Chống dội payload)**: Snapshot mới được băm thành một chuỗi `signature` dựa trên 5 yếu tố: `last_event_at`, `total_traces`, `active_sessions`, `traces_in_last_minute`, và `latest_trace_id`.
   - Nếu `signature` **thay đổi**: Gửi payload hoàn chỉnh với event `type: dashboard_update`.
   - Nếu `signature` **không đổi**: Gửi event `type: heartbeat` cực nhẹ để báo client biết kết nối vẫn đang sống, kèm theo trạng thái (`status`).

## Sequence Diagram

```mermaid
sequenceDiagram
    participant Client
    participant API as /api/live-monitor/stream
    participant Snapshot as _fetch_live_snapshot()
    participant Langfuse as Langfuse REST API

    Client->>API: GET /stream?window_minutes=20&interval_seconds=4
    API->>Snapshot: Lấy dữ liệu lần đầu
    Snapshot->>Langfuse: GET /api/public/traces
    Langfuse-->>Snapshot: Trả về tối đa 100 traces
    Snapshot-->>API: Trả về dict & signature
    API-->>Client: SSE Event (type: snapshot)

    loop Mỗi 4 giây (interval_seconds)
        API->>Snapshot: Kiểm tra snapshot mới
        Snapshot->>Langfuse: GET /api/public/traces
        Langfuse-->>Snapshot: Traces mới nhất
        Snapshot-->>API: Snapshot mới & signature mới
        
        alt signature != last_signature
            API-->>Client: SSE Event (type: dashboard_update)
        else signature == last_signature
            API-->>Client: SSE Event (type: heartbeat)
        end
    end
```
