[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)