Prhub

#37958 [Bugfix] Fix IndexError when accessing prev_tool_call_arr in OpenAIToolParser

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

执行摘要

修复 OpenAI 工具调用流式响应中访问 prev_tool_call_arr 时的索引错误,避免崩溃。

PR body 引用 Issue #37937 和 #36849 以修复 IndexError。Issue 评论中 sfeng33 指出错误发生在流式路径(serving.py:1133),而 extract_tool_calls() 从未被调用,作者随后在流式路径中添加了处理(如 issue 评论中作者回应“I’ve added handling for the stream as well”)。

建议工程师精读此 PR 以理解流式处理中工具调用的状态管理逻辑,关注 auto_tool_called 变量的引入和条件检查的调整,这有助于避免类似索引错误;同时注意 review 中提到的死代码问题,可作为代码优化参考。

讨论亮点

review 中,gemini-code-assist[bot] 指出 openai_tool_parser.py 中的修改可能是死代码,因为 prev_tool_call_arr 主要在流式路径使用,作者未移除该代码。在 issue 评论中,sfeng33 提醒 bug 位于流式路径,作者确认并添加处理。最终,审核者如 yanghui1-arch 和 DarkLight1337 批准了 PR,讨论聚焦于正确性和代码清理。

实现拆解

主要改动在 vllm/entrypoints/openai/chat_completion/serving.py 的 chat_completion_stream_generator 函数中:引入 auto_tools_called 变量检查 tool_parser.prev_tool_call_arr 是否非空,并调整条件逻辑为 'if should_check and tool_parser and auto_tools_called',避免在数组为空时访问。此外,review 评论显示 vllm/tool_parsers/openai_tool_parser.py 的 extract_tool_calls 方法中添加了填充 prev_tool_call_arr 的代码,但这可能仅用于非流式路径,且 review 中指出为死代码。

文件 模块 状态 重要度
vllm/entrypoints/openai/chat_completion/serving.py frontend/chat_completion modified 6.0
vllm/tool_parsers/openai_tool_parser.py tool_parsers modified 3.0

关键符号

chat_completion_stream_generator extract_tool_calls

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

评论区精华

死代码问题 正确性

gemini-code-assist[bot] 指出 openai_tool_parser.py 中的代码可能未使用,因为 prev_tool_call_arr 主要用于流式路径,而非非流式路径。

结论:作者未移除该代码,审核者批准,可能被视为无害或后续优化。 · 已解决

bug 定位与修复 正确性

sfeng33 在 issue 评论中指出错误发生在流式路径(serving.py:1133),而 extract_tool_calls() 从未被调用,作者随后确认并添加流式路径处理。

结论:作者完善了修复,确保流式和非流式路径都得到处理。 · 已解决

风险与影响

风险较低,但需注意:条件逻辑变更(serving.py 中从 'if should_check and tool_parser' 改为 'if should_check and tool_parser and auto_tools_called')可能引入边界情况错误,例如在工具调用为空时跳过检查是否正确;openai_tool_parser.py 中的死代码可能增加代码复杂度和维护负担,但无直接功能影响;未新增测试覆盖,可能遗漏回归测试。

直接影响使用 OpenAI 工具调用的流式响应用户,修复了潜在的崩溃问题,提升前端聊天完成功能的稳定性。对非流式路径无影响,影响范围局限于 vllm/entrypoints/openai/chat_completion 模块。

条件逻辑变更 潜在死代码

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论