diff --git a/model/renderers/gemma4.go b/model/renderers/gemma4.go index 59133527f..4d8baa539 100644 --- a/model/renderers/gemma4.go +++ b/model/renderers/gemma4.go @@ -125,7 +125,7 @@ func (r *Gemma4Renderer) Render(messages []api.Message, tools []api.Tool, thinkV // Generation prompt. if prevMessageType != "tool_response" && prevMessageType != "tool_call" { sb.WriteString("<|turn>model\n") - if r.emptyBlockOnNothink { + if r.emptyBlockOnNothink && !hasThink { sb.WriteString("<|channel>thought\n") } } diff --git a/model/renderers/gemma4_reference_test.go b/model/renderers/gemma4_reference_test.go index d65a061e4..cb5a46963 100644 --- a/model/renderers/gemma4_reference_test.go +++ b/model/renderers/gemma4_reference_test.go @@ -1508,6 +1508,13 @@ func TestGemma4RendererVariantsMatchExpectedGenerationPrompt(t *testing.T) { } } +func TestGemma4LargeRendererOmitsEmptyThoughtBlockWhenThinkingEnabled(t *testing.T) { + got, err := RenderWithRenderer("gemma4-large", []api.Message{{Role: "user", Content: "Hello"}}, nil, thinkTrue()) + assert.NoError(t, err) + assert.Equal(t, "<|turn>system\n<|think|>\n\n<|turn>user\nHello\n<|turn>model\n", got) + assert.NotContains(t, got, "<|channel>thought\n") +} + func TestGemma4RendererMatchesJinja2ExpandedParity(t *testing.T) { if os.Getenv("VERIFY_JINJA2") == "" { t.Skip("set VERIFY_JINJA2=1 to run expanded Jinja2 parity checks")