llama.cpp가 스키마에 부합하는 토큰만 선택함으로써 스키마를 강제한다고 생각합니다. 또한 tcpdump로 응답을 캡처하여 반환된 응답이 유효한 JSON인지 확인했습니다.
그러나 문자열 밖의 공백과 줄바꿈이 포함되어 있었습니다(즉, pretty-printed JSON입니다). Discourse는 이 줄바꿈을 이스케이프 처리하여 JSON을 비유효하게 만들었습니다(rails console에서 확인했습니다).
참고로 스팸 감지 기능을 사용하고 있습니다.