inkling-NVFP4 / tokenizer_config.json
danielhanchen's picture
Update chat template: tool-call author in history, end_sampling after assistant turns, reasoning-effort validation (minimal=0.1, raise on invalid), raise on unknown roles
7cb05ee verified
Raw
History Blame Contribute Delete
35.4 kB
{
"added_tokens_decoder": {
"199998": {
"content": "<|unused|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"199999": {
"content": "<|endoftext|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200000": {
"content": "<|message_user|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200001": {
"content": "<|message_model|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200002": {
"content": "<|message_system|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200003": {
"content": "<|message_tool|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200004": {
"content": "<|content_text|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200005": {
"content": "<|content_image|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200006": {
"content": "<|content_model_end_sampling|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200007": {
"content": "<|unused_200007|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200008": {
"content": "<|content_thinking|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200009": {
"content": "<|unused_200009|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200010": {
"content": "<|end_message|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200011": {
"content": "<|unused_200011|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200012": {
"content": "<|unused_200012|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200013": {
"content": "<|unused_200013|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200014": {
"content": "<|unused_200014|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200015": {
"content": "<|unused_200015|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200016": {
"content": "<|unused_200016|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200017": {
"content": "<|unused_200017|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200018": {
"content": "<|unused_200018|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200019": {
"content": "<|unused_200019|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200020": {
"content": "<|content_audio_input|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200021": {
"content": "<|unused_200021|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200022": {
"content": "<|content_tool_error|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200023": {
"content": "<|audio|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200024": {
"content": "<|content_xml|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200025": {
"content": "<|unused_200025|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200026": {
"content": "<|unused_200026|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200027": {
"content": "<|unused_200027|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200028": {
"content": "<|begin_of_text|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200029": {
"content": "<|unused_200029|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200030": {
"content": "<|unused_200030|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200031": {
"content": "<|unused_200031|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200032": {
"content": "<|unused_200032|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200033": {
"content": "<|unused_200033|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200034": {
"content": "<|unused_200034|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200035": {
"content": "<|unused_200035|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200036": {
"content": "<|unused_200036|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200037": {
"content": "<|unused_200037|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200038": {
"content": "<|unused_200038|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200039": {
"content": "<|unused_200039|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200040": {
"content": "<|unused_200040|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200041": {
"content": "<|unused_200041|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200042": {
"content": "<|unused_200042|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200043": {
"content": "<|audio_end|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200044": {
"content": "<|unused_200044|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200045": {
"content": "<|unused_200045|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200046": {
"content": "<|unused_200046|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200047": {
"content": "<|unused_200047|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200048": {
"content": "<|unused_200048|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200049": {
"content": "<|content_invoke_tool_json|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200050": {
"content": "<|unused_200050|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200051": {
"content": "<|unused_200051|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200052": {
"content": "<|unused_200052|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200053": {
"content": "<|unused_200053|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200054": {
"content": "<|unused_200054|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200055": {
"content": "<|unused_200055|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200056": {
"content": "<|unused_200056|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
"200057": {
"content": "<|content_invoke_tool_text|>",
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
}
},
"clean_up_tokenization_spaces": false,
"fix_mistral_regex": false,
"extra_special_tokens": {
"endoftext": "<|endoftext|>",
"message_user": "<|message_user|>",
"message_model": "<|message_model|>",
"message_system": "<|message_system|>",
"message_tool": "<|message_tool|>",
"content_text": "<|content_text|>",
"content_image": "<|content_image|>",
"content_model_end_sampling": "<|content_model_end_sampling|>",
"content_thinking": "<|content_thinking|>",
"end_message": "<|end_message|>",
"content_audio_input": "<|content_audio_input|>",
"content_tool_error": "<|content_tool_error|>",
"audio": "<|audio|>",
"content_xml": "<|content_xml|>",
"begin_of_text": "<|begin_of_text|>",
"audio_end": "<|audio_end|>",
"content_invoke_tool_json": "<|content_invoke_tool_json|>",
"content_invoke_tool_text": "<|content_invoke_tool_text|>"
},
"model_max_length": 1000000000000000019884624838656,
"tokenizer_class": "PreTrainedTokenizerFast",
"chat_template": "{#- Keep Python's floating type spelling when the jinja engine compacts 1.0 to 1. -#}\n{%- macro json_scalar(value) -%}\n {%- set serialized = value | tojson(ensure_ascii=false, separators=(',', ':')) -%}\n {%- if value is float and '.' not in serialized and 'e' not in (serialized | lower) -%}\n {{- serialized -}}{{- '.0' -}}\n {%- else -%}\n {{- serialized -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- macro canonical_json(value) -%}\n {%- if value is mapping -%}\n {{- '{' -}}\n {%- for key, item in value | dictsort(case_sensitive=true) -%}\n {{- (key | string) | tojson(ensure_ascii=false, separators=(',', ':')) -}}{{- ':' -}}\n {{- canonical_json(item) -}}\n {%- if not loop.last -%}{{- ',' -}}{%- endif -%}\n {%- endfor -%}\n {{- '}' -}}\n {%- elif value is sequence and value is not string -%}\n {{- '[' -}}\n {%- for item in value -%}\n {{- canonical_json(item) -}}\n {%- if not loop.last -%}{{- ',' -}}{%- endif -%}\n {%- endfor -%}\n {{- ']' -}}\n {%- else -%}\n {{- json_scalar(value) -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{#- Advance across insignificant JSON whitespace. -#}\n{%- macro json_skip_ws(source, state) -%}\n {%- set scan = namespace(done=false) -%}\n {%- for ignored in range(source | length) -%}\n {%- if not scan.done and state.pos < source | length -%}\n {%- set ch = source[state.pos] -%}\n {%- if ch == ' ' or ch == '\\t' or ch == '\\r' or ch == '\\n' -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- else -%}\n {%- set scan.done = true -%}\n {%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n{%- endmacro -%}\n\n{#-\n Decode a JSON string under Transformers, then re-encode it like json.dumps.\n llama.cpp converts string arguments to objects after capability detection;\n the fallback keeps engine-only parsing safe without runtime-only filters.\n-#}\n{%- macro json_string(source, state) -%}\n {%- if lipsum is defined -%}\n {%- set out = namespace(decoded='', done=false, code=0, low=0) -%}\n {%- set hex_values = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15} -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- for ignored in range(source | length) -%}\n {%- if not out.done and state.pos < source | length -%}\n {%- set ch = source[state.pos] -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- if ch == '\"' -%}\n {%- set out.done = true -%}\n {%- elif ch != '\\\\' -%}\n {%- set out.decoded = out.decoded + ch -%}\n {%- elif state.pos < source | length -%}\n {%- set escape = source[state.pos] -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- if escape == '\"' -%}{%- set out.decoded = out.decoded + '\"' -%}\n {%- elif escape == '\\\\' -%}{%- set out.decoded = out.decoded + '\\\\' -%}\n {%- elif escape == '/' -%}{%- set out.decoded = out.decoded + '/' -%}\n {%- elif escape == 'b' -%}{%- set out.decoded = out.decoded + '\\b' -%}\n {%- elif escape == 'f' -%}{%- set out.decoded = out.decoded + '\\f' -%}\n {%- elif escape == 'n' -%}{%- set out.decoded = out.decoded + '\\n' -%}\n {%- elif escape == 'r' -%}{%- set out.decoded = out.decoded + '\\r' -%}\n {%- elif escape == 't' -%}{%- set out.decoded = out.decoded + '\\t' -%}\n {%- elif escape == 'u' -%}\n {%- set out.code = 0 -%}\n {%- for offset in range(4) -%}\n {%- set digit = source[state.pos + offset] | lower -%}\n {%- set out.code = out.code * 16 + hex_values[digit] -%}\n {%- endfor -%}\n {%- set state.pos = state.pos + 4 -%}\n {%- if out.code >= 55296 and out.code <= 56319 and source[state.pos:state.pos + 2] == '\\\\u' -%}\n {%- set out.low = 0 -%}\n {%- for offset in range(4) -%}\n {%- set digit = source[state.pos + 2 + offset] | lower -%}\n {%- set out.low = out.low * 16 + hex_values[digit] -%}\n {%- endfor -%}\n {%- if out.low >= 56320 and out.low <= 57343 -%}\n {%- set out.code = 65536 + (out.code - 55296) * 1024 + out.low - 56320 -%}\n {%- set state.pos = state.pos + 6 -%}\n {%- endif -%}\n {%- endif -%}\n {%- set out.decoded = out.decoded + ('%c' % out.code) -%}\n {%- else -%}\n {%- set out.decoded = out.decoded + escape -%}\n {%- endif -%}\n {%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n {%- set state.string_value = out.decoded -%}\n {{- out.decoded | tojson(ensure_ascii=false, separators=(',', ':')) -}}\n {%- else -%}\n {%- set out = namespace(start=state.pos, escaped=false, done=false) -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- for ignored in range(source | length) -%}\n {%- if not out.done and state.pos < source | length -%}\n {%- set ch = source[state.pos] -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- if out.escaped -%}\n {%- set out.escaped = false -%}\n {%- elif ch == '\\\\' -%}\n {%- set out.escaped = true -%}\n {%- elif ch == '\"' -%}\n {%- set out.done = true -%}\n {%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n {%- set state.string_value = source[out.start:state.pos] -%}\n {{- source[out.start:state.pos] -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{#-\n Move the cursor across one complete JSON value without rendering it. Object\n parsing uses the raw slice to sort members before recursively rendering them.\n-#}\n{%- macro json_scan_value(source, state) -%}\n {{- json_skip_ws(source, state) -}}\n {%- set scan = namespace(depth=0, quoted=false, escaped=false, done=false) -%}\n {%- for ignored in range(source | length) -%}\n {%- if not scan.done and state.pos < source | length -%}\n {%- set ch = source[state.pos] -%}\n {%- if scan.quoted -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- if ch == '\"' and not scan.escaped -%}\n {%- set scan.quoted = false -%}\n {%- elif ch == '\\\\' and not scan.escaped -%}\n {%- set scan.escaped = true -%}\n {%- else -%}\n {%- set scan.escaped = false -%}\n {%- endif -%}\n {%- elif ch == '\"' -%}\n {%- set scan.quoted = true -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- elif ch == '{' or ch == '[' -%}\n {%- set scan.depth = scan.depth + 1 -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- elif ch == '}' or ch == ']' -%}\n {%- if scan.depth > 0 -%}\n {%- set scan.depth = scan.depth - 1 -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- else -%}\n {%- set scan.done = true -%}\n {%- endif -%}\n {%- elif ch == ',' and scan.depth == 0 -%}\n {%- set scan.done = true -%}\n {%- else -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n{%- endmacro -%}\n\n{#- Parse and canonically render one JSON value from source at state.pos. -#}\n{%- macro canonical_json_text_value(source, state) -%}\n {{- json_skip_ws(source, state) -}}\n {%- if state.pos >= source | length -%}\n {{- '{}' -}}\n {%- elif source[state.pos] == '\"' -%}\n {{- json_string(source, state) -}}\n {%- elif source[state.pos] == '{' -%}\n {%- set state.pos = state.pos + 1 -%}\n {{- json_skip_ws(source, state) -}}\n {%- set object_state = namespace(pairs=[], done=false) -%}\n {%- if state.pos < source | length and source[state.pos] == '}' -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- set object_state.done = true -%}\n {%- endif -%}\n {%- for ignored in range(source | length) -%}\n {%- if not object_state.done -%}\n {{- json_skip_ws(source, state) -}}\n {%- set key = json_string(source, state) -%}\n {%- set sort_key = state.string_value -%}\n {{- json_skip_ws(source, state) -}}\n {%- if state.pos < source | length and source[state.pos] == ':' -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- endif -%}\n {{- json_skip_ws(source, state) -}}\n {%- set value_start = state.pos -%}\n {{- json_scan_value(source, state) -}}\n {#- json.loads keeps the final member when a key is duplicated. -#}\n {%- set unique = namespace(pairs=[]) -%}\n {%- for previous in object_state.pairs -%}\n {%- if previous[0] != sort_key -%}\n {%- set unique.pairs = unique.pairs + [previous] -%}\n {%- endif -%}\n {%- endfor -%}\n {%- set object_state.pairs = unique.pairs + [[sort_key, key, source[value_start:state.pos]]] -%}\n {{- json_skip_ws(source, state) -}}\n {%- if state.pos < source | length and source[state.pos] == ',' -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- else -%}\n {%- if state.pos < source | length and source[state.pos] == '}' -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- endif -%}\n {%- set object_state.done = true -%}\n {%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n {{- '{' -}}\n {%- for pair in object_state.pairs | sort(case_sensitive=true, attribute=0) -%}\n {{- pair[1] -}}{{- ':' -}}\n {%- set child_state = namespace(pos=0, string_value='') -%}\n {{- canonical_json_text_value(pair[2], child_state) -}}\n {%- if not loop.last -%}{{- ',' -}}{%- endif -%}\n {%- endfor -%}\n {{- '}' -}}\n {%- elif source[state.pos] == '[' -%}\n {%- set state.pos = state.pos + 1 -%}\n {{- '[' -}}\n {{- json_skip_ws(source, state) -}}\n {%- set array_state = namespace(done=false, first=true) -%}\n {%- if state.pos < source | length and source[state.pos] == ']' -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- set array_state.done = true -%}\n {%- endif -%}\n {%- for ignored in range(source | length) -%}\n {%- if not array_state.done -%}\n {%- if not array_state.first -%}{{- ',' -}}{%- endif -%}\n {%- set array_state.first = false -%}\n {{- canonical_json_text_value(source, state) -}}\n {{- json_skip_ws(source, state) -}}\n {%- if state.pos < source | length and source[state.pos] == ',' -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- else -%}\n {%- if state.pos < source | length and source[state.pos] == ']' -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- endif -%}\n {%- set array_state.done = true -%}\n {%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n {{- ']' -}}\n {%- else -%}\n {%- set scalar = namespace(start=state.pos, done=false) -%}\n {%- for ignored in range(source | length) -%}\n {%- if not scalar.done and state.pos < source | length -%}\n {%- set ch = source[state.pos] -%}\n {%- if ch == ',' or ch == '}' or ch == ']' or ch == ' ' or ch == '\\t' or ch == '\\r' or ch == '\\n' -%}\n {%- set scalar.done = true -%}\n {%- else -%}\n {%- set state.pos = state.pos + 1 -%}\n {%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n {%- set token = source[scalar.start:state.pos] -%}\n {%- if token == 'true' or token == 'false' or token == 'null' -%}\n {{- token -}}\n {%- elif '.' in token or 'e' in token or 'E' in token -%}\n {{- json_scalar(token | float) -}}\n {%- else -%}\n {{- token | int | tojson(ensure_ascii=false, separators=(',', ':')) -}}\n {%- endif -%}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- macro canonical_json_text(source) -%}\n {%- set text = source | trim -%}\n {%- if not text -%}\n {{- '{}' -}}\n {%- else -%}\n {%- set state = namespace(pos=0, string_value='') -%}\n {{- canonical_json_text_value(text, state) -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{#-\n OpenAI clients use either an argument mapping or a JSON-encoded object.\n Non-object/empty oddities degrade to {} instead of raising. Object parsing\n recursively sorts keys, keeps the last duplicate key (json.loads behavior),\n decodes JSON escapes under Transformers, and preserves array order.\n-#}\n{%- macro canonical_arguments(arguments) -%}\n {%- if arguments is mapping -%}\n {{- canonical_json(arguments) -}}\n {%- elif arguments is string -%}\n {%- set source = arguments | trim -%}\n {%- if source and source[0] == '{' -%}\n {{- canonical_json_text(source) -}}\n {%- else -%}\n {{- '{}' -}}\n {%- endif -%}\n {%- else -%}\n {{- '{}' -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{#-\n Match Python f\"{float(effort):.2f}\" followed by trailing-zero removal.\n llama.cpp's jinja engine has no round filter; the bit table handles binary64 midpoint equality.\n-#}\n{%- macro reasoning_effort_text(effort) -%}\n {%- set eff = effort -%}\n {%- if eff is string -%}\n {%- set e = eff | trim | lower -%}\n {%- if e == 'none' -%}{%- set eff = 0.0 -%}\n {%- elif e == 'minimal' -%}{%- set eff = 0.1 -%}\n {%- elif e == 'low' -%}{%- set eff = 0.2 -%}\n {%- elif e == 'medium' -%}{%- set eff = 0.7 -%}\n {%- elif e == 'high' -%}{%- set eff = 0.9 -%}\n {%- elif e == 'xhigh' -%}{%- set eff = 0.99 -%}\n {%- elif e == 'max' -%}{%- set eff = 0.99 -%}\n {%- else -%}{%- set eff = e | float(-1.0) -%}\n {%- endif -%}\n {%- endif -%}\n {%- set value = eff | float -%}\n {%- if value < 0 or value > 0.99 -%}\n {{- raise_exception('Invalid reasoning_effort: ' + (effort | string) + '; expected none/minimal/low/medium/high/xhigh/max or a number in [0.0, 0.99]') -}}\n {%- endif -%}\n {%- if value == value | int and value >= 0 and value <= 1 -%}\n {{- value | int -}}\n {%- else -%}\n {%- set midpoint_rounds_up = '1011011011010100100100100111000111000111100011100011111100000001111110000001111110000001111111000000' -%}\n {%- set rounded = namespace(hundredths=0) -%}\n {%- for lower_hundredth in range(100) -%}\n {%- set boundary = (lower_hundredth + 0.5) / 100 -%}\n {%- if value > boundary or (value == boundary and midpoint_rounds_up[lower_hundredth] == '1') -%}\n {%- set rounded.hundredths = lower_hundredth + 1 -%}\n {%- endif -%}\n {%- endfor -%}\n {%- if rounded.hundredths == 100 -%}\n {{- '1' -}}\n {%- elif rounded.hundredths == 0 -%}\n {{- '0' -}}\n {%- elif rounded.hundredths % 10 == 0 -%}\n {{- '0.' -}}{{- (rounded.hundredths / 10) | int -}}\n {%- elif rounded.hundredths < 10 -%}\n {{- '0.0' -}}{{- rounded.hundredths -}}\n {%- else -%}\n {{- '0.' -}}{{- rounded.hundredths -}}\n {%- endif -%}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- macro role_token(role) -%}\n {%- if role == 'user' -%}{{- '<|message_user|>' -}}\n {%- elif role == 'assistant' -%}{{- '<|message_model|>' -}}\n {%- elif role == 'system' or role == 'developer' -%}{{- '<|message_system|>' -}}\n {%- elif role == 'tool' -%}{{- '<|message_tool|>' -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- macro emit_message(role, kind, content='', author_name='') -%}\n {{- role_token(role) -}}\n {%- if author_name -%}{{- author_name -}}{%- endif -%}\n {%- if kind == 'text' -%}\n {{- '<|content_text|>' -}}{{- content -}}\n {%- elif kind == 'thinking' -%}\n {{- '<|content_thinking|>' -}}{{- content -}}\n {%- elif kind == 'xml' -%}\n {{- '<|content_xml|>' -}}{{- content -}}\n {%- elif kind == 'invoke_tool_json' -%}\n {{- '<|content_invoke_tool_json|>' -}}{{- content -}}\n {%- elif kind == 'image' -%}\n {{- '<|content_image|><|image|>' -}}\n {%- elif kind == 'audio' -%}\n {{- '<|content_audio_input|><|audio|><|audio_end|>' -}}\n {%- endif -%}\n {{- '<|end_message|>' -}}\n{%- endmacro -%}\n\n{%- set effort_value = reasoning_effort if (reasoning_effort is defined and reasoning_effort is not none) else 0.9 -%}\n{%- set eff_ns = namespace(emitted=false) -%}\n{%- set first_ns = namespace(idx=-1) -%}\n{%- for m in messages -%}\n {%- if first_ns.idx == -1 and m.get('role') not in ['system', 'developer'] -%}\n {%- set first_ns.idx = loop.index0 -%}\n {%- endif -%}\n{%- endfor -%}\n\n{%- if tools is defined and tools -%}\n {{- '<|message_system|>tool_declare<|content_xml|>[' -}}\n {%- for tool in tools -%}\n {%- set function = tool.get('function', {}) if tool.get('function', {}) is mapping else {} -%}\n {%- set description = function.get('description') or '' -%}\n {%- set parameters = function.get('parameters') or {} -%}\n {%- set tool_type = tool.get('type', 'function') -%}\n {{- '{\"description\":' -}}{{- canonical_json(description) -}}\n {{- ',\"name\":' -}}{{- canonical_json(function.get('name')) -}}\n {{- ',\"parameters\":' -}}{{- canonical_json(parameters) -}}\n {{- ',\"type\":' -}}{{- canonical_json(tool_type) -}}{{- '}' -}}\n {%- if not loop.last -%}{{- ',' -}}{%- endif -%}\n {%- endfor -%}\n {{- ']<|end_message|>' -}}\n{%- endif -%}\n\n{#- Last-user boundary used only by the opt-in preserve_thinking=false mode. -#}\n{%- set thinking_state = namespace(last_user_index=messages | length - 1, found_user=false) -%}\n{%- for index in range(messages | length - 1, -1, -1) -%}\n {%- if not thinking_state.found_user and messages[index].get('role') == 'user' -%}\n {%- set thinking_state.last_user_index = index -%}\n {%- set thinking_state.found_user = true -%}\n {%- endif -%}\n{%- endfor -%}\n\n{%- for message in messages -%}\n {%- set message_index = loop.index0 -%}\n {%- set role = message.get('role') -%}\n {%- if not eff_ns.emitted and loop.index0 == first_ns.idx -%}\n {{- emit_message('system', 'text', 'Thinking effort level: ' + reasoning_effort_text(effort_value)) -}}\n {%- set eff_ns.emitted = true -%}\n {%- endif -%}\n {%- if role == 'tool' -%}\n {%- set resolved = namespace(name=message.get('name') or '') -%}\n {%- if not resolved.name and message.get('tool_call_id') -%}\n {%- for prior in messages[:message_index] -%}\n {%- if prior.get('role') == 'assistant' -%}\n {%- for call in prior.get('tool_calls') or [] -%}\n {%- if call.get('id') and (call.get('id') | string) == message.get('tool_call_id') -%}\n {%- set prior_function = call.get('function', {}) if call.get('function', {}) is mapping else {} -%}\n {%- set resolved.name = prior_function.get('name') or '' -%}\n {%- endif -%}\n {%- endfor -%}\n {%- endif -%}\n {%- endfor -%}\n {%- endif -%}\n {%- set tool_content = message.get('content', '') -%}\n {%- if tool_content is none -%}\n {%- set tool_content = '' -%}\n {%- elif tool_content is mapping or (tool_content is sequence and tool_content is not string) -%}\n {%- set tool_content = canonical_json(tool_content) -%}\n {%- elif tool_content is not string -%}\n {%- set tool_content = canonical_json(tool_content) -%}\n {%- endif -%}\n {{- emit_message('tool', 'text', tool_content, resolved.name | string) -}}\n {%- elif role == 'user' or role == 'assistant' or role == 'system' or role == 'developer' -%}\n {%- set turn_out -%}\n {%- if role == 'assistant' and message.get('reasoning_content') is string and message.get('reasoning_content') and\n ((preserve_thinking is not defined) or preserve_thinking is not false or message_index > thinking_state.last_user_index) -%}\n {{- emit_message('assistant', 'thinking', message.get('reasoning_content')) -}}\n {%- endif -%}\n\n {%- set content = message.get('content', '') -%}\n {#- Makes llama.cpp retain typed arrays rather than flattening them. -#}\n {%- set content_probe = content[0] if content is sequence and content | length > 0 else none -%}\n {%- if content is string -%}\n {%- if '<__media_' in content -%}\n {#- Flattened media markers: each part becomes its own message block. The runtime may\n randomize the marker suffix, so split on the stable prefix and re-emit the exact\n marker text; the runtime then expands it into the typed content sentinel plus the\n media embedding rows. -#}\n {%- for segment in content.split('<__media_') -%}\n {%- if loop.first -%}\n {%- if segment -%}{{- emit_message(role, 'text', segment) -}}{%- endif -%}\n {%- else -%}\n {%- set mparts = segment.split('>') -%}\n {%- set rest = mparts[1:] | join('>') -%}\n {{- role_token(role) -}}{{- '<__media_' + mparts[0] + '>' -}}{{- '<|end_message|>' -}}\n {%- if rest -%}{{- emit_message(role, 'text', rest) -}}{%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n {%- elif content -%}\n {{- emit_message(role, 'text', content) -}}\n {%- endif -%}\n {%- elif content is sequence -%}\n {%- for part in content -%}\n {%- if part is string -%}\n {{- emit_message(role, 'text', part) -}}\n {%- elif part is mapping -%}\n {%- set part_type = part.get('type') -%}\n {%- if part_type is none or part_type == 'text' or part_type == 'input_text' -%}\n {%- set part_text = part.get('text', '') -%}\n {{- emit_message(role, 'text', part_text if part_text is string else '') -}}\n {%- elif part_type == 'image' or part_type == 'input_image' or part_type == 'image_url' -%}\n {{- emit_message(role, 'image') -}}\n {%- elif part_type == 'audio' or part_type == 'input_audio' or part_type == 'audio_url' -%}\n {{- emit_message(role, 'audio') -}}\n {%- endif -%}\n {%- endif -%}\n {%- endfor -%}\n {%- endif -%}\n\n {%- if role == 'assistant' -%}\n {%- for call in message.get('tool_calls') or [] -%}\n {%- set function = call.get('function', {}) if call.get('function', {}) is mapping else {} -%}\n {%- if function.get('name') is string -%}\n {%- set raw_arguments = function.get('arguments') or {} -%}\n {%- set arguments_json = canonical_arguments(raw_arguments) -%}\n {%- set invocation = '{\"name\":' + canonical_json(function.get('name')) + ',\"args\":' + arguments_json + '}' -%}\n {{- emit_message('assistant', 'invoke_tool_json', invocation, function.get('name')) -}}\n {%- endif -%}\n {%- endfor -%}\n {%- endif -%}\n {%- endset -%}\n {{- turn_out -}}\n {#- Close each historical model turn, but never emit a bare terminator for an\n assistant message that rendered no blocks. -#}\n {%- if role == 'assistant' and turn_out -%}\n {{- '<|content_model_end_sampling|>' -}}\n {%- endif -%}\n {%- else -%}\n {{- raise_exception('Unknown message role: ' + (role | string)) -}}\n {%- endif -%}\n{%- endfor -%}\n\n{%- if not eff_ns.emitted -%}\n {{- emit_message('system', 'text', 'Thinking effort level: ' + reasoning_effort_text(effort_value)) -}}\n{%- endif -%}\n\n{%- if add_generation_prompt is defined and add_generation_prompt -%}\n {{- '<|message_model|>' -}}\n{%- endif -%}\n{#- Unsloth translation to jinja from TML's parser #}"
}