diff --git a/tests/tool_use/test_chat_completion_request_validations.py b/tests/tool_use/test_chat_completion_request_validations.py new file mode 100644 index 0000000000000..3d0fe8f060895 --- /dev/null +++ b/tests/tool_use/test_chat_completion_request_validations.py @@ -0,0 +1,71 @@ +import pytest + +from vllm.entrypoints.openai.protocol import ChatCompletionRequest + + +def test_chat_completion_request_with_no_tools(): + # tools key is not present + request = ChatCompletionRequest.model_validate({ + 'messages': [{ + 'role': 'user', + 'content': 'Hello' + }], + 'model': + 'facebook/opt-125m', + }) + assert request.tool_choice == 'none' + + # tools key is None + request = ChatCompletionRequest.model_validate({ + 'messages': [{ + 'role': 'user', + 'content': 'Hello' + }], + 'model': + 'facebook/opt-125m', + 'tools': + None + }) + assert request.tool_choice == 'none' + + # tools key present but empty + request = ChatCompletionRequest.model_validate({ + 'messages': [{ + 'role': 'user', + 'content': 'Hello' + }], + 'model': + 'facebook/opt-125m', + 'tools': [] + }) + assert request.tool_choice == 'none' + + +def test_chat_completion_request_with_tool_choice_but_no_tools(): + with pytest.raises(ValueError, + match="When using `tool_choice`, `tools` must be set."): + ChatCompletionRequest.model_validate({ + 'messages': [{ + 'role': 'user', + 'content': 'Hello' + }], + 'model': + 'facebook/opt-125m', + 'tool_choice': + 'auto' + }) + + with pytest.raises(ValueError, + match="When using `tool_choice`, `tools` must be set."): + ChatCompletionRequest.model_validate({ + 'messages': [{ + 'role': 'user', + 'content': 'Hello' + }], + 'model': + 'facebook/opt-125m', + 'tool_choice': + 'auto', + 'tools': + None + }) diff --git a/vllm/entrypoints/openai/protocol.py b/vllm/entrypoints/openai/protocol.py index 40d27f984fbaa..646aa4537999e 100644 --- a/vllm/entrypoints/openai/protocol.py +++ b/vllm/entrypoints/openai/protocol.py @@ -386,7 +386,7 @@ def check_tool_usage(cls, data): # if "tool_choice" is not specified but tools are provided, # default to "auto" tool_choice - if "tool_choice" not in data and "tools" in data: + if "tool_choice" not in data and data.get("tools"): data["tool_choice"] = "auto" # if "tool_choice" is specified -- validation