gemma4-31b

#127
by Draeson - opened
Files changed (2) hide show
  1. README.md +58 -81
  2. chat_template.jinja +41 -68
README.md CHANGED
@@ -16,21 +16,20 @@ base_model:
16
  <a href="https://huggingface.co/collections/google/gemma-4" target="_blank">Hugging Face</a> |
17
  <a href="https://github.com/google-gemma" target="_blank">GitHub</a> |
18
  <a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/" target="_blank">Launch Blog</a> |
19
- <a href="https://ai.google.dev/gemma/docs/core" target="_blank">Documentation</a>|
20
- <a href="https://arxiv.org/abs/2607.02770" target="_blank">Technical Report</a>
21
  <br>
22
  <b>License</b>: <a href="https://ai.google.dev/gemma/docs/gemma_4_license" target="_blank">Apache 2.0</a> | <b>Authors</b>: <a href="https://deepmind.google/models/gemma/" target="_blank">Google DeepMind</a>
23
  </p>
24
 
25
- Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on E2B, E4B, and 12B) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages.
26
 
27
- Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in five distinct sizes: **E2B**, **E4B**, **12B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI.
28
 
29
  Gemma 4 introduces key **capability and architectural advancements**:
30
 
31
  * **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes.
32
 
33
- * **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B, E4B, and 12B models).
34
 
35
  * **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment.
36
 
@@ -44,27 +43,25 @@ Gemma 4 introduces key **capability and architectural advancements**:
44
 
45
  ## **Models Overview**
46
 
47
- Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (12B, 26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding.
48
 
49
  The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE).
50
 
51
  ### Dense Models
52
 
53
- | Property | E2B | E4B | 12B Unified | 31B Dense |
54
- | :---- | :---- | :---- | :---- | :---- |
55
- | **Total Parameters** | 2.3B effective <br> (5.1B with embeddings) | 4.5B effective <br> (8B with embeddings) | 11.95B | 30.7B |
56
- | **Layers** | 35 | 42 | 48 | 60 |
57
- | **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | 1024 tokens |
58
- | **Context Length** | 128K tokens | 128K tokens | 256K tokens | 256K tokens |
59
- | **Vocabulary Size** | 262K | 262K | 262K | 262K |
60
- | **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image, Audio | Text, Image |
61
- | **Vision Encoder Parameters** | *~150M* | *~150M* | - | *~550M* |
62
- | **Audio Encoder Parameters** | *~300M* | *~300M* | - | No Audio |
63
 
64
  The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total.
65
 
66
- The "Unified" in Gemma 4 12B Unified refers to its encoder-free architecture. Other Gemma 4 models use dedicated encoders to process multimodal data before passing it to the LLM. Gemma 4 12B eliminates these encoders entirely, projecting raw image patches and audio waveforms directly into the LLM's embedding space through lightweight linear layers. This unified approach means all modalities flow straight into a single decoder-only transformer, reducing multimodal latency and allowing the entire model to be fine-tuned in one pass.
67
-
68
  ### Mixture-of-Experts (MoE) Model
69
 
70
  | Property | 26B A4B MoE |
@@ -85,44 +82,42 @@ The "A" in 26B A4B stands for "active parameters" in contrast to the total numbe
85
 
86
  These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models.
87
 
