diff --git a/tests/entrypoints/openai/chat_completion/test_serving_chat.py b/tests/entrypoints/openai/chat_completion/test_serving_chat.py index 9f92e1ce35..6f580a9c28 100644 --- a/tests/entrypoints/openai/chat_completion/test_serving_chat.py +++ b/tests/entrypoints/openai/chat_completion/test_serving_chat.py @@ -2239,7 +2239,13 @@ async def test_tool_choice_validation_without_parser(): @pytest.mark.asyncio -async def test_streaming_n_gt1_independent_tool_parsers(): +@pytest.mark.parametrize( + ("engine_finish_reason", "expected_finish_reason"), + [("stop", "tool_calls"), ("length", "length")], +) +async def test_streaming_n_gt1_independent_tool_parsers( + engine_finish_reason: str, expected_finish_reason: str +): """n>1 streaming must use independent parser instances and token-id histories per choice. """ @@ -2344,7 +2350,7 @@ async def test_streaming_n_gt1_independent_tool_parsers(): token_ids=[], cumulative_logprob=0.0, logprobs=None, - finish_reason="stop", + finish_reason=engine_finish_reason, ) for choice_idx in range(num_choices) ], @@ -2408,8 +2414,8 @@ async def test_streaming_n_gt1_independent_tool_parsers(): assert len(reasons) == 1, ( f"Choice {choice_idx}: expected exactly 1 finish_reason, got {reasons}" ) - assert reasons[0] == "tool_calls", ( - f"Choice {choice_idx}: expected finish_reason='tool_calls', " + assert reasons[0] == expected_finish_reason, ( + f"Choice {choice_idx}: expected finish_reason={expected_finish_reason!r}, " f"got '{reasons[0]}'" ) diff --git a/vllm/entrypoints/openai/chat_completion/serving.py b/vllm/entrypoints/openai/chat_completion/serving.py index 3e2d8f7369..45ea3203cd 100644 --- a/vllm/entrypoints/openai/chat_completion/serving.py +++ b/vllm/entrypoints/openai/chat_completion/serving.py @@ -757,7 +757,11 @@ class OpenAIServingChat(GenerateBaseServing): # finish_reason is: # "tool_calls" for "auto" or "required" tool calls, # and "stop" for named tool calls. - if tools_streamed[i] and not tool_choice_function_name: + if ( + tools_streamed[i] + and not tool_choice_function_name + and output.finish_reason == "stop" + ): finish_reason_ = "tool_calls" else: finish_reason_ = (