From ec1cd90ac90faecb54f144f7234b9b2608ef9a1a Mon Sep 17 00:00:00 2001 From: Antoine Roux Date: Sun, 12 Oct 2025 14:34:58 +0200 Subject: [PATCH] Fix the GPT function calling regex to allow dash in the name (#10577) --- python/sglang/srt/function_call/gpt_oss_detector.py | 2 +- sgl-router/src/tool_parser/parsers/gpt_oss_parser.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/sglang/srt/function_call/gpt_oss_detector.py b/python/sglang/srt/function_call/gpt_oss_detector.py index c02e71efc..71b2ce3c2 100644 --- a/python/sglang/srt/function_call/gpt_oss_detector.py +++ b/python/sglang/srt/function_call/gpt_oss_detector.py @@ -31,7 +31,7 @@ class GptOssDetector(BaseFormatDetector): # Pattern to extract function name and JSON from tool_call event content self.tool_extract_pattern = re.compile( - r"to=([a-zA-Z_][a-zA-Z0-9_.]*)\s*<\|constrain\|>json<\|message\|>(.*?)(?:<\|call\|>|$)", + r"to=([a-zA-Z_][a-zA-Z0-9_.-]*)\s*<\|constrain\|>json<\|message\|>(.*?)(?:<\|call\|>|$)", re.DOTALL, ) diff --git a/sgl-router/src/tool_parser/parsers/gpt_oss_parser.rs b/sgl-router/src/tool_parser/parsers/gpt_oss_parser.rs index 6aacdb6f4..0dd58cf87 100644 --- a/sgl-router/src/tool_parser/parsers/gpt_oss_parser.rs +++ b/sgl-router/src/tool_parser/parsers/gpt_oss_parser.rs @@ -40,12 +40,12 @@ impl GptOssParser { pub fn new() -> Self { // Pattern for complete function calls with to= parameter // Handles optional <|start|>assistant prefix and whitespace after function name - let function_call_pattern = r"(?s)(?:<\|start\|>assistant)?<\|channel\|>commentary to=([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)*)\s*<\|constrain\|>json<\|message\|>(.*?)<\|call\|>(?:commentary)?"; + let function_call_pattern = r"(?s)(?:<\|start\|>assistant)?<\|channel\|>commentary to=([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_-]*)*)\s*<\|constrain\|>json<\|message\|>(.*?)<\|call\|>(?:commentary)?"; let function_call_extractor = Regex::new(function_call_pattern).expect("Valid regex pattern"); // Pattern for streaming function calls (incomplete) - let streaming_pattern = r"(?s)(?:<\|start\|>assistant)?<\|channel\|>commentary to=([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)*)\s*<\|constrain\|>json<\|message\|>(.*)"; + let streaming_pattern = r"(?s)(?:<\|start\|>assistant)?<\|channel\|>commentary to=([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_-]*)*)\s*<\|constrain\|>json<\|message\|>(.*)"; let streaming_extractor = Regex::new(streaming_pattern).expect("Valid regex pattern"); Self {