Prhub

#7154 [BugFix]fix extract_tool_calls

PaddlePaddle/FastDeploy · 作者 luukunn · 合并时间 2026-04-02 21:18

分析状态 已生成
文件变更 2提交数 3 · 评论 10
代码增减 +28 / -26
bugfix APIServer test

执行摘要

修复 ErnieX1 工具调用解析器在无标记时错误返回 tools_called=True 的语义 bug。

修复工具调用解析器在无标记场景下的返回语义错误。review 中指出原逻辑在 model_output 不含 标签时,正则匹配返回空列表,但错误地设置 tools_called=True,导致上层处理异常。

该 PR 值得快速浏览以理解工具解析器的错误处理逻辑,但变更直白,无需深入剖析。关注点在于前置检查的设计和测试更新的一致性。

讨论亮点

review 中 Copilot 指出原逻辑无条件返回 tools_called=True 的问题,作者通过添加前置检查解决;Copilot 建议更新测试注释,作者采纳并修复;Copilot 建议补充标记存在但无 JSON 场景的测试,作者拒绝增加;Copilot 建议改进异常日志以附带详细信息,作者暂不修复。讨论焦点在于最小化修复与覆盖范围之间的权衡。

实现拆解

关键改动在两个文件:1) fastdeploy/entrypoints/openai/tool_parsers/ernie_x1_tool_parser.py 的 extract_tool_calls 方法新增 if self.tool_call_start_token not in model_output: 分支,直接返回 ExtractedToolCallInformation(tools_called=False, tool_calls=[], content=model_output);否则继续原有 JSON 解析流程。2) tests/entrypoints/openai/tool_parsers/test_ernie_x1_tool_parser.py 更新 test_extract_tool_calls_no_match 测试,断言从 tools_called=True 改为 tools_called=False 并校验 content 透传。

文件 模块 状态 重要度
fastdeploy/entrypoints/openai/tool_parsers/ernie_x1_tool_parser.py OpenAI Entrypoints modified 5.0
tests/entrypoints/openai/tool_parsers/test_ernie_x1_tool_parser.py Testing modified 3.0

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

关键符号

extract_tool_calls

评论区精华

原逻辑无条件返回 tools_called=True 的问题 正确性

Copilot 指出原逻辑在 model_output 不含 <tool_call> 标签时仍返回 tools_called=True,语义错误;作者通过添加前置检查解决

结论:已通过新增前置检查分支修复 · 已解决

测试注释更新 documentation

Copilot 建议更新测试注释以匹配断言,避免误导;作者已修复

结论:注释已更新 · 已解决

补充无效 JSON 场景测试 测试

Copilot 建议补充标记存在但无 JSON 的测试,作者拒绝增加,保持现有覆盖

结论:未采纳,测试覆盖不完整 · unresolved

异常日志改进 other

Copilot 建议在异常日志中附带详细信息,作者暂不修复

结论:未采纳,日志信息仍不详细 · unresolved

风险与影响

主要风险是未处理标记存在但 JSON 无效的边缘情况(如 ),可能导致 tools_called 标志仍为 True,逻辑不完整。此外,异常日志未记录详细信息,可能增加线上排查难度。变更局限于特定解析器,回归风险低。

影响范围仅限于使用 ErnieX1 工具解析器的 OpenAI 入口请求,修复后工具调用检测更准确,避免上层错误处理。对系统整体影响小,但提升了相关功能的正确性,单元测试同步更新确保验证。

边缘情况未覆盖 异常日志不详细

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

  • 一句话:修复 ErnieX1 工具调用解析器在无标记时错误返回 tools_called=True 的语义 bug。
  • 推荐动作:该 PR 值得快速浏览以理解工具解析器的错误处理逻辑,但变更直白,无需深入剖析。关注点在于前置检查的设计和测试更新的一致性。

功能与动机

修复工具调用解析器在无标记场景下的返回语义错误。review 中指出原逻辑在 model_output 不含 标签时,正则匹配返回空列表,但错误地设置 tools_called=True,导致上层处理异常。

实现拆解

关键改动在两个文件:1) fastdeploy/entrypoints/openai/tool_parsers/ernie_x1_tool_parser.py 的 extract_tool_calls 方法新增 if self.tool_call_start_token not in model_output: 分支,直接返回 ExtractedToolCallInformation(tools_called=False, tool_calls=[], content=model_output);否则继续原有 JSON 解析流程。2) tests/entrypoints/openai/tool_parsers/test_ernie_x1_tool_parser.py 更新 test_extract_tool_calls_no_match 测试,断言从 tools_called=True 改为 tools_called=False 并校验 content 透传。

关键文件:

  • fastdeploy/entrypoints/openai/tool_parsers/ernie_x1_tool_parser.py(模块 OpenAI Entrypoints): 核心修复文件,修改了 extract_tool_calls 方法以添加前置检查,修正语义错误
  • tests/entrypoints/openai/tool_parsers/test_ernie_x1_tool_parser.py(模块 Testing): 更新了单元测试以验证修复后的行为,确保测试覆盖

关键符号:extract_tool_calls

评论区精华

review 中 Copilot 指出原逻辑无条件返回 tools_called=True 的问题,作者通过添加前置检查解决;Copilot 建议更新测试注释,作者采纳并修复;Copilot 建议补充标记存在但无 JSON 场景的测试,作者拒绝增加;Copilot 建议改进异常日志以附带详细信息,作者暂不修复。讨论焦点在于最小化修复与覆盖范围之间的权衡。

  • 原逻辑无条件返回 tools_called=True 的问题 (correctness): 已通过新增前置检查分支修复
  • 测试注释更新 (documentation): 注释已更新
  • 补充无效 JSON 场景测试 (testing): 未采纳,测试覆盖不完整
  • 异常日志改进 (other): 未采纳,日志信息仍不详细

风险与影响

  • 风险:主要风险是未处理标记存在但 JSON 无效的边缘情况(如 ),可能导致 tools_called 标志仍为 True,逻辑不完整。此外,异常日志未记录详细信息,可能增加线上排查难度。变更局限于特定解析器,回归风险低。
  • 影响:影响范围仅限于使用 ErnieX1 工具解析器的 OpenAI 入口请求,修复后工具调用检测更准确,避免上层错误处理。对系统整体影响小,但提升了相关功能的正确性,单元测试同步更新确保验证。
  • 风险标记:边缘情况未覆盖, 异常日志不详细

关联脉络

  • PR #7079 [Optimization]Fix tool parser: 同样涉及工具解析器的 bug 修复,可能存在功能关联,同属 OpenAI 入口模块

参与讨论