Server-Sent Events 규격은 의외로 작아. data: <json>\n\n 가 event 하나고, 빈 줄이 event 경계를 나눠. OpenAI stream 은 data: [DONE] 으로 끝나.
frame 구조
frame 하나는 한 줄 이상의 field: value 로 이루어지고 빈 줄에서 끝나. OpenAI 에서는 JSON payload 를 담는 data: 와 일부 proxy 가 keep-alive 용으로 넣는 : comment 를 볼 수 있어. comment 는 무시하고 literal data: [DONE] 을 종료 신호로 처리해.
SDK 를 써도 형식은 알아야 해
SDK 의 iter_lines() 가 framing 을 처리해주지만, proxy 가 : 로 시작하는 keep-alive comment 를 넣으면 직접 만든 parser 가 깨질 수 있어. 규격을 알면 어느 줄을 무시해야 하는지 바로 찾을 수 있어.
raw httpx 로 한 번 parsing 해봐
client.stream 과 iter_lines 로 frame 을 받고, data: prefix 를 떼고, JSON 을 읽고, [DONE] 을 감지해. SDK 가 감춰주는 일을 직접 확인해두면 wire 문제를 진단하기 쉬워져.