Deploying Qwen 3.0 on RK3588 – Continuation

Deploying Qwen 3.0 on RK3588 - Continuation

Qwen3 is deployed on rk3588, defaulting to thinking mode, which can be switched to non-thinking mode by adding /no_think to the user input.

How to change the default mode to non-thinking on rk3588? That is, setting enable_thinking=False will also take effect on rk3588.

Let’s take a look at Qwen3‘s chat_template.Tokenizer_config.json is located in

"chat_template": "{%- if tools %}\n    {{-'<|im_start|>system\n' }}\n    {%- if messages[0].role == 'system' %}\n       {{- messages[0].content + '\n\n' }}\n    {%- endif %}\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>" }}\n    {%- for tool in tools %}\n        {{- "\n"}}\n        {{- tool | tojson }}\n    {%- endfor %}\n    {{- "\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"}}\n{%- else %}\n    {%- if messages[0].role== 'system' %}\n        {{-'<|im_start|>system\n' + messages[0].content + '<|im_end|>\n'}}\n    {%- endif %}\n{%- endif %}\n{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1)%}\n{%- for message in messages[::-1] %}\n   {%- set index = (messages|length - 1) - loop.index0 %}\n    {%- if ns.multi_step_tool and message.role== "user" and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %}\n        {%- set ns.multi_step_tool = false%}\n        {%- set ns.last_query_index = index %}\n    {%- endif %}\n{%- endfor %}\n{%- for message in messages %}\n    {%- if (message.role == "user") or (message.role == "system" and not loop.first) %}\n        {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }}\n    {%- elif message.role == "assistant" %}\n        {%- set content = message.content %}\n       {%- set reasoning_content = '' %}\n        {%- if message.reasoning_content is defined and message.reasoning_content is not none %}\n            {%- set reasoning_content = message.reasoning_content %}\n        {%- else %}\n            {%- if '</think>' in message.content %}\n                {%- set content = message.content.split('</think>')[-1].lstrip('\n') %}\n                {%- set reasoning_content = message.content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n')%}\n            {%- endif %}\n        {%- endif %}\n        {%- if loop.index0 > ns.last_query_index %}\n            {%- if loop.last or (not loop.last and reasoning_content) %}\n                {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') +'\n</think>\n\n' + content.lstrip('\n') }}\n            {%- else %}\n                {{- '<|im_start|>' + message.role + '\n' + content }}\n           {%- endif %}\n        {%- else %}\n            {{- '<|im_start|>' + message.role + '\n' + content }}\n       {%- endif %}\n        {%- if message.tool_calls %}\n            {%- for tool_call in message.tool_calls %}\n                {%- if (loop.first and content) or (not loop.first) %}\n                   {{- '\n' }}\n                {%- endif %}\n                {%- if tool_call.function %}\n                   {%- set tool_call = tool_call.function %}\n                {%- endif %}\n                {{-'<tool_call>\n{"name": "' }}\n                {{- tool_call.name }}\n                {{- '","arguments": ' }}\n               {%- if tool_call.arguments is string %}\n                    {{- tool_call.arguments}}\n                {%- else %}\n                    {{- tool_call.arguments | tojson }}\n                {%- endif %}\n                {{- '}\n</tool_call>' }}\n           {%- endfor %}\n        {%- endif %}\n        {{- '<|im_end|>\n' }}\n    {%- elif message.role == "tool"%}\n        {%- if loop.first or(messages[loop.index0 - 1].role != "tool") %}\n            {{- '<|im_start|>user'}}\n        {%- endif %}\n        {{- '\n<tool_response>\n' }}\n        {{- message.content }}\n        {{- '\n</tool_response>'}}\n        {%- if loop.last or(messages[loop.index0 + 1].role != "tool") %}\n            {{- '<|im_end|>\n' }}\n        {%- endif %}\n    {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n    {{-'<|im_start|>assistant\n' }}\n   {%- if enable_thinking is defined and enable_thinking is false %}\n        {{-'<think>\n\n</think>\n\n' }}\n    {%- endif %}\n{%- endif %}"

or print directly

from transformers import Qwen2ForCausalLM, Qwen2TokenizerFast import torch model_name_or_path = "./Qwen3-0.6B" tokenizer = Qwen2TokenizerFast.from_pretrained(model_name_or_path) print(tokenizer.get_chat_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" %}        {%- 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 }}                {{- '

Leave a Comment