88
- | | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 12B Unified | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) |
89
- | :---- | :---- | :---- | :---- | :---- | :---- | :---- |
90
- | MMLU Pro | 85.2% | 82.6% | 77.2% | 69.4% | 60.0% | 67.6% |
91
- | AIME 2026 no tools | 89.2% | 88.3% | 77.5% | 42.5% | 37.5% | 20.8% |
92
- | LiveCodeBench v6 | 80.0% | 77.1% | 72.0% | 52.0% | 44.0% | 29.1% |
93
- | Codeforces ELO | 2150 | 1718 | 1659 | 940 | 633 | 110 |
94
- | GPQA Diamond | 84.3% | 82.3% | 78.8% | 58.6% | 43.4% | 42.4% |
95
- | Tau2 (average over 3) | 76.9% | 68.2% | 69.0% | 42.2% | 24.5% | 16.2% |
96
- | HLE no tools | 19.5% | 8.7% | 5.2% | - | - | - |
97
- | HLE with search | 26.5% | 17.2% | - | - | - | - |
98
- | BigBench Extra Hard | 74.4% | 64.8% | 53.0% | 33.1% | 21.9% | 19.3% |
99
- | MMMLU | 88.4% | 86.3% | 83.4% | 76.6% | 67.4% | 70.7% |
100
- | **Vision** | | | | | | |
101
- | MMMU Pro | 76.9% | 73.8% | 69.1% | 52.6% | 44.2% | 49.7% |
102
- | OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.164 | 0.181 | 0.290 | 0.365 |
103
- | MATH-Vision | 85.6% | 82.4% | 79.7% | 59.5% | 52.4% | 46.0% |
104
- | MedXPertQA MM | 61.3% | 58.1% | 48.7% | 28.7% | 23.5% | - |
105
- | **Audio** | | | | | | |
106
- | CoVoST | - | - | 38.5<sup>*</sup> | 35.54 | 33.47 | - |
107
- | FLEURS (lower is better) | - | - | 0.069<sup>*</sup> | 0.08 | 0.09 | - |
108
- | **Long Context** | | | | | | |
109
- | MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 43.4% | 25.4% | 19.1% | 13.5% |
110
-
111
- <sup>*</sup>Excluding Chinese language.
112
 
113
  ## **Core Capabilities**
114
 
115
  Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include:
116
 
117
  * **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering.
118
- * **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (12B, 26B A4B/31B).
119
  * **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions.
120
  * **Video Understanding** – Analyze video by processing sequences of frames.
121
  * **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt.
122
  * **Function Calling** – Native support for structured tool use, enabling agentic workflows.
123
  * **Coding** – Code generation, completion, and correction.
124
  * **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages.
