패턴
제대로 된 Python Ollama streaming client가 챙기는 세 가지:
timeout=None— Cold model의 첫 토큰 latency가 수십 초 갈 수 있어. Default httpx timeout은 warm-up 도중에 stream을 죽여. None으로 두고 server한테 맡겨.iter_lines()— HTTP client가 newline까지 buffer하다가 완성된 줄만 yield해줘. Raw byte를 읽어서 줄을 직접 재조립하지 마.flush=True— 토큰 찍을 때 꼭 켜. 안 그러면 stdio buffer가 streaming 느낌을 삼켜버려.
Production에서 어디 쓰여
이게 네 backend의 streaming endpoint를 짓는 벽돌이야. 피파의 Ollama vessel이 정확히 이 패턴 — Ollama에서 NDJSON stream, 각 chunk를 universal StreamChunk로 변환, JSONL ground truth에 write, frontend로 yield.
흔한 실수
timeout=None을 깜빡함. Default timeout이 cold start에서 stream을 죽여.- 줄 단위가 아니라 char 단위로 buffering함.
iter_text()는 network 경계에서 잘리는데,iter_lines()가 그 경계 문제를 대신 처리해줘. - 빈 마지막 chunk를 안 걸러냄.
done: true는 빈 content를 달고 와. 찍기 전에 break해.