Spaces:
Configuration error
Configuration error
import json | |
import os | |
import sys | |
from unittest.mock import AsyncMock, MagicMock | |
import pytest | |
sys.path.insert( | |
0, os.path.abspath("../../..") | |
) # Adds the parent directory to the system path | |
from mcp.types import ( | |
CallToolRequestParams, | |
CallToolResult, | |
ListToolsResult, | |
TextContent, | |
) | |
from mcp.types import Tool as MCPTool | |
from litellm.experimental_mcp_client.tools import ( | |
_get_function_arguments, | |
call_mcp_tool, | |
call_openai_tool, | |
load_mcp_tools, | |
transform_mcp_tool_to_openai_tool, | |
transform_openai_tool_call_request_to_mcp_tool_call_request, | |
) | |
def mock_mcp_tool(): | |
return MCPTool( | |
name="test_tool", | |
description="A test tool", | |
inputSchema={"type": "object", "properties": {"test": {"type": "string"}}}, | |
) | |
def mock_session(): | |
session = MagicMock() | |
session.list_tools = AsyncMock() | |
session.call_tool = AsyncMock() | |
return session | |
def mock_list_tools_result(): | |
return ListToolsResult( | |
tools=[ | |
MCPTool( | |
name="test_tool", | |
description="A test tool", | |
inputSchema={ | |
"type": "object", | |
"properties": {"test": {"type": "string"}}, | |
}, | |
) | |
] | |
) | |
def mock_mcp_tool_call_result(): | |
return CallToolResult(content=[TextContent(type="text", text="test_output")]) | |
def test_transform_mcp_tool_to_openai_tool(mock_mcp_tool): | |
openai_tool = transform_mcp_tool_to_openai_tool(mock_mcp_tool) | |
assert openai_tool["type"] == "function" | |
assert openai_tool["function"]["name"] == "test_tool" | |
assert openai_tool["function"]["description"] == "A test tool" | |
assert openai_tool["function"]["parameters"] == { | |
"type": "object", | |
"properties": {"test": {"type": "string"}}, | |
} | |
def testtransform_openai_tool_call_request_to_mcp_tool_call_request(mock_mcp_tool): | |
openai_tool = { | |
"function": {"name": "test_tool", "arguments": json.dumps({"test": "value"})} | |
} | |
mcp_tool_call_request = transform_openai_tool_call_request_to_mcp_tool_call_request( | |
openai_tool | |
) | |
assert mcp_tool_call_request.name == "test_tool" | |
assert mcp_tool_call_request.arguments == {"test": "value"} | |
async def test_load_mcp_tools_mcp_format(mock_session, mock_list_tools_result): | |
mock_session.list_tools.return_value = mock_list_tools_result | |
result = await load_mcp_tools(mock_session, format="mcp") | |
assert len(result) == 1 | |
assert isinstance(result[0], MCPTool) | |
assert result[0].name == "test_tool" | |
mock_session.list_tools.assert_called_once() | |
async def test_load_mcp_tools_openai_format(mock_session, mock_list_tools_result): | |
mock_session.list_tools.return_value = mock_list_tools_result | |
result = await load_mcp_tools(mock_session, format="openai") | |
assert len(result) == 1 | |
assert result[0]["type"] == "function" | |
assert result[0]["function"]["name"] == "test_tool" | |
mock_session.list_tools.assert_called_once() | |
def test_get_function_arguments(): | |
# Test with string arguments | |
function = {"arguments": '{"test": "value"}'} | |
result = _get_function_arguments(function) | |
assert result == {"test": "value"} | |
# Test with dict arguments | |
function = {"arguments": {"test": "value"}} | |
result = _get_function_arguments(function) | |
assert result == {"test": "value"} | |
# Test with invalid JSON string | |
function = {"arguments": "invalid json"} | |
result = _get_function_arguments(function) | |
assert result == {} | |
# Test with no arguments | |
function = {} | |
result = _get_function_arguments(function) | |
assert result == {} | |
async def test_call_openai_tool(mock_session, mock_mcp_tool_call_result): | |
mock_session.call_tool.return_value = mock_mcp_tool_call_result | |
openai_tool = { | |
"function": {"name": "test_tool", "arguments": json.dumps({"test": "value"})} | |
} | |
result = await call_openai_tool(mock_session, openai_tool) | |
print("result of call_openai_tool", result) | |
assert result.content[0].text == "test_output" | |
mock_session.call_tool.assert_called_once_with( | |
name="test_tool", arguments={"test": "value"} | |
) | |
async def test_call_mcp_tool(mock_session, mock_mcp_tool_call_result): | |
mock_session.call_tool.return_value = mock_mcp_tool_call_result | |
request_params = CallToolRequestParams( | |
name="test_tool", arguments={"test": "value"} | |
) | |
result = await call_mcp_tool(mock_session, request_params) | |
print("call_mcp_tool result", result) | |
assert result.content[0].text == "test_output" | |
mock_session.call_tool.assert_called_once_with( | |
name="test_tool", arguments={"test": "value"} | |
) | |