> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sajuapi.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# 일일 운세 스트리밍

> Server-Sent Events를 통한 실시간 운세 스트리밍

운세 생성 과정을 실시간으로 스트리밍하여 사용자 경험을 개선합니다.

## 요청

일반 `/v1/fortunes/daily` 엔드포인트와 동일한 파라미터를 사용합니다.

## 응답 (Server-Sent Events)

```
event: start
data: {"type": "start", "requestId": "req_abc123", "model": "haiku"}

event: partial
data: {"type": "partial", "data": {"todayFortune": {"actionItems": [...]}}}

event: partial
data: {"type": "partial", "data": {"investmentFortune": {...}}}

event: complete
data: {"type": "complete", "data": {...}, "meta": {...}}

data: [DONE]
```

## 클라이언트 구현 예시

```typescript theme={null}
function useDailyFortuneStream(birthDate: string) {
  const [fortune, setFortune] = useState(null);
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    const eventSource = new EventSource(
      `/v1/fortunes/daily-stream?birthDate=${birthDate}`,
      { headers: { 'X-API-Key': API_KEY } }
    );

    eventSource.addEventListener('partial', (e) => {
      const partial = JSON.parse(e.data);
      setFortune(prev => ({ ...prev, ...partial.data }));
    });

    eventSource.addEventListener('complete', (e) => {
      const complete = JSON.parse(e.data);
      setFortune(complete.data);
      setIsLoading(false);
      eventSource.close();
    });

    return () => eventSource.close();
  }, [birthDate]);

  return { fortune, isLoading };
}
```

## 캐시된 응답

캐시 히트 시 단일 `complete` 이벤트로 즉시 응답합니다:

```
event: complete
data: {"type": "complete", "data": {...}, "meta": {"cached": true, "costPerCall": 0}}

data: [DONE]
```
