Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
16 changes: 16 additions & 0 deletions tests/entrypoints/openai/test_cli_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,22 @@ def test_default_chat_template_kwargs_default_none(serve_parser):
assert args.default_chat_template_kwargs is None


def test_log_output_token_ids_arg(serve_parser):
assert serve_parser.parse_args([]).enable_log_output_token_ids is True
assert (
serve_parser.parse_args(
["--enable-log-output-token-ids"]
).enable_log_output_token_ids
is True
)
assert (
serve_parser.parse_args(
["--no-enable-log-output-token-ids"]
).enable_log_output_token_ids
is False
)


def test_default_chat_template_kwargs_invalid_json(serve_parser):
"""Ensure invalid JSON raises an error"""
with pytest.raises(SystemExit):
Expand Down
37 changes: 37 additions & 0 deletions tests/entrypoints/serve/utils/test_request_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

from unittest.mock import MagicMock, patch

import pytest

from vllm.entrypoints.serve.utils.request_logger import RequestLogger


Expand Down Expand Up @@ -122,6 +124,41 @@ def test_request_logger_log_outputs_with_truncation():
assert len(logged_token_ids) == 10


@pytest.mark.parametrize(
("is_streaming", "delta", "stream_info"),
[
(False, False, ""),
(True, True, " (streaming delta)"),
(True, False, " (streaming complete)"),
],
)
def test_request_logger_log_outputs_without_token_ids(is_streaming, delta, stream_info):
mock_logger = MagicMock()

with patch("vllm.entrypoints.serve.utils.request_logger.logger", mock_logger):
request_logger = RequestLogger(max_log_len=4, enable_log_output_token_ids=False)

request_logger.log_outputs(
request_id="test-no-token-ids",
outputs="Test output",
output_token_ids=[1, 2, 3],
finish_reason="stop",
is_streaming=is_streaming,
delta=delta,
)

mock_logger.info.assert_called_once()
call_args = mock_logger.info.call_args.args
assert "output_token_ids" not in call_args[0]
assert call_args == (
"Generated response %s%s: output: %r, finish_reason: %s",
"test-no-token-ids",
stream_info,
"Test",
"stop",
)


def test_request_logger_log_outputs_none_values():
"""Test log_outputs handles None values correctly."""
mock_logger = MagicMock()
Expand Down
10 changes: 8 additions & 2 deletions vllm/entrypoints/openai/api_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,10 @@ async def init_app_state(
served_model_names = [args.model]

if args.enable_log_requests:
request_logger = RequestLogger(max_log_len=args.max_log_len)
request_logger = RequestLogger(
max_log_len=args.max_log_len,
enable_log_output_token_ids=args.enable_log_output_token_ids,
)
else:
request_logger = None

Expand Down Expand Up @@ -509,7 +512,10 @@ async def init_render_app_state(
)

if args.enable_log_requests:
request_logger = RequestLogger(max_log_len=args.max_log_len)
request_logger = RequestLogger(
max_log_len=args.max_log_len,
enable_log_output_token_ids=args.enable_log_output_token_ids,
)
else:
request_logger = None

Expand Down
3 changes: 3 additions & 0 deletions vllm/entrypoints/openai/cli_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@ class BaseFrontendArgs:
"""If set to True, log model outputs (generations).
Requires `--enable-log-requests`. As with `--enable-log-requests`,
information is only logged at INFO level at maximum."""
enable_log_output_token_ids: bool = True
"""If set to False, omit output token IDs from model output logs.
Relevant only if `--enable-log-outputs` is set."""
enable_log_deltas: bool = True
"""If set to False, output deltas will not be logged. Relevant only if
--enable-log-outputs is set.
Expand Down
37 changes: 26 additions & 11 deletions vllm/entrypoints/serve/utils/request_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,14 @@


class RequestLogger:
def __init__(self, *, max_log_len: int | None) -> None:
def __init__(
self,
*,
max_log_len: int | None,
enable_log_output_token_ids: bool = True,
) -> None:
self.max_log_len = max_log_len
self.enable_log_output_token_ids = enable_log_output_token_ids

if not logger.isEnabledFor(logging.INFO):
logger.warning_once(
Expand Down Expand Up @@ -81,20 +87,29 @@ def log_outputs(
if outputs is not None:
outputs = outputs[:max_log_len]

if output_token_ids is not None:
if self.enable_log_output_token_ids and output_token_ids is not None:
# Convert to list and apply truncation
output_token_ids = list(output_token_ids)[:max_log_len]

stream_info = ""
if is_streaming:
stream_info = " (streaming delta)" if delta else " (streaming complete)"

logger.info(
"Generated response %s%s: output: %r, "
"output_token_ids: %s, finish_reason: %s",
request_id,
stream_info,
outputs,
output_token_ids,
finish_reason,
)
if self.enable_log_output_token_ids:
logger.info(
"Generated response %s%s: output: %r, "
"output_token_ids: %s, finish_reason: %s",
request_id,
stream_info,
outputs,
output_token_ids,
finish_reason,
)
else:
logger.info(
"Generated response %s%s: output: %r, finish_reason: %s",
request_id,
stream_info,
outputs,
finish_reason,
)
Loading