Bueno, técnicamente es cierto, pero indica un error en el código. El mecanismo de respaldo funciona, por lo que no se genera ningún error, pero es mejor corregir la causa raíz en lugar de cambiarlo al nivel INFO para encubrirlo, ¿verdad?
JSON permite caracteres de salto de línea como espacios en blanco, pero no permite secuencias de escape fuera de las cadenas; sin embargo, la función de escape las codifica. Para solucionarlo, puedes modificarla para que solo escape los caracteres ASCII de 0x0 a 0x1f inclusive, según la especificación de JSON. (No sé cómo escribirlo en Ruby, así que no haré una solicitud de extracción.)
Creo que llama.cpp fuerza el esquema seleccionando únicamente los tokens que lo cumplen. También capturé una respuesta con tcpdump y verifiqué que la respuesta devuelta fuera JSON válido.
Sin embargo, contenía espacios y saltos de línea fuera de las cadenas de texto (es decir, era un JSON con formato legible), y Discourse escapaba esos saltos de línea, lo que lo hacía inválido (lo verifiqué en la consola de Rails).
Por cierto, estoy utilizando la función de detección de spam.