Skip to content

Commit 156d97b

Browse files
authored
Fix KeyError when logprobs=false in completions endpoint (sgl-project#16095)
1 parent 24b30f7 commit 156d97b

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

python/sglang/srt/entrypoints/openai/serving_completions.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,9 @@ async def _generate_completion_stream(
242242
output_token_logprobs=content["meta_info"][
243243
"output_token_logprobs"
244244
][n_prev_token:],
245-
output_top_logprobs=content["meta_info"]["output_top_logprobs"][
246-
n_prev_token:
247-
],
245+
output_top_logprobs=content["meta_info"].get(
246+
"output_top_logprobs", []
247+
)[n_prev_token:],
248248
)
249249
n_prev_tokens[index] = len(
250250
content["meta_info"]["output_token_logprobs"]
@@ -398,10 +398,12 @@ def _build_completion_response(
398398
logprobs = to_openai_style_logprobs(
399399
input_token_logprobs=input_token_logprobs,
400400
input_top_logprobs=input_top_logprobs,
401-
output_token_logprobs=ret_item["meta_info"][
402-
"output_token_logprobs"
403-
],
404-
output_top_logprobs=ret_item["meta_info"]["output_top_logprobs"],
401+
output_token_logprobs=ret_item["meta_info"].get(
402+
"output_token_logprobs", []
403+
),
404+
output_top_logprobs=ret_item["meta_info"].get(
405+
"output_top_logprobs", []
406+
),
405407
)
406408

407409
# Handle hidden states

test/registered/openai_server/basic/test_serving_completions.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,31 @@ def test_response_format_none(self):
156156
# (but might have json_schema from the legacy json_schema field)
157157
self.assertIsNone(sampling_params.get("structural_tag"))
158158

159+
def test_logprobs_false_non_streaming(self):
160+
"""Test that logprobs=False doesn't cause KeyError in non-streaming response."""
161+
req = CompletionRequest(
162+
model="x", prompt="Hello", max_tokens=10, logprobs=False
163+
)
164+
165+
mock_ret = [
166+
{
167+
"text": " world",
168+
"meta_info": {
169+
"id": "test-id",
170+
"prompt_tokens": 1,
171+
"completion_tokens": 2,
172+
"finish_reason": {"type": "stop"},
173+
"weight_version": "v1",
174+
},
175+
}
176+
]
177+
178+
response = self.sc._build_completion_response(req, mock_ret, 1234567890)
179+
180+
self.assertEqual(len(response.choices), 1)
181+
self.assertEqual(response.choices[0].text, " world")
182+
self.assertEqual(len(response.choices[0].logprobs.top_logprobs), 0)
183+
159184

160185
if __name__ == "__main__":
161186
unittest.main(verbosity=2)

0 commit comments

Comments
 (0)