Async streaming 패턴 — async with client.stream("POST", url, headers=h, json=body) as response:. Block 안에서 async for line in response.aiter_lines(): 가 SSE frame 을 yield. Framing (data: prefix, empty-line separator, [DONE] terminator) 은 dev 가 parse.
가장 큰 실수
Streaming block 안에서 response.aread() 또는 response.json() 호출. 둘 다 전체 body 수집 — streaming 무효. iterate 하거나 streaming 안 한다고 인정하거나.
SSE parse 단계
- Line stripping
- 'data: ' prefix 분리
- '[DONE]' 감지 → break
- JSON parse
- Event type 으로 dispatch
iter_lines vs iter_bytes
aiter_lines 는 줄 단위, aiter_bytes 는 raw byte chunk. SSE 는 줄 기반이라 aiter_lines 가 적합. iter_bytes 는 binary streaming (e.g. audio download) 용.