async streaming 은 async with client.stream("POST", url, headers=h, json=body) as response: 로 시작해. block 안에서 async for line in response.aiter_lines(): 를 순회하면 SSE 줄이 차례로 와. data: prefix, 빈 줄 경계, [DONE] 종료는 client가 parsing 해야 해.
stream 안에서 전체 body를 읽지 마
response.aread()나 response.json()은 body 전체가 올 때까지 기다려 streaming을 무효로 만들어. 줄을 순회하거나, 중간 결과가 필요 없다면 처음부터 non-streaming 호출을 선택해.
SSE parsing 순서
- 줄 양끝의 불필요한 문자를 정리해.
data:prefix를 떼어.[DONE]이면 loop를 끝내.- 나머지 payload를 JSON으로 parsing해.
- event type에 따라 처리해.
text SSE에는 aiter_lines
aiter_lines는 줄 단위, aiter_bytes는 raw byte chunk 단위야. 줄 기반인 SSE에는 aiter_lines가 맞고, audio download 같은 binary streaming에는 aiter_bytes가 맞아.