react-native-executorch-lfm-3 / 1_7b /tokenizer_config.json
msluszniak's picture
Add LFM3-1.7B and LFM3-VL-2B (XNNPACK 8da4w, MLX int4/int8)
09c463b verified
Raw History Blame Contribute Delete
14.2 kB
{
"audio_out_token": "<|audio_out|>",
"audio_token": "<|audio|>",
"backend": "tokenizers",
"bos_token": "<|startoftext|>",
"eos_token": "<|im_end|>",
"extra_special_tokens": [],
"image_token": "<|image|>",
"model_max_length": 1000000000000000019884624838656,
"pad_token": "<|pad|>",
"response_template": {
"defaults": {
"role": "assistant"
},
"start_anchor_pattern": "<\\|im_start\\|>assistant\\n",
"fields": {
"reasoning_content": {
"open_pattern": "<think>\\n?",
"close_pattern": "</think>\\s*",
"content": "text"
},
"tool_calls": {
"open_pattern": "<tool_call>\\s*<function=(?P<name>[^\\n>]+)>",
"close_pattern": "</tool_call>\\s*",
"repeats": true,
"content": "xml-inline",
"content_args": {
"tag_pattern": "<parameter=(?P<key>[^>\\n]+)>\\n?(?P<value>.*?)\\n?</parameter>(?=\\s*(?:<parameter=|</function>\\s*\\Z|\\Z))",
"value_parser": {
"name": "text",
"args": {
"strip": false
}
}
},
"transform": {
"type": "function",
"function": {
"name": "{name}",
"arguments": "{content}"
}
}
},
"content": {
"close_pattern": "<\\|im_end\\|>\\s*",
"content": "text"
}
}
},
"tokenizer_class": "TokenizersBackend",
"video_token": "<|video|>",
"vision_end_token": "<|vision_end|>",
"vision_start_token": "<|vision_start|>",
"chat_template": "{{- bos_token -}}\n{%- set preserve_thinking = preserve_thinking | default(false) -%}\n{%- set enable_thinking = enable_thinking | default(true) -%}\n\n{%- macro render_value(v) -%}\n {%- if v is string -%}\n {{- v -}}\n {%- elif v is boolean -%}\n {{- \"true\" if v else \"false\" -}}\n {%- elif v is none -%}\n {{- \"null\" -}}\n {%- elif v is mapping or (v is sequence and v is not string) -%}\n {{- v | tojson -}}\n {%- else -%}\n {{- v -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- macro parse_content(content) -%}\n {%- if content is string -%}\n {{- content -}}\n {%- elif content is mapping and content.get(\"type\") == \"image\" -%}\n {{- \"<|vision_start|><|image|><|vision_end|>\" -}}\n {%- elif content is mapping and content.get(\"type\") == \"video\" -%}\n {{- \"<|vision_start|><|video|><|vision_end|>\" -}}\n {%- elif content is mapping and content.get(\"type\") == \"text\" -%}\n {{- (content.get(\"text\") or \"\") | string -}}\n {%- elif content is mapping -%}\n {{- content | tojson -}}\n {%- elif content is iterable -%}\n {%- set _ns = namespace(result=\"\") -%}\n {%- for item in content -%}\n {%- if item is string -%}\n {%- set _ns.result = _ns.result + item -%}\n {%- elif item is mapping and item.get(\"type\") == \"image\" -%}\n {%- set _ns.result = _ns.result + \"<|vision_start|><|image|><|vision_end|>\" -%}\n {%- elif item is mapping and item.get(\"type\") == \"video\" -%}\n {%- set _ns.result = _ns.result + \"<|vision_start|><|video|><|vision_end|>\" -%}\n {%- elif item is mapping and item.get(\"type\") == \"text\" -%}\n {%- set _ns.result = _ns.result + ((item.get(\"text\") or \"\") | string) -%}\n {%- else -%}\n {%- set _ns.result = _ns.result + (item | tojson) -%}\n {%- endif -%}\n {%- endfor -%}\n {{- _ns.result -}}\n {%- elif content is not none -%}\n {{- content | tojson -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- macro render_tool_calls(tool_calls) -%}\n {%- for tool_call in tool_calls -%}\n {%- if not loop.first -%}{{- \"\\n\\n\" -}}{%- endif -%}\n {%- set func = tool_call[\"function\"] if \"function\" in tool_call else tool_call -%}\n {%- set func_args = func.get(\"arguments\") -%}\n {%- if func_args is string and (func_args | trim) not in [\"\", \"{}\", \"null\"] -%}\n {{- raise_exception(\"Tool call arguments must be a mapping, got a JSON-encoded string: parse arguments with json.loads() before applying the chat template\") -}}\n {%- endif -%}\n {{- \"<tool_call>\\n<function=\" + func[\"name\"] + \">\\n\" -}}\n {%- if func_args is mapping -%}\n {%- for arg_name, arg_value in func_args.items() -%}\n {{- \"<parameter=\" + arg_name + \">\\n\" + render_value(arg_value) + \"\\n</parameter>\\n\" -}}\n {%- endfor -%}\n {%- endif -%}\n {{- \"</function>\\n</tool_call>\" -}}\n {%- endfor -%}\n{%- endmacro -%}\n\n{%- macro tool_to_json(tool) -%}\n {%- set fn = tool.function if tool.function is defined else tool -%}\n {%- set ns_t = namespace(first=true) -%}\n {{- \"{\" -}}\n {%- for k, v in fn.items() -%}\n {%- if k != \"defer_loading\" -%}\n {%- if not ns_t.first -%}{{- \", \" -}}{%- endif -%}\n {%- set ns_t.first = false -%}\n {{- k | tojson -}}{{- \": \" -}}{{- v | tojson -}}\n {%- endif -%}\n {%- endfor -%}\n {{- \"}\" -}}\n{%- endmacro -%}\n\n{%- macro is_tool_reference(item) -%}\n {{- \"1\" if item is mapping and item.get(\"type\") == \"tool_reference\" else \"\" -}}\n{%- endmacro -%}\n\n{%- macro referenced_tool_to_json(name) -%}\n {%- set _ns = namespace(found=none) -%}\n {%- for tool in tools or [] -%}\n {%- set fn = tool.function if tool.function is defined else tool -%}\n {%- if fn.name == name -%}\n {%- set _ns.found = fn -%}\n {%- endif -%}\n {%- endfor -%}\n {%- if _ns.found is none -%}\n {{- raise_exception(\"Tool reference '\" + name | string + \"' not found in available tools. Every tool referenced by a tool_reference must be in `tools` on every request.\") -}}\n {%- endif -%}\n {{- tool_to_json(_ns.found) -}}\n{%- endmacro -%}\n\n{%- macro render_tool_response(content) -%}\n {%- if content is string and \"<tool_response>\" in content -%}\n {{- content -}}\n {%- else -%}\n {{- \"<tool_response>\\n\" -}}\n {%- if content is string -%}\n {{- content -}}\n {%- elif content is mapping -%}\n {{- parse_content(content) -}}\n {%- elif content is iterable -%}\n {%- for item in content -%}\n {%- if not loop.first -%}{{- \"\\n\" -}}{%- endif -%}\n {%- if is_tool_reference(item) -%}\n {%- if loop.first or not is_tool_reference(loop.previtem) -%}\n {{- \"<additional_tools>\\n\" -}}\n {%- endif -%}\n {{- referenced_tool_to_json(item.name) -}}\n {%- if loop.last or not is_tool_reference(loop.nextitem) -%}\n {{- \"\\n</additional_tools>\" -}}\n {%- endif -%}\n {%- elif item is mapping and item.result is defined and item.result is mapping and item.result.tools is defined -%}\n {{- \"<additional_tools>\\n\" -}}\n {%- set _tl = item.result.tools -%}\n {%- if _tl is string -%}\n {{- _tl -}}\n {%- elif _tl is mapping -%}\n {{- tool_to_json(_tl) -}}\n {%- else -%}\n {%- for t in _tl -%}\n {%- if not loop.first -%}{{- \"\\n\" -}}{%- endif -%}\n {{- tool_to_json(t) -}}\n {%- endfor -%}\n {%- endif -%}\n {{- \"\\n</additional_tools>\" -}}\n {%- else -%}\n {{- parse_content(item) -}}\n {%- endif -%}\n {%- endfor -%}\n {%- elif content is not none -%}\n {{- content | tojson -}}\n {%- endif -%}\n {{- \"\\n</tool_response>\" -}}\n {%- endif -%}\n{%- endmacro -%}\n\n{%- set ns = namespace(system_prompt=\"\", last_user_index=-1) -%}\n{%- if messages and messages[0][\"role\"] == \"system\" -%}\n {%- if messages[0].get(\"content\") -%}\n {%- set ns.system_prompt = parse_content(messages[0][\"content\"]) -%}\n {%- endif -%}\n {%- set messages = messages[1:] -%}\n{%- endif -%}\n{%- if tools -%}\n {%- set tools_ns = namespace(lines=[]) -%}\n {%- for tool in tools -%}\n {%- set fn = tool.function if tool.function is defined else tool -%}\n {%- set _dyn = (fn.defer_loading is defined and fn.defer_loading) or (tool.defer_loading is defined and tool.defer_loading) -%}\n {%- if not _dyn -%}\n {%- set tools_ns.lines = tools_ns.lines + [tool_to_json(fn)] -%}\n {%- endif -%}\n {%- endfor -%}\n {%- if tools_ns.lines -%}\n {%- set ns.system_prompt = ns.system_prompt + (\"\\n\\n\" if ns.system_prompt else \"\") + \"<tools>\\n\" + (tools_ns.lines | join(\"\\n\")) + \"\\n</tools>\" -%}\n {%- endif -%}\n{%- endif -%}\n{%- if ns.system_prompt -%}\n {{- \"<|im_start|>system\\n\" + ns.system_prompt + \"<|im_end|>\\n\" -}}\n{%- endif -%}\n{%- for message in messages -%}\n {%- if message[\"role\"] == \"user\" -%}\n {%- set ns.last_user_index = loop.index0 -%}\n {%- endif -%}\n{%- endfor -%}\n{%- set carry = namespace(pending=[]) -%}\n{%- for message in messages -%}\n {%- set _next = messages[loop.index0 + 1] if not loop.last else none -%}\n {%- set _merge = message.role == \"tool\" and not message.get(\"additional_tools\")\n and _next is not none and _next.role == \"tool\" and not _next.get(\"additional_tools\")\n and message.get(\"tool_call_id\") and _next.get(\"tool_call_id\") == message.get(\"tool_call_id\") -%}\n {%- set _items = [] -%}\n {%- if message.role == \"tool\" and not message.get(\"additional_tools\") -%}\n {%- set _c = message.get(\"content\") -%}\n {%- if _c is string -%}\n {%- set _items = [{\"type\": \"text\", \"text\": _c}] if _c else [] -%}\n {%- elif _c is mapping -%}\n {%- set _items = [_c] -%}\n {%- elif _c is iterable -%}\n {%- set _items = _c | list -%}\n {%- elif _c is not none -%}\n {%- set _items = [_c] -%}\n {%- endif -%}\n {%- endif -%}\n {%- if _merge -%}\n {%- set carry.pending = carry.pending + _items -%}\n {%- else -%}\n {{- \"<|im_start|>\" + message.role + \"\\n\" -}}\n {%- if message.role == \"assistant\" -%}\n {%- generation -%}\n {%- set thinking = message.thinking if message.thinking is defined else message.reasoning if message.reasoning is defined else message.reasoning_content -%}\n {%- set keep_thinking = preserve_thinking -%}\n {%- if thinking is defined and keep_thinking -%}\n {{- \"<think>\" + (thinking or \"\") + \"</think>\" -}}\n {%- elif keep_thinking and \"</think>\" not in (message.get(\"content\") if message.get(\"content\") is string else \"\") -%}\n {{- \"<think></think>\" -}}\n {%- endif -%}\n {%- set _cfm_tag = \"CONTINUE_FINAL_MESSAGE_TAG \" -%}\n {%- set _has_cfm = false -%}\n {%- set content = \"\" -%}\n {%- if message.get(\"content\") -%}\n {%- set content = parse_content(message.content) -%}\n {%- endif -%}\n {%- if not keep_thinking -%}\n {%- if \"</think>\" in content -%}\n {%- set content = content.split(\"</think>\")[-1] | trim -%}\n {%- endif -%}\n {%- set content = \"<think></think>\" + content -%}\n {%- endif -%}\n {%- if content.endswith(_cfm_tag) -%}\n {%- set _has_cfm = true -%}\n {%- set _trunc_len = (content | length) - (_cfm_tag | length) -%}\n {%- set content = content[:_trunc_len] -%}\n {%- endif -%}\n {{- content -}}\n {%- if message.tool_calls -%}\n {{- render_tool_calls(message.tool_calls) -}}\n {%- endif -%}\n {%- if _has_cfm -%}\n {{- _cfm_tag -}}\n {%- endif -%}\n {{- \"<|im_end|>\\n\" -}}\n {%- endgeneration -%}\n {%- elif message.role == \"tool\" -%}\n {%- if message.get(\"additional_tools\") -%}\n {%- set _at = message[\"additional_tools\"] -%}\n {%- if _at is mapping or (_at is sequence and _at is not string) -%}\n {%- set _src = _at -%}\n {%- else -%}\n {%- set _src = message.get(\"content\") -%}\n {%- endif -%}\n {%- if _src is string and \"<tool_response>\" in _src -%}\n {{- _src -}}\n {%- elif _src is string and \"<additional_tools>\" in _src -%}\n {{- \"<tool_response>\\n\" + _src + \"\\n</tool_response>\" -}}\n {%- elif _src -%}\n {{- \"<tool_response>\\n<additional_tools>\\n\" -}}\n {%- if _src is string -%}\n {{- _src -}}\n {%- elif _src is mapping -%}\n {{- tool_to_json(_src) -}}\n {%- else -%}\n {%- for t in _src -%}\n {%- if not loop.first -%}{{- \"\\n\" -}}{%- endif -%}\n {{- tool_to_json(t) -}}\n {%- endfor -%}\n {%- endif -%}\n {{- \"\\n</additional_tools>\\n</tool_response>\" -}}\n {%- endif -%}\n {%- elif carry.pending -%}\n {{- render_tool_response(carry.pending + _items) -}}\n {%- set carry.pending = [] -%}\n {%- else -%}\n {{- render_tool_response(\"\" if message.get(\"content\") is none else message.get(\"content\")) -}}\n {%- endif -%}\n {{- \"<|im_end|>\\n\" -}}\n {%- else %}\n {%- if message.get(\"content\") -%}\n {{- parse_content(message[\"content\"]) -}}\n {%- endif -%}\n {{- \"<|im_end|>\\n\" -}}\n {%- endif %}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{- \"<|im_start|>assistant\\n\" -}}\n {%- if enable_thinking -%}\n {{- \"<think>\" -}}\n {%- else -%}\n {{- \"<think></think>\" -}}\n {%- endif -%}\n{%- endif -%}\n"
}