diff --git a/CHANGELOG.md b/CHANGELOG.md index 87bb8b7..117289f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,38 @@ one of them changed. An entry says which artefact and which version, so `web 0.1 Every version published to a channel appears here. Nothing is written from memory afterwards: a build cannot be published without its entry. +## 2026-08-28 — Models other than OpenAI's work again `api 0.96.0` + +**Read this if you point Jarvis at anything other than OpenAI.** Self-hosted models, Qwen, Llama, +Mistral, anything behind LiteLLM or a similar gateway. If you use OpenAI, nothing here changes for +you. + +A conversation in which the assistant had used a tool would fail from that point on, with the +provider answering: + +```text +400 System message must be at the beginning +``` + +and failing the same way on every retry and every later message in that conversation. There was no +way round it except starting a new conversation and avoiding tools, which is most of what Jarvis +does. + +The cause was on our side. Jarvis records what a tool returned as its own entry in the context, +placed immediately after the assistant turn it belongs to — the position is what says "these are the +results of the turn above". That entry was labelled as a system instruction, which OpenAI accepts +anywhere in a conversation and almost every other provider rejects outright. + +It is now labelled in a way every provider accepts at any position, and it still says in its own +first sentence that the platform wrote it and the assistant did not — which is what stops a model +learning to write tool results instead of asking for them. Nothing changes about what the model is +told; only the envelope it arrives in. + +A guard now also sits on the last line before any request leaves for your provider, so a +mislabelled entry is corrected and logged rather than costing you a conversation. + +**Nothing to do.** Take the build; conversations that were failing will work on their next message. + ## 2026-08-27 — A machine could show Offline while you were using it `api 0.95.0` `web 0.121.0` **Only affects deployments running more than one copy of the api.** On Docker Compose this cannot