[Bugfix][Tool Parser] PoolsideV1: fix logprobs AttributeError on Responses API (#47138)
Signed-off-by: Joe Rowell <joerowell4@gmail.com> Co-authored-by: Robert Shaw <114415538+robertgshaw2-redhat@users.noreply.github.com>
Joe Rowell committed
Jun 30, 2026 at 21:14 UTC
11b26c5528b57ccbebd3e7da49892a8f2257cb83
2 files changed
+37
-2
tests/tool_parsers/test_poolside_v1_tool_parser.py
+32
-1
@@ -77,7 +77,9 @@ def _build_chat_request(*, tool_choice: str | dict[str, Any]) -> ChatCompletionR
77
)
78
79
80
-def _build_responses_request(*, tool_choice: str | dict[str, Any]) -> ResponsesRequest:
80
+def _build_responses_request(
81
+ *, tool_choice: str | dict[str, Any], include: list[str] | None = None
82
+) -> ResponsesRequest:
83
return ResponsesRequest(
84
model="poolside-test",
85
input=[{"role": "user", "content": "write the file"}],
@@ -85,6 +87,7 @@ def _build_responses_request(*, tool_choice: str | dict[str, Any]) -> ResponsesR
87
tool_choice=tool_choice,
88
stream=True,
89
max_output_tokens=200,
90
+ include=include,
91
)
92
93
@@ -215,3 +218,31 @@ def test_responses_extract_tool_calls_with_flat_tools() -> None:
218
assert result.tools_called
219
args = json.loads(result.tool_calls[0].function.arguments)
220
assert args["content"] == content
221
+
222
+
223
+def _stream_partial_start_token(request: ResponsesRequest):
224
+ parser = _make_parser(request)
225
+ delta = parser.tool_call_start_token[0]
226
+ return parser.extract_tool_calls_streaming(
227
+ previous_text="",
228
+ current_text=delta,
229
+ delta_text=delta,
230
+ previous_token_ids=[],
231
+ current_token_ids=[],
232
+ delta_token_ids=[],
233
+ request=request,
234
+ )
235
+
236
+
237
+def test_streaming_responses_request_without_logprobs() -> None:
238
+ request = _build_responses_request(tool_choice="auto")
239
+ assert _stream_partial_start_token(request) is None
240
+
241
+
242
+def test_streaming_responses_request_with_logprobs_emits_empty_delta() -> None:
243
+ request = _build_responses_request(
244
+ tool_choice="auto", include=["message.output_text.logprobs"]
245
+ )
246
+ result = _stream_partial_start_token(request)
247
+ assert result is not None
248
+ assert result.content == ""
vllm/tool_parsers/poolside_v1_tool_parser.py
+5
-1
@@ -443,7 +443,11 @@ class PoolsideV1ToolParser(ToolParser):
443
444
tool_calls = list(pending_deltas.values())
445
if content is None and len(tool_calls) == 0:
446
- if request.logprobs:
446
+ wants_logprobs = getattr(request, "logprobs", None) or (
447
+ isinstance(request, ResponsesRequest)
448
+ and request.is_include_output_logprobs()
449
+ )
450
+ if wants_logprobs:
451
return DeltaMessage(content="")
452
return None
453
return DeltaMessage(content=content, tool_calls=tool_calls)