Skip to content

Commit b03b1b9

Browse files
authored
Support LongCat-Flash-Chat tool call (#24083)
Signed-off-by: 许文卿 <xwq391974@alibaba-inc.com>
1 parent dfb9af2 commit b03b1b9

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

docs/features/tool_calling.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,15 @@ Flags:
310310
* For non-reasoning: `--tool-call-parser hunyuan_a13b`
311311
* For reasoning: `--tool-call-parser hunyuan_a13b --reasoning-parser hunyuan_a13b --enable_reasoning`
312312

313+
### LongCat-Flash-Chat Models (`longcat`)
314+
315+
Supported models:
316+
317+
* `meituan-longcat/LongCat-Flash-Chat`
318+
* `meituan-longcat/LongCat-Flash-Chat-FP8`
319+
320+
Flags: `--tool-call-parser longcat`
321+
313322
### GLM-4.5 Models (`glm45`)
314323

315324
Supported models:

vllm/entrypoints/openai/tool_parsers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from .kimi_k2_tool_parser import KimiK2ToolParser
1515
from .llama4_pythonic_tool_parser import Llama4PythonicToolParser
1616
from .llama_tool_parser import Llama3JsonToolParser
17+
from .longcat_tool_parser import LongcatFlashToolParser
1718
from .minimax_tool_parser import MinimaxToolParser
1819
from .mistral_tool_parser import MistralToolParser
1920
from .openai_tool_parser import OpenAIToolParser
@@ -36,6 +37,7 @@
3637
"Llama3JsonToolParser",
3738
"JambaToolParser",
3839
"Llama4PythonicToolParser",
40+
"LongcatFlashToolParser",
3941
"PythonicToolParser",
4042
"Phi4MiniJsonToolParser",
4143
"DeepSeekV3ToolParser",
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3+
4+
import regex as re
5+
6+
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
7+
ToolParserManager)
8+
from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import (
9+
Hermes2ProToolParser)
10+
from vllm.transformers_utils.tokenizer import AnyTokenizer
11+
12+
13+
@ToolParserManager.register_module("longcat")
14+
class LongcatFlashToolParser(Hermes2ProToolParser):
15+
16+
def __init__(self, tokenizer: AnyTokenizer):
17+
super().__init__(tokenizer)
18+
19+
self.tool_call_start_token: str = "<longcat_tool_call>"
20+
self.tool_call_end_token: str = "</longcat_tool_call>"
21+
22+
self.tool_call_regex = re.compile(
23+
r"<longcat_tool_call>(.*?)</longcat_tool_call>|<longcat_tool_call>(.*)",
24+
re.DOTALL)
25+
26+
self.tool_call_start_token_ids = self.model_tokenizer.encode(
27+
self.tool_call_start_token, add_special_tokens=False)
28+
self.tool_call_end_token_ids = self.model_tokenizer.encode(
29+
self.tool_call_end_token, add_special_tokens=False)
30+
31+
self.tool_call_start_token_array = [
32+
self.model_tokenizer.decode([token_id])
33+
for token_id in self.tool_call_start_token_ids
34+
]
35+
36+
self.tool_call_end_token_array = [
37+
self.model_tokenizer.decode([token_id])
38+
for token_id in self.tool_call_end_token_ids
39+
]

0 commit comments

Comments
 (0)