|
- #!/usr/bin/env python3 -m pytest
-
- import pytest
-
- import autogen
- from autogen.oai.client_utils import should_hide_tools, validate_parameter
-
-
- def test_validate_parameter():
- # Test valid parameters
- params = {
- "model": "Qwen/Qwen2-72B-Instruct",
- "max_tokens": 1000,
- "stream": False,
- "temperature": 1,
- "top_p": 0.8,
- "top_k": 50,
- "repetition_penalty": 0.5,
- "presence_penalty": 1.5,
- "frequency_penalty": 1.5,
- "min_p": 0.2,
- "safety_model": "Meta-Llama/Llama-Guard-7b",
- }
-
- # Should return the original value as they are valid
- assert params["model"] == validate_parameter(params, "model", str, False, None, None, None)
- assert params["max_tokens"] == validate_parameter(params, "max_tokens", int, True, 512, (0, None), None)
- assert params["stream"] == validate_parameter(params, "stream", bool, False, False, None, None)
- assert params["temperature"] == validate_parameter(params, "temperature", (int, float), True, None, None, None)
- assert params["top_k"] == validate_parameter(params, "top_k", int, True, None, None, None)
- assert params["repetition_penalty"] == validate_parameter(
- params, "repetition_penalty", float, True, None, None, None
- )
- assert params["presence_penalty"] == validate_parameter(
- params, "presence_penalty", (int, float), True, None, (-2, 2), None
- )
- assert params["safety_model"] == validate_parameter(params, "safety_model", str, True, None, None, None)
-
- # Test None allowed
- params = {
- "max_tokens": None,
- }
-
- # Should remain None
- assert validate_parameter(params, "max_tokens", int, True, 512, (0, None), None) is None
-
- # Test not None allowed
- params = {
- "max_tokens": None,
- }
-
- # Should return default
- assert 512 == validate_parameter(params, "max_tokens", int, False, 512, (0, None), None)
-
- # Test invalid parameters
- params = {
- "stream": "Yes",
- "temperature": "0.5",
- "top_p": "0.8",
- "top_k": "50",
- "repetition_penalty": "0.5",
- "presence_penalty": "1.5",
- "frequency_penalty": "1.5",
- "min_p": "0.2",
- "safety_model": False,
- }
-
- # Should all be set to defaults
- assert validate_parameter(params, "stream", bool, False, False, None, None) is not None
- assert validate_parameter(params, "temperature", (int, float), True, None, None, None) is None
- assert validate_parameter(params, "top_p", (int, float), True, None, None, None) is None
- assert validate_parameter(params, "top_k", int, True, None, None, None) is None
- assert validate_parameter(params, "repetition_penalty", float, True, None, None, None) is None
- assert validate_parameter(params, "presence_penalty", (int, float), True, None, (-2, 2), None) is None
- assert validate_parameter(params, "frequency_penalty", (int, float), True, None, (-2, 2), None) is None
- assert validate_parameter(params, "min_p", (int, float), True, None, (0, 1), None) is None
- assert validate_parameter(params, "safety_model", str, True, None, None, None) is None
-
- # Test parameters outside of bounds
- params = {
- "max_tokens": -200,
- "presence_penalty": -5,
- "frequency_penalty": 5,
- "min_p": -0.5,
- }
-
- # Should all be set to defaults
- assert 512 == validate_parameter(params, "max_tokens", int, True, 512, (0, None), None)
- assert validate_parameter(params, "presence_penalty", (int, float), True, None, (-2, 2), None) is None
- assert validate_parameter(params, "frequency_penalty", (int, float), True, None, (-2, 2), None) is None
- assert validate_parameter(params, "min_p", (int, float), True, None, (0, 1), None) is None
-
- # Test valid list options
- params = {
- "safety_model": "Meta-Llama/Llama-Guard-7b",
- }
-
- # Should all be set to defaults
- assert "Meta-Llama/Llama-Guard-7b" == validate_parameter(
- params, "safety_model", str, True, None, None, ["Meta-Llama/Llama-Guard-7b", "Meta-Llama/Llama-Guard-13b"]
- )
-
- # Test invalid list options
- params = {
- "stream": True,
- }
-
- # Should all be set to defaults
- assert not validate_parameter(params, "stream", bool, False, False, None, [False])
-
- # test invalid type
- params = {
- "temperature": None,
- }
-
- # should be set to defaults
- assert validate_parameter(params, "temperature", (int, float), False, 0.7, (0.0, 1.0), None) == 0.7
-
- # test value out of bounds
- params = {
- "temperature": 23,
- }
-
- # should be set to defaults
- assert validate_parameter(params, "temperature", (int, float), False, 1.0, (0.0, 1.0), None) == 1.0
-
- # type error for the parameters
- with pytest.raises(TypeError):
- validate_parameter({}, "param", str, True, None, None, "not_a_list")
-
- # passing empty params, which will set to defaults
- assert validate_parameter({}, "max_tokens", int, True, 512, (0, None), None) == 512
-
-
- def test_should_hide_tools():
- # Test messages
- no_tools_called_messages = [
- {"content": "You are a chess program and are playing for player white.", "role": "system"},
- {"content": "Let's play chess! Make a move.", "role": "user"},
- {
- "tool_calls": [
- {
- "id": "call_abcde56o5jlugh9uekgo84c6",
- "function": {"arguments": "{}", "name": "get_legal_moves"},
- "type": "function",
- }
- ],
- "content": None,
- "role": "assistant",
- },
- {
- "tool_calls": [
- {
- "id": "call_p1fla56o5jlugh9uekgo84c6",
- "function": {"arguments": "{}", "name": "get_legal_moves"},
- "type": "function",
- }
- ],
- "content": None,
- "role": "assistant",
- },
- {
- "tool_calls": [
- {
- "id": "call_lcow1j0ehuhrcr3aakdmd9ju",
- "function": {"arguments": '{"move":"g1f3"}', "name": "make_move"},
- "type": "function",
- }
- ],
- "content": None,
- "role": "assistant",
- },
- ]
- one_tool_called_messages = [
- {"content": "You are a chess program and are playing for player white.", "role": "system"},
- {"content": "Let's play chess! Make a move.", "role": "user"},
- {
- "tool_calls": [
- {
- "id": "call_abcde56o5jlugh9uekgo84c6",
- "function": {"arguments": "{}", "name": "get_legal_moves"},
- "type": "function",
- }
- ],
- "content": None,
- "role": "assistant",
- },
- {
- "tool_call_id": "call_abcde56o5jlugh9uekgo84c6",
- "role": "user",
- "content": "Possible moves are: g1h3,g1f3,b1c3,b1a3,h2h3,g2g3,f2f3,e2e3,d2d3,c2c3,b2b3,a2a3,h2h4,g2g4,f2f4,e2e4,d2d4,c2c4,b2b4,a2a4",
- },
- {
- "tool_calls": [
- {
- "id": "call_lcow1j0ehuhrcr3aakdmd9ju",
- "function": {"arguments": '{"move":"g1f3"}', "name": "make_move"},
- "type": "function",
- }
- ],
- "content": None,
- "role": "assistant",
- },
- ]
- messages = [
- {"content": "You are a chess program and are playing for player white.", "role": "system"},
- {"content": "Let's play chess! Make a move.", "role": "user"},
- {
- "tool_calls": [
- {
- "id": "call_abcde56o5jlugh9uekgo84c6",
- "function": {"arguments": "{}", "name": "get_legal_moves"},
- "type": "function",
- }
- ],
- "content": None,
- "role": "assistant",
- },
- {
- "tool_call_id": "call_abcde56o5jlugh9uekgo84c6",
- "role": "user",
- "content": "Possible moves are: g1h3,g1f3,b1c3,b1a3,h2h3,g2g3,f2f3,e2e3,d2d3,c2c3,b2b3,a2a3,h2h4,g2g4,f2f4,e2e4,d2d4,c2c4,b2b4,a2a4",
- },
- {
- "tool_calls": [
- {
- "id": "call_p1fla56o5jlugh9uekgo84c6",
- "function": {"arguments": "{}", "name": "get_legal_moves"},
- "type": "function",
- }
- ],
- "content": None,
- "role": "assistant",
- },
- {
- "tool_call_id": "call_p1fla56o5jlugh9uekgo84c6",
- "role": "user",
- "content": "Possible moves are: g1h3,g1f3,b1c3,b1a3,h2h3,g2g3,f2f3,e2e3,d2d3,c2c3,b2b3,a2a3,h2h4,g2g4,f2f4,e2e4,d2d4,c2c4,b2b4,a2a4",
- },
- {
- "tool_calls": [
- {
- "id": "call_lcow1j0ehuhrcr3aakdmd9ju",
- "function": {"arguments": '{"move":"g1f3"}', "name": "make_move"},
- "type": "function",
- }
- ],
- "content": None,
- "role": "assistant",
- },
- {"tool_call_id": "call_lcow1j0ehuhrcr3aakdmd9ju", "role": "user", "content": "Moved knight (♘) from g1 to f3."},
- ]
-
- # Test if no tools
- no_tools = []
- all_tools = [
- {
- "type": "function",
- "function": {
- "description": "Call this tool to make a move after you have the list of legal moves.",
- "name": "make_move",
- "parameters": {
- "type": "object",
- "properties": {
- "move": {"type": "string", "description": "A move in UCI format. (e.g. e2e4 or e7e5 or e7e8q)"}
- },
- "required": ["move"],
- },
- },
- },
- {
- "type": "function",
- "function": {
- "description": "Call this tool to make a move after you have the list of legal moves.",
- "name": "get_legal_moves",
- "parameters": {"type": "object", "properties": {}, "required": []},
- },
- },
- ]
-
- # Should not hide for any hide_tools value
- assert not should_hide_tools(messages, no_tools, "if_all_run")
- assert not should_hide_tools(messages, no_tools, "if_any_run")
- assert not should_hide_tools(messages, no_tools, "never")
-
- # Has run tools but never hide, should be false
- assert not should_hide_tools(messages, all_tools, "never")
-
- # Has run tools, should be true if all or any
- assert should_hide_tools(messages, all_tools, "if_all_run")
- assert should_hide_tools(messages, all_tools, "if_any_run")
-
- # Hasn't run any tools, should be false for all
- assert not should_hide_tools(no_tools_called_messages, all_tools, "if_all_run")
- assert not should_hide_tools(no_tools_called_messages, all_tools, "if_any_run")
- assert not should_hide_tools(no_tools_called_messages, all_tools, "never")
-
- # Has run one of the two tools, should be true only for 'if_any_run'
- assert not should_hide_tools(one_tool_called_messages, all_tools, "if_all_run")
- assert should_hide_tools(one_tool_called_messages, all_tools, "if_any_run")
- assert not should_hide_tools(one_tool_called_messages, all_tools, "never")
-
- # Parameter validation
- with pytest.raises(TypeError):
- assert not should_hide_tools(one_tool_called_messages, all_tools, "not_a_valid_value")
-
-
- if __name__ == "__main__":
- # test_validate_parameter()
- test_should_hide_tools()
|