OpenCode Go's Claude models (over Anthropic Messages) refuse a
conversation ending with the assistant's message, "This model does not
support assistant message prefill. The conversation must end with a user
message.", and Volcengine's Agent Plan does too, "The last message cannot
be from the assistant for a model that does not support prefill".
magpie took every Anthropic upstream to go on from a prefill, so both a
client's own resume (Codex sends what it has of a cut reply as the last
assistant message) and magpie's own continuation of a cut reply (#853)
ended with that refusal.
The refusal is about the model, so it is remembered for that provider,
model and API in unfit (prefillRefused); the provider's other models,
and every upstream that takes a prefill, are unchanged.
- A Chat or Responses client's conversation ending with the assistant's
message, which those APIs read as a turn already said, is asked again
with a user turn after it ("Continue."), the conversation the refusal
asks for, and so from then on: translated (forwardTranslated, whole
and streamed) and relayed as is (passthrough, Chat and Responses: the
Volcengine case).
- An Anthropic client's prefill is its own ask and still gets the
refusal as the vendor sent it.
- magpie's own continuation is not asked of that model again, and the
try it refused ends the reply with what cut it, as a reply that can't
go on did before #853, not with the refusal of an ask the client never
made. No user-turn continuation there: a re-answer spliced onto the
part the client has is the garble continuation.go avoids.
The thinking-block refusal in the same report (a signed thinking block
with no text) is a separate fix, in its own commit.
Tests (prefill_test.go), from the report's literal messages: the
issue's Responses repro and a streamed Chat request to an Anthropic
upstream (TestTrailingAssistantToNoPrefillModel, also checks another
model keeps its prefill), Volcengine's refusal relayed on Responses and
Chat (TestTrailingAssistantRelayedToNoPrefillModel), a cut reply
(TestStreamCutOnNoPrefillModel), an Anthropic client's prefill
(TestAnthropicPrefillToNoPrefillModel), userLastBody. With the refusal
unrecognised (the old code's behaviour) the first three fail with the
report's "UP: Upstream request failed: [invalid_request_error] This
model does not support assistant message prefill…" / "…the reply didn't
end with what cut it"; with the remembering removed they fail with
"calls 4 … asked one again" and "calls = 2 … asked to go on again".
Run: gofmt -l (clean), go vet -tags nogui ./internal/gateway on darwin,
GOOS=linux and GOOS=windows, go test -tags nogui ./... under a scratch
HOME with pinned caches (all ok). Not run for real: the owner's OpenCode
Go key answers 403 "An active OpenCode Go subscription is required", and
there is no Volcengine Agent Plan account.