Server-Sent Events 는 100-line spec 이지 100-page 아냐. data: <json>\n\n 이 한 event. 빈 줄이 delimiter. data: [DONE] 이 종료. 끝.
Frame 구조
한 frame = 한 줄 이상의 field: value, 빈 줄로 종료. OpenAI 에서 실제로 보는 field — data: (JSON payload), : (comment, 일부 proxy 가 keep-alive 로 사용 — ignore). Terminator 는 literal line data: [DONE].
왜 직접 알아야
SDK 의 iter_lines() 가 framing 을 처리하지만 — 어느 날 corporate proxy 가 keep-alive comment (':' 시작 줄) 박기 시작하면 hand-rolled parser 가 깨짐. Spec 알면 그 사고 5 분 안에 진단.
Raw 로 parse 해 보기
Raw httpx client.stream 으로 streaming 호출 + iter_lines 로 frame 받아서 직접 parse. data: prefix 분리, JSON load, [DONE] 감지. SDK 가 어떤 일을 하는지 직접 본 사람과 안 본 사람의 디버깅 능력 차이.