From 156d97b219d9fa034192e5a1e5308c4add2a4aa5 Mon Sep 17 00:00:00 2001 From: Harish Date: Wed, 7 Jan 2026 15:49:02 -0800 Subject: [PATCH] Fix KeyError when logprobs=false in completions endpoint (#16095) --- .../entrypoints/openai/serving_completions.py | 16 ++++++------ .../basic/test_serving_completions.py | 25 +++++++++++++++++++ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/python/sglang/srt/entrypoints/openai/serving_completions.py b/python/sglang/srt/entrypoints/openai/serving_completions.py index c6bd4bc9f..9fbfb8841 100644 --- a/python/sglang/srt/entrypoints/openai/serving_completions.py +++ b/python/sglang/srt/entrypoints/openai/serving_completions.py @@ -242,9 +242,9 @@ class OpenAIServingCompletion(OpenAIServingBase): output_token_logprobs=content["meta_info"][ "output_token_logprobs" ][n_prev_token:], - output_top_logprobs=content["meta_info"]["output_top_logprobs"][ - n_prev_token: - ], + output_top_logprobs=content["meta_info"].get( + "output_top_logprobs", [] + )[n_prev_token:], ) n_prev_tokens[index] = len( content["meta_info"]["output_token_logprobs"] @@ -398,10 +398,12 @@ class OpenAIServingCompletion(OpenAIServingBase): logprobs = to_openai_style_logprobs( input_token_logprobs=input_token_logprobs, input_top_logprobs=input_top_logprobs, - output_token_logprobs=ret_item["meta_info"][ - "output_token_logprobs" - ], - output_top_logprobs=ret_item["meta_info"]["output_top_logprobs"], + output_token_logprobs=ret_item["meta_info"].get( + "output_token_logprobs", [] + ), + output_top_logprobs=ret_item["meta_info"].get( + "output_top_logprobs", [] + ), ) # Handle hidden states diff --git a/test/registered/openai_server/basic/test_serving_completions.py b/test/registered/openai_server/basic/test_serving_completions.py index ea58ec1c7..504ee2358 100644 --- a/test/registered/openai_server/basic/test_serving_completions.py +++ b/test/registered/openai_server/basic/test_serving_completions.py @@ -156,6 +156,31 @@ class ServingCompletionTestCase(unittest.TestCase): # (but might have json_schema from the legacy json_schema field) self.assertIsNone(sampling_params.get("structural_tag")) + def test_logprobs_false_non_streaming(self): + """Test that logprobs=False doesn't cause KeyError in non-streaming response.""" + req = CompletionRequest( + model="x", prompt="Hello", max_tokens=10, logprobs=False + ) + + mock_ret = [ + { + "text": " world", + "meta_info": { + "id": "test-id", + "prompt_tokens": 1, + "completion_tokens": 2, + "finish_reason": {"type": "stop"}, + "weight_version": "v1", + }, + } + ] + + response = self.sc._build_completion_response(req, mock_ret, 1234567890) + + self.assertEqual(len(response.choices), 1) + self.assertEqual(response.choices[0].text, " world") + self.assertEqual(len(response.choices[0].logprobs.top_logprobs), 0) + if __name__ == "__main__": unittest.main(verbosity=2)