Prhub

#38189 [Tool Parser][2/3] Use self.tools instead of request.tools in tool parsers

原始 PR 作者 sfeng33 合并时间 2026-03-31 13:41 文件变更 16 提交数 1 评论 13 代码增减 +113 / -105

执行摘要

重构工具解析器,将工具依赖从 request.tools 移至 self.tools,统一工具管理逻辑。

根据 PR body 描述,目的是“迁移工具解析器以从 self.tools(在构造时设置)读取工具,而不是在调用时从 request.tools 读取”,这是工具解析器清理系列的第二部分,跟随 #38029,旨在提升代码清晰度和可维护性。

建议技术管理者和工程师精读此 PR,重点关注基类过滤逻辑的设计决策和跨解析器的一致性变更,以了解工具解析器重构的模式和潜在风险点。

讨论亮点

review 中核心讨论点包括:

  • 工具类型过滤问题:gemini-code-assist[bot] 警告 FunctionTool 可能被错误过滤,但 sfeng33 和 bbrowning 确认其为 Pydantic 模型而非 TypedDict,确保过滤逻辑正确。
  • Responses API 兼容性:chaunceyjiang 询问是否测试了 Responses API,sfeng33 回复已测试并确认 FunctionTool 是 Responses API 使用的类型。
  • 遗留代码处理:bbrowning 指出 _WrappedParser 暂时未传递工具,但认为在当前使用场景下可接受,可能在未来步骤中处理。

实现拆解

实现方案分为三个层次:

  1. 基类更新:在 vllm/tool_parsers/abstract_tool_parser.py 中,ToolParser.__init__ 方法新增过滤逻辑,仅存储 ChatCompletionToolsParam | FunctionTool 实例到 self.tools
  2. 子类适配:修改了多个工具解析器文件(如 deepseekv32_tool_parser.py、glm4_moe_tool_parser.py 等),将原本从 request.tools 获取工具的逻辑替换为 self.tools,涉及方法如 _convert_params_with_schemaextract_tool_calls 等。
  3. 测试更新:所有相关测试文件(如 test_deepseekv32_tool_parser.py)调整为在解析器构造时传递工具,并移除对 request.tools 的依赖。
文件 模块 状态 重要度
vllm/tool_parsers/abstract_tool_parser.py tool_parsers modified 9.0
vllm/tool_parsers/deepseekv32_tool_parser.py tool_parsers modified 7.0
tests/tool_parsers/test_deepseekv32_tool_parser.py tests modified 6.0

关键符号

ToolParser.__init__ _convert_params_with_schema extract_tool_calls _parse_xml_function_call

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

工具类型过滤的正确性 正确性

gemini-code-assist[bot] 警告 FunctionTool 可能被错误过滤,认为它是 TypedDict,但 sfeng33 和 bbrowning 确认为 Pydantic 模型。

结论:确认过滤逻辑正确,无需修改,因为代码库中实际传递的是 Pydantic 模型实例。 · 已解决

Responses API 兼容性 设计

chaunceyjiang 询问是否测试了 Responses API,sfeng33 回复已测试并确认 FunctionTool 是 Responses API 使用的类型。

结论:变更兼容两种 API,但 _WrappedParser 可能在未来步骤中需要调整。 · partially_resolved

风险与影响

技术风险包括:

  1. 类型过滤风险:在 abstract_tool_parser.py 中,过滤逻辑依赖于 isinstance 检查 ChatCompletionToolsParamFunctionTool,如果传入非标准类型可能导致工具被错误丢弃,但讨论已确认当前代码库中使用的是 Pydantic 模型,风险较低。
  2. API 兼容性风险:Responses API 与 Chat API 的工具类型可能不同,变更可能影响这些路径,但作者表示已测试双方。
  3. 回归风险:修改了多个解析器文件的核心逻辑,如果没有全面测试覆盖,可能引入工具调用解析错误,但 PR 更新了所有相关测试以验证新逻辑。

影响分析:

  • 对系统:简化了工具解析器的接口,减少了方法参数传递,提升了代码模块化和可维护性;影响范围集中在工具调用模块,不影响核心推理路径。
  • 对用户:无直接用户界面变更,但工具调用行为应保持相同,确保了向后兼容性。
  • 对团队:为后续工具解析器清理(如 step 3)打下基础,促进统一工具处理逻辑。
工具过滤逻辑风险 API 兼容性风险 测试覆盖不足

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论