diff --git a/tests/parser/test_harmony.py b/tests/parser/test_harmony.py index d8db7f4057..00294afb88 100644 --- a/tests/parser/test_harmony.py +++ b/tests/parser/test_harmony.py @@ -872,6 +872,15 @@ class TestProcessChunk: ("final", "Two"), ] + def test_malformed_token_does_not_raise(self, harmony_parser): + malformed = encode_output( + "<|channel|>analysis<|message|>think<|end|><|return|>" + "<|start|>assistant<|channel|>final<|message|>answer<|return|>" + ) + + result = harmony_parser.process_chunk(malformed) + assert "".join(s.delta for s in result.segments if s.delta) == "thinkanswer" + class TestCountReasoningTokens: def test_matches_process_chunk(self, harmony_parser, gpt_oss_tokenizer): diff --git a/vllm/parser/harmony.py b/vllm/parser/harmony.py index 26f311c7e9..6a1399db66 100644 --- a/vllm/parser/harmony.py +++ b/vllm/parser/harmony.py @@ -335,7 +335,10 @@ class HarmonyParser(DelegatingParser): segments: list[Segment] = [] reasoning_token_count = 0 for token_id in token_ids: - self._harmony_parser.process(token_id) + try: + self._harmony_parser.process(token_id) + except HarmonyError: + continue channel = self._harmony_parser.current_channel recipient = self._normalize_recipient( self._harmony_parser.current_recipient @@ -376,7 +379,10 @@ class HarmonyParser(DelegatingParser): parser = get_streamable_parser_for_assistant() count = 0 for token_id in token_ids: - parser.process(token_id) + try: + parser.process(token_id) + except HarmonyError: + continue recipient = self._normalize_recipient(parser.current_recipient) if self._is_reasoning_token(token_id, parser.current_channel, recipient): count += 1