125
- * **Audio** (E2B, E4B, and 12B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages.
126
 
127
  ## Getting Started
128
 
@@ -133,13 +128,13 @@ You can use all Gemma 4 models with the latest version of Transformers. To get s
133
  Once you have everything installed, you can proceed to load the model with the code below:
134
 
135
  ```python
136
- from transformers import AutoProcessor, AutoModelForMultimodalLM
137
 
138
  MODEL_ID = "google/gemma-4-31B-it"
139
 
140
  # Load model
141
  processor = AutoProcessor.from_pretrained(MODEL_ID)
142
- model = AutoModelForMultimodalLM.from_pretrained(
143
  MODEL_ID,
144
  dtype="auto",
145
  device_map="auto"
@@ -156,14 +151,13 @@ messages = [
156
  ]
157
 
158
  # Process input
159
- inputs = processor.apply_chat_template(
160
- messages,
161
- tokenize=True,
162
- return_dict=True,
163
- return_tensors="pt",
164
- add_generation_prompt=True,
165
  enable_thinking=False
166
- ).to(model.device)
 
167
  input_len = inputs["input_ids"].shape[-1]
168
 
169
  # Generate output
@@ -176,14 +170,15 @@ processor.parse_response(response)
176
 
177
  To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output.
178
 
179
- Below, you will also find snippets for processing audio (E2B, E4B, 12B only), images, and video alongside text:
180
 
181
  <details>
182
  <summary>Code for processing Audio</summary>
183
 
184
- Make sure to install the following packages:
185
 
186
- `pip install -U transformers torch torchvision librosa accelerate`
 
187
 
188
  You can then load the model with the code below:
189
 
@@ -239,7 +234,7 @@ processor.parse_response(response)
239
  <details>
240
  <summary>Code for processing Images</summary>
241
 
242
- Make sure to install the following packages:
243
 
244
 
245
  `pip install -U transformers torch torchvision accelerate`
@@ -298,9 +293,9 @@ processor.parse_response(response)
298
  <details>
299
  <summary>Code for processing Videos</summary>
300
 
301
- Make sure to install the following packages:
302
 
303
- `pip install -U transformers torch torchvision librosa accelerate`
304
 
305
  You can then load the model with the code below:
306
 
@@ -354,7 +349,6 @@ processor.parse_response(response)
354
  </details>
355
 
356
 
357
-
358
  ## **Best Practices**
359
 
360
  For the best performance, use these configurations and best practices:
@@ -382,7 +376,7 @@ Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` r
382
 
383
  ### 3. Multi-Turn Conversations
384
 
385
- * **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins, with the exception of tool call turns where thinking content should be preserved.
386
 
387
  ### 4. Modality order
388
 
@@ -422,7 +416,7 @@ When formatting the answer, first output the transcription in {SOURCE_LANGUAGE},
422
 
423
  ### 7. Audio and Video Length
424
 
425
- All models support image inputs and can process videos as frames whereas the E2B, E4B, and 12B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second.
426
 
427
  ## **Model Data**
428
 
@@ -478,7 +472,7 @@ Multimodal models (capable of processing vision, language, and/or audio) have a
478
  * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications.
479
  * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports.
480
  * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications.
481
- * **Audio Processing and Interaction**: The E2B, E4B, and 12B models can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions.
482
  * **Research and Education**
483
  * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field.
484
  * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice.
@@ -521,21 +515,4 @@ The development of vision-language models (VLMs) raises several ethical concerns
521
 
522
  ### **Benefits**
523
 
524
- At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models.
525
-
526
-
527
- ## **Citation**
528
-
529
- If you find our work helpful, please consider citing it:
530
-
531
- ```bibtex
532
- @misc{gemmateam2026gemma4,
533
- title={Gemma 4 Technical Report},
534
- author={Gemma Team},
535
- year={2026},
536
- eprint={2607.02770},
537
- archivePrefix={arXiv},
538
- primaryClass={cs.CL},
539
- url={https://arxiv.org/abs/2607.02770},
540
- }
541
- ```
 
16
  <a href="https://huggingface.co/collections/google/gemma-4" target="_blank">Hugging Face</a> |
17
  <a href="https://github.com/google-gemma" target="_blank">GitHub</a> |
18
  <a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/" target="_blank">Launch Blog</a> |
19
+ <a href="https://ai.google.dev/gemma/docs/core" target="_blank">Documentation</a>
 
20
  <br>
21
  <b>License</b>: <a href="https://ai.google.dev/gemma/docs/gemma_4_license" target="_blank">Apache 2.0</a> | <b>Authors</b>: <a href="https://deepmind.google/models/gemma/" target="_blank">Google DeepMind</a>
22
  </p>
23
 
24
+ Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages.
25
 
26
+ Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI.
27
 
28
  Gemma 4 introduces key **capability and architectural advancements**:
29
 
30
  * **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes.
31
 
32
+ * **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models).
33
 
34
  * **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment.
35
 
 
43
 
44
  ## **Models Overview**
45
 
46
+ Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding.
47
 
48
  The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE).
49
 
50
  ### Dense Models
51
 
52
+ | Property | E2B | E4B | 31B Dense |
53
+ | :---- | :---- | :---- | :---- |
54
+ | **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B |
55
+ | **Layers** | 35 | 42 | 60 |
56
+ | **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens |
57
+ | **Context Length** | 128K tokens | 128K tokens | 256K tokens |
58
+ | **Vocabulary Size** | 262K | 262K | 262K |
59
+ | **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image |
60
+ | **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* |
61
+ | **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio |
62
 
63
  The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total.
64
 
 
 
65
  ### Mixture-of-Experts (MoE) Model
66
 
67
  | Property | 26B A4B MoE |
 
82
 
83
  These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models.
84
 
85
+ | | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) |
86
+ | :---- | :---- | :---- | :---- | :---- | :---- |
87
+ | MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% |
88
+ | AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% |
89
+ | LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% |
90
+ | Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 |
91
+ | GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% |
92
+ | Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% |
93
+ | HLE no tools | 19.5% | 8.7% | - | - | - |
94
+ | HLE with search | 26.5% | 17.2% | - | - | - |
95
+ | BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% |
96
+ | MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% |
97
+ | **Vision** | | | | | |
98
+ | MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% |
99
+ | OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 |
100
+ | MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% |
101
+ | MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - |
102
+ | **Audio** | | | | | |
103
+ | CoVoST | - | - | 35.54 | 33.47 | - |
104
+ | FLEURS (lower is better) | - | - | 0.08 | 0.09 | - |
105
+ | **Long Context** | | | | | |
106
+ | MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% |
 
 
107
 
