Prhub

#46382 [Bugfix] fix: stream Mimimax m2 tool call string arguments

原始 PR 作者 chaunceyjiang 合并时间 2026-06-25 11:12 文件变更 1 提交数 4 评论 3 代码增减 +33 / -2

执行摘要

修复 MiniMax M2 流式工具调用参数解析

跟进 PR #46351 的修复,解决 MiniMax M2 模型流式输出工具调用时字符串参数无法正确解析的问题。核心问题是当参数值在流式过程中被截断时,原有的正则表达式要求找到闭合的 才匹配,导致不完整的参数被忽略。

建议合并。该 PR 修复了明确的 bug,实现遵循了已有的 Qwen 3 模式,且经过手动验证。建议后续增加对应的单元测试以避免回归。

讨论亮点

审核人 bbrowning 确认该修复与 Qwen 3 增量流式字符串参数的修改模式一致,并附带一个验证脚本证明了 before/after 的行为变化(在 PR 评论中显示流式增量从 7 个 delta 变为预期行为)。

实现拆解

  1. 新增正则表达式:在 vllm/parser/minimax_m2.py 中添加 _PARTIAL_PARAM_RE,该表达式匹配未闭合的 <parameter name="...">... 模式,用于捕获流式传输中末尾的不完整参数。
  2. 修改已有正则表达式:将 _PARAM_RE 的末尾从强制闭合的 </parameter> 改为可选闭合或匹配下一个 <parameter 开头,以便在流式场景中能提前结束一个参数并开始下一个。
  3. 扩展参数转换函数:在 _minimax_m2_arg_converter 中,当 partial=True 时,先用 _PARAM_RE 提取完整参数,然后用 _PARTIAL_PARAM_RE 从剩余文本中提取不完整的末尾参数。
  4. 注册解析引擎终端:在 minimax_m2_config() 中增加 'PARAM_START': PARAM_START'PARAM_END': PARAM_END 终端,并添加从 TOOL_ARGS 状态到 TOOL_ARGS 状态的 PARAM_STARTPARAM_END 转换,触发 ARG_VALUE_CHUNK 事件,使流式参数能够增量输出。
文件 模块 状态 重要度
vllm/parser/minimax_m2.py 解析器 modified 7.28

关键符号

_minimax_m2_arg_converter minimax_m2_config

关键源码片段

vllm/parser/minimax_m2.py core-logic

唯一变更文件,包含所有核心逻辑修改:新增正则、修改转换函数、更新解析引擎配置。

# vllm/parser/minimax_m2.py - 流式工具调用参数修复# 新增正则:匹配未闭合的 <parameter> 标签,用于流式部分解析
_PARTIAL_PARAM_RE = re.compile(
    r"<\s*parameter\s+name\s*=\s*"
    r"(?:\"(?P<dq_name>[^\"]*)\"|'(?P<sq_name>[^']*)'|(?P<bare_name>[^>\s]+))"
    r"\s*>"
    r"(?P<value>.*)$", # 匹配到行尾,无需闭合标签
    re.DOTALL,
)
​
​
def _minimax_m2_arg_converter(raw_args: str, partial: bool) -> str:
    """将原始参数 XML 转换为 JSON。partial=True 时额外处理末尾不完整参数"""
    params: dict[str, object] = {}
​
    # 先用 _PARAM_RE 提取完整的参数(现已支持未闭合或下一个参数开头作为结束)
    for match in _PARAM_RE.finditer(raw_args):
        name = (
            match.group("dq_name")
            or match.group("sq_name")
            or match.group("bare_name")
            or ""
        ).strip()
        if not name:
            continue
        params[name] = match.group("value").strip()
​
    if partial:
        # 用 _PARTIAL_PARAM_RE 尝试匹配剩余文本中的不完整参数
        remaining = _PARAM_RE.sub("", raw_args)
        match = _PARTIAL_PARAM_RE.search(remaining)
        if match:
            name = (
                match.group("dq_name")
                or match.group("sq_name")
                or match.group("bare_name")
                or ""
            ).strip()
            if name:
                params[name] = match.group("value").strip()
​
    return json.dumps(params, ensure_ascii=False)# 在解析引擎配置中注册 <parameter name= 和 </parameter> 作为终端,以触发增量事件
# 添加转换:TOOL_ARGS -> PARAM_START -> ARG_VALUE_CHUNK
# 添加转换:TOOL_ARGS -> PARAM_END -> ARG_VALUE_CHUNK

评论区精华

流式参数解析行为验证 正确性

bbrowning 在评论中提供了手动验证结果,显示 before/after 的差异:修复前流式增量产生 7 个 delta(FAIL),修复后符合预期(PASS)。

结论:变更验证通过,行为正确。 · 已解决

风险与影响

风险较低。变更仅影响 MiniMax M2 模型的解析器,且逻辑清晰,已有审核验证。但缺少单元测试覆盖新增加的正则表达式和 partial 分支,回归风险主要通过手动验证控制。

影响范围仅限于使用 MiniMax M2 模型并启用工具调用(tool calling)的用户,特别是流式输出场景。修复后,流式工具调用参数将能正确递增输出,提升用户体验。对非流式场景无影响。

缺少测试覆盖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论