From 360f33f61ce02bda04bcb7ea876f1d2e5af8d06d Mon Sep 17 00:00:00 2001 From: Colin McNamara Date: Thu, 10 Sep 2026 17:21:21 -0500 Subject: [PATCH] [Bugfix] Set stop_sequence explicitly in streaming message_delta event (#55325) Signed-off-by: Colin McNamara --- .../test_anthropic_messages_conversion.py | 26 +++++++++++++++++++ vllm/entrypoints/anthropic/serving.py | 4 ++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/entrypoints/anthropic/test_anthropic_messages_conversion.py b/tests/entrypoints/anthropic/test_anthropic_messages_conversion.py index 436db76a9a..0c986f1291 100644 --- a/tests/entrypoints/anthropic/test_anthropic_messages_conversion.py +++ b/tests/entrypoints/anthropic/test_anthropic_messages_conversion.py @@ -1610,6 +1610,32 @@ class TestStopSequenceReason: assert msg_deltas[0]["delta"]["stop_reason"] == "stop_sequence" assert msg_deltas[0]["delta"]["stop_sequence"] == "" + @pytest.mark.asyncio + async def test_streaming_no_stop_string_emits_explicit_null_stop_sequence(self): + """exclude_unset=True drops stop_sequence unless it is set explicitly.""" + + async def sse_input(): + yield _make_stream_chunk(delta=DeltaMessage(role="assistant")) + yield _make_stream_chunk(delta=DeltaMessage(content="hi")) + yield _make_stream_chunk(finish_reason="stop") + yield _make_stream_chunk( + choices=[], + usage=UsageInfo(prompt_tokens=5, total_tokens=8, completion_tokens=3), + ) + yield "data: [DONE]" + + converter = _make_stream_converter() + output = [] + async for event in converter.message_stream_converter(sse_input()): + output.append(event) + + events = _parse_sse_events(output) + msg_deltas = [data for ev_type, data in events if ev_type == "message_delta"] + assert len(msg_deltas) == 1 + assert msg_deltas[0]["delta"]["stop_reason"] == "end_turn" + assert "stop_sequence" in msg_deltas[0]["delta"] + assert msg_deltas[0]["delta"]["stop_sequence"] is None + # ====================================================================== # Client-caused errors are 4xx, not 500 (Issue #52088) diff --git a/vllm/entrypoints/anthropic/serving.py b/vllm/entrypoints/anthropic/serving.py index fe0d752d4e..f8784284b4 100644 --- a/vllm/entrypoints/anthropic/serving.py +++ b/vllm/entrypoints/anthropic/serving.py @@ -842,7 +842,9 @@ class AnthropicServingMessages(OpenAIServingChat): stop_delta = AnthropicDelta( stop_reason=self.stop_reason_map.get( finish_reason or "stop" - ) + ), + # Set explicitly so exclude_unset=True keeps it. + stop_sequence=None, ) chunk = AnthropicStreamEvent( type="message_delta",