Skip to content

Conversation

Xu-Wenqing
Copy link
Contributor

Motivation

Modifications

Accuracy Tests

Benchmarking and Profiling

Checklist

@jinmingyi1998
Copy link
Contributor

tokenizer_config.json

{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% if not thinking is defined %}{% set thinking = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, system_prompt='', is_first_sp=true, is_last_user=false, is_only_sys=false, is_prefix=false) %}{%- for message in messages %}{%- if message['role'] == 'system' %}{%- if ns.is_first_sp %}{% set ns.system_prompt = ns.system_prompt + message['content'] %}{% set ns.is_first_sp = false %}{%- else %}{% set ns.system_prompt = ns.system_prompt + '\n\n' + message['content'] %}{%- endif %}{% set ns.is_only_sys = true %}{%- endif %}{%- endfor %}{{ bos_token }}{{ ns.system_prompt }}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{%- set ns.is_first = false -%}{%- set ns.is_last_user = true -%}{{'<|User|>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and message['tool_calls'] is defined and message['tool_calls'] is not none %}{%- if ns.is_last_user or ns.is_only_sys %}{{'<|Assistant|></think>'}}{%- endif %}{%- set ns.is_last_user = false -%}{%- set ns.is_first = false %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls'] %}{%- if not ns.is_first %}{%- if message['content'] is none %}{{'<|tool▁calls▁begin|><|tool▁call▁begin|>'+ tool['function']['name'] + '<|tool▁sep|>' + tool['function']['arguments'] + '<|tool▁call▁end|>'}}{%- else %}{{message['content'] + '<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['function']['name'] + '<|tool▁sep|>' + tool['function']['arguments'] + '<|tool▁call▁end|>'}}{%- endif %}{%- set ns.is_first = true -%}{%- else %}{{'<|tool▁call▁begin|>'+ tool['function']['name'] + '<|tool▁sep|>' + tool['function']['arguments'] + '<|tool▁call▁end|>'}}{%- endif %}{%- endfor %}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- if message['role'] == 'assistant' and (message['tool_calls'] is not defined or message['tool_calls'] is none) %}{%- if ns.is_last_user %}{{'<|Assistant|>'}}{%- if message['prefix'] is defined and message['prefix'] and thinking %}{{'<think>'}}{%- else %}{{'</think>'}}{%- endif %}{%- endif %}{%- if message['prefix'] is defined and message['prefix'] %}{%- set ns.is_prefix = true -%}{%- endif %}{%- set ns.is_last_user = false -%}{%- if ns.is_tool %}{{message['content'] + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{%- set content = message['content'] -%}{%- if '</think>' in content %}{%- set content = content.split('</think>', 1)[1] -%}{%- endif %}{{content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_last_user = false -%}{%- set ns.is_tool = true -%}{{'<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- endif %}{%- if message['role'] != 'system' %}{% set ns.is_only_sys = false %}{%- endif %}{%- endfor -%}{% if add_generation_prompt and not ns.is_tool%}{% if ns.is_last_user or ns.is_only_sys or not ns.is_prefix %}{{'<|Assistant|>'}}{%- if not thinking %}{{'</think>'}}{%- else %}{{'<think>'}}{%- endif %}{% endif %}{% endif %}

@Xu-Wenqing Xu-Wenqing changed the title [WIP] Support DeepSeek-V3.2 Tool Call Support DeepSeek-V3.2 Tool Call Sep 29, 2025
@Xu-Wenqing Xu-Wenqing marked this pull request as ready for review September 29, 2025 12:17
@jinmingyi1998
Copy link
Contributor

examples/chat_template/tool_chat_template_deepseekv31.jinja works well for me

@jinmingyi1998
Copy link
Contributor

It doesn't look any different from the "v31".

It's just a minor upgrade; I think it could be merged with the v31.

@Xu-Wenqing
Copy link
Contributor Author

Xu-Wenqing commented Sep 29, 2025

It doesn't look any different from the "v31".

It's just a minor upgrade; I think it could be merged with the v31.

Both v31 template and v32 template is copied from model's default template, added tool descriptions and fixed some issues.

@Xu-Wenqing Xu-Wenqing closed this Sep 30, 2025
@Xu-Wenqing
Copy link
Contributor Author

Compared with v31, v32 only has minor change. This PR has been closed. If there are any requirements, changes can be made on v31.

@JustinTong0323
Copy link
Collaborator

I think it is good to add the updated template

@JustinTong0323 JustinTong0323 changed the title Support DeepSeek-V3.2 Tool Call Add DeepSeek-V3.2 Tool Call Template Oct 5, 2025
@JustinTong0323 JustinTong0323 merged commit 85c1f79 into sgl-project:main Oct 5, 2025
24 checks passed
0xtoward pushed a commit to 0xtoward/sglang that referenced this pull request Oct 5, 2025
PrinsYin pushed a commit to PrinsYin/sglang that referenced this pull request Oct 7, 2025
ch-tiger1 pushed a commit to ch-tiger1/sglang that referenced this pull request Oct 9, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants