Skip to main content

rhapsode-conform

Point it at a worker and it says whether that worker is one.

rhapsode-conform unix:/run/rhapsode/workers/chatterbox.sock
rhapsode-conform tcp:127.0.0.1:9310
rhapsode-conform http://gpu-02.lan:9310

It talks HTTP and nothing else, so a worker on a socket, a worker on another machine, and a worker written in a language this project has never heard of are all the same thing to it. The exit code is the verdict, which is the whole interface for wiring it into your own CI.

Every check names the section of docs/protocol.md it comes from. The one worth understanding is the pair that compare audio with and without a cue or a delivery. Section 8 says an adapter must do exactly one thing honestly, claim only what its loaded variant can actually perform, and that nothing else checks it. That is still true in general, but the common shape of the lie is a claim wired to nothing at all, and a claim wired to nothing produces audio identical to the line without it. This catches that.

Only with the seed held fixed, though. A model that samples produces different audio on every call, so without a seed "the audio changed" is true whether or not anything was performed, and a check that cannot fail would be reported as one that had succeeded. So the suite first asks, per variant, whether the same seed and text reproduce the same audio. Where they do, the comparisons run with that seed. Where they do not, which ยง 6 allows, the comparisons are reported as skip rather than ok, and the summary says so on its own line: nothing failed, but the checks about whether a claimed cue is performed could not be decided, so listen to those yourself. --strict turns undecided into a failing exit code, for a CI that needs the honesty checks decided.