gemma-4-E4B-it-qat-int4-ov / openvino_detokenizer.xml
HarmenWessels's picture
Initial release: first OpenVINO IR of Gemma 4 E4B QAT (int4 sym g32, q4_0-matched, probe-validated)
f3e82a2 verified
Raw
History Blame Contribute Delete
28.1 kB
<?xml version="1.0"?>
<net name="detokenizer" version="11">
<layers>
<layer id="0" name="Parameter_209766" type="Parameter" version="opset1">
<data shape="?,?" element_type="i64" />
<output>
<port id="0" precision="I64" names="Parameter_209766">
<dim>-1</dim>
<dim>-1</dim>
</port>
</output>
</layer>
<layer id="1" name="Convert_209801" type="Convert" version="opset1">
<data destination_type="i32" />
<input>
<port id="0" precision="I64">
<dim>-1</dim>
<dim>-1</dim>
</port>
</input>
<output>
<port id="1" precision="I32">
<dim>-1</dim>
<dim>-1</dim>
</port>
</output>
</layer>
<layer id="2" name="Constant_209722" type="Const" version="opset1">
<data element_type="i32" shape="262144" offset="0" size="1048576" />
<output>
<port id="0" precision="I32">
<dim>262144</dim>
</port>
</output>
</layer>
<layer id="3" name="Constant_209724" type="Const" version="opset1">
<data element_type="i32" shape="262144" offset="1048576" size="1048576" />
<output>
<port id="0" precision="I32">
<dim>262144</dim>
</port>
</output>
</layer>
<layer id="4" name="Constant_209726" type="Const" version="opset1">
<data element_type="u8" shape="2316295" offset="2097152" size="2316295" />
<output>
<port id="0" precision="U8">
<dim>2316295</dim>
</port>
</output>
</layer>
<layer id="5" name="Slice_209771" type="Const" version="opset1">
<data element_type="i32" shape="24" offset="4413447" size="96" />
<output>
<port id="0" precision="I32">
<dim>24</dim>
</port>
</output>
</layer>
<layer id="6" name="VocabDecoder_209773" type="VocabDecoder" version="extension">
<data skip_tokens="" />
<input>
<port id="0" precision="I32">
<dim>-1</dim>
<dim>-1</dim>
</port>
<port id="1" precision="I32">
<dim>262144</dim>
</port>
<port id="2" precision="I32">
<dim>262144</dim>
</port>
<port id="3" precision="U8">
<dim>2316295</dim>
</port>
<port id="4" precision="I32">
<dim>24</dim>
</port>
</input>
<output>
<port id="5" precision="I32">
<dim>-1</dim>
</port>
<port id="6" precision="I32">
<dim>-1</dim>
</port>
<port id="7" precision="I32">
<dim>-1</dim>
</port>
<port id="8" precision="I32">
<dim>-1</dim>
</port>
<port id="9" precision="U8">
<dim>-1</dim>
</port>
</output>
</layer>
<layer id="7" name="Constant_209775" type="Const" version="opset1">
<data element_type="u8" shape="3" offset="4413543" size="3" />
<output>
<port id="0" precision="U8">
<dim>3</dim>
</port>
</output>
</layer>
<layer id="8" name="Constant_209777" type="Const" version="opset1">
<data element_type="u8" shape="1" offset="4413546" size="1" />
<output>
<port id="0" precision="U8">
<dim>1</dim>
</port>
</output>
</layer>
<layer id="9" name="RegexNormalization_209778" type="RegexNormalization" version="extension">
<data global_replace="true" />
<input>
<port id="0" precision="I32">
<dim>-1</dim>
</port>
<port id="1" precision="I32">
<dim>-1</dim>
</port>
<port id="2" precision="U8">
<dim>-1</dim>
</port>
<port id="3" precision="U8">
<dim>3</dim>
</port>
<port id="4" precision="U8">
<dim>1</dim>
</port>
</input>
<output>
<port id="5" precision="I32">
<dim>-1</dim>
</port>
<port id="6" precision="I32">
<dim>-1</dim>
</port>
<port id="7" precision="U8">
<dim>-1</dim>
</port>
</output>
</layer>
<layer id="10" name="ByteFallback_209779" type="ByteFallback" version="extension">
<input>
<port id="0" precision="I32">
<dim>-1</dim>
</port>
<port id="1" precision="I32">
<dim>-1</dim>
</port>
<port id="2" precision="U8">
<dim>-1</dim>
</port>
</input>
<output>
<port id="3" precision="I32">
<dim>-1</dim>
</port>
<port id="4" precision="I32">
<dim>-1</dim>
</port>
<port id="5" precision="U8">
<dim>-1</dim>
</port>
</output>
</layer>
<layer id="11" name="FuzeRagged_209780" type="FuzeRagged" version="extension">
<input>
<port id="0" precision="I32">
<dim>-1</dim>
</port>
<port id="1" precision="I32">
<dim>-1</dim>
</port>
<port id="2" precision="I32">
<dim>-1</dim>
</port>
<port id="3" precision="I32">
<dim>-1</dim>
</port>
</input>
<output>
<port id="4" precision="I32">
<dim>-1</dim>
</port>
<port id="5" precision="I32">
<dim>-1</dim>
</port>
</output>
</layer>
<layer id="12" name="UTF8Validate_209781" type="UTF8Validate" version="extension">
<data replace_mode="true" />
<input>
<port id="0" precision="I32">
<dim>-1</dim>
</port>
<port id="1" precision="I32">
<dim>-1</dim>
</port>
<port id="2" precision="U8">
<dim>-1</dim>
</port>
</input>
<output>
<port id="3" precision="I32">
<dim>-1</dim>
</port>
<port id="4" precision="I32">
<dim>-1</dim>
</port>
<port id="5" precision="U8">
<dim>-1</dim>
</port>
</output>
</layer>
<layer id="13" name="StringTensorPack_209782" type="StringTensorPack" version="opset15">
<input>
<port id="0" precision="I32">
<dim>-1</dim>
</port>
<port id="1" precision="I32">
<dim>-1</dim>
</port>
<port id="2" precision="U8">
<dim>-1</dim>
</port>
</input>
<output>
<port id="3" precision="STRING" names="Result_209783,string_output">
<dim>-1</dim>
</port>
</output>
</layer>
<layer id="14" name="Result_209783" type="Result" version="opset1" output_names="Result_209783,string_output">
<input>
<port id="0" precision="STRING">
<dim>-1</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0" />
<edge from-layer="1" from-port="1" to-layer="6" to-port="0" />
<edge from-layer="2" from-port="0" to-layer="6" to-port="1" />
<edge from-layer="3" from-port="0" to-layer="6" to-port="2" />
<edge from-layer="4" from-port="0" to-layer="6" to-port="3" />
<edge from-layer="5" from-port="0" to-layer="6" to-port="4" />
<edge from-layer="6" from-port="7" to-layer="9" to-port="0" />
<edge from-layer="6" from-port="8" to-layer="9" to-port="1" />
<edge from-layer="6" from-port="9" to-layer="9" to-port="2" />
<edge from-layer="6" from-port="5" to-layer="11" to-port="0" />
<edge from-layer="6" from-port="6" to-layer="11" to-port="1" />
<edge from-layer="7" from-port="0" to-layer="9" to-port="3" />
<edge from-layer="8" from-port="0" to-layer="9" to-port="4" />
<edge from-layer="9" from-port="5" to-layer="10" to-port="0" />
<edge from-layer="9" from-port="6" to-layer="10" to-port="1" />
<edge from-layer="9" from-port="7" to-layer="10" to-port="2" />
<edge from-layer="10" from-port="3" to-layer="11" to-port="2" />
<edge from-layer="10" from-port="4" to-layer="11" to-port="3" />
<edge from-layer="10" from-port="5" to-layer="12" to-port="2" />
<edge from-layer="11" from-port="4" to-layer="12" to-port="0" />
<edge from-layer="11" from-port="5" to-layer="12" to-port="1" />
<edge from-layer="12" from-port="3" to-layer="13" to-port="0" />
<edge from-layer="12" from-port="4" to-layer="13" to-port="1" />
<edge from-layer="12" from-port="5" to-layer="13" to-port="2" />
<edge from-layer="13" from-port="3" to-layer="14" to-port="0" />
</edges>
<rt_info>
<info name="OpenVINO Runtime" value="2026.3.0-22098-367f60d8408" />
<add_attention_mask value="True" />
<add_prefix_space />
<add_special_tokens value="True" />
<bos_token_id value="2" />
<chat_template value="{%- macro format_parameters(properties, required, filter_keys=false) -%}&#10; {%- set standard_keys = ['description', 'type', 'properties', 'required', 'nullable'] -%}&#10; {%- set ns = namespace(found_first=false) -%}&#10; {%- for key, value in properties | dictsort -%}&#10; {%- set add_comma = false -%}&#10; {%- if not filter_keys or key not in standard_keys -%}&#10; {%- if ns.found_first %},{% endif -%}&#10; {%- set ns.found_first = true -%}&#10; {{ key }}:{&#10; {%- if value['description'] -%}&#10; description:&lt;|&quot;|>{{ value['description'] }}&lt;|&quot;|>&#10; {%- set add_comma = true -%}&#10; {%- endif -%}&#10; {%- if value['type'] | upper == 'STRING' -%}&#10; {%- if value['enum'] -%}&#10; {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%}&#10; enum:{{ format_argument(value['enum']) }}&#10; {%- endif -%}&#10; {%- elif value['type'] | upper == 'ARRAY' -%}&#10; {%- if value['items'] is mapping and value['items'] -%}&#10; {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%}&#10; items:{&#10; {%- set ns_items = namespace(found_first=false) -%}&#10; {%- for item_key, item_value in value['items'] | dictsort -%}&#10; {%- if item_value is not none -%}&#10; {%- if ns_items.found_first %},{% endif -%}&#10; {%- set ns_items.found_first = true -%}&#10; {%- if item_key == 'properties' -%}&#10; properties:{&#10; {%- if item_value is mapping -%}&#10; {{- format_parameters(item_value, value['items']['required'] | default([])) -}}&#10; {%- endif -%}&#10; }&#10; {%- elif item_key == 'required' -%}&#10; required:[&#10; {%- for req_item in item_value -%}&#10; &lt;|&quot;|>{{- req_item -}}&lt;|&quot;|>&#10; {%- if not loop.last %},{% endif -%}&#10; {%- endfor -%}&#10; ]&#10; {%- elif item_key == 'type' -%}&#10; {%- if item_value is string -%}&#10; type:{{ format_argument(item_value | upper) }}&#10; {%- else -%}&#10; type:{{ format_argument(item_value | map('upper') | list) }}&#10; {%- endif -%}&#10; {%- else -%}&#10; {{ item_key }}:{{ format_argument(item_value) }}&#10; {%- endif -%}&#10; {%- endif -%}&#10; {%- endfor -%}&#10; }&#10; {%- endif -%}&#10; {%- endif -%}&#10; {%- if value['nullable'] %}&#10; {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%}&#10; nullable:true&#10; {%- endif -%}&#10; {%- if value['type'] | upper == 'OBJECT' -%}&#10; {%- if value['properties'] is defined and value['properties'] is mapping -%}&#10; {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%}&#10; properties:{&#10; {{- format_parameters(value['properties'], value['required'] | default([])) -}}&#10; }&#10; {%- elif value is mapping -%}&#10; {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%}&#10; properties:{&#10; {{- format_parameters(value, value['required'] | default([]), filter_keys=true) -}}&#10; }&#10; {%- endif -%}&#10; {%- if value['required'] -%}&#10; {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%}&#10; required:[&#10; {%- for item in value['required'] | default([]) -%}&#10; &lt;|&quot;|>{{- item -}}&lt;|&quot;|>&#10; {%- if not loop.last %},{% endif -%}&#10; {%- endfor -%}&#10; ]&#10; {%- endif -%}&#10; {%- endif -%}&#10; {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%}&#10; type:&lt;|&quot;|>{{ value['type'] | upper }}&lt;|&quot;|>}&#10; {%- endif -%}&#10; {%- endfor -%}&#10;{%- endmacro -%}&#10;{%- macro format_function_declaration(tool_data) -%}&#10; declaration:{{- tool_data['function']['name'] -}}{description:&lt;|&quot;|>{{- tool_data['function']['description'] -}}&lt;|&quot;|>&#10; {%- set params = tool_data['function']['parameters'] -%}&#10; {%- if params -%}&#10; ,parameters:{&#10; {%- if params['properties'] -%}&#10; properties:{ {{- format_parameters(params['properties'], params['required']) -}} },&#10; {%- endif -%}&#10; {%- if params['required'] -%}&#10; required:[&#10; {%- for item in params['required'] -%}&#10; &lt;|&quot;|>{{- item -}}&lt;|&quot;|>&#10; {{- ',' if not loop.last -}}&#10; {%- endfor -%}&#10; ],&#10; {%- endif -%}&#10; {%- if params['type'] -%}&#10; type:&lt;|&quot;|>{{- params['type'] | upper -}}&lt;|&quot;|>}&#10; {%- endif -%}&#10; {%- endif -%}&#10; {%- if 'response' in tool_data['function'] -%}&#10; {%- set response_declaration = tool_data['function']['response'] -%}&#10; ,response:{&#10; {%- if response_declaration['description'] -%}&#10; description:&lt;|&quot;|>{{- response_declaration['description'] -}}&lt;|&quot;|>,&#10; {%- endif -%}&#10; {%- if response_declaration['type'] | upper == 'OBJECT' -%}&#10; type:&lt;|&quot;|>{{- response_declaration['type'] | upper -}}&lt;|&quot;|>}&#10; {%- endif -%}&#10; {%- endif -%}&#10; }&#10;{%- endmacro -%}&#10;{%- macro format_argument(argument, escape_keys=True) -%}&#10; {%- if argument is string -%}&#10; {{- '&lt;|&quot;|>' + argument + '&lt;|&quot;|>' -}}&#10; {%- elif argument is boolean -%}&#10; {{- 'true' if argument else 'false' -}}&#10; {%- elif argument is mapping -%}&#10; {{- '{' -}}&#10; {%- set ns = namespace(found_first=false) -%}&#10; {%- for key, value in argument | dictsort -%}&#10; {%- if ns.found_first %},{% endif -%}&#10; {%- set ns.found_first = true -%}&#10; {%- if escape_keys -%}&#10; {{- '&lt;|&quot;|>' + key + '&lt;|&quot;|>' -}}&#10; {%- else -%}&#10; {{- key -}}&#10; {%- endif -%}&#10; :{{- format_argument(value, escape_keys=escape_keys) -}}&#10; {%- endfor -%}&#10; {{- '}' -}}&#10; {%- elif argument is sequence -%}&#10; {{- '[' -}}&#10; {%- for item in argument -%}&#10; {{- format_argument(item, escape_keys=escape_keys) -}}&#10; {%- if not loop.last %},{% endif -%}&#10; {%- endfor -%}&#10; {{- ']' -}}&#10; {%- else -%}&#10; {{- argument -}}&#10; {%- endif -%}&#10;{%- endmacro -%}&#10;{%- macro strip_thinking(text) -%}&#10; {%- set ns = namespace(result='') -%}&#10; {%- for part in text.split('&lt;channel|>') -%}&#10; {%- if '&lt;|channel>' in part -%}&#10; {%- set ns.result = ns.result + part.split('&lt;|channel>')[0] -%}&#10; {%- else -%}&#10; {%- set ns.result = ns.result + part -%}&#10; {%- endif -%}&#10; {%- endfor -%}&#10; {{- ns.result | trim -}}&#10;{%- endmacro -%}&#10;&#10;{%- macro format_tool_response_block(tool_name, response) -%}&#10; {{- '&lt;|tool_response>' -}}&#10; {%- if response is mapping -%}&#10; {{- 'response:' + tool_name + '{' -}}&#10; {%- for key, value in response | dictsort -%}&#10; {{- key -}}:{{- format_argument(value, escape_keys=False) -}}&#10; {%- if not loop.last %},{% endif -%}&#10; {%- endfor -%}&#10; {{- '}' -}}&#10; {%- else -%}&#10; {{- 'response:' + tool_name + '{value:' + format_argument(response, escape_keys=False) + '}' -}}&#10; {%- endif -%}&#10; {{- '&lt;tool_response|>' -}}&#10;{%- endmacro -%}&#10;&#10;{%- set ns = namespace(prev_message_type=None) -%}&#10;{%- set loop_messages = messages -%}&#10;{{- bos_token -}}&#10;{#- Handle System/Tool Definitions Block -#}&#10;{%- if (enable_thinking is defined and enable_thinking) or tools or messages[0]['role'] in ['system', 'developer'] -%}&#10; {{- '&lt;|turn>system\n' -}}&#10; {#- Inject Thinking token at the very top of the FIRST system turn -#}&#10; {%- if enable_thinking is defined and enable_thinking -%}&#10; {{- '&lt;|think|>\n' -}}&#10; {%- set ns.prev_message_type = 'think' -%}&#10; {%- endif -%}&#10; {%- if messages[0]['role'] in ['system', 'developer'] -%}&#10; {%- if messages[0]['content'] is string -%}&#10; {{- messages[0]['content'] | trim -}}&#10; {%- elif messages[0]['content'] is sequence -%}&#10; {%- for item in messages[0]['content'] -%}&#10; {{- item['text'] | trim + ' '-}}&#10; {%- endfor -%}&#10; {%- endif -%}&#10; {%- set loop_messages = messages[1:] -%}&#10; {%- endif -%}&#10; {%- if tools -%}&#10; {%- for tool in tools %}&#10; {{- '&lt;|tool>' -}}&#10; {{- format_function_declaration(tool) | trim -}}&#10; {{- '&lt;tool|>' -}}&#10; {%- endfor %}&#10; {%- set ns.prev_message_type = 'tool' -%}&#10; {%- endif -%}&#10; {{- '&lt;turn|>\n' -}}&#10;{%- endif %}&#10;&#10;{#- Pre-scan: find last user message index for reasoning guard -#}&#10;{%- set ns_turn = namespace(last_user_idx=-1) -%}&#10;{%- for i in range(loop_messages | length) -%}&#10; {%- if loop_messages[i]['role'] == 'user' -%}&#10; {%- set ns_turn.last_user_idx = i -%}&#10; {%- endif -%}&#10;{%- endfor -%}&#10;&#10;{#- Loop through messages -#}&#10;{%- for message in loop_messages -%}&#10; {%- if message['role'] != 'tool' -%}&#10; {%- set ns.prev_message_type = None -%}&#10; {%- set role = 'model' if message['role'] == 'assistant' else message['role'] -%}&#10; {#- Detect continuation: suppress duplicate &lt;|turn>model when previous non-tool message was also assistant -#}&#10; {%- set prev_nt = namespace(role=None, found=false) -%}&#10; {%- if loop.index0 > 0 -%}&#10; {%- for j in range(loop.index0 - 1, -1, -1) -%}&#10; {%- if not prev_nt.found -%}&#10; {%- if loop_messages[j]['role'] != 'tool' -%}&#10; {%- set prev_nt.role = loop_messages[j]['role'] -%}&#10; {%- set prev_nt.found = true -%}&#10; {%- endif -%}&#10; {%- endif -%}&#10; {%- endfor -%}&#10; {%- endif -%}&#10; {%- set continue_same_model_turn = (role == 'model' and prev_nt.role == 'assistant') -%}&#10; {%- if not continue_same_model_turn -%}&#10; {{- '&lt;|turn>' + role + '\n' }}&#10; {%- endif -%}&#10;&#10; {#- Render reasoning/reasoning_content as thinking channel -#}&#10; {%- set thinking_text = message.get('reasoning') or message.get('reasoning_content') -%}&#10; {%- if thinking_text and loop.index0 > ns_turn.last_user_idx and message.get('tool_calls') -%}&#10; {{- '&lt;|channel>thought\n' + thinking_text + '\n&lt;channel|>' -}}&#10; {%- endif -%}&#10;&#10; {%- if message['tool_calls'] -%}&#10; {%- for tool_call in message['tool_calls'] -%}&#10; {%- set function = tool_call['function'] -%}&#10; {{- '&lt;|tool_call>call:' + function['name'] + '{' -}}&#10; {%- if function['arguments'] is mapping -%}&#10; {%- set ns_args = namespace(found_first=false) -%}&#10; {%- for key, value in function['arguments'] | dictsort -%}&#10; {%- if ns_args.found_first %},{% endif -%}&#10; {%- set ns_args.found_first = true -%}&#10; {{- key -}}:{{- format_argument(value, escape_keys=False) -}}&#10; {%- endfor -%}&#10; {%- elif function['arguments'] is string -%}&#10; {{- function['arguments'] -}}&#10; {%- endif -%}&#10; {{- '}&lt;tool_call|>' -}}&#10; {%- endfor -%}&#10; {%- set ns.prev_message_type = 'tool_call' -%}&#10; {%- endif -%}&#10;&#10; {%- set ns_tr_out = namespace(flag=false) -%}&#10; {%- if message.get('tool_responses') -%}&#10; {#- Legacy: tool_responses embedded on the assistant message (Google/Gemma native) -#}&#10; {%- for tool_response in message['tool_responses'] -%}&#10; {{- format_tool_response_block(tool_response['name'] | default('unknown'), tool_response['response']) -}}&#10; {%- set ns_tr_out.flag = true -%}&#10; {%- set ns.prev_message_type = 'tool_response' -%}&#10; {%- endfor -%}&#10; {%- elif message.get('tool_calls') -%}&#10; {#- OpenAI Chat Completions: forward-scan consecutive role:tool messages -#}&#10; {%- set ns_tool_scan = namespace(stopped=false) -%}&#10; {%- for k in range(loop.index0 + 1, loop_messages | length) -%}&#10; {%- if ns_tool_scan.stopped -%}&#10; {%- elif loop_messages[k]['role'] != 'tool' -%}&#10; {%- set ns_tool_scan.stopped = true -%}&#10; {%- else -%}&#10; {%- set follow = loop_messages[k] -%}&#10; {#- Resolve tool_call_id to function name -#}&#10; {%- set ns_tname = namespace(name=follow.get('name') | default('unknown')) -%}&#10; {%- for tc in message['tool_calls'] -%}&#10; {%- if tc.get('id') == follow.get('tool_call_id') -%}&#10; {%- set ns_tname.name = tc['function']['name'] -%}&#10; {%- endif -%}&#10; {%- endfor -%}&#10; {#- Handle content as string or content-parts array -#}&#10; {%- set tool_body = follow.get('content') -%}&#10; {%- if tool_body is string -%}&#10; {{- format_tool_response_block(ns_tname.name, tool_body) -}}&#10; {%- elif tool_body is sequence and tool_body is not string -%}&#10; {%- set ns_txt = namespace(s='') -%}&#10; {%- for part in tool_body -%}&#10; {%- if part.get('type') == 'text' -%}&#10; {%- set ns_txt.s = ns_txt.s + (part.get('text') | default('')) -%}&#10; {%- endif -%}&#10; {%- endfor -%}&#10; {{- format_tool_response_block(ns_tname.name, ns_txt.s) -}}&#10; {%- else -%}&#10; {{- format_tool_response_block(ns_tname.name, tool_body) -}}&#10; {%- endif -%}&#10; {%- set ns_tr_out.flag = true -%}&#10; {%- set ns.prev_message_type = 'tool_response' -%}&#10; {%- endif -%}&#10; {%- endfor -%}&#10; {%- endif -%}&#10;&#10; {%- set captured_content -%}&#10; {%- if message['content'] is string -%}&#10; {%- if role == 'model' -%}&#10; {{- strip_thinking(message['content']) -}}&#10; {%- else -%}&#10; {{- message['content'] | trim -}}&#10; {%- endif -%}&#10; {%- elif message['content'] is sequence -%}&#10; {%- for item in message['content'] -%}&#10; {%- if item['type'] == 'text' -%}&#10; {%- if role == 'model' -%}&#10; {{- strip_thinking(item['text']) -}}&#10; {%- else -%}&#10; {{- item['text'] | trim -}}&#10; {%- endif -%}&#10; {%- elif item['type'] == 'image' -%}&#10; {{- '&lt;|image|>' -}}&#10; {%- set ns.prev_message_type = 'image' -%}&#10; {%- elif item['type'] == 'audio' -%}&#10; {{- '&lt;|audio|>' -}}&#10; {%- set ns.prev_message_type = 'audio' -%}&#10; {%- elif item['type'] == 'video' -%}&#10; {{- '&lt;|video|>' -}}&#10; {%- set ns.prev_message_type = 'video' -%}&#10; {%- endif -%}&#10; {%- endfor -%}&#10; {%- endif -%}&#10; {%- endset -%}&#10;&#10; {{- captured_content -}}&#10; {%- set has_content = captured_content | trim | length > 0 -%}&#10;&#10; {%- if ns.prev_message_type == 'tool_call' and not ns_tr_out.flag -%}&#10; {{- '&lt;|tool_response>' -}}&#10; {%- elif not (ns_tr_out.flag and not has_content) -%}&#10; {{- '&lt;turn|>\n' -}}&#10; {%- endif -%}&#10; {%- endif -%}&#10;{%- endfor -%}&#10;&#10;{%- if add_generation_prompt -%}&#10; {%- if ns.prev_message_type != 'tool_response' and ns.prev_message_type != 'tool_call' -%}&#10; {{- '&lt;|turn>model\n' -}}&#10; {%- endif -%}&#10;{%- endif -%}" />
<clean_up_tokenization_spaces />
<detokenizer_input_type value="i64" />
<eos_token_id value="1" />
<handle_special_tokens_with_re />
<max_length />
<number_of_inputs value="1" />
<openvino_tokenizers_version value="2026.3.0.0-683-6d28e696dfa" />
<openvino_version value="2026.3.0-22098-367f60d8408" />
<original_post_processor_template value="{&quot;type&quot;: &quot;TemplateProcessing&quot;, &quot;single&quot;: [{&quot;Sequence&quot;: {&quot;id&quot;: &quot;A&quot;, &quot;type_id&quot;: 0}}], &quot;pair&quot;: [{&quot;Sequence&quot;: {&quot;id&quot;: &quot;A&quot;, &quot;type_id&quot;: 0}}, {&quot;Sequence&quot;: {&quot;id&quot;: &quot;B&quot;, &quot;type_id&quot;: 1}}], &quot;special_tokens&quot;: {}}" />
<original_tokenizer_class value="&lt;class 'transformers.models.gemma.tokenization_gemma.GemmaTokenizer'>" />
<pad_token_id value="0" />
<processed_post_processor_template value="{&quot;single&quot;: {&quot;ids&quot;: [-1], &quot;type_ids&quot;: [0]}, &quot;pair&quot;: {&quot;ids&quot;: [-1, -2], &quot;type_ids&quot;: [0, 1]}}" />
<skip_special_tokens value="True" />
<streaming_detokenizer value="False" />
<tiktoken_version value="0.13.0" />
<tokenizer_output_type value="i64" />
<tokenizers_version value="0.23.0rc0" />
<transformers_version value="5.5.0" />
<use_max_padding value="False" />
<use_sentencepiece_backend value="False" />
<utf8_replace_mode value="replace" />
<with_detokenizer value="True" />
</rt_info>
</net>