Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions components/src/dynamo/vllm/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1034,6 +1034,22 @@ def _engine_generate_reasoning_kwargs(
return kwargs


def _engine_generate_session_kwargs(
engine_client: Any, session_id: str | None
) -> dict[str, str | None]:
try:
parameters = inspect.signature(engine_client.generate).parameters.values()
except (TypeError, ValueError):
return {"session_id": session_id}
if any(
parameter.name == "session_id"
or parameter.kind is inspect.Parameter.VAR_KEYWORD
for parameter in parameters
):
return {"session_id": session_id}
return {}


def _engine_generate_reasoning_support(
engine_client: Any,
) -> tuple[bool, bool] | None:
Expand Down Expand Up @@ -3258,7 +3274,7 @@ async def generate_tokens(
data_parallel_rank=data_parallel_rank,
trace_headers=trace_headers,
priority=priority,
session_id=session_id,
**_engine_generate_session_kwargs(self.engine_client, session_id),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This compatibility guard only covers BaseWorkerHandler.generate_tokens. DecodeWorkerHandler.generate routes use_vllm_tokenizer=True requests through _generate_text_mode, which still calls engine_client.generate(..., session_id=session_id) directly, and PrefillWorkerHandler._generate_token_mode does the same. Both paths therefore still raise TypeError on the stated legacy vLLM engine, leaving supported text-mode decode and prefill requests broken.

🤖 AI Fix

Apply _engine_generate_session_kwargs to every remaining direct engine_client.generate call that forwards session_id, including text-mode decode and prefill generation.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This compatibility helper is applied only to the BaseWorkerHandler token path. Legacy vLLM still receives session_id unconditionally from DecodeWorkerHandler's supported text-mode path and PrefillWorkerHandler's supported disaggregated prefill path, so an XPU vLLM 0.27.1 worker raises TypeError for those requests even after this fix. Apply the same conditional expansion at both direct engine_client.generate call sites.

🤖 AI Fix

Use _engine_generate_session_kwargs(self.engine_client, session_id) for every direct vLLM generate invocation that forwards session_id, including decode text mode and prefill mode.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This compatibility wrapper is only used by generate_tokens. The direct AsyncLLM.generate calls in DecodeWorkerHandler._generate_text_mode and PrefillWorkerHandler._generate_token_mode still pass session_id=session_id; on the supported XPU vLLM 0.27.1 signature, both paths raise TypeError before producing output, including when no session ID was supplied.

🤖 AI Fix

Apply _engine_generate_session_kwargs to every remaining direct engine_client.generate call that forwards session_id.

**_engine_generate_reasoning_kwargs(
self.engine_client,
reasoning_ended,
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Expand Down Expand Up @@ -3823,7 +3839,7 @@ async def _generate_text_mode(self, request, context, request_id):
data_parallel_rank=dp_rank,
trace_headers=trace_headers,
priority=priority,
session_id=session_id,
**_engine_generate_session_kwargs(self.engine_client, session_id),
)

async for res in gen:
Expand Down Expand Up @@ -4022,7 +4038,9 @@ async def _generate_token_mode(self, request, context, request_id):
lora_request=admitted_lora_request,
trace_headers=trace_headers,
priority=priority,
session_id=session_id,
**_engine_generate_session_kwargs(
self.engine_client, session_id
),
**_engine_generate_reasoning_kwargs(
self.engine_client,
reasoning_ended,
Expand Down
38 changes: 38 additions & 0 deletions components/src/dynamo/vllm/tests/test_vllm_worker_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,44 @@ async def fake_generate(
assert chunks == []
assert calls == {"called": True}

@pytest.mark.asyncio
async def test_generate_tokens_omits_session_id_for_old_vllm(self):
from vllm.sampling_params import SamplingParams

handler = _make_handler()
calls = {}

async def fake_generate(
prompt,
sampling_params,
request_id,
*,
lora_request=None,
data_parallel_rank=None,
trace_headers=None,
priority=0,
reasoning_ended=None,
reasoning_parser_kwargs=None,
):
calls["called"] = True
if False:
yield None

handler.engine_client = MagicMock()
handler.engine_client.generate = fake_generate

chunks = []
async for chunk in handler.generate_tokens(
PatchedTokensPrompt(prompt_token_ids=[1]),
SamplingParams(max_tokens=1),
"req-1",
session_id="session-1",
):
chunks.append(chunk)

assert chunks == []
assert calls == {"called": True}

@pytest.mark.asyncio
async def test_generate_tokens_emits_routed_experts_on_final_chunk(self):
from vllm.sampling_params import SamplingParams
Expand Down
Loading