Source code for lmflow.utils.conversation_template.qwen
#!/usr/bin/env python
# Copyright 2024 Statistics and Machine Learning Research Group. All rights reserved.
from .base import ConversationTemplate, ConversationTemplateForTool, StringFormatter, TemplateComponent
[docs]
QWEN2_TEMPLATE = ConversationTemplate(
template_name="qwen2",
user_formatter=StringFormatter(
template=[TemplateComponent(type="string", content="<|im_start|>user\n{{content}}<|im_end|>\n")]
),
assistant_formatter=StringFormatter(
template=[TemplateComponent(type="string", content="<|im_start|>assistant\n{{content}}<|im_end|>\n")]
),
system_formatter=StringFormatter(
template=[TemplateComponent(type="string", content="<|im_start|>system\n{{content}}<|im_end|>\n")]
),
separator=TemplateComponent(type="string", content="\n"),
)
[docs]
QWEN2_5_TEMPLATE = (
"{%- if tools %}"
"{{- '<|im_start|>system\\n' }}"
"{%- if messages[0]['role'] == 'system' %}"
"{{- messages[0]['content'] }}"
"{%- else %}"
"{{- 'You are Qwen, created by Alibaba Cloud. You are a helpful assistant.' }}"
"{%- endif %}"
'{{- "\\n\\n# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within <tools></tools> XML tags:\\n<tools>" }}'
"{%- for tool in tools %}"
'{{- "\\n" }}'
"{{- tool | tojson }}"
"{%- endfor %}"
'{{- "\\n</tools>\\n\\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\\n<tool_call>\\n{\\"name\\": <function-name>, \\"arguments\\": <args-json-object>}\\n</tool_call><|im_end|>\\n" }}'
"{%- else %}"
"{%- if messages[0]['role'] == 'system' %}"
"{{- '<|im_start|>system\\n' + messages[0]['content'] + '<|im_end|>\\n' }}"
"{%- else %}"
"{{- '<|im_start|>system\\nYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- for message in messages %}"
'{%- if (message.role == "user") or (message.role == "system" and not loop.first) or (message.role == "assistant" and not message.tool_calls) %}'
'{%- if message.role == "assistant" %}'
"{{- '<|im_start|>' + message.role + '\\n' }}"
"{% generation %}"
"{{ message.content + '<|im_end|>' + '\\n' }}"
"{% endgeneration %}"
"{%- else %}"
"{{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}"
"{%- endif %}"
'{%- elif message.role == "assistant" %}'
"{{- '<|im_start|>' + message.role }}"
"{%- if message.content %}"
"{% generation %}"
"{{- '\\n' + message.content }}"
"{% endgeneration %}"
"{%- endif %}"
"{%- for tool_call in message.tool_calls %}"
"{%- if tool_call.function is defined %}"
"{%- set tool_call = tool_call.function %}"
"{%- endif %}"
"{% generation %}"
'{{- \'\\n<tool_call>\\n{"name": "\' }}'
"{{- tool_call.name }}"
'{{- \'", "arguments": \' }}'
"{{- tool_call.arguments | tojson }}"
"{{- '}\\n</tool_call>' }}"
"{% endgeneration %}"
"{%- endfor %}"
"{% generation %}"
"{{- '<|im_end|>\\n' }}"
"{% endgeneration %}"
'{%- elif message.role == "tool" %}'
'{%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %}'
"{{- '<|im_start|>user' }}"
"{%- endif %}"
"{{- '\\n<tool_response>\\n' }}"
"{{- message.content }}"
"{{- '\\n</tool_response>' }}"
'{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}'
"{{- '<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- endfor %}"
"{%- if add_generation_prompt %}"
"{{- '<|im_start|>assistant\\n' }}"
"{%- endif %}"
)
[docs]
QWEN2_5_1M_TEMPLATE = (
"{%- if tools %}"
"{{- '<|im_start|>system\\n' }}"
"{%- if messages[0]['role'] == 'system' %}"
"{{- messages[0]['content'] }}"
"{%- else %}"
"{{- 'You are a helpful assistant.' }}"
"{%- endif %}"
'{{- "\\n\\n# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within <tools></tools> XML tags:\\n<tools>" }}'
"{%- for tool in tools %}"
'{{- "\\n" }}'
"{{- tool | tojson }}"
"{%- endfor %}"
'{{- "\\n</tools>\\n\\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\\n<tool_call>\\n{\\"name\\": <function-name>, \\"arguments\\": <args-json-object>}\\n</tool_call><|im_end|>\\n" }}'
"{%- else %}"
"{%- if messages[0]['role'] == 'system' %}"
"{{- '<|im_start|>system\\n' + messages[0]['content'] + '<|im_end|>\\n' }}"
"{%- else %}"
"{{- '<|im_start|>system\\nYou are a helpful assistant.<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- for message in messages %}"
'{%- if (message.role == "user") or (message.role == "system" and not loop.first) or (message.role == "assistant" and not message.tool_calls) %}'
'{%- if message.role == "assistant" %}'
"{{- '<|im_start|>' + message.role + '\\n' }}"
"{% generation %}"
"{{ message.content + '<|im_end|>' + '\\n' }}"
"{% endgeneration %}"
"{%- else %}"
"{{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}"
"{%- endif %}"
'{%- elif message.role == "assistant" %}'
"{{- '<|im_start|>' + message.role }}"
"{%- if message.content %}"
"{% generation %}"
"{{- '\\n' + message.content }}"
"{% endgeneration %}"
"{%- endif %}"
"{%- for tool_call in message.tool_calls %}"
"{%- if tool_call.function is defined %}"
"{%- set tool_call = tool_call.function %}"
"{%- endif %}"
"{% generation %}"
'{{- \'\\n<tool_call>\\n{"name": "\' }}'
"{{- tool_call.name }}"
'{{- \'", "arguments": \' }}'
"{{- tool_call.arguments | tojson }}"
"{{- '}\\n</tool_call>' }}"
"{% endgeneration %}"
"{%- endfor %}"
"{% generation %}"
"{{- '<|im_end|>\\n' }}"
"{% endgeneration %}"
'{%- elif message.role == "tool" %}'
'{%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %}'
"{{- '<|im_start|>user' }}"
"{%- endif %}"
"{{- '\\n<tool_response>\\n' }}"
"{{- message.content }}"
"{{- '\\n</tool_response>' }}"
'{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}'
"{{- '<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- endfor %}"
"{%- if add_generation_prompt %}"
"{{- '<|im_start|>assistant\\n' }}"
"{%- endif %}"
)
[docs]
QWEN2_5_MATH_TEMPLATE = (
"{%- if tools %}"
"{{- '<|im_start|>system\\n' }}"
"{%- if messages[0]['role'] == 'system' %}"
"{{- messages[0]['content'] }}"
"{%- else %}"
"{{- 'Please reason step by step, and put your final answer within \\\\boxed{}.' }}"
"{%- endif %}"
'{{- "\\n\\n# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within <tools></tools> XML tags:\\n<tools>" }}'
"{%- for tool in tools %}"
'{{- "\\n" }}'
"{{- tool | tojson }}"
"{%- endfor %}"
'{{- "\\n</tools>\\n\\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\\n<tool_call>\\n{\\"name\\": <function-name>, \\"arguments\\": <args-json-object>}\\n</tool_call><|im_end|>\\n" }}'
"{%- else %}"
"{%- if messages[0]['role'] == 'system' %}"
"{{- '<|im_start|>system\\n' + messages[0]['content'] + '<|im_end|>\\n' }}"
"{%- else %}"
"{{- '<|im_start|>system\\nPlease reason step by step, and put your final answer within \\\\boxed{}.<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- for message in messages %}"
'{%- if (message.role == "user") or (message.role == "system" and not loop.first) or (message.role == "assistant" and not message.tool_calls) %}'
'{%- if message.role == "assistant" %}'
"{{- '<|im_start|>' + message.role + '\\n' }}"
"{% generation %}"
"{{ message.content + '<|im_end|>' + '\\n' }}"
"{% endgeneration %}"
"{%- else %}"
"{{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}"
"{%- endif %}"
'{%- elif message.role == "assistant" %}'
"{{- '<|im_start|>' + message.role }}"
"{%- if message.content %}"
"{% generation %}"
"{{- '\\n' + message.content }}"
"{% endgeneration %}"
"{%- endif %}"
"{%- for tool_call in message.tool_calls %}"
"{%- if tool_call.function is defined %}"
"{%- set tool_call = tool_call.function %}"
"{%- endif %}"
"{% generation %}"
'{{- \'\\n<tool_call>\\n{"name": "\' }}'
"{{- tool_call.name }}"
'{{- \'", "arguments": \' }}'
"{{- tool_call.arguments | tojson }}"
"{{- '}\\n</tool_call>' }}"
"{% endgeneration %}"
"{%- endfor %}"
"{% generation %}"
"{{- '<|im_end|>\\n' }}"
"{% endgeneration %}"
'{%- elif message.role == "tool" %}'
'{%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %}'
"{{- '<|im_start|>user' }}"
"{%- endif %}"
"{{- '\\n<tool_response>\\n' }}"
"{{- message.content }}"
"{{- '\\n</tool_response>' }}"
'{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}'
"{{- '<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- endfor %}"
"{%- if add_generation_prompt %}"
"{{- '<|im_start|>assistant\\n' }}"
"{%- endif %}"
)
[docs]
QWEN_QWQ_TEMPLATE = (
"{%- if tools %}"
"{{- '<|im_start|>system\\n' }}"
"{%- if messages[0]['role'] == 'system' %}"
"{{- messages[0]['content'] }}"
"{%- else %}"
"{{- 'You are a helpful and harmless assistant. You are Qwen developed by Alibaba. You should think step-by-step.' }}"
"{%- endif %}"
'{{- "\\n\\n# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within <tools></tools> XML tags:\\n<tools>" }}'
"{%- for tool in tools %}"
'{{- "\\n" }}'
"{{- tool | tojson }}"
"{%- endfor %}"
'{{- "\\n</tools>\\n\\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\\n<tool_call>\\n{\\"name\\": <function-name>, \\"arguments\\": <args-json-object>}\\n</tool_call><|im_end|>\\n" }}'
"{%- else %}"
"{%- if messages[0]['role'] == 'system' %}"
"{{- '<|im_start|>system\\n' + messages[0]['content'] + '<|im_end|>\\n' }}"
"{%- else %}"
"{{- '<|im_start|>system\\nYou are a helpful and harmless assistant. You are Qwen developed by Alibaba. You should think step-by-step.<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- for message in messages %}"
'{%- if (message.role == "user") or (message.role == "system" and not loop.first) or (message.role == "assistant" and not message.tool_calls) %}'
'{%- if message.role == "assistant" %}'
"{{- '<|im_start|>' + message.role + '\\n' }}"
"{% generation %}"
"{{ message.content + '<|im_end|>' + '\\n' }}"
"{% endgeneration %}"
"{%- else %}"
"{{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}"
"{%- endif %}"
'{%- elif message.role == "assistant" %}'
"{{- '<|im_start|>' + message.role }}"
"{%- if message.content %}"
"{% generation %}"
"{{- '\\n' + message.content }}"
"{% endgeneration %}"
"{%- endif %}"
"{%- for tool_call in message.tool_calls %}"
"{%- if tool_call.function is defined %}"
"{%- set tool_call = tool_call.function %}"
"{%- endif %}"
"{% generation %}"
'{{- \'\\n<tool_call>\\n{"name": "\' }}'
"{{- tool_call.name }}"
'{{- \'", "arguments": \' }}'
"{{- tool_call.arguments | tojson }}"
"{{- '}\\n</tool_call>' }}"
"{% endgeneration %}"
"{%- endfor %}"
"{% generation %}"
"{{- '<|im_end|>\\n' }}"
"{% endgeneration %}"
'{%- elif message.role == "tool" %}'
'{%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %}'
"{{- '<|im_start|>user' }}"
"{%- endif %}"
"{{- '\\n<tool_response>\\n' }}"
"{{- message.content }}"
"{{- '\\n</tool_response>' }}"
'{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}'
"{{- '<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- endfor %}"
"{%- if add_generation_prompt %}"
"{{- '<|im_start|>assistant\\n' }}"
"{%- endif %}"
)
[docs]
QWEN3_TEMPLATE = (
"{%- if tools %}"
"{{- '<|im_start|>system\\n' }}"
"{%- if messages[0].role == 'system' %}"
"{{- messages[0].content + '\\n\\n' }}"
"{%- endif %}"
'{{- "# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within <tools></tools> XML tags:\\n<tools>" }}'
"{%- for tool in tools %}"
'{{- "\\n" }}'
"{{- tool | tojson }}"
"{%- endfor %}"
'{{- "\\n</tools>\\n\\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\\n<tool_call>\\n{\\"name\\": <function-name>, \\"arguments\\": <args-json-object>}\\n</tool_call><|im_end|>\\n" }}'
"{%- else %}"
"{%- if messages[0].role == 'system' %}"
"{{- '<|im_start|>system\\n' + messages[0].content + '<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}"
"{%- for message in messages[::-1] %}"
"{%- set index = (messages|length - 1) - loop.index0 %}"
"{%- if ns.multi_step_tool and message.role == \"user\" and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %}"
"{%- set ns.multi_step_tool = false %}"
"{%- set ns.last_query_index = index %}"
"{%- endif %}"
"{%- endfor %}"
"{%- for message in messages %}"
'{%- if (message.role == "user") or (message.role == "system" and not loop.first) %}'
"{{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}"
'{%- elif message.role == "assistant" %}'
"{% generation %}"
"{%- set content = message.content %}"
"{%- set reasoning_content = '' %}"
"{%- if message.reasoning_content is defined and message.reasoning_content is not none %}"
"{%- set reasoning_content = message.reasoning_content %}"
"{%- else %}"
"{%- if '</think>' in message.content %}"
"{%- set content = message.content.split('</think>')[-1].lstrip('\\n') %}"
"{%- set reasoning_content = message.content.split('</think>')[0].rstrip('\\n').split('<think>')[-1].lstrip('\\n') %}"
"{%- endif %}"
"{%- endif %}"
"{%- if loop.index0 > ns.last_query_index %}"
"{%- if loop.last or (not loop.last and reasoning_content) %}"
"{{- '<|im_start|>' + message.role + '\\n<think>\\n' + reasoning_content.strip('\\n') + '\\n</think>\\n\\n' + content.lstrip('\\n') }}"
"{%- else %}"
"{{- '<|im_start|>' + message.role + '\\n' + content }}"
"{%- endif %}"
"{%- else %}"
"{{- '<|im_start|>' + message.role + '\\n' + content }}"
"{%- endif %}"
"{%- if message.tool_calls %}"
"{%- for tool_call in message.tool_calls %}"
"{%- if (loop.first and content) or (not loop.first) %}"
"{{- '\\n' }}"
"{%- endif %}"
"{%- if tool_call.function %}"
"{%- set tool_call = tool_call.function %}"
"{%- endif %}"
'{{- \'<tool_call>\\n{"name": "\' }}'
"{{- tool_call.name }}"
'{{- \'", "arguments": \' }}'
"{%- if tool_call.arguments is string %}"
"{{- tool_call.arguments }}"
"{%- else %}"
"{{- tool_call.arguments | tojson }}"
"{%- endif %}"
"{{- '}\\n</tool_call>' }}"
"{%- endfor %}"
"{%- endif %}"
"{{- '<|im_end|>\\n' }}"
"{% endgeneration %}"
'{%- elif message.role == "tool" %}'
'{%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}'
"{{- '<|im_start|>user' }}"
"{%- endif %}"
"{{- '\\n<tool_response>\\n' }}"
"{{- message.content }}"
"{{- '\\n</tool_response>' }}"
'{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}'
"{{- '<|im_end|>\\n' }}"
"{%- endif %}"
"{%- endif %}"
"{%- endfor %}"
"{%- if add_generation_prompt %}"
"{{- '<|im_start|>assistant\\n' }}"
"{%- if enable_thinking is defined and enable_thinking is false %}"
"{{- '<think>\\n\\n</think>\\n\\n' }}"
"{%- endif %}"
"{%- endif %}"
)