diff --git a/examples/chat_template/tool_chat_template_deepseekv3.jinja b/examples/chat_template/tool_chat_template_deepseekv3.jinja index dde922d30..526368b0c 100644 --- a/examples/chat_template/tool_chat_template_deepseekv3.jinja +++ b/examples/chat_template/tool_chat_template_deepseekv3.jinja @@ -12,7 +12,7 @@ {% set ns.system_prompt = ns.system_prompt + '\n\n' + message['content'] %} {%- endif %} {%- endif %} -{%- endfor %} +{%- endfor -%} {# --- Append tool descriptions if tools are defined --- #} {% if tools is defined and tools is not none %} @@ -23,13 +23,13 @@ 'Make sure the JSON is valid.' '## Tools\n\n### Function\n\nYou have the following functions available:\n\n') %} {% for tool in tools %} - {% set tool_ns.text = tool_ns.text + '- `' + tool['name'] + '`:\n```json\n' + (tool | tojson) + '\n```\n' %} + {% set tool_ns.text = tool_ns.text + '\n```json\n' + (tool | tojson) + '\n```\n' %} {% endfor %} {% set ns.system_prompt = ns.system_prompt + '\n\n' + tool_ns.text %} {% endif %} -{{ bos_token }} -{{ ns.system_prompt }} +{{- bos_token }} +{{- ns.system_prompt }} {%- for message in messages %} {%- if message['role'] == 'user' %} @@ -41,7 +41,7 @@ {%- if message['role'] == 'assistant' and message['tool_calls'] is defined and message['tool_calls'] is not none %} {%- set ns.is_last_user = false -%} {%- if ns.is_tool %} - {{'<|tool▁outputs▁end|>'}} + {{- '<|tool▁outputs▁end|>'}} {%- endif %} {%- set ns.is_first = false %} {%- set ns.is_tool = false -%} @@ -49,43 +49,43 @@ {%- for tool in message['tool_calls'] %} {%- if not ns.is_first %} {%- if message['content'] is none %} - {{'<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}} + {{- '<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments']|tojson + '\n' + '```' + '<|tool▁call▁end|>'}} {%- else %} - {{message['content'] + '<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}} + {{- message['content'] + '<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments']|tojson + '\n' + '```' + '<|tool▁call▁end|>'}} {%- endif %} {%- set ns.is_first = true -%} {%- else %} - {{'\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}} + {{- '\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}} {%- endif %} {%- endfor %} - {{'<|tool▁calls▁end|><|end▁of▁sentence|>'}} + {{- '<|tool▁calls▁end|><|end▁of▁sentence|>'}} {%- endif %} {%- if message['role'] == 'assistant' and (message['tool_calls'] is not defined or message['tool_calls'] is none)%} {%- set ns.is_last_user = false -%} {%- if ns.is_tool %} - {{'<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}} + {{- '<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}} {%- set ns.is_tool = false -%} {%- else %} {% set content = message['content'] %} - {{content + '<|end▁of▁sentence|>'}} + {{- content + '<|end▁of▁sentence|>'}} {%- endif %} {%- endif %} {%- if message['role'] == 'tool' %} {%- set ns.is_last_user = false -%} {%- set ns.is_tool = true -%} {%- if ns.is_output_first %} - {{ 'Use the results below to formulate an answer to the user question unless additional information is needed.' }} - {{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}} + {{- 'Use the results below to formulate an answer to the user question unless additional information is needed.' }} + {{- '<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}} {%- set ns.is_output_first = false %} {%- else %} - {{'\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}} + {{- '\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}} {%- endif %} {%- endif %} {%- endfor -%} {% if ns.is_tool %} - {{"<|tool▁outputs▁end|>"}} + {{- '<|tool▁outputs▁end|>'}} {% endif %} {% if add_generation_prompt and not ns.is_last_user and not ns.is_tool %} - {{'<|Assistant|>'}} + {{- '<|Assistant|>'}} {% endif %} diff --git a/python/sglang/srt/function_call/deepseekv3_detector.py b/python/sglang/srt/function_call/deepseekv3_detector.py index afd0e3012..33c4dfc44 100644 --- a/python/sglang/srt/function_call/deepseekv3_detector.py +++ b/python/sglang/srt/function_call/deepseekv3_detector.py @@ -215,6 +215,6 @@ class DeepSeekV3Detector(BaseFormatDetector): sequence_start_token=self.bot_token, sequence_end_token=self.eot_token, tool_call_separator="", - call_rule_fmt='"<|tool▁call▁begin|>function<|tool▁sep|>{name}\\n```json\\n" {arguments_rule} "\\n```<|tool▁call▁end|>"', + call_rule_fmt='"<|tool▁call▁begin|>function<|tool▁sep|>{name}\\n```json\\n"{arguments_rule}"\\n```<|tool▁call▁end|>"', function_format="json", )