Je pense que llama.cpp impose le schéma en ne sélectionnant que les jetons qui y sont conformes. J’ai également capturé une réponse avec tcpdump et vérifié que la réponse retournée est un JSON valide.
Cependant, elle contenait des espaces et des sauts de ligne en dehors des chaînes (c’est-à-dire qu’il s’agissait d’un JSON formaté), et ces sauts de ligne ont été échappés par Discourse, ce qui l’a rendu invalide (je l’ai vérifié dans la console Rails).
Je utilise d’ailleurs la fonctionnalité de détection des spams.