108
  ## **Core Capabilities**
109
 
110
  Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include:
111
 
112
  * **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering.
113
+ * **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B).
114
  * **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions.
115
  * **Video Understanding** – Analyze video by processing sequences of frames.
116
  * **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt.
117
  * **Function Calling** – Native support for structured tool use, enabling agentic workflows.
118
  * **Coding** – Code generation, completion, and correction.
119
  * **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages.
120
+ * **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages.
121
 
122
  ## Getting Started
123
 
 
128
  Once you have everything installed, you can proceed to load the model with the code below:
129
 
130
  ```python
131
+ from transformers import AutoProcessor, AutoModelForCausalLM
132
 
133
  MODEL_ID = "google/gemma-4-31B-it"
134
 
135
  # Load model
136
  processor = AutoProcessor.from_pretrained(MODEL_ID)
137
+ model = AutoModelForCausalLM.from_pretrained(
138
  MODEL_ID,
139
  dtype="auto",
140
  device_map="auto"
 
151
  ]
152
 
153
  # Process input
154
+ text = processor.apply_chat_template(
155
+ messages,
156
+ tokenize=False,
157
+ add_generation_prompt=True,
 
 
158
  enable_thinking=False
159
+ )
160
+ inputs = processor(text=text, return_tensors="pt").to(model.device)
161
  input_len = inputs["input_ids"].shape[-1]
162
 
163
  # Generate output
 
170
 
171
  To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output.
172
 
173
+ Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text:
174
 
175
  <details>
176
  <summary>Code for processing Audio</summary>
177
 
178
+ Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages:
179
 
180
+
181
+ `pip install -U transformers torch librosa accelerate`
182
 
183
  You can then load the model with the code below:
184
 
 
234
  <details>
235
  <summary>Code for processing Images</summary>
236
 
237
+ Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages:
238
 
239
 
240
  `pip install -U transformers torch torchvision accelerate`
 
293
  <details>
294
  <summary>Code for processing Videos</summary>
295
 
296
+ Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages:
297
 
298
+ `pip install -U transformers torch torchvision torchcodec librosa accelerate`
299
 
300
  You can then load the model with the code below:
301
 
 
349
  </details>
350
 
351
 
 
352
  ## **Best Practices**
353
 
354
  For the best performance, use these configurations and best practices:
 
376
 
377
  ### 3. Multi-Turn Conversations
378
 
379
+ * **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins.
380
 
381
  ### 4. Modality order
382
 
 
416
 
417
  ### 7. Audio and Video Length
418
 
419
+ All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second.
420
 
421
  ## **Model Data**
422
 
 
472
  * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications.
473
  * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports.
474
  * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications.
475
+ * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions.
476
  * **Research and Education**
477
  * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field.
478
  * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice.
 
515
 
516
  ### **Benefits**
517
 
518
+ At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chat_template.jinja CHANGED
@@ -1,9 +1,3 @@
1
- {#
2
- Template: Google Gemma 4 Canonical Chat Template
3
- Author: Google Gemma Engineering Team
4
- Published: 2026-07-09
5
- Context: Fixed tool-calling loops, turn closures, and thinking content-ordering.
6
- #}
7
  {%- macro format_parameters(properties, required, filter_keys=false) -%}
8
  {%- set standard_keys = ['description', 'type', 'properties', 'required', 'nullable'] -%}
9
  {%- set ns = namespace(found_first=false) -%}
@@ -122,9 +116,7 @@
122
  }
123
  {%- endmacro -%}
124
  {%- macro format_argument(argument, escape_keys=True) -%}
125
- {%- if argument is none -%}
126
- {{- 'null' -}}
127
- {%- elif argument is string -%}
128
  {{- '<|"|>' + argument + '<|"|>' -}}
129
  {%- elif argument is boolean -%}
130
  {{- 'true' if argument else 'false' -}}
@@ -180,21 +172,18 @@
180
  {{- '<tool_response|>' -}}
181
  {%- endmacro -%}
182
 
183
- {#- ===== SETUP ===== -#}
184
- {%- set ns = namespace(prev_message_type=None, prev_non_tool_role=None) -%}
185
  {%- set loop_messages = messages -%}
186
- {%- set enable_thinking = enable_thinking | default(false) -%}
187
- {%- set preserve_thinking = preserve_thinking | default(false) -%}
188
  {{- bos_token -}}
189
  {#- Handle System/Tool Definitions Block -#}
190
- {%- if enable_thinking or tools or (messages and messages[0]['role'] in ['system', 'developer']) -%}
191
  {{- '<|turn>system\n' -}}
192
  {#- Inject Thinking token at the very top of the FIRST system turn -#}
193
- {%- if enable_thinking -%}
194
  {{- '<|think|>\n' -}}
195
  {%- set ns.prev_message_type = 'think' -%}
196
  {%- endif -%}
197
- {%- if messages and messages[0]['role'] in ['system', 'developer'] -%}
198
  {%- if messages[0]['content'] is string -%}
199
  {{- messages[0]['content'] | trim -}}
200
  {%- elif messages[0]['content'] is sequence -%}
@@ -228,22 +217,31 @@
228
  {%- if message['role'] != 'tool' -%}
229
  {%- set ns.prev_message_type = None -%}
230
  {%- set role = 'model' if message['role'] == 'assistant' else message['role'] -%}
231
- {#- Detect continuation using tracked state O(1) instead of O(n) backward scan -#}
232
- {%- set continue_same_model_turn = (role == 'model' and ns.prev_non_tool_role == 'assistant') -%}
 
 
 
 
 
 
 
 
 
 
 
233
  {%- if not continue_same_model_turn -%}
234
  {{- '<|turn>' + role + '\n' }}
235
-
236
  {%- endif -%}
237
 
238
  {#- Render reasoning/reasoning_content as thinking channel -#}
239
  {%- set thinking_text = message.get('reasoning') or message.get('reasoning_content') -%}
240
- {%- set thinking_gate = (loop.index0 > ns_turn.last_user_idx) or (preserve_thinking and message.get('tool_calls')) -%}
241
- {%- if thinking_text and thinking_gate -%}
242
  {{- '<|channel>thought\n' + thinking_text + '\n<channel|>' -}}
243
  {%- endif -%}
244
 
245
- {%- if message.get('tool_calls') -%}
246
- {%- for tool_call in message.get('tool_calls') -%}
247
  {%- set function = tool_call['function'] -%}
248
  {{- '<|tool_call>call:' + function['name'] + '{' -}}
249
  {%- if function['arguments'] is mapping -%}
@@ -253,13 +251,8 @@
253
  {%- set ns_args.found_first = true -%}
254
  {{- key -}}:{{- format_argument(value, escape_keys=False) -}}
255
  {%- endfor -%}
256
- {%- elif function['arguments'] is none -%}
257
- {%- else -%}
258
- {{- raise_exception(
259
- "chat_template: tool_calls[].function.arguments must be a "
260
- "JSON object (mapping), not a string. Deserialize arguments "
261
- "before passing to the template."
262
- ) -}}
263
  {%- endif -%}
264
  {{- '}<tool_call|>' -}}
265
  {%- endfor -%}
@@ -269,8 +262,8 @@
269
  {%- set ns_tr_out = namespace(flag=false) -%}
270
  {%- if message.get('tool_responses') -%}
271
  {#- Legacy: tool_responses embedded on the assistant message (Google/Gemma native) -#}
272
- {%- for tool_response in message.get('tool_responses') -%}
273
- {{- format_tool_response_block(tool_response['name'] | default('unknown', true), tool_response['response']) -}}
274
  {%- set ns_tr_out.flag = true -%}
275
  {%- set ns.prev_message_type = 'tool_response' -%}
276
  {%- endfor -%}
@@ -284,8 +277,8 @@
284
  {%- else -%}
285
  {%- set follow = loop_messages[k] -%}
286
  {#- Resolve tool_call_id to function name -#}
287
- {%- set ns_tname = namespace(name=follow.get('name') or 'unknown') -%}
288
- {%- for tc in message.get('tool_calls') -%}
289
  {%- if tc.get('id') == follow.get('tool_call_id') -%}
290
  {%- set ns_tname.name = tc['function']['name'] -%}
291
  {%- endif -%}
@@ -303,9 +296,9 @@
303
  {%- endfor -%}
304
  {{- format_tool_response_block(ns_tname.name, ns_txt.s) -}}
305
  {%- for part in tool_body -%}
306
- {%- if part.get('type') in ['image', 'image_url'] -%}
307
  {{- '<|image|>' -}}
308
- {%- elif part.get('type') in ['audio', 'input_audio'] -%}
309
  {{- '<|audio|>' -}}
310
  {%- elif part.get('type') == 'video' -%}
311
  {{- '<|video|>' -}}
@@ -321,26 +314,29 @@
321
  {%- endif -%}
322
 
323
  {%- set captured_content -%}
324
- {%- if message.get('content') is string -%}
325
  {%- if role == 'model' -%}
326
  {{- strip_thinking(message['content']) -}}
327
  {%- else -%}
328
  {{- message['content'] | trim -}}
329
  {%- endif -%}
330
- {%- elif message.get('content') is sequence -%}
331
  {%- for item in message['content'] -%}
332
- {%- if item.get('type') == 'text' -%}
333
  {%- if role == 'model' -%}
334
  {{- strip_thinking(item['text']) -}}
335
  {%- else -%}
336
  {{- item['text'] | trim -}}
337
  {%- endif -%}
338
- {%- elif item.get('type') in ['image', 'image_url'] -%}
339
  {{- '<|image|>' -}}
340
- {%- elif item.get('type') in ['audio', 'input_audio'] -%}
 
341
  {{- '<|audio|>' -}}
342
- {%- elif item.get('type') == 'video' -%}
 
343
  {{- '<|video|>' -}}
 
344
  {%- endif -%}
345
  {%- endfor -%}
346
  {%- endif -%}
@@ -349,42 +345,19 @@
349
  {{- captured_content -}}
350
  {%- set has_content = captured_content | trim | length > 0 -%}
351
 
352
- {#- Forward-scan: find next non-tool message role for continuation detection -#}
353
- {%- set next_nt = namespace(role=None, found=false) -%}
354
- {%- for j in range(loop.index0 + 1, loop_messages | length) -%}
355
- {%- if not next_nt.found -%}
356
- {%- if loop_messages[j]['role'] != 'tool' -%}
357
- {%- set next_nt.role = loop_messages[j]['role'] -%}
358
- {%- set next_nt.found = true -%}
359
- {%- endif -%}
360
- {%- endif -%}
361
- {%- endfor -%}
362
-
363
- {%- set continues_into_next = (
364
- role == 'model'
365
- and next_nt.role == 'assistant'
366
- and (not message.get('tool_calls') or ns_tr_out.flag)
367
- ) -%}
368
-
369
  {%- if ns.prev_message_type == 'tool_call' and not ns_tr_out.flag -%}
370
  {{- '<|tool_response>' -}}
371
- {%- elif continues_into_next -%}
372
- {%- elif not (ns_tr_out.flag and not has_content and not next_nt.found) -%}
373
  {{- '<turn|>\n' -}}
374
  {%- endif -%}
375
-
376
- {#- Track previous non-tool role for next iteration (avoids O(n) backward scan) -#}
377
- {%- set ns.prev_non_tool_role = message['role'] -%}
378
  {%- endif -%}
379
  {%- endfor -%}
380
 
381
  {%- if add_generation_prompt -%}
382
  {%- if ns.prev_message_type != 'tool_response' and ns.prev_message_type != 'tool_call' -%}
383
  {{- '<|turn>model\n' -}}
384
- {%- if not enable_thinking -%}
385
  {{- '<|channel>thought\n<channel|>' -}}
386
  {%- endif -%}
387
- {%- elif ns.prev_message_type == 'tool_response' and enable_thinking -%}
388
- {{- '<|channel>thought\n' -}}
389
  {%- endif -%}
390
- {%- endif -%}
 
 
 
 
 
 
 
1
  {%- macro format_parameters(properties, required, filter_keys=false) -%}
2
  {%- set standard_keys = ['description', 'type', 'properties', 'required', 'nullable'] -%}
3
  {%- set ns = namespace(found_first=false) -%}
 
116
  }
117
  {%- endmacro -%}
118
  {%- macro format_argument(argument, escape_keys=True) -%}
119
+ {%- if argument is string -%}
 
 
120
  {{- '<|"|>' + argument + '<|"|>' -}}
121
  {%- elif argument is boolean -%}
122
  {{- 'true' if argument else 'false' -}}
 
172
  {{- '<tool_response|>' -}}
173
  {%- endmacro -%}
174
 
175
+ {%- set ns = namespace(prev_message_type=None) -%}
 
176
  {%- set loop_messages = messages -%}
 
 
177
  {{- bos_token -}}
178
  {#- Handle System/Tool Definitions Block -#}
179
+ {%- if (enable_thinking is defined and enable_thinking) or tools or messages[0]['role'] in ['system', 'developer'] -%}
180
  {{- '<|turn>system\n' -}}
181
  {#- Inject Thinking token at the very top of the FIRST system turn -#}
182
+ {%- if enable_thinking is defined and enable_thinking -%}
183
  {{- '<|think|>\n' -}}
184
  {%- set ns.prev_message_type = 'think' -%}
185
  {%- endif -%}
186
+ {%- if messages[0]['role'] in ['system', 'developer'] -%}
187
  {%- if messages[0]['content'] is string -%}
188
  {{- messages[0]['content'] | trim -}}
189
  {%- elif messages[0]['content'] is sequence -%}
 
217
  {%- if message['role'] != 'tool' -%}
218
  {%- set ns.prev_message_type = None -%}
219
  {%- set role = 'model' if message['role'] == 'assistant' else message['role'] -%}
220
+ {#- Detect continuation: suppress duplicate <|turn>model when previous non-tool message was also assistant -#}
221
+ {%- set prev_nt = namespace(role=None, found=false) -%}
222
+ {%- if loop.index0 > 0 -%}
223
+ {%- for j in range(loop.index0 - 1, -1, -1) -%}
224
+ {%- if not prev_nt.found -%}
225
+ {%- if loop_messages[j]['role'] != 'tool' -%}
226
+ {%- set prev_nt.role = loop_messages[j]['role'] -%}
227
+ {%- set prev_nt.found = true -%}
228
+ {%- endif -%}
229
+ {%- endif -%}
230
+ {%- endfor -%}
231
+ {%- endif -%}
232
+ {%- set continue_same_model_turn = (role == 'model' and prev_nt.role == 'assistant') -%}
233
  {%- if not continue_same_model_turn -%}
234
  {{- '<|turn>' + role + '\n' }}
 
235
  {%- endif -%}
236
 
237
  {#- Render reasoning/reasoning_content as thinking channel -#}
238
  {%- set thinking_text = message.get('reasoning') or message.get('reasoning_content') -%}
239
+ {%- if thinking_text and loop.index0 > ns_turn.last_user_idx and message.get('tool_calls') -%}
 
240
  {{- '<|channel>thought\n' + thinking_text + '\n<channel|>' -}}
241
  {%- endif -%}
242
 
243
+ {%- if message['tool_calls'] -%}
244
+ {%- for tool_call in message['tool_calls'] -%}
245
  {%- set function = tool_call['function'] -%}
246
  {{- '<|tool_call>call:' + function['name'] + '{' -}}
247
  {%- if function['arguments'] is mapping -%}
 
251
  {%- set ns_args.found_first = true -%}
252
  {{- key -}}:{{- format_argument(value, escape_keys=False) -}}
253
  {%- endfor -%}
254
+ {%- elif function['arguments'] is string -%}
255
+ {{- function['arguments'] -}}
 
 
 
 
 
256
  {%- endif -%}
257
  {{- '}<tool_call|>' -}}
258
  {%- endfor -%}
 
262
  {%- set ns_tr_out = namespace(flag=false) -%}
263
  {%- if message.get('tool_responses') -%}
264
  {#- Legacy: tool_responses embedded on the assistant message (Google/Gemma native) -#}
265
+ {%- for tool_response in message['tool_responses'] -%}
266
+ {{- format_tool_response_block(tool_response['name'] | default('unknown'), tool_response['response']) -}}
267
  {%- set ns_tr_out.flag = true -%}
268
  {%- set ns.prev_message_type = 'tool_response' -%}
269
  {%- endfor -%}
 
277
  {%- else -%}
278
  {%- set follow = loop_messages[k] -%}
279
  {#- Resolve tool_call_id to function name -#}
280
+ {%- set ns_tname = namespace(name=follow.get('name') | default('unknown')) -%}
281
+ {%- for tc in message['tool_calls'] -%}
282
  {%- if tc.get('id') == follow.get('tool_call_id') -%}
283
  {%- set ns_tname.name = tc['function']['name'] -%}
284
  {%- endif -%}
 
296
  {%- endfor -%}
297
  {{- format_tool_response_block(ns_tname.name, ns_txt.s) -}}
298
  {%- for part in tool_body -%}
299
+ {%- if part.get('type') == 'image' -%}
300
  {{- '<|image|>' -}}
301
+ {%- elif part.get('type') == 'audio' -%}
302
  {{- '<|audio|>' -}}
303
  {%- elif part.get('type') == 'video' -%}
304
  {{- '<|video|>' -}}
 
314
  {%- endif -%}
315
 
316
  {%- set captured_content -%}
317
+ {%- if message['content'] is string -%}
318
  {%- if role == 'model' -%}
319
  {{- strip_thinking(message['content']) -}}
320
  {%- else -%}
321
  {{- message['content'] | trim -}}
322
  {%- endif -%}
323
+ {%- elif message['content'] is sequence -%}
324
  {%- for item in message['content'] -%}
325
+ {%- if item['type'] == 'text' -%}
326
  {%- if role == 'model' -%}
327
  {{- strip_thinking(item['text']) -}}
328
  {%- else -%}
329
  {{- item['text'] | trim -}}
330
  {%- endif -%}
331
+ {%- elif item['type'] == 'image' -%}
332
  {{- '<|image|>' -}}
333
+ {%- set ns.prev_message_type = 'image' -%}
334
+ {%- elif item['type'] == 'audio' -%}
335
  {{- '<|audio|>' -}}
336
+ {%- set ns.prev_message_type = 'audio' -%}
337
+ {%- elif item['type'] == 'video' -%}
338
  {{- '<|video|>' -}}
339
+ {%- set ns.prev_message_type = 'video' -%}
340
  {%- endif -%}
341
  {%- endfor -%}
342
  {%- endif -%}
 
345
  {{- captured_content -}}
346
  {%- set has_content = captured_content | trim | length > 0 -%}
347
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
348
  {%- if ns.prev_message_type == 'tool_call' and not ns_tr_out.flag -%}
349
  {{- '<|tool_response>' -}}
350
+ {%- elif not (ns_tr_out.flag and not has_content) -%}
 
351
  {{- '<turn|>\n' -}}
352
  {%- endif -%}
 
 
 
353
  {%- endif -%}
354
  {%- endfor -%}
355
 
356
  {%- if add_generation_prompt -%}
357
  {%- if ns.prev_message_type != 'tool_response' and ns.prev_message_type != 'tool_call' -%}
358
  {{- '<|turn>model\n' -}}
359
+ {%- if not enable_thinking | default(false) -%}
360
  {{- '<|channel>thought\n<channel|>' -}}
361
  {%- endif -%}
 
 
362
  {%- endif -%}
363
+ {%- endif